Project

General

Profile

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

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

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

    
30
import eu.etaxonomy.cdm.model.name.Rank;
31
import eu.etaxonomy.cdm.model.taxon.TaxonNodeStatus;
32
import eu.etaxonomy.cdm.vaadin.util.CdmQueryFactory;
33

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

    
40
    private static final long serialVersionUID = -1339368783995155526L;
41

    
42
    public static final String NAME_ID = "NAME";
43
    public static final String ACCTAXON_ID = "ACCTAXON";
44
    public static final String PB_ID = "PB";
45
    public static final String FN_ID = "FN";
46
    public static final String UNP_ID = "UNP";
47
    public static final String UNR_ID = "UNR";
48
    public static final String RANK_ID = "RANK";
49
    public static final String HAS_SYN_ID = "HASSYN";
50

    
51
    public Set<Filter> currentFilters;
52

    
53

    
54
    private Filter nrFilter, unpFilter, unfFilter, unpbFilter, rankFilter,  classificationFilter, synonymFilter, idFilter;
55
    private SimpleStringFilter nameFilter;
56

    
57
    private int classificationId = -1;
58

    
59
    private final Map<RowId, RowItem> synItems = new HashMap<>();
60

    
61
    private final Map<Object,List<Object>> taxonSynonymMap;
62

    
63
    private final CdmSQLContainer synonymContainer;
64

    
65

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

    
82
    private void initFilters() {
83
        //nrFilter = new Compare.Equal(StatusPresenter.UNR_ID, true);
84
        unpFilter = new Compare.Equal("tn.status", TaxonNodeStatus.UNPLACED.getKey());
85
        //unfFilter = new Compare.Equal(StatusPresenter.FN_ID, false);
86
        unpbFilter = new Compare.Equal("tb.publish", false);
87
        classificationFilter = new Compare.Equal("tn.classification_id", classificationId);
88

    
89
        // get species aggregate rank order index
90
        int saoIndex = Rank.SPECIESAGGREGATE().getOrderIndex();
91
        rankFilter = new Compare.GreaterOrEqual("dtb.orderindex", saoIndex);
92

    
93
        synonymFilter = new Not(new IsNull("acc.id"));
94

    
95
        currentFilters = new HashSet<>();
96
    }
97

    
98

    
99

    
100
    public void setUnplacedFilter() {
101
        addContainerFilter(unpFilter);
102
    }
103

    
104

    
105
    public void removeUnplacedFilter() {
106
        removeContainerFilter(unpFilter);
107
    }
108

    
109

    
110
    public void setUnpublishedFilter() {
111
        addContainerFilter(unpbFilter);
112
    }
113

    
114

    
115
    public void removeUnpublishedFilter() {
116
        removeContainerFilter(unpbFilter);
117
    }
118

    
119

    
120
    public void setNameFilter(String filterString) {
121
        removeNameFilter();
122
        nameFilter = new SimpleStringFilter("n.titleCache", filterString, true, true);
123
        addContainerFilter(nameFilter);
124
    }
125

    
126

    
127
    public void removeNameFilter() {
128
        removeContainerFilter(nameFilter);
129
    }
130

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

    
137
    public void removeIdFilter() {
138
        removeContainerFilter(idFilter);
139
    }
140

    
141
    public void removeDynamicFilters() {
142
        removeUnplacedFilter();
143
        removeUnpublishedFilter();
144
        removeNameFilter();
145
        removeIdFilter();
146

    
147
    }
148
    public int getTotalNoOfTaxa() {
149
        return size();
150
    }
151

    
152
    @Override
153
    public Collection<?> getChildren(Object itemId) {
154
        List<Object> synList = taxonSynonymMap.get(itemId);
155
        if(synList != null) {
156
            return synList;
157
        }
158

    
159
        return addToSynonymCache(itemId);
160
    }
161

    
162
    @Override
163
    public Object getParent(Object itemId) {
164
        return null;
165
    }
166

    
167
    @Override
168
    public Collection<?> rootItemIds() {
169
        return getItemIds();
170
    }
171

    
172
    @Override
173
    public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
174
        return true;
175
    }
176

    
177
    @Override
178
    public boolean areChildrenAllowed(Object itemId) {
179
        Property<?> hasSynProperty = getItem(itemId).getItemProperty(HAS_SYN_ID);
180
        if(hasSynProperty == null) {
181
            return false;
182
        }
183
       return (Long)hasSynProperty.getValue() > 0;
184
    }
185

    
186
    @Override
187
    public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException {
188
        return true;
189
    }
190

    
191
    @Override
192
    public boolean isRoot(Object itemId) {
193
        return true;
194
    }
195

    
196
    @Override
197
    public boolean hasChildren(Object itemId) {
198
        return true;
199
    }
200

    
201
    public boolean isSynonym(Object itemId) {
202
        Property<?> hasSynProperty = getItem(itemId).getItemProperty(HAS_SYN_ID);
203
        return hasSynProperty == null;
204
    }
205

    
206
    public void removeTaxonFromCache(Object itemId) {
207
        taxonSynonymMap.remove(itemId);
208
    }
209

    
210
    public void refreshSynonymCache() {
211
        if(taxonSynonymMap != null) {
212
            for(Object taxonItemId  : taxonSynonymMap.keySet()) {
213
                addToSynonymCache(taxonItemId);
214
            }
215
        }
216
    }
217

    
218
    private List<Object> addToSynonymCache(Object taxonItemId) {
219
        Filter synonymOfTaxonFilter = new Compare.Equal("acc.id", Integer.valueOf(taxonItemId.toString()));
220
        synonymContainer.addContainerFilter(synonymOfTaxonFilter);
221
        List<Object> synList = new ArrayList<>();
222
        synList.addAll(synonymContainer.getItemIds());
223
        for(Object synItemId : synList) {
224
            addSynItem((RowItem) synonymContainer.getItem(synItemId));
225
        }
226
        synonymContainer.removeAllContainerFilters();
227

    
228
        taxonSynonymMap.put(taxonItemId, synList);
229

    
230
        return synList;
231
    }
232

    
233
    @Override
234
    public Item getItem(Object itemId) {
235
        Item item = synItems.get(itemId);
236
        if(item == null) {
237
            item = super.getItem(itemId);
238
        }
239
        return item;
240
    }
241

    
242

    
243
    @Override
244
    public boolean removeAllItems() throws UnsupportedOperationException {
245
        taxonSynonymMap.clear();
246
        synItems.clear();
247
        return super.removeAllItems();
248
    }
249

    
250
    @Override
251
    public void refresh() {
252
        if(synItems != null) {
253
            synItems.clear();
254
        }
255
        refreshSynonymCache();
256
        super.refresh();
257
    }
258

    
259
    public void addSynItem(RowItem rowItem) {
260
        synItems.put(rowItem.getId(), rowItem);
261

    
262
    }
263

    
264
}
(4-4/7)