Project

General

Profile

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