Project

General

Profile

Download (7.5 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 org.apache.log4j.Logger;
21

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

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

    
36
/**
37
 * @author cmathew
38
 * @since 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 = "ACCTAXON";
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 = "HASSYN";
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<>();
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<>();
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("tn.status", TaxonNodeStatus.UNPLACED.getKey());
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("acc.id"));
98

    
99
        currentFilters = new HashSet<>();
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("n.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
    @Override
157
    public Collection<?> getChildren(Object itemId) {
158
        List<Object> synList = taxonSynonymMap.get(itemId);
159
        if(synList != null) {
160
            return synList;
161
        }
162

    
163
        return addToSynonymCache(itemId);
164
    }
165

    
166
    @Override
167
    public Object getParent(Object itemId) {
168
        return null;
169
    }
170

    
171
    @Override
172
    public Collection<?> rootItemIds() {
173
        return getItemIds();
174
    }
175

    
176
    @Override
177
    public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
178
        return true;
179
    }
180

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

    
190
    @Override
191
    public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException {
192
        return true;
193
    }
194

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

    
200
    @Override
201
    public boolean hasChildren(Object itemId) {
202
        return true;
203
    }
204

    
205
    public boolean isSynonym(Object itemId) {
206
        Property<?> hasSynProperty = getItem(itemId).getItemProperty(HAS_SYN_ID);
207
        return hasSynProperty == null;
208
    }
209

    
210
    public void removeTaxonFromCache(Object itemId) {
211
        taxonSynonymMap.remove(itemId);
212
    }
213

    
214
    public void refreshSynonymCache() {
215
        if(taxonSynonymMap != null) {
216
            for(Object taxonItemId  : taxonSynonymMap.keySet()) {
217
                addToSynonymCache(taxonItemId);
218
            }
219
        }
220
    }
221

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

    
232
        taxonSynonymMap.put(taxonItemId, synList);
233

    
234
        return synList;
235
    }
236

    
237
    @Override
238
    public Item getItem(Object itemId) {
239
        Item item = synItems.get(itemId);
240
        if(item == null) {
241
            item = super.getItem(itemId);
242
        }
243
        return item;
244
    }
245

    
246

    
247
    @Override
248
    public boolean removeAllItems() throws UnsupportedOperationException {
249
        taxonSynonymMap.clear();
250
        synItems.clear();
251
        return super.removeAllItems();
252
    }
253

    
254
    @Override
255
    public void refresh() {
256
        if(synItems != null) {
257
            synItems.clear();
258
        }
259
        refreshSynonymCache();
260
        super.refresh();
261
    }
262

    
263
    public void addSynItem(RowItem rowItem) {
264
        synItems.put(rowItem.getId(), rowItem);
265

    
266
    }
267

    
268
}
(4-4/7)