2 * Copyright (C) 2007 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.
10 package eu
.etaxonomy
.taxeditor
.store
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Collection
;
14 import java
.util
.Comparator
;
15 import java
.util
.HashMap
;
16 import java
.util
.Iterator
;
17 import java
.util
.List
;
19 import java
.util
.UUID
;
21 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTermBase
;
22 import eu
.etaxonomy
.cdm
.model
.term
.TermBase
;
23 import eu
.etaxonomy
.cdm
.model
.term
.TermType
;
24 import eu
.etaxonomy
.cdm
.model
.term
.TermVocabulary
;
25 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermDto
;
26 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermVocabularyDto
;
27 import eu
.etaxonomy
.taxeditor
.model
.DefaultTermComparator
;
28 import eu
.etaxonomy
.taxeditor
.model
.TaxonRelationshipTypeInverseContainer
;
29 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
33 * @created Dec 7, 2010
36 public class TermManager
{
38 private static final String TERMS
= "terms";
39 private static final String TERM
= "term";
40 private static final String HIDE
= "hide";
42 private static final String CLASS
= "class";
43 private static final String UUID_STRING
= "uuid";
46 private Map
<Object
, List
> cachedTermMap
= new HashMap
<>();
49 //new cache for features!!
50 //dinstinguish preferences for both
61 public <T
extends DefinedTermBase
> List
<T
> getPreferredTerms(TermType termType
){
62 List terms
= cachedTermMap
.get(termType
);
63 if(terms
==null || terms
.isEmpty()){
64 terms
= getFilteredTerms(TermStore
.<T
>getTerms(termType
, null));
65 cachedTermMap
.put(termType
, terms
);
75 public <T
extends DefinedTermBase
> List
<T
> getPreferredTerms(TermVocabulary
<T
> termVocabulary
){
76 List terms
= cachedTermMap
.get(termVocabulary
.getUuid());
78 terms
= getFilteredTerms(new ArrayList
<T
>(TermStore
.getTerms(termVocabulary
,null)));
79 cachedTermMap
.put(termVocabulary
.getUuid(), terms
);
89 public List
<TermDto
> getPreferredTerms(TermVocabularyDto termVocabularyDto
){
90 List terms
= cachedTermMap
.get(termVocabularyDto
.getUuid());
92 terms
= getFilteredTermDtos(new ArrayList
<>(termVocabularyDto
.getTerms()));
93 cachedTermMap
.put(termVocabularyDto
.getUuid(), terms
);
103 public <T
extends DefinedTermBase
> List
<T
> getPreferredTerms(TermVocabulary
<T
> termVocabulary
, Comparator comp
){
105 comp
= new DefaultTermComparator
<T
>();
107 List terms
= cachedTermMap
.get(termVocabulary
.getUuid());
108 List
<T
> termBaseList
= new ArrayList();
110 terms
= getFilteredTerms(new ArrayList
<T
>(TermStore
.getTerms(termVocabulary
,comp
)));
111 cachedTermMap
.put(termVocabulary
.getUuid(), terms
);
113 Iterator iterator
= terms
.iterator();
114 DefinedTermBase termBase
= null;
115 List
<UUID
> uuids
= new ArrayList();
116 while (iterator
.hasNext()){
117 Object term
= iterator
.next();
118 if (term
instanceof TermDto
){
119 TermDto dto
= (TermDto
)term
;
120 uuids
.add(dto
.getUuid());
122 termBaseList
.add((T
)term
);
126 if (!uuids
.isEmpty()){
127 termBaseList
.addAll(this.getTerms(uuids
, DefinedTermBase
.class));
131 termBaseList
.sort(comp
);
132 terms
= termBaseList
;
140 public <T
extends DefinedTermBase
> List
<T
> getPreferredTerms(Class
<T
> clazz
){
141 List terms
= cachedTermMap
.get(clazz
);
143 terms
= getFilteredTerms(TermStore
.getTerms(clazz
));
144 cachedTermMap
.put(clazz
, terms
);
151 * Generic method to get term preferences for a term vocabulary
153 * @param initialTerms a {@link java.util.List} object.
154 * @return a {@link java.util.List} object.
156 public <T
extends DefinedTermBase
> List
<T
> getFilteredTerms(List
<T
> initialTerms
){
158 List
<T
> filteredTerms
= new ArrayList
<T
>();
160 for (T term
: initialTerms
){
162 if (term
instanceof TaxonRelationshipTypeInverseContainer
){
163 if(!PreferencesUtil
.getBooleanValue(getPrefName(term
))){
164 T type
= (T
)((TaxonRelationshipTypeInverseContainer
) term
).getType();
165 filteredTerms
.add(type
);
170 if(PreferencesUtil
.getBooleanValue(getPrefName(term
))){
171 filteredTerms
.add(term
);
174 if (filteredTerms
.isEmpty()){
178 return filteredTerms
;
182 * Generic method to get term preferences for a term vocabulary
184 * @param initialTerms a {@link java.util.List} object.
185 * @return a {@link java.util.List} object.
187 public List
<TermDto
> getFilteredTermDtos(List
<TermDto
> initialTerms
){
189 List
<TermDto
> filteredTerms
= new ArrayList();
191 for (TermDto term
: initialTerms
){
193 //TODO:inverse terms!!
195 if(PreferencesUtil
.getBooleanValue(getPrefNameByDto(term
))){
196 filteredTerms
.add(term
);
199 if (filteredTerms
.isEmpty()){
203 return filteredTerms
;
206 private <T
extends TermBase
> String
getPrefName(T term
) {
207 return term
.getTermType()!=null?term
.getTermType().toString()+term
.getUuid().toString():""+term
.getUuid().toString();
209 private String
getPrefNameByDto(TermDto term
) {
210 return term
.getTermType()!=null?term
.getTermType().toString()+term
.getUuid().toString():""+term
.getUuid().toString();
213 private <T
extends DefinedTermBase
> TermVocabulary
<T
> getTermVocabulary(Collection
<T
> initialTerms
){
215 TermType result
= null;
216 if(!initialTerms
.isEmpty()){
217 T entity
= initialTerms
.iterator().next();
218 return entity
.getVocabulary();
223 private TermVocabularyDto
getTermVocabularyByDto(Collection
<TermDto
> initialTerms
){
225 TermType result
= null;
226 if(!initialTerms
.isEmpty()){
227 TermDto entity
= initialTerms
.iterator().next();
228 return entity
.getVocabularyDto();
235 * Generic method to set term preferences
237 * @param preferredTerms a {@link java.util.List} object.
238 * @param initialTerms a {@link java.util.List} object.
239 * @param <T> a T object.
241 public <T
extends DefinedTermBase
> void setPreferredTerms(Collection
<T
> preferredTerms
, Collection
<T
> initialTerms
){
242 TermVocabulary
<T
> voc
= getTermVocabulary(initialTerms
);
244 Collection
<UUID
> undesiredTermUuids
= new ArrayList
<UUID
>();
246 for(TermBase term
: initialTerms
){
247 if(! preferredTerms
.contains(term
)){
248 undesiredTermUuids
.add(term
.getUuid());
249 PreferencesUtil
.setBooleanValue(getPrefName(term
), false);
251 PreferencesUtil
.setBooleanValue(getPrefName(term
), true);
254 clearTermMapForTermVoc(voc
.getUuid());
262 * Generic method to set term preferences
264 * @param preferredTerms a {@link java.util.List} object.
265 * @param initialTerms a {@link java.util.List} object.
266 * @param <T> a T object.
268 public <T
extends DefinedTermBase
> void setPreferredTermsByType(Collection
<T
> preferredTerms
, TermType type
){
272 List
<DefinedTermBase
> oldValues
= getPreferredTerms(type
);
273 for (DefinedTermBase term
: oldValues
){
274 PreferencesUtil
.setBooleanValue(getPrefName(term
), false);
276 for(TermBase term
: preferredTerms
){
277 PreferencesUtil
.setBooleanValue(getPrefName(term
), true);
281 clearTermMapForTermType(type
);
282 List
<DefinedTermBase
> list
= new ArrayList
<>(preferredTerms
);
283 cachedTermMap
.put(type
.getUuid(), list
);
289 * Generic method to set term preferences
291 * @param preferredTerms a {@link java.util.List} object.
292 * @param initialTerms a {@link java.util.List} object.
293 * @param <T> a T object.
295 public void setPreferredTermsByDto(Collection
<TermDto
> preferredTerms
, TermVocabularyDto vocDto
){
297 List
<TermDto
> oldValues
= getPreferredTerms(vocDto
);
298 for (TermDto term
: oldValues
){
299 PreferencesUtil
.setBooleanValue(getPrefNameByDto(term
), false);
301 for(TermDto term
: preferredTerms
){
302 PreferencesUtil
.setBooleanValue(getPrefNameByDto(term
), true);
306 //if (initialTerms.iterator().hasNext()){
307 clearTermMapForTermVoc(vocDto
.getUuid());
308 List
<TermDto
> list
= new ArrayList
<>(preferredTerms
);
309 cachedTermMap
.put(vocDto
.getUuid(), list
);
315 public <T
extends DefinedTermBase
> void clearTermMapForTermVoc(UUID vocUuid
){
316 cachedTermMap
.remove(vocUuid
);
319 public void clearTermMapForTermType(TermType termType
){
320 cachedTermMap
.remove(termType
);
324 * Generic method to get term preferences for a term vocabulary
326 * @param initialTerms a {@link java.util.List} object.
327 * @return a {@link java.util.List} object.
329 public <T
extends DefinedTermBase
> List
<T
> getTerms(List
<UUID
> uuidList
, Class clazz
){
331 List
<T
> filteredTerms
= new ArrayList
<T
>();
332 List
<T
> terms
= TermStore
.getTerms(clazz
);
333 if (uuidList
== null || uuidList
.isEmpty()){
336 for (T term
: terms
){
337 if(uuidList
.contains(term
.getUuid())){
338 filteredTerms
.add(term
);
342 return filteredTerms
;
346 * Generic method to get term preferences for a term vocabulary
348 * @param initialTerms a {@link java.util.List} object.
349 * @return a {@link java.util.List} object.
351 public <T
extends DefinedTermBase
> List
<T
> getAllTerms(TermType type
, Comparator comparator
){
352 List
<T
> terms
= TermStore
.getTerms(type
, comparator
);