Project

General

Profile

Download (8.37 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.model.name.Rank;
34
import eu.etaxonomy.cdm.vaadin.util.CdmQueryFactory;
35

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

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

    
45

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

    
55
    public Set<Filter> currentFilters;
56

    
57

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

    
61
    private int classificationId = -1;
62

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

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

    
67
    private final CdmSQLContainer synonymContainer;
68

    
69

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

    
86
    private void initFilters() {
87
        //nrFilter = new Compare.Equal(StatusPresenter.UNR_ID, true);
88
        unpFilter = new Compare.Equal("tb.unplaced", true);
89
        //unfFilter = new Compare.Equal(StatusPresenter.FN_ID, false);
90
        unpbFilter = new Compare.Equal("tb.publish", false);
91
        classificationFilter = new Compare.Equal("tn.classification_id",classificationId);
92

    
93
        // get species aggregate rank order index
94
        int saoIndex = Rank.SPECIESAGGREGATE().getOrderIndex();
95
        rankFilter = new Compare.GreaterOrEqual("dtb.orderindex", saoIndex);
96

    
97
        synonymFilter = new Not(new IsNull("sr.relatedto_id"));
98

    
99
        currentFilters = new HashSet<Filter>();
100
    }
101

    
102

    
103

    
104
    public void setUnplacedFilter() {
105
        addContainerFilter(unpFilter);
106
    }
107

    
108

    
109
    public void removeUnplacedFilter() {
110
        removeContainerFilter(unpFilter);
111
    }
112

    
113

    
114
    public void setUnpublishedFilter() {
115
        addContainerFilter(unpbFilter);
116
    }
117

    
118

    
119
    public void removeUnpublishedFilter() {
120
        removeContainerFilter(unpbFilter);
121
    }
122

    
123

    
124
    public void setNameFilter(String filterString) {
125
        removeNameFilter();
126
        nameFilter = new SimpleStringFilter("tnb.titleCache", filterString, true, true);
127
        addContainerFilter(nameFilter);
128
    }
129

    
130

    
131
    public void removeNameFilter() {
132
        removeContainerFilter(nameFilter);
133
    }
134

    
135
    public void setIdFilter(Object itemId) {
136
        removeIdFilter();
137
        idFilter = new Compare.Equal("tb.id", itemId.toString());
138
        addContainerFilter(idFilter);
139
    }
140

    
141
    public void removeIdFilter() {
142
        removeContainerFilter(idFilter);
143
    }
144

    
145
    public void removeDynamicFilters() {
146
        removeUnplacedFilter();
147
        removeUnpublishedFilter();
148
        removeNameFilter();
149
        removeIdFilter();
150

    
151
    }
152
    public int getTotalNoOfTaxa() {
153
        return size();
154
    }
155

    
156

    
157
    /* (non-Javadoc)
158
     * @see com.vaadin.data.Container.Hierarchical#getChildren(java.lang.Object)
159
     */
160
    @Override
161
    public Collection<?> getChildren(Object itemId) {
162
        List<Object> synList = taxonSynonymMap.get(itemId);
163
        if(synList != null) {
164
            return synList;
165
        }
166

    
167
        return addToSynonymCache(itemId);
168
    }
169

    
170
    /* (non-Javadoc)
171
     * @see com.vaadin.data.Container.Hierarchical#getParent(java.lang.Object)
172
     */
173
    @Override
174
    public Object getParent(Object itemId) {
175
        return null;
176
    }
177

    
178
    /* (non-Javadoc)
179
     * @see com.vaadin.data.Container.Hierarchical#rootItemIds()
180
     */
181
    @Override
182
    public Collection<?> rootItemIds() {
183
        return getItemIds();
184
    }
185

    
186
    /* (non-Javadoc)
187
     * @see com.vaadin.data.Container.Hierarchical#setParent(java.lang.Object, java.lang.Object)
188
     */
189
    @Override
190
    public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
191
        return true;
192
    }
193

    
194
    /* (non-Javadoc)
195
     * @see com.vaadin.data.Container.Hierarchical#areChildrenAllowed(java.lang.Object)
196
     */
197
    @Override
198
    public boolean areChildrenAllowed(Object itemId) {
199
        Property hasSynProperty = getItem(itemId).getItemProperty(HAS_SYN_ID);
200
        if(hasSynProperty == null) {
201
            return false;
202
        }
203
       return (Long)hasSynProperty.getValue() > 0;
204
    }
205

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

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

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

    
230
    public boolean isSynonym(Object itemId) {
231
        Property hasSynProperty = getItem(itemId).getItemProperty(HAS_SYN_ID);
232
        return hasSynProperty == null;
233
    }
234

    
235
    public void removeTaxonFromCache(Object itemId) {
236
        taxonSynonymMap.remove(itemId);
237
    }
238

    
239
    public void refreshSynonymCache() {
240
        if(taxonSynonymMap != null) {
241
            for(Object taxonItemId  : taxonSynonymMap.keySet()) {
242
                addToSynonymCache(taxonItemId);
243
            }
244
        }
245
    }
246

    
247
    private List<Object> addToSynonymCache(Object taxonItemId) {
248
        Filter synonymOfTaxonFilter = new Compare.Equal("sr.relatedto_id", Integer.valueOf(taxonItemId.toString()));
249
        synonymContainer.addContainerFilter(synonymOfTaxonFilter);
250
        List<Object> synList = new ArrayList<Object>();
251
        synList.addAll(synonymContainer.getItemIds());
252
        for(Object synItemId : synList) {
253
            addSynItem((RowItem) synonymContainer.getItem(synItemId));
254
        }
255
        synonymContainer.removeAllContainerFilters();
256

    
257
        taxonSynonymMap.put(taxonItemId, synList);
258

    
259
        return synList;
260
    }
261

    
262
    @Override
263
    public Item getItem(Object itemId) {
264
        Item item = synItems.get(itemId);
265
        if(item == null) {
266
            item = super.getItem(itemId);
267
        }
268
        return item;
269
    }
270

    
271

    
272
    @Override
273
    public boolean removeAllItems() throws UnsupportedOperationException {
274
        taxonSynonymMap.clear();
275
        synItems.clear();
276
        return super.removeAllItems();
277
    }
278

    
279
    @Override
280
    public void refresh() {
281
        if(synItems != null) {
282
            synItems.clear();
283
        }
284
        refreshSynonymCache();
285
        super.refresh();
286
    }
287

    
288
    public void addSynItem(RowItem rowItem) {
289
        synItems.put(rowItem.getId(), rowItem);
290

    
291
    }
292

    
293
}
(4-4/4)