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.
9 package eu
.etaxonomy
.taxeditor
.store
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Collections
;
13 import java
.util
.Comparator
;
14 import java
.util
.HashSet
;
15 import java
.util
.List
;
18 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
19 import eu
.etaxonomy
.cdm
.api
.service
.exception
.ReferencedObjectUndeletableException
;
20 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
21 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
22 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTerm
;
23 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
24 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTermBase
;
25 import eu
.etaxonomy
.cdm
.model
.term
.TermType
;
26 import eu
.etaxonomy
.cdm
.model
.term
.TermVocabulary
;
27 import eu
.etaxonomy
.taxeditor
.model
.DefaultTermComparator
;
28 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
31 * All terms may be accessed through this store.
32 * Note: This is for internal use. When using vocabularies in the UI, try to use the preferred terms from
38 public class TermStore
{
41 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given type currently available in the system.
43 * @param clazz a class that inherits from {@link DefinedTermBase}
44 * @return an alphabetically sorted list of terms
46 public static <TERM
extends DefinedTermBase
> List
<TERM
> getTerms(Class
<TERM
> clazz
){
47 return getTerms(clazz
, null, true);
51 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given {@link TermType})
52 * currently available in the system.
54 * @param termType the term type
55 * @return an alphabetically sorted list of terms
57 public static <TERM
extends DefinedTermBase
> List
<TERM
> getTerms(TermType termType
, Comparator
<TERM
> comparator
){
58 return getTermsFromService(termType
, comparator
);
62 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given {@link TermType})
63 * currently available in the system.
65 * @param termType the term type
66 * @return an alphabetically sorted list of terms
68 public static <TERM
extends DefinedTermBase
> Set
<TERM
> getTerms(TermVocabulary
<TERM
> termVocabulary
, Comparator
<DefinedTermBase
<?
>> comparator
){
69 return termVocabulary
.getTerms();
73 * Returns a list of terms of the given type currently available in the system.
74 * If <code>filtered</code> is set to <code>true</code>, all terms for certain types will be
75 * gathered from edge cases.
77 * @param clazz a class that inherits from {@link DefinedTermBase}
78 * @param comparator a {@link Comparator} that defines the sorting algorithm. If set to null, {@link DefaultTermComparator} will be used
79 * @param filtered if set to true, some terms are filtered from the result (according to definition in {@link ITermStoreEdgeCase}s)
80 * @return a sorted list of terms
82 public static <TERM
extends DefinedTermBase
> List
<TERM
> getTerms(Class
<TERM
> clazz
, Comparator
<TERM
> comparator
, boolean filtered
){
83 List
<TERM
> terms
= new ArrayList
<>();
85 ITermStoreEdgeCase
<TERM
> edgeCase
= getEdgeCase(clazz
);
86 if(filtered
&& edgeCase
!= null){
87 terms
= edgeCase
.getTerms();
89 terms
= getTermsFromService(clazz
, comparator
);
95 private static <T
extends DefinedTermBase
> List
<T
> getTermsFromService(TermType termType
, Comparator
<T
> comparator
){
96 if (comparator
== null){
97 comparator
= new DefaultTermComparator
<T
>();
100 List
<T
> terms
= CdmStore
.getService(ITermService
.class).listByTermType(termType
, null, null, null, null);
101 Collections
.sort(terms
, comparator
);
105 private static <T
extends DefinedTermBase
> List
<T
> getTermsFromService(Class
<T
> termClass
, Comparator
<T
> comparator
){
106 if (comparator
== null){
107 comparator
= new DefaultTermComparator
<T
>();
110 List
<T
> terms
= CdmStore
.getService(ITermService
.class).list(termClass
, null, null, null, null);
111 Collections
.sort(terms
, comparator
);
115 public static void saveTerm(DefinedTermBase term
){
116 CdmStore
.getService(ITermService
.class).saveOrUpdate(term
);
122 * @param selected a {@link eu.etaxonomy.cdm.model.term.DefinedTermBase} object.
123 * @throws ReferencedObjectUndeletableException
125 public static void delete(DefinedTermBase selected
) throws ReferencedObjectUndeletableException
{
126 CdmStore
.getService(ITermService
.class).delete(selected
);
130 * Save a vacabulary to data store
132 * @param term a {@link eu.etaxonomy.cdm.model.term.DefinedTermBase} object.
134 public static void updateVocabulary(DefinedTermBase term
) {
135 CdmStore
.getService(ITermService
.class).saveOrUpdate(term
);
139 * Handling of special cases
141 private static Set
<ITermStoreEdgeCase
<?
extends DefinedTermBase
>> termStoreEdgeCases
= new HashSet
<>();
144 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<Feature
>() {
147 public Class
<Feature
> getTermClass() {
148 return Feature
.class;
152 public List
<Feature
> getTerms() {
153 List
<Feature
> features
= TermStore
.getTermsFromService(Feature
.class, null);
154 features
.remove(Feature
.IMAGE());
158 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<MarkerType
>(){
161 public Class
<MarkerType
> getTermClass() {
162 return MarkerType
.class;
166 public List
<MarkerType
> getTerms() {
167 // filter out non technical markers
168 List
<MarkerType
> nonTechnicalMarkerTypes
= new ArrayList
<>();
169 List
<MarkerType
> markerTypes
= TermStore
.getTermsFromService(MarkerType
.class, null);
171 for (Object type
: markerTypes
) {
172 if (((MarkerType
) type
).isTechnical() == false) {
173 nonTechnicalMarkerTypes
.add((MarkerType
) type
);
177 return nonTechnicalMarkerTypes
;
181 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<Rank
>() {
184 public Class
<Rank
> getTermClass() {
189 public List
<Rank
> getTerms() {
190 if(PreferencesUtil
.getSortRanksHierarchichally()){
191 return TermStore
.getTermsFromService(Rank
.class, new Comparator
<Rank
>(){
193 public int compare(Rank o1
, Rank o2
) {
194 return o1
.compareTo(o2
);
198 return TermStore
.getTermsFromService(Rank
.class, null);
202 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<PresenceAbsenceTerm
>() {
204 public Class
<PresenceAbsenceTerm
> getTermClass() {
205 return PresenceAbsenceTerm
.class;
208 public List
<PresenceAbsenceTerm
> getTerms() {
209 List
<PresenceAbsenceTerm
> presenceAbsenceTerms
= TermStore
.getTermsFromService(PresenceAbsenceTerm
.class, null);
211 return presenceAbsenceTerms
;
214 // termStoreEdgeCases.add(new ITermStoreEdgeCase<TaxonRelationshipTypeInverseContainer>() {
216 // public Class<TaxonRelationshipTypeInverseContainer> getTermClass() {
217 // return TaxonRelationshipTypeInverseContainer.class;
220 // public List<TaxonRelationshipTypeInverseContainer> getTerms() {
221 // List<TaxonRelationshipType> excludeTaxonRelationshipTypes = Arrays.asList(new TaxonRelationshipType[]{
222 // TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN(),
223 // TaxonRelationshipType.MISAPPLIED_NAME_FOR(),
224 // TaxonRelationshipType.ALL_RELATIONSHIPS()
227 // List<TaxonRelationshipTypeInverseContainer> relationshipTypeInverseContainers = new ArrayList<>();
229 // List<TaxonRelationshipType> relationshipTypes = TermStore.getTerms(TaxonRelationshipType.class);
231 // relationshipTypes.removeAll(excludeTaxonRelationshipTypes);
233 // for (TaxonRelationshipType relationshipType : relationshipTypes){
234 // if(!relationshipType.isSymmetric()){
235 // TaxonRelationshipTypeInverseContainer inverseContainer = new TaxonRelationshipTypeInverseContainer(relationshipType, true);
236 // relationshipTypeInverseContainers.add(inverseContainer);
238 // TaxonRelationshipTypeInverseContainer container = new TaxonRelationshipTypeInverseContainer(relationshipType, false);
239 // relationshipTypeInverseContainers.add(container);
242 // return relationshipTypeInverseContainers;
247 private static <T
extends DefinedTermBase
> ITermStoreEdgeCase
<T
> getEdgeCase(Class
<T
> termClass
) {
249 for (ITermStoreEdgeCase termStoreEdgeCase
: termStoreEdgeCases
){
250 if (termStoreEdgeCase
.getTermClass().equals(termClass
)){
251 return termStoreEdgeCase
;
258 private interface ITermStoreEdgeCase
<TERM
> {
260 public abstract Class
<TERM
> getTermClass();
262 public abstract List
<TERM
> getTerms();