Project

General

Profile

Download (9.48 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2007 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
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.
9
*/
10

    
11
package eu.etaxonomy.taxeditor.store;
12

    
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;
19
import java.util.Set;
20

    
21
import eu.etaxonomy.cdm.api.service.ITermService;
22
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
23
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
24
import eu.etaxonomy.cdm.model.common.MarkerType;
25
import eu.etaxonomy.cdm.model.common.TermType;
26
import eu.etaxonomy.cdm.model.common.TermVocabulary;
27
import eu.etaxonomy.cdm.model.description.AbsenceTerm;
28
import eu.etaxonomy.cdm.model.description.Feature;
29
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
30
import eu.etaxonomy.cdm.model.description.PresenceTerm;
31
import eu.etaxonomy.cdm.model.name.Rank;
32
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
33
import eu.etaxonomy.taxeditor.model.DefaultTermComparator;
34
import eu.etaxonomy.taxeditor.model.TaxonRelationshipTypeInverseContainer;
35
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
36

    
37
/**
38
 * All terms may be accessed through this store.
39
 * Note: This is for internal use. When using vocabularies in the UI, try to use the preferred terms from
40
 * PreferenceUtil
41
 *
42
 * @author n.hoffmann
43
 * @created 25.06.2009
44
 * @version 1.0
45
 */
46
public class TermStore {
47

    
48
	/**
49
	 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given type currently available in the system.
50
	 *
51
	 * @param clazz a class that inherits from {@link DefinedTermBase}
52
	 * @return an alphabetically sorted list of terms
53
	 */
54
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz){
55
		return getTerms(clazz, null, true);
56
	}
57

    
58
	/**
59
	 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given {@link TermType})
60
	 * currently available in the system.
61
	 *
62
	 * @param termType the term type
63
	 * @return an alphabetically sorted list of terms
64
	 */
65
	public static List<DefinedTermBase<?>> getTerms(TermType termType, Comparator<DefinedTermBase<?>> comparator){
66
        return getTermsFromService(termType, comparator);
67
	}
68

    
69
	/**
70
	 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given {@link TermType})
71
	 * currently available in the system.
72
	 *
73
	 * @param termType the term type
74
	 * @return an alphabetically sorted list of terms
75
	 */
76
	public static <TERM extends DefinedTermBase> Set<TERM> getTerms(TermVocabulary<TERM> termVocabulary, Comparator<DefinedTermBase<?>> comparator){
77
	    return termVocabulary.getTerms();
78
	}
79

    
80
	/**
81
	 * Returns a list of terms of the given type currently available in the system.
82
	 * If <code>filtered</code> is set to <code>true</code>, all terms for certain types will be
83
	 * gathered from edge cases.
84
	 *
85
	 * @param clazz a class that inherits from {@link DefinedTermBase}
86
	 * @param comparator a {@link Comparator} that defines the sorting algorithm. If set to null, {@link DefaultTermComparator} will be used
87
	 * @param filtered if set to true, some terms are filtered from the result (according to definition in {@link ITermStoreEdgeCase}s)
88
	 * @return a sorted list of terms
89
	 */
90
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz, Comparator<TERM> comparator, boolean filtered){
91
		List<TERM> terms = new ArrayList<TERM>();
92

    
93
		ITermStoreEdgeCase<TERM> edgeCase = getEdgeCase(clazz);
94
		if(filtered && edgeCase != null){
95
			terms = edgeCase.getTerms();
96
		}else{
97
			terms = getTermsFromService(clazz, comparator);
98
		}
99

    
100
		return terms;
101

    
102
	}
103

    
104
	/**
105
	 *
106
	 * @param termClass
107
	 * @param comparator
108
	 * @return
109
	 */
110
	private static List<DefinedTermBase<?>> getTermsFromService(TermType termType, Comparator<DefinedTermBase<?>> comparator){
111
	    if (comparator == null){
112
	        comparator = new DefaultTermComparator<DefinedTermBase<?>>();
113
	    }
114

    
115
	    List<DefinedTermBase<?>> terms = CdmStore.getService(ITermService.class).listByTermType(termType, null, null, null, null);
116
	    Collections.sort(terms, comparator);
117
	    return terms;
118
	}
119

    
120
	/**
121
	 *
122
	 * @param termClass
123
	 * @param comparator
124
	 * @return
125
	 */
126
	private static <T extends DefinedTermBase> List<T> getTermsFromService(Class<T> termClass, Comparator<T> comparator){
127
		if (comparator == null){
128
			comparator = new DefaultTermComparator<T>();
129
		}
130

    
131
		List<T> terms = CdmStore.getService(ITermService.class).list(termClass, null, null, null, null);
132
		Collections.sort(terms, comparator);
133
		return terms;
134
	}
135

    
136
	/**
137
	 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
138
	 */
139
	public static void saveTerm(DefinedTermBase term){
140
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
141
	}
142

    
143
	/**
144
	 * <p>delete</p>
145
	 *
146
	 * @param selected a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
147
	 * @throws ReferencedObjectUndeletableException
148
	 */
149
	public static void delete(DefinedTermBase selected) throws ReferencedObjectUndeletableException {
150
		CdmStore.getService(ITermService.class).delete(selected);
151
	}
152

    
153
	/**
154
	 * Save a vacabulary to data store
155
	 *
156
	 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
157
	 */
158
	public static void updateVocabulary(DefinedTermBase term) {
159
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
160
	}
161

    
162
	/**
163
	 * Handingling of special cases
164
	 */
165

    
166
	private static Set<ITermStoreEdgeCase<? extends DefinedTermBase>> termStoreEdgeCases = new HashSet<ITermStoreEdgeCase<? extends DefinedTermBase>>();
167

    
168
	static {
169
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Feature>() {
170

    
171
			@Override
172
			public Class<Feature> getTermClass() {
173
				return Feature.class;
174
			}
175

    
176
			@Override
177
			public List<Feature> getTerms() {
178
				List<Feature> features = TermStore.getTermsFromService(Feature.class, null);
179
				features.remove(Feature.IMAGE());
180
				return features;
181
			}
182
		});
183
		termStoreEdgeCases.add(new ITermStoreEdgeCase<MarkerType>(){
184

    
185
			@Override
186
			public Class<MarkerType> getTermClass() {
187
				return MarkerType.class;
188
			}
189

    
190
			@Override
191
			public List<MarkerType> getTerms() {
192
				// filter out non technical markers
193
				List<MarkerType> nonTechnicalMarkerTypes = new ArrayList<MarkerType>();
194
				List<MarkerType> markerTypes = TermStore.getTermsFromService(MarkerType.class, null);
195

    
196
				for (Object type : markerTypes) {
197
					if (((MarkerType) type).isTechnical() == false) {
198
						nonTechnicalMarkerTypes.add((MarkerType) type);
199
					}
200
				}
201

    
202
				return nonTechnicalMarkerTypes;
203
			}
204

    
205
		});
206
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Rank>() {
207

    
208
			@Override
209
			public Class<Rank> getTermClass() {
210
				return Rank.class;
211
			}
212

    
213
			@Override
214
			public List<Rank> getTerms() {
215
				if(PreferencesUtil.getSortRanksHierarchichally()){
216
					return TermStore.getTermsFromService(Rank.class, new Comparator<Rank>(){
217

    
218
						@Override
219
						public int compare(Rank o1, Rank o2) {
220
							return o1.compareTo(o2);
221
						}
222

    
223
					});
224
				}else{
225
					return TermStore.getTermsFromService(Rank.class, null);
226
				}
227
			}
228

    
229
		});
230
		termStoreEdgeCases.add(new ITermStoreEdgeCase<PresenceAbsenceTermBase>() {
231

    
232
			@Override
233
			public Class<PresenceAbsenceTermBase> getTermClass() {
234
				return PresenceAbsenceTermBase.class;
235
			}
236

    
237
			@Override
238
			public List<PresenceAbsenceTermBase> getTerms() {
239
				List presenceAbsenceTerms = TermStore.getTermsFromService(PresenceTerm.class, null);
240
				presenceAbsenceTerms.addAll(TermStore.getTermsFromService(AbsenceTerm.class, null));
241

    
242
				return presenceAbsenceTerms;
243
			}
244
		});
245
		termStoreEdgeCases.add(new ITermStoreEdgeCase<TaxonRelationshipTypeInverseContainer>() {
246

    
247
			@Override
248
			public Class<TaxonRelationshipTypeInverseContainer> getTermClass() {
249
				return TaxonRelationshipTypeInverseContainer.class;
250
			}
251

    
252
			@Override
253
			public List<TaxonRelationshipTypeInverseContainer> getTerms() {
254
				List<TaxonRelationshipType> excludeTaxonRelationshipTypes = Arrays.asList(new TaxonRelationshipType[]{
255
					TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN(),
256
					TaxonRelationshipType.MISAPPLIED_NAME_FOR(),
257
					TaxonRelationshipType.ALL_RELATIONSHIPS()
258
				});
259

    
260
				List<TaxonRelationshipTypeInverseContainer> relationshipTypeInverseContainers = new ArrayList<TaxonRelationshipTypeInverseContainer>();
261

    
262
				List<TaxonRelationshipType> relationshipTypes = TermStore.getTerms(TaxonRelationshipType.class);
263

    
264
				relationshipTypes.removeAll(excludeTaxonRelationshipTypes);
265

    
266
				for (TaxonRelationshipType relationshipType : relationshipTypes){
267
					if(!relationshipType.isSymmetric()){
268
						TaxonRelationshipTypeInverseContainer inverseContainer = new TaxonRelationshipTypeInverseContainer(relationshipType, true);
269
						relationshipTypeInverseContainers.add(inverseContainer);
270
					}
271
					TaxonRelationshipTypeInverseContainer container = new TaxonRelationshipTypeInverseContainer(relationshipType, false);
272
					relationshipTypeInverseContainers.add(container);
273
				}
274

    
275
				return relationshipTypeInverseContainers;
276
			}
277
		});
278
	}
279

    
280
	private static <T extends DefinedTermBase> ITermStoreEdgeCase<T> getEdgeCase(Class<T> termClass) {
281

    
282
		for (ITermStoreEdgeCase termStoreEdgeCase : termStoreEdgeCases){
283
			if (termStoreEdgeCase.getTermClass().equals(termClass)){
284
				return termStoreEdgeCase;
285
			}
286
		}
287

    
288
		return null;
289
	}
290

    
291
	private interface ITermStoreEdgeCase<TERM> {
292

    
293
		public abstract Class<TERM> getTermClass();
294

    
295
		public abstract List<TERM> getTerms();
296

    
297
	}
298
}
(9-9/9)