3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.taxeditor
.store
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Arrays
;
15 import java
.util
.Collections
;
16 import java
.util
.Comparator
;
17 import java
.util
.HashSet
;
18 import java
.util
.List
;
21 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
22 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
23 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
24 import eu
.etaxonomy
.cdm
.model
.description
.AbsenceTerm
;
25 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
26 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTermBase
;
27 import eu
.etaxonomy
.cdm
.model
.description
.PresenceTerm
;
28 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
29 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
30 import eu
.etaxonomy
.taxeditor
.model
.TaxonRelationshipTypeInverseContainer
;
31 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
34 * All terms may be accessed through this store.
35 * Note: This is for internal use. When using vocabularies in the UI, try to use the preferred terms from
42 public class TermStore
{
46 public static <TERM
extends DefinedTermBase
> List
<TERM
> getTerms(Class
<TERM
> clazz
){
47 return getTerms(clazz
, null, true);
51 * Returns a list of terms of the given type currently available in the system.
52 * If <code>filtered</code> is set to <code>true</code>, all terms for certain types will be
53 * gathered from edge cases.
57 * @param filtered Will filter out some results
60 public static <TERM
extends DefinedTermBase
> List
<TERM
> getTerms(Class
<TERM
> clazz
, Comparator
<TERM
> comparator
, boolean filtered
){
61 List
<TERM
> terms
= new ArrayList
<TERM
>();
63 ITermStoreEdgeCase
<TERM
> edgeCase
= getEdgeCase(clazz
);
64 if(filtered
&& edgeCase
!= null){
65 terms
= edgeCase
.getTerms();
67 terms
= getTermsFromService(clazz
, comparator
);
74 private static <T
extends DefinedTermBase
> List
<T
> getTermsFromService(Class
<T
> termClass
, Comparator
<T
> comparator
){
75 if (comparator
== null){
76 comparator
= new Comparator
<T
>() {
78 public int compare(T o1
, T o2
) {
79 String label1
= o1
.getLabel(CdmStore
.getDefaultLanguage()) != null ? o1
.getLabel(CdmStore
.getDefaultLanguage()) : o1
.getTitleCache();
80 String label2
= o2
.getLabel(CdmStore
.getDefaultLanguage()) != null ? o2
.getLabel(CdmStore
.getDefaultLanguage()) : o2
.getTitleCache();
81 return label1
.compareTo(label2
);
86 List
<T
> terms
= CdmStore
.getService(ITermService
.class).listByTermClass(termClass
, null, null, null, null);
87 Collections
.sort(terms
, comparator
);
92 // * <p>getFeatures</p>
94 // * @return a {@link java.util.List} object.
96 // public static List<Feature> getFeatures() {
97 // List<Feature> features = getTerms(Feature.class);
98 // features.remove(Feature.IMAGE());
105 // * <p>getNonTechnicalMarkerTypes</p>
107 // * @return a {@link java.util.List} object.
109 // public static List<MarkerType> getNonTechnicalMarkerTypes() {
110 // List<MarkerType> nonTechnicalMarkerTypes = new ArrayList<MarkerType>();
111 // List<MarkerType> markerTypes = getTerms(MarkerType.class);
113 // for (Object type : markerTypes) {
114 // if (((MarkerType) type).isTechnical() == false) {
115 // nonTechnicalMarkerTypes.add((MarkerType) type);
119 // return nonTechnicalMarkerTypes;
123 // * Retrieve all ranks from data store.
125 // * @return a {@link java.util.List} object.
127 // public static List<Rank> getRanks(){
128 // if(PreferencesUtil.getSortRanksHierarchichally()){
129 // return getTerms(Rank.class, new Comparator<Rank>(){
132 // public int compare(Rank o1, Rank o2) {
133 // return o1.compareTo(o2);
138 // return getTerms(Rank.class);
144 // * Retrieve all presence and absence terms from data store.
146 // * @return a {@link java.util.List} object.
148 // public static List<PresenceAbsenceTermBase> getPresenceAbsenceTerms() {
149 // List presenceAbsenceTerms = getTerms(PresenceTerm.class);
150 // presenceAbsenceTerms.addAll(getTerms(AbsenceTerm.class));
152 // return presenceAbsenceTerms;
156 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
158 public static void saveTerm(DefinedTermBase term
){
159 CdmStore
.getService(ITermService
.class).saveOrUpdate(term
);
165 * @param selected a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
167 public static void delete(DefinedTermBase selected
) {
168 CdmStore
.getService(ITermService
.class).delete(selected
);
172 * Save a vacabulary to data store
174 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
176 public static void updateVocabulary(DefinedTermBase term
) {
177 CdmStore
.getService(ITermService
.class).saveOrUpdate(term
);
180 private static Set
<ITermStoreEdgeCase
<?
extends DefinedTermBase
>> termStoreEdgeCases
= new HashSet
<ITermStoreEdgeCase
<?
extends DefinedTermBase
>>();
183 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<Feature
>() {
186 public Class
<Feature
> getTermClass() {
187 return Feature
.class;
191 public List
<Feature
> getTerms() {
192 List
<Feature
> features
= TermStore
.getTermsFromService(Feature
.class, null);
193 features
.remove(Feature
.IMAGE());
197 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<MarkerType
>(){
200 public Class
<MarkerType
> getTermClass() {
201 return MarkerType
.class;
205 public List
<MarkerType
> getTerms() {
206 // filter out non technical markers
207 List
<MarkerType
> nonTechnicalMarkerTypes
= new ArrayList
<MarkerType
>();
208 List
<MarkerType
> markerTypes
= TermStore
.getTermsFromService(MarkerType
.class, null);
210 for (Object type
: markerTypes
) {
211 if (((MarkerType
) type
).isTechnical() == false) {
212 nonTechnicalMarkerTypes
.add((MarkerType
) type
);
216 return nonTechnicalMarkerTypes
;
220 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<Rank
>() {
223 public Class
<Rank
> getTermClass() {
228 public List
<Rank
> getTerms() {
229 if(PreferencesUtil
.getSortRanksHierarchichally()){
230 return TermStore
.getTermsFromService(Rank
.class, new Comparator
<Rank
>(){
233 public int compare(Rank o1
, Rank o2
) {
234 return o1
.compareTo(o2
);
239 return TermStore
.getTermsFromService(Rank
.class, null);
244 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<PresenceAbsenceTermBase
>() {
247 public Class
<PresenceAbsenceTermBase
> getTermClass() {
248 return PresenceAbsenceTermBase
.class;
252 public List
<PresenceAbsenceTermBase
> getTerms() {
253 List presenceAbsenceTerms
= TermStore
.getTermsFromService(PresenceTerm
.class, null);
254 presenceAbsenceTerms
.addAll(TermStore
.getTermsFromService(AbsenceTerm
.class, null));
256 return presenceAbsenceTerms
;
259 termStoreEdgeCases
.add(new ITermStoreEdgeCase
<TaxonRelationshipTypeInverseContainer
>() {
262 public Class
<TaxonRelationshipTypeInverseContainer
> getTermClass() {
263 return TaxonRelationshipTypeInverseContainer
.class;
267 public List
<TaxonRelationshipTypeInverseContainer
> getTerms() {
268 List
<TaxonRelationshipType
> excludeTaxonRelationshipTypes
= Arrays
.asList(new TaxonRelationshipType
[]{
269 TaxonRelationshipType
.TAXONOMICALLY_INCLUDED_IN(),
270 TaxonRelationshipType
.MISAPPLIED_NAME_FOR(),
271 TaxonRelationshipType
.ALL_RELATIONSHIPS()
274 List
<TaxonRelationshipTypeInverseContainer
> relationshipTypeInverseContainers
= new ArrayList
<TaxonRelationshipTypeInverseContainer
>();
276 List
<TaxonRelationshipType
> relationshipTypes
= TermStore
.getTerms(TaxonRelationshipType
.class);
278 relationshipTypes
.removeAll(excludeTaxonRelationshipTypes
);
280 for (TaxonRelationshipType relationshipType
: relationshipTypes
){
281 if(!relationshipType
.isSymmetric()){
282 TaxonRelationshipTypeInverseContainer inverseContainer
= new TaxonRelationshipTypeInverseContainer(relationshipType
, true);
283 relationshipTypeInverseContainers
.add(inverseContainer
);
285 TaxonRelationshipTypeInverseContainer container
= new TaxonRelationshipTypeInverseContainer(relationshipType
, false);
286 relationshipTypeInverseContainers
.add(container
);
289 return relationshipTypeInverseContainers
;
294 private static <T
extends DefinedTermBase
> ITermStoreEdgeCase
<T
> getEdgeCase(Class
<T
> termClass
) {
296 for (ITermStoreEdgeCase termStoreEdgeCase
: termStoreEdgeCases
){
297 if (termStoreEdgeCase
.getTermClass().equals(termClass
)){
298 return termStoreEdgeCase
;
305 private interface ITermStoreEdgeCase
<TERM
> {
307 public abstract Class
<TERM
> getTermClass();
309 public abstract List
<TERM
> getTerms();