Project

General

Profile

Download (9.25 KB) Statistics
| Branch: | Tag: | Revision:
1 3fb05254 n.hoffmann
// $Id$
2
/**
3
* Copyright (C) 2007 EDIT
4 ccc7ac6f Patric Plitzner
* European Distributed Institute of Taxonomy
5 3fb05254 n.hoffmann
* http://www.e-taxonomy.eu
6 ccc7ac6f Patric Plitzner
*
7 3fb05254 n.hoffmann
* 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
11
package eu.etaxonomy.taxeditor.store;
12
13
import java.util.ArrayList;
14 b9a0d300 l.morris
import java.util.Arrays;
15 3fb05254 n.hoffmann
import java.util.Collections;
16
import java.util.Comparator;
17 b9a0d300 l.morris
import java.util.HashSet;
18 3fb05254 n.hoffmann
import java.util.List;
19 b9a0d300 l.morris
import java.util.Set;
20 3fb05254 n.hoffmann
21 1d9ed6ce n.hoffmann
import eu.etaxonomy.cdm.api.service.ITermService;
22 97e10b7c Katja Luther
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
23 3fb05254 n.hoffmann
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
24
import eu.etaxonomy.cdm.model.common.MarkerType;
25 ccc7ac6f Patric Plitzner
import eu.etaxonomy.cdm.model.common.TermType;
26 7084aeff Patric Plitzner
import eu.etaxonomy.cdm.model.common.TermVocabulary;
27 3fb05254 n.hoffmann
import eu.etaxonomy.cdm.model.description.Feature;
28 da005e87 Patric Plitzner
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
29 3fb05254 n.hoffmann
import eu.etaxonomy.cdm.model.name.Rank;
30
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
31 78222507 n.hoffmann
import eu.etaxonomy.taxeditor.model.DefaultTermComparator;
32 b9a0d300 l.morris
import eu.etaxonomy.taxeditor.model.TaxonRelationshipTypeInverseContainer;
33 30140758 n.hoffmann
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
34 3fb05254 n.hoffmann
35
/**
36
 * All terms may be accessed through this store.
37
 * Note: This is for internal use. When using vocabularies in the UI, try to use the preferred terms from
38
 * PreferenceUtil
39 3be6ef3e n.hoffmann
 *
40 3fb05254 n.hoffmann
 * @author n.hoffmann
41
 * @created 25.06.2009
42
 * @version 1.0
43
 */
44
public class TermStore {
45 ccc7ac6f Patric Plitzner
46 caaaa636 n.hoffmann
	/**
47 ccc7ac6f Patric Plitzner
	 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given type currently available in the system.
48
	 *
49 caaaa636 n.hoffmann
	 * @param clazz a class that inherits from {@link DefinedTermBase}
50
	 * @return an alphabetically sorted list of terms
51
	 */
52 b9a0d300 l.morris
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz){
53
		return getTerms(clazz, null, true);
54 3fb05254 n.hoffmann
	}
55 ccc7ac6f Patric Plitzner
56
	/**
57
	 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given {@link TermType})
58
	 * currently available in the system.
59
	 *
60
	 * @param termType the term type
61
	 * @return an alphabetically sorted list of terms
62
	 */
63 1d716a84 Patrick Plitzner
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(TermType termType, Comparator<TERM> comparator){
64 ccc7ac6f Patric Plitzner
        return getTermsFromService(termType, comparator);
65
	}
66
67 7084aeff Patric Plitzner
	/**
68
	 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given {@link TermType})
69
	 * currently available in the system.
70
	 *
71
	 * @param termType the term type
72
	 * @return an alphabetically sorted list of terms
73
	 */
74
	public static <TERM extends DefinedTermBase> Set<TERM> getTerms(TermVocabulary<TERM> termVocabulary, Comparator<DefinedTermBase<?>> comparator){
75
	    return termVocabulary.getTerms();
76
	}
77
78 3fb05254 n.hoffmann
	/**
79 ccc7ac6f Patric Plitzner
	 * Returns a list of terms of the given type currently available in the system.
80 b9a0d300 l.morris
	 * If <code>filtered</code> is set to <code>true</code>, all terms for certain types will be
81
	 * gathered from edge cases.
82 ccc7ac6f Patric Plitzner
	 *
83 caaaa636 n.hoffmann
	 * @param clazz a class that inherits from {@link DefinedTermBase}
84
	 * @param comparator a {@link Comparator} that defines the sorting algorithm. If set to null, {@link DefaultTermComparator} will be used
85
	 * @param filtered if set to true, some terms are filtered from the result (according to definition in {@link ITermStoreEdgeCase}s)
86
	 * @return a sorted list of terms
87 3fb05254 n.hoffmann
	 */
88 b9a0d300 l.morris
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz, Comparator<TERM> comparator, boolean filtered){
89
		List<TERM> terms = new ArrayList<TERM>();
90 3fb05254 n.hoffmann
91 b9a0d300 l.morris
		ITermStoreEdgeCase<TERM> edgeCase = getEdgeCase(clazz);
92
		if(filtered && edgeCase != null){
93
			terms = edgeCase.getTerms();
94
		}else{
95
			terms = getTermsFromService(clazz, comparator);
96 3fb05254 n.hoffmann
		}
97 ccc7ac6f Patric Plitzner
98 b9a0d300 l.morris
		return terms;
99 ccc7ac6f Patric Plitzner
100 3fb05254 n.hoffmann
	}
101 ccc7ac6f Patric Plitzner
102
	/**
103
	 *
104
	 * @param termClass
105
	 * @param comparator
106
	 * @return
107
	 */
108 1d716a84 Patrick Plitzner
	private static <T extends DefinedTermBase> List<T> getTermsFromService(TermType termType, Comparator<T> comparator){
109 ccc7ac6f Patric Plitzner
	    if (comparator == null){
110 1d716a84 Patrick Plitzner
	        comparator = new DefaultTermComparator<T>();
111 ccc7ac6f Patric Plitzner
	    }
112
113 1d716a84 Patrick Plitzner
	    List<T> terms = CdmStore.getService(ITermService.class).listByTermType(termType, null, null, null, null);
114 ccc7ac6f Patric Plitzner
	    Collections.sort(terms, comparator);
115
	    return terms;
116
	}
117
118 caaaa636 n.hoffmann
	/**
119 ccc7ac6f Patric Plitzner
	 *
120 caaaa636 n.hoffmann
	 * @param termClass
121
	 * @param comparator
122
	 * @return
123
	 */
124 b9a0d300 l.morris
	private static <T extends DefinedTermBase> List<T> getTermsFromService(Class<T> termClass, Comparator<T> comparator){
125
		if (comparator == null){
126 78222507 n.hoffmann
			comparator = new DefaultTermComparator<T>();
127 30140758 n.hoffmann
		}
128 ccc7ac6f Patric Plitzner
129 3ccf6d41 Andreas Müller
		List<T> terms = CdmStore.getService(ITermService.class).list(termClass, null, null, null, null);
130 b9a0d300 l.morris
		Collections.sort(terms, comparator);
131
		return terms;
132 3fb05254 n.hoffmann
	}
133 ccc7ac6f Patric Plitzner
134 3fb05254 n.hoffmann
	/**
135 3be6ef3e n.hoffmann
	 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
136
	 */
137 30140758 n.hoffmann
	public static void saveTerm(DefinedTermBase term){
138 b9a0d300 l.morris
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
139 1d9ed6ce n.hoffmann
	}
140 ccc7ac6f Patric Plitzner
141 1d9ed6ce n.hoffmann
	/**
142 3be6ef3e n.hoffmann
	 * <p>delete</p>
143
	 *
144
	 * @param selected a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
145 ccc7ac6f Patric Plitzner
	 * @throws ReferencedObjectUndeletableException
146 1d9ed6ce n.hoffmann
	 */
147 97e10b7c Katja Luther
	public static void delete(DefinedTermBase selected) throws ReferencedObjectUndeletableException {
148 b9a0d300 l.morris
		CdmStore.getService(ITermService.class).delete(selected);
149 3fb05254 n.hoffmann
	}
150 ccc7ac6f Patric Plitzner
151 3fb05254 n.hoffmann
	/**
152
	 * Save a vacabulary to data store
153 3be6ef3e n.hoffmann
	 *
154
	 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
155 3fb05254 n.hoffmann
	 */
156
	public static void updateVocabulary(DefinedTermBase term) {
157 b9a0d300 l.morris
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
158 3fb05254 n.hoffmann
	}
159 caaaa636 n.hoffmann
160
	/**
161
	 * Handingling of special cases
162
	 */
163 ccc7ac6f Patric Plitzner
164 b9a0d300 l.morris
	private static Set<ITermStoreEdgeCase<? extends DefinedTermBase>> termStoreEdgeCases = new HashSet<ITermStoreEdgeCase<? extends DefinedTermBase>>();
165 ccc7ac6f Patric Plitzner
166 b9a0d300 l.morris
	static {
167
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Feature>() {
168
169
			@Override
170
			public Class<Feature> getTermClass() {
171
				return Feature.class;
172
			}
173
174
			@Override
175
			public List<Feature> getTerms() {
176
				List<Feature> features = TermStore.getTermsFromService(Feature.class, null);
177
				features.remove(Feature.IMAGE());
178
				return features;
179
			}
180
		});
181
		termStoreEdgeCases.add(new ITermStoreEdgeCase<MarkerType>(){
182
183
			@Override
184
			public Class<MarkerType> getTermClass() {
185
				return MarkerType.class;
186
			}
187
188
			@Override
189
			public List<MarkerType> getTerms() {
190
				// filter out non technical markers
191
				List<MarkerType> nonTechnicalMarkerTypes = new ArrayList<MarkerType>();
192
				List<MarkerType> markerTypes = TermStore.getTermsFromService(MarkerType.class, null);
193 ccc7ac6f Patric Plitzner
194 b9a0d300 l.morris
				for (Object type : markerTypes) {
195
					if (((MarkerType) type).isTechnical() == false) {
196
						nonTechnicalMarkerTypes.add((MarkerType) type);
197
					}
198
				}
199 ccc7ac6f Patric Plitzner
200 b9a0d300 l.morris
				return nonTechnicalMarkerTypes;
201
			}
202 ccc7ac6f Patric Plitzner
203 b9a0d300 l.morris
		});
204
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Rank>() {
205
206
			@Override
207
			public Class<Rank> getTermClass() {
208
				return Rank.class;
209
			}
210
211
			@Override
212
			public List<Rank> getTerms() {
213
				if(PreferencesUtil.getSortRanksHierarchichally()){
214
					return TermStore.getTermsFromService(Rank.class, new Comparator<Rank>(){
215 ccc7ac6f Patric Plitzner
216 b9a0d300 l.morris
						@Override
217
						public int compare(Rank o1, Rank o2) {
218
							return o1.compareTo(o2);
219
						}
220 ccc7ac6f Patric Plitzner
221 b9a0d300 l.morris
					});
222
				}else{
223
					return TermStore.getTermsFromService(Rank.class, null);
224
				}
225
			}
226 ccc7ac6f Patric Plitzner
227 b9a0d300 l.morris
		});
228 da005e87 Patric Plitzner
		termStoreEdgeCases.add(new ITermStoreEdgeCase<PresenceAbsenceTerm>() {
229 b9a0d300 l.morris
230
			@Override
231 da005e87 Patric Plitzner
			public Class<PresenceAbsenceTerm> getTermClass() {
232
				return PresenceAbsenceTerm.class;
233 b9a0d300 l.morris
			}
234
235
			@Override
236 da005e87 Patric Plitzner
			public List<PresenceAbsenceTerm> getTerms() {
237
				List<PresenceAbsenceTerm> presenceAbsenceTerms = TermStore.getTermsFromService(PresenceAbsenceTerm.class, null);
238 b9a0d300 l.morris
239
				return presenceAbsenceTerms;
240
			}
241
		});
242
		termStoreEdgeCases.add(new ITermStoreEdgeCase<TaxonRelationshipTypeInverseContainer>() {
243
244
			@Override
245
			public Class<TaxonRelationshipTypeInverseContainer> getTermClass() {
246
				return TaxonRelationshipTypeInverseContainer.class;
247
			}
248
249
			@Override
250
			public List<TaxonRelationshipTypeInverseContainer> getTerms() {
251
				List<TaxonRelationshipType> excludeTaxonRelationshipTypes = Arrays.asList(new TaxonRelationshipType[]{
252
					TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN(),
253
					TaxonRelationshipType.MISAPPLIED_NAME_FOR(),
254 ccc7ac6f Patric Plitzner
					TaxonRelationshipType.ALL_RELATIONSHIPS()
255 b9a0d300 l.morris
				});
256 ccc7ac6f Patric Plitzner
257 b9a0d300 l.morris
				List<TaxonRelationshipTypeInverseContainer> relationshipTypeInverseContainers = new ArrayList<TaxonRelationshipTypeInverseContainer>();
258 ccc7ac6f Patric Plitzner
259 b9a0d300 l.morris
				List<TaxonRelationshipType> relationshipTypes = TermStore.getTerms(TaxonRelationshipType.class);
260 ccc7ac6f Patric Plitzner
261 b9a0d300 l.morris
				relationshipTypes.removeAll(excludeTaxonRelationshipTypes);
262 ccc7ac6f Patric Plitzner
263 b9a0d300 l.morris
				for (TaxonRelationshipType relationshipType : relationshipTypes){
264
					if(!relationshipType.isSymmetric()){
265
						TaxonRelationshipTypeInverseContainer inverseContainer = new TaxonRelationshipTypeInverseContainer(relationshipType, true);
266
						relationshipTypeInverseContainers.add(inverseContainer);
267 ccc7ac6f Patric Plitzner
					}
268 b9a0d300 l.morris
					TaxonRelationshipTypeInverseContainer container = new TaxonRelationshipTypeInverseContainer(relationshipType, false);
269 ccc7ac6f Patric Plitzner
					relationshipTypeInverseContainers.add(container);
270
				}
271
272 b9a0d300 l.morris
				return relationshipTypeInverseContainers;
273
			}
274
		});
275 3fb05254 n.hoffmann
	}
276 ccc7ac6f Patric Plitzner
277 b9a0d300 l.morris
	private static <T extends DefinedTermBase> ITermStoreEdgeCase<T> getEdgeCase(Class<T> termClass) {
278 ccc7ac6f Patric Plitzner
279 b9a0d300 l.morris
		for (ITermStoreEdgeCase termStoreEdgeCase : termStoreEdgeCases){
280
			if (termStoreEdgeCase.getTermClass().equals(termClass)){
281
				return termStoreEdgeCase;
282 3fb05254 n.hoffmann
			}
283 b9a0d300 l.morris
		}
284 ccc7ac6f Patric Plitzner
285 b9a0d300 l.morris
		return null;
286 3fb05254 n.hoffmann
	}
287 ccc7ac6f Patric Plitzner
288 b9a0d300 l.morris
	private interface ITermStoreEdgeCase<TERM> {
289 3fb05254 n.hoffmann
290 b9a0d300 l.morris
		public abstract Class<TERM> getTermClass();
291 ccc7ac6f Patric Plitzner
292 b9a0d300 l.morris
		public abstract List<TERM> getTerms();
293 ccc7ac6f Patric Plitzner
294 1d9ed6ce n.hoffmann
	}
295 3fb05254 n.hoffmann
}