Project

General

Profile

Download (8.21 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.synonymContainer.sort(new String[]{NAME_ID}, new boolean[]{true});
77
        this.classificationId = classificationId;
78
        taxonSynonymMap = new HashMap<Object,List<Object>>();
79
        initFilters();
80
        addContainerFilter(classificationFilter);
81
        enableCacheFlushNotifications();
82
        //addContainerFilter(rankFilter);
83
    }
84

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

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

    
97

    
98

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

    
103

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

    
108

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

    
113

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

    
118

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

    
125

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

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

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

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

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

    
151

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

    
162
        return addToSynonymCache(itemId);
163
    }
164

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

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

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

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

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

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

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

    
225
    public boolean isSynonym(Object itemId) {
226
        Property hasSynProperty = getItem(itemId).getItemProperty(HAS_SYN_ID);
227
        return hasSynProperty == null;
228
    }
229

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

    
234
    public void refreshSynonymCache() {
235
        if(taxonSynonymMap != null) {
236
            for(Object taxonItemId  : taxonSynonymMap.keySet()) {
237
                addToSynonymCache(taxonItemId);
238
            }
239
        }
240
    }
241

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

    
252
        taxonSynonymMap.put(taxonItemId, synList);
253

    
254
        return synList;
255
    }
256

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

    
266

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

    
274
    @Override
275
    public void refresh() {
276
        if(synItems != null) {
277
            synItems.clear();
278
        }
279
        refreshSynonymCache();
280
        super.refresh();
281
    }
282

    
283
    public void addSynItem(RowItem rowItem) {
284
        synItems.put(rowItem.getId(), rowItem);
285

    
286
    }
287

    
288
}
(4-4/4)