Project

General

Profile

Download (8.85 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.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.DefaultTermComparator;
31
import eu.etaxonomy.taxeditor.model.TaxonRelationshipTypeInverseContainer;
32
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
33

    
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
 *
39
 * @author n.hoffmann
40
 * @created 25.06.2009
41
 * @version 1.0
42
 */
43
public class TermStore {
44
	
45
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz){
46
		return getTerms(clazz, null, true);
47
	}
48
	
49
	/**
50
	 * Returns a list of terms of the given type currently available in the system. 
51
	 * If <code>filtered</code> is set to <code>true</code>, all terms for certain types will be
52
	 * gathered from edge cases.
53
	 * 
54
	 * @param clazz
55
	 * @param comparator
56
	 * @param filtered Will filter out some results
57
	 * @return
58
	 */
59
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz, Comparator<TERM> comparator, boolean filtered){
60
		List<TERM> terms = new ArrayList<TERM>();
61

    
62
		ITermStoreEdgeCase<TERM> edgeCase = getEdgeCase(clazz);
63
		if(filtered && edgeCase != null){
64
			terms = edgeCase.getTerms();
65
		}else{
66
			terms = getTermsFromService(clazz, comparator);
67
		}
68
		
69
		return terms;
70
		
71
	}
72
	
73
	private static <T extends DefinedTermBase> List<T> getTermsFromService(Class<T> termClass, Comparator<T> comparator){
74
		if (comparator == null){
75
			comparator = new DefaultTermComparator<T>();
76
		}
77
		
78
		List<T> terms = CdmStore.getService(ITermService.class).listByTermClass(termClass, null, null, null, null);
79
		Collections.sort(terms, comparator);
80
		return terms;
81
	}
82
	
83
//	/**
84
//	 * <p>getFeatures</p>
85
//	 *
86
//	 * @return a {@link java.util.List} object.
87
//	 */
88
//	public static List<Feature> getFeatures() {
89
//		List<Feature> features = getTerms(Feature.class);
90
//		features.remove(Feature.IMAGE());
91
//		return features;
92
//
93
//	}
94
//
95
//
96
//	/**
97
//	 * <p>getNonTechnicalMarkerTypes</p>
98
//	 *
99
//	 * @return a {@link java.util.List} object.
100
//	 */
101
//	public static List<MarkerType> getNonTechnicalMarkerTypes() {
102
//		List<MarkerType> nonTechnicalMarkerTypes = new ArrayList<MarkerType>();
103
//		List<MarkerType> markerTypes = getTerms(MarkerType.class);
104
//		
105
//		for (Object type : markerTypes) {
106
//			if (((MarkerType) type).isTechnical() == false) {
107
//				nonTechnicalMarkerTypes.add((MarkerType) type);
108
//			}
109
//		}
110
//		
111
//		return nonTechnicalMarkerTypes;
112
//	}
113
//
114
//	/**
115
//	 * Retrieve all ranks from data store.
116
//	 *
117
//	 * @return a {@link java.util.List} object.
118
//	 */
119
//	public static List<Rank> getRanks(){
120
//		if(PreferencesUtil.getSortRanksHierarchichally()){
121
//			return getTerms(Rank.class, new Comparator<Rank>(){
122
//	
123
//				@Override
124
//				public int compare(Rank o1, Rank o2) {
125
//					return o1.compareTo(o2);
126
//				}
127
//				
128
//			});
129
//		}else{
130
//			return getTerms(Rank.class);
131
//		}
132
//	}
133
//	
134
//	
135
//	/**
136
//	 * Retrieve all presence and absence terms from data store.
137
//	 *
138
//	 * @return a {@link java.util.List} object.
139
//	 */
140
//	public static List<PresenceAbsenceTermBase> getPresenceAbsenceTerms() {
141
//		List presenceAbsenceTerms = getTerms(PresenceTerm.class);
142
//		presenceAbsenceTerms.addAll(getTerms(AbsenceTerm.class));
143
//
144
//		return presenceAbsenceTerms;
145
//	}
146
	
147
	/**
148
	 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
149
	 */
150
	public static void saveTerm(DefinedTermBase term){
151
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
152
	}
153
	
154
	/**
155
	 * <p>delete</p>
156
	 *
157
	 * @param selected a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
158
	 */
159
	public static void delete(DefinedTermBase selected) {
160
		CdmStore.getService(ITermService.class).delete(selected);
161
	}
162
	
163
	/**
164
	 * Save a vacabulary to data store
165
	 *
166
	 * @param term a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
167
	 */
168
	public static void updateVocabulary(DefinedTermBase term) {
169
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
170
	}
171
	
172
	private static Set<ITermStoreEdgeCase<? extends DefinedTermBase>> termStoreEdgeCases = new HashSet<ITermStoreEdgeCase<? extends DefinedTermBase>>();
173
	
174
	static {
175
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Feature>() {
176

    
177
			@Override
178
			public Class<Feature> getTermClass() {
179
				return Feature.class;
180
			}
181

    
182
			@Override
183
			public List<Feature> getTerms() {
184
				List<Feature> features = TermStore.getTermsFromService(Feature.class, null);
185
				features.remove(Feature.IMAGE());
186
				return features;
187
			}
188
		});
189
		termStoreEdgeCases.add(new ITermStoreEdgeCase<MarkerType>(){
190

    
191
			@Override
192
			public Class<MarkerType> getTermClass() {
193
				return MarkerType.class;
194
			}
195

    
196
			@Override
197
			public List<MarkerType> getTerms() {
198
				// filter out non technical markers
199
				List<MarkerType> nonTechnicalMarkerTypes = new ArrayList<MarkerType>();
200
				List<MarkerType> markerTypes = TermStore.getTermsFromService(MarkerType.class, null);
201
				
202
				for (Object type : markerTypes) {
203
					if (((MarkerType) type).isTechnical() == false) {
204
						nonTechnicalMarkerTypes.add((MarkerType) type);
205
					}
206
				}
207
				
208
				return nonTechnicalMarkerTypes;
209
			}
210
			
211
		});
212
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Rank>() {
213

    
214
			@Override
215
			public Class<Rank> getTermClass() {
216
				return Rank.class;
217
			}
218

    
219
			@Override
220
			public List<Rank> getTerms() {
221
				if(PreferencesUtil.getSortRanksHierarchichally()){
222
					return TermStore.getTermsFromService(Rank.class, new Comparator<Rank>(){
223
			
224
						@Override
225
						public int compare(Rank o1, Rank o2) {
226
							return o1.compareTo(o2);
227
						}
228
						
229
					});
230
				}else{
231
					return TermStore.getTermsFromService(Rank.class, null);
232
				}
233
			}
234
			
235
		});
236
		termStoreEdgeCases.add(new ITermStoreEdgeCase<PresenceAbsenceTermBase>() {
237

    
238
			@Override
239
			public Class<PresenceAbsenceTermBase> getTermClass() {
240
				return PresenceAbsenceTermBase.class;
241
			}
242

    
243
			@Override
244
			public List<PresenceAbsenceTermBase> getTerms() {
245
				List presenceAbsenceTerms = TermStore.getTermsFromService(PresenceTerm.class, null);
246
				presenceAbsenceTerms.addAll(TermStore.getTermsFromService(AbsenceTerm.class, null));
247

    
248
				return presenceAbsenceTerms;
249
			}
250
		});
251
		termStoreEdgeCases.add(new ITermStoreEdgeCase<TaxonRelationshipTypeInverseContainer>() {
252

    
253
			@Override
254
			public Class<TaxonRelationshipTypeInverseContainer> getTermClass() {
255
				return TaxonRelationshipTypeInverseContainer.class;
256
			}
257

    
258
			@Override
259
			public List<TaxonRelationshipTypeInverseContainer> getTerms() {
260
				List<TaxonRelationshipType> excludeTaxonRelationshipTypes = Arrays.asList(new TaxonRelationshipType[]{
261
					TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN(),
262
					TaxonRelationshipType.MISAPPLIED_NAME_FOR(),
263
					TaxonRelationshipType.ALL_RELATIONSHIPS()	
264
				});
265
				
266
				List<TaxonRelationshipTypeInverseContainer> relationshipTypeInverseContainers = new ArrayList<TaxonRelationshipTypeInverseContainer>();
267
				
268
				List<TaxonRelationshipType> relationshipTypes = TermStore.getTerms(TaxonRelationshipType.class);
269
				
270
				relationshipTypes.removeAll(excludeTaxonRelationshipTypes);
271
				
272
				for (TaxonRelationshipType relationshipType : relationshipTypes){
273
					if(!relationshipType.isSymmetric()){
274
						TaxonRelationshipTypeInverseContainer inverseContainer = new TaxonRelationshipTypeInverseContainer(relationshipType, true);
275
						relationshipTypeInverseContainers.add(inverseContainer);
276
					}			
277
					TaxonRelationshipTypeInverseContainer container = new TaxonRelationshipTypeInverseContainer(relationshipType, false);
278
					relationshipTypeInverseContainers.add(container);			
279
				}		
280
				
281
				return relationshipTypeInverseContainers;
282
			}
283
		});
284
	}
285
	
286
	private static <T extends DefinedTermBase> ITermStoreEdgeCase<T> getEdgeCase(Class<T> termClass) {
287
		
288
		for (ITermStoreEdgeCase termStoreEdgeCase : termStoreEdgeCases){
289
			if (termStoreEdgeCase.getTermClass().equals(termClass)){
290
				return termStoreEdgeCase;
291
			}
292
		}
293
		
294
		return null;
295
	}
296
	
297
	private interface ITermStoreEdgeCase<TERM> {
298

    
299
		public abstract Class<TERM> getTermClass();
300
		
301
		public abstract List<TERM> getTerms();
302
		
303
	}
304
}
(9-9/9)