Project

General

Profile

Download (7.92 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
 * Copyright (C) 2015 EDIT
4
 * European Distributed Institute of Taxonomy
5
 * http://www.e-taxonomy.eu
6
 *
7
 * The contents of this file are subject to the Mozilla Public License Version 1.1
8
 * See LICENSE.TXT at the top of this package for the full license terms.
9
 */
10
package eu.etaxonomy.cdm.vaadin.container;
11

    
12
import java.sql.SQLException;
13
import java.util.ArrayList;
14
import java.util.Collection;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.Set;
20

    
21
import org.apache.log4j.Logger;
22

    
23
import com.vaadin.data.Container;
24
import com.vaadin.data.Item;
25
import com.vaadin.data.Property;
26
import com.vaadin.data.util.filter.Compare;
27
import com.vaadin.data.util.filter.IsNull;
28
import com.vaadin.data.util.filter.Not;
29
import com.vaadin.data.util.filter.SimpleStringFilter;
30
import com.vaadin.data.util.sqlcontainer.RowId;
31
import com.vaadin.data.util.sqlcontainer.RowItem;
32

    
33
import eu.etaxonomy.cdm.vaadin.util.CdmQueryFactory;
34

    
35
/**
36
 * @author cmathew
37
 * @date 10 Mar 2015
38
 *
39
 */
40
public class LeafNodeTaxonContainer extends CdmSQLContainer implements Container.Hierarchical  {
41

    
42
    private static final Logger logger = Logger.getLogger(LeafNodeTaxonContainer.class);
43

    
44

    
45
    public static final String NAME_ID = "Name";
46
    public static final String ACCTAXON_ID = "AccTaxonId";
47
    public static final String PB_ID = "Pb";
48
    public static final String FN_ID = "Fn";
49
    public static final String UNP_ID = "Unp";
50
    public static final String UNR_ID = "Unr";
51
    public static final String RANK_ID = "Rank";
52
    public static final String HAS_SYN_ID = "HasSynonyms";
53

    
54
    public Set<Filter> currentFilters;
55

    
56

    
57
    private Filter nrFilter, unpFilter, unfFilter, unpbFilter, rankFilter,  classificationFilter, synonymFilter, idFilter;
58
    private SimpleStringFilter nameFilter;
59

    
60
    private int classificationId = -1;
61

    
62
    private final Map<RowId, RowItem> synItems = new HashMap<RowId, RowItem>();
63

    
64
    private final Map<Object,List<Object>> taxonSynonymMap;
65

    
66
    private final CdmSQLContainer synonymContainer;
67

    
68

    
69
    /**
70
     * @param delegate
71
     * @throws SQLException
72
     */
73
    public LeafNodeTaxonContainer(int classificationId) throws SQLException {
74
        super(CdmQueryFactory.generateTaxonBaseQuery(NAME_ID, PB_ID, UNP_ID, RANK_ID, HAS_SYN_ID));
75
        this.synonymContainer = new CdmSQLContainer(CdmQueryFactory.generateSynonymofTaxonQuery(NAME_ID));
76
        this.classificationId = classificationId;
77
        taxonSynonymMap = new HashMap<Object,List<Object>>();
78
        initFilters();
79
        addContainerFilter(classificationFilter);
80
        //addContainerFilter(rankFilter);
81
    }
82

    
83
    private void initFilters() {
84
        //nrFilter = new Compare.Equal(StatusPresenter.UNR_ID, true);
85
        unpFilter = new Compare.Equal("tb.unplaced", true);
86
        //unfFilter = new Compare.Equal(StatusPresenter.FN_ID, false);
87
        unpbFilter = new Compare.Equal("tb.publish", false);
88
        classificationFilter = new Compare.Equal("tn.classification_id",classificationId);
89
        rankFilter = new Compare.Equal("dtb.titleCache","Species");
90
        synonymFilter = new Not(new IsNull("sr.relatedto_id"));
91

    
92
        currentFilters = new HashSet<Filter>();
93
    }
94

    
95

    
96

    
97
    public void setUnplacedFilter() {
98
        addContainerFilter(unpFilter);
99
    }
100

    
101

    
102
    public void removeUnplacedFilter() {
103
        removeContainerFilter(unpFilter);
104
    }
105

    
106

    
107
    public void setUnpublishedFilter() {
108
        addContainerFilter(unpbFilter);
109
    }
110

    
111

    
112
    public void removeUnpublishedFilter() {
113
        removeContainerFilter(unpbFilter);
114
    }
115

    
116

    
117
    public void setNameFilter(String filterString) {
118
        removeNameFilter();
119
        nameFilter = new SimpleStringFilter("tnb.titleCache", filterString, true, true);
120
        addContainerFilter(nameFilter);
121
    }
122

    
123

    
124
    public void removeNameFilter() {
125
        removeContainerFilter(nameFilter);
126
    }
127

    
128
    public void setIdFilter(Object itemId) {
129
        removeIdFilter();
130
        idFilter = new Compare.Equal("tb.id", itemId.toString());
131
        addContainerFilter(idFilter);
132
    }
133

    
134
    public void removeIdFilter() {
135
        removeContainerFilter(idFilter);
136
    }
137

    
138
    public void removeDynamicFilters() {
139
        removeUnplacedFilter();
140
        removeUnpublishedFilter();
141
        removeNameFilter();
142
        removeIdFilter();
143

    
144
    }
145
    public int getTotalNoOfTaxa() {
146
        return size();
147
    }
148

    
149

    
150
    /* (non-Javadoc)
151
     * @see com.vaadin.data.Container.Hierarchical#getChildren(java.lang.Object)
152
     */
153
    @Override
154
    public Collection<?> getChildren(Object itemId) {
155
        List<Object> synList = taxonSynonymMap.get(itemId);
156
        if(synList != null) {
157
            return synList;
158
        }
159

    
160
        return addToSynonymCache(itemId);
161
    }
162

    
163
    /* (non-Javadoc)
164
     * @see com.vaadin.data.Container.Hierarchical#getParent(java.lang.Object)
165
     */
166
    @Override
167
    public Object getParent(Object itemId) {
168
        return null;
169
    }
170

    
171
    /* (non-Javadoc)
172
     * @see com.vaadin.data.Container.Hierarchical#rootItemIds()
173
     */
174
    @Override
175
    public Collection<?> rootItemIds() {
176
        return getItemIds();
177
    }
178

    
179
    /* (non-Javadoc)
180
     * @see com.vaadin.data.Container.Hierarchical#setParent(java.lang.Object, java.lang.Object)
181
     */
182
    @Override
183
    public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
184
        return true;
185
    }
186

    
187
    /* (non-Javadoc)
188
     * @see com.vaadin.data.Container.Hierarchical#areChildrenAllowed(java.lang.Object)
189
     */
190
    @Override
191
    public boolean areChildrenAllowed(Object itemId) {
192

    
193
        Property hasSynProperty = getItem(itemId).getItemProperty(HAS_SYN_ID);
194
        if(hasSynProperty == null) {
195
            return false;
196
        }
197
        return (Long)hasSynProperty.getValue() > 0;
198

    
199

    
200
    }
201

    
202
    /* (non-Javadoc)
203
     * @see com.vaadin.data.Container.Hierarchical#setChildrenAllowed(java.lang.Object, boolean)
204
     */
205
    @Override
206
    public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException {
207
        return true;
208
    }
209

    
210
    /* (non-Javadoc)
211
     * @see com.vaadin.data.Container.Hierarchical#isRoot(java.lang.Object)
212
     */
213
    @Override
214
    public boolean isRoot(Object itemId) {
215
        return true;
216
    }
217

    
218
    /* (non-Javadoc)
219
     * @see com.vaadin.data.Container.Hierarchical#hasChildren(java.lang.Object)
220
     */
221
    @Override
222
    public boolean hasChildren(Object itemId) {
223
        return true;
224
    }
225

    
226
    public boolean isSynonym(Object itemId) {
227
        return synonymContainer.containsId(itemId);
228
    }
229

    
230
    public void removeTaxonFromCache(Object itemId) {
231
        taxonSynonymMap.remove(itemId);
232
    }
233

    
234
    public void refreshSynonymCache() {
235
        for(Object taxonItemId  : taxonSynonymMap.keySet()) {
236
            addToSynonymCache(taxonItemId);
237
        }
238
    }
239

    
240
    private List<Object> addToSynonymCache(Object taxonItemId) {
241
        Filter synonymOfTaxonFilter = new Compare.Equal("sr.relatedto_id", Integer.valueOf(taxonItemId.toString()));
242
        synonymContainer.addContainerFilter(synonymOfTaxonFilter);
243
        List<Object> synList = new ArrayList<Object>();
244
        synList.addAll(synonymContainer.getItemIds());
245
        for(Object synItemId : synList) {
246
            addSynItem((RowItem) synonymContainer.getItem(synItemId));
247
        }
248
        synonymContainer.removeAllContainerFilters();
249

    
250
        taxonSynonymMap.put(taxonItemId, synList);
251

    
252
        return synList;
253
    }
254

    
255
    @Override
256
    public Item getItem(Object itemId) {
257
        Item item = synItems.get(itemId);
258
        if(item == null) {
259
            item = super.getItem(itemId);
260
        }
261
        return item;
262
    }
263

    
264

    
265
    @Override
266
    public boolean removeAllItems() throws UnsupportedOperationException {
267
        taxonSynonymMap.clear();
268
        synItems.clear();
269
        return super.removeAllItems();
270
    }
271

    
272
    @Override
273
    public void refresh() {
274
        synItems.clear();
275
        refreshSynonymCache();
276
        super.refresh();
277
    }
278

    
279
    public void addSynItem(RowItem rowItem) {
280
        synItems.put(rowItem.getId(), rowItem);
281

    
282
    }
283

    
284
}
(4-4/4)