2 * Copyright (C) 2015 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.vaadin
.container
;
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
;
20 import org
.apache
.log4j
.Logger
;
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
;
32 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
33 import eu
.etaxonomy
.cdm
.vaadin
.util
.CdmQueryFactory
;
40 public class LeafNodeTaxonContainer
extends CdmSQLContainer
implements Container
.Hierarchical
{
42 private static final Logger logger
= Logger
.getLogger(LeafNodeTaxonContainer
.class);
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";
54 public Set
<Filter
> currentFilters
;
57 private Filter nrFilter
, unpFilter
, unfFilter
, unpbFilter
, rankFilter
, classificationFilter
, synonymFilter
, idFilter
;
58 private SimpleStringFilter nameFilter
;
60 private int classificationId
= -1;
62 private final Map
<RowId
, RowItem
> synItems
= new HashMap
<>();
64 private final Map
<Object
,List
<Object
>> taxonSynonymMap
;
66 private final CdmSQLContainer synonymContainer
;
71 * @throws SQLException
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
<>();
80 addContainerFilter(classificationFilter
);
81 enableCacheFlushNotifications();
82 addContainerFilter(rankFilter
);
85 private void initFilters() {
86 //nrFilter = new Compare.Equal(StatusPresenter.UNR_ID, true);
87 unpFilter
= new Compare
.Equal("tn.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
);
92 // get species aggregate rank order index
93 int saoIndex
= Rank
.SPECIESAGGREGATE().getOrderIndex();
94 rankFilter
= new Compare
.GreaterOrEqual("dtb.orderindex", saoIndex
);
96 synonymFilter
= new Not(new IsNull("acc.id"));
98 currentFilters
= new HashSet
<>();
103 public void setUnplacedFilter() {
104 addContainerFilter(unpFilter
);
108 public void removeUnplacedFilter() {
109 removeContainerFilter(unpFilter
);
113 public void setUnpublishedFilter() {
114 addContainerFilter(unpbFilter
);
118 public void removeUnpublishedFilter() {
119 removeContainerFilter(unpbFilter
);
123 public void setNameFilter(String filterString
) {
125 nameFilter
= new SimpleStringFilter("n.titleCache", filterString
, true, true);
126 addContainerFilter(nameFilter
);
130 public void removeNameFilter() {
131 removeContainerFilter(nameFilter
);
134 public void setIdFilter(Object itemId
) {
136 idFilter
= new Compare
.Equal("tb.id", itemId
.toString());
137 addContainerFilter(idFilter
);
140 public void removeIdFilter() {
141 removeContainerFilter(idFilter
);
144 public void removeDynamicFilters() {
145 removeUnplacedFilter();
146 removeUnpublishedFilter();
151 public int getTotalNoOfTaxa() {
156 public Collection
<?
> getChildren(Object itemId
) {
157 List
<Object
> synList
= taxonSynonymMap
.get(itemId
);
158 if(synList
!= null) {
162 return addToSynonymCache(itemId
);
166 public Object
getParent(Object itemId
) {
171 public Collection
<?
> rootItemIds() {
176 public boolean setParent(Object itemId
, Object newParentId
) throws UnsupportedOperationException
{
181 public boolean areChildrenAllowed(Object itemId
) {
182 Property
<?
> hasSynProperty
= getItem(itemId
).getItemProperty(HAS_SYN_ID
);
183 if(hasSynProperty
== null) {
186 return (Long
)hasSynProperty
.getValue() > 0;
190 public boolean setChildrenAllowed(Object itemId
, boolean areChildrenAllowed
) throws UnsupportedOperationException
{
195 public boolean isRoot(Object itemId
) {
200 public boolean hasChildren(Object itemId
) {
204 public boolean isSynonym(Object itemId
) {
205 Property
<?
> hasSynProperty
= getItem(itemId
).getItemProperty(HAS_SYN_ID
);
206 return hasSynProperty
== null;
209 public void removeTaxonFromCache(Object itemId
) {
210 taxonSynonymMap
.remove(itemId
);
213 public void refreshSynonymCache() {
214 if(taxonSynonymMap
!= null) {
215 for(Object taxonItemId
: taxonSynonymMap
.keySet()) {
216 addToSynonymCache(taxonItemId
);
221 private List
<Object
> addToSynonymCache(Object taxonItemId
) {
222 Filter synonymOfTaxonFilter
= new Compare
.Equal("acc.id", Integer
.valueOf(taxonItemId
.toString()));
223 synonymContainer
.addContainerFilter(synonymOfTaxonFilter
);
224 List
<Object
> synList
= new ArrayList
<>();
225 synList
.addAll(synonymContainer
.getItemIds());
226 for(Object synItemId
: synList
) {
227 addSynItem((RowItem
) synonymContainer
.getItem(synItemId
));
229 synonymContainer
.removeAllContainerFilters();
231 taxonSynonymMap
.put(taxonItemId
, synList
);
237 public Item
getItem(Object itemId
) {
238 Item item
= synItems
.get(itemId
);
240 item
= super.getItem(itemId
);
247 public boolean removeAllItems() throws UnsupportedOperationException
{
248 taxonSynonymMap
.clear();
250 return super.removeAllItems();
254 public void refresh() {
255 if(synItems
!= null) {
258 refreshSynonymCache();
262 public void addSynItem(RowItem rowItem
) {
263 synItems
.put(rowItem
.getId(), rowItem
);