Project

General

Profile

Download (8.92 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* 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
import java.util.Arrays;
14
import java.util.Collections;
15
import java.util.Comparator;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Set;
19

    
20
import eu.etaxonomy.cdm.api.service.ITermService;
21
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
22
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
23
import eu.etaxonomy.cdm.model.common.MarkerType;
24
import eu.etaxonomy.cdm.model.term.TermType;
25
import eu.etaxonomy.cdm.model.term.TermVocabulary;
26
import eu.etaxonomy.cdm.model.description.Feature;
27
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
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
	/**
46
	 * Returns an alphabetically sorted list of terms (anything that extends {@link DefinedTermBase}) of the given type currently available in the system.
47
	 *
48
	 * @param clazz a class that inherits from {@link DefinedTermBase}
49
	 * @return an alphabetically sorted list of terms
50
	 */
51
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz){
52
		return getTerms(clazz, null, true);
53
	}
54

    
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
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(TermType termType, Comparator<TERM> comparator){
63
        return getTermsFromService(termType, comparator);
64
	}
65

    
66
	/**
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
	/**
78
	 * Returns a list of terms of the given type currently available in the system.
79
	 * If <code>filtered</code> is set to <code>true</code>, all terms for certain types will be
80
	 * gathered from edge cases.
81
	 *
82
	 * @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
	 */
87
	public static <TERM extends DefinedTermBase> List<TERM> getTerms(Class<TERM> clazz, Comparator<TERM> comparator, boolean filtered){
88
		List<TERM> terms = new ArrayList<>();
89

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

    
97
		return terms;
98
	}
99

    
100
	private static <T extends DefinedTermBase> List<T> getTermsFromService(TermType termType, Comparator<T> comparator){
101
	    if (comparator == null){
102
	        comparator = new DefaultTermComparator<T>();
103
	    }
104

    
105
	    List<T> terms = CdmStore.getService(ITermService.class).listByTermType(termType, null, null, null, null);
106
	    Collections.sort(terms, comparator);
107
	    return terms;
108
	}
109

    
110
	private static <T extends DefinedTermBase> List<T> getTermsFromService(Class<T> termClass, Comparator<T> comparator){
111
		if (comparator == null){
112
			comparator = new DefaultTermComparator<T>();
113
		}
114

    
115
		List<T> terms = CdmStore.getService(ITermService.class).list(termClass, null, null, null, null);
116
		Collections.sort(terms, comparator);
117
		return terms;
118
	}
119

    
120
	public static void saveTerm(DefinedTermBase term){
121
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
122
	}
123

    
124
	/**
125
	 * <p>delete</p>
126
	 *
127
	 * @param selected a {@link eu.etaxonomy.cdm.model.term.DefinedTermBase} object.
128
	 * @throws ReferencedObjectUndeletableException
129
	 */
130
	public static void delete(DefinedTermBase selected) throws ReferencedObjectUndeletableException {
131
		CdmStore.getService(ITermService.class).delete(selected);
132
	}
133

    
134
	/**
135
	 * Save a vacabulary to data store
136
	 *
137
	 * @param term a {@link eu.etaxonomy.cdm.model.term.DefinedTermBase} object.
138
	 */
139
	public static void updateVocabulary(DefinedTermBase term) {
140
		CdmStore.getService(ITermService.class).saveOrUpdate(term);
141
	}
142

    
143
	/**
144
	 * Handingling of special cases
145
	 */
146
	private static Set<ITermStoreEdgeCase<? extends DefinedTermBase>> termStoreEdgeCases = new HashSet<>();
147

    
148
	static {
149
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Feature>() {
150

    
151
			@Override
152
			public Class<Feature> getTermClass() {
153
				return Feature.class;
154
			}
155

    
156
			@Override
157
			public List<Feature> getTerms() {
158
				List<Feature> features = TermStore.getTermsFromService(Feature.class, null);
159
				features.remove(Feature.IMAGE());
160
				return features;
161
			}
162
		});
163
		termStoreEdgeCases.add(new ITermStoreEdgeCase<MarkerType>(){
164

    
165
			@Override
166
			public Class<MarkerType> getTermClass() {
167
				return MarkerType.class;
168
			}
169

    
170
			@Override
171
			public List<MarkerType> getTerms() {
172
				// filter out non technical markers
173
				List<MarkerType> nonTechnicalMarkerTypes = new ArrayList<>();
174
				List<MarkerType> markerTypes = TermStore.getTermsFromService(MarkerType.class, null);
175

    
176
				for (Object type : markerTypes) {
177
					if (((MarkerType) type).isTechnical() == false) {
178
						nonTechnicalMarkerTypes.add((MarkerType) type);
179
					}
180
				}
181

    
182
				return nonTechnicalMarkerTypes;
183
			}
184

    
185
		});
186
		termStoreEdgeCases.add(new ITermStoreEdgeCase<Rank>() {
187

    
188
			@Override
189
			public Class<Rank> getTermClass() {
190
				return Rank.class;
191
			}
192

    
193
			@Override
194
			public List<Rank> getTerms() {
195
				if(PreferencesUtil.getSortRanksHierarchichally()){
196
					return TermStore.getTermsFromService(Rank.class, new Comparator<Rank>(){
197
							@Override
198
							public int compare(Rank o1, Rank o2) {
199
								return o1.compareTo(o2);
200
							}
201
						});
202
				}else{
203
					return TermStore.getTermsFromService(Rank.class, null);
204
				}
205
			}
206
		});
207
		termStoreEdgeCases.add(new ITermStoreEdgeCase<PresenceAbsenceTerm>() {
208
			@Override
209
			public Class<PresenceAbsenceTerm> getTermClass() {
210
				return PresenceAbsenceTerm.class;
211
			}
212
			@Override
213
			public List<PresenceAbsenceTerm> getTerms() {
214
				List<PresenceAbsenceTerm> presenceAbsenceTerms = TermStore.getTermsFromService(PresenceAbsenceTerm.class, null);
215

    
216
				return presenceAbsenceTerms;
217
			}
218
		});
219
		termStoreEdgeCases.add(new ITermStoreEdgeCase<TaxonRelationshipTypeInverseContainer>() {
220
			@Override
221
			public Class<TaxonRelationshipTypeInverseContainer> getTermClass() {
222
				return TaxonRelationshipTypeInverseContainer.class;
223
			}
224
			@Override
225
			public List<TaxonRelationshipTypeInverseContainer> getTerms() {
226
				List<TaxonRelationshipType> excludeTaxonRelationshipTypes = Arrays.asList(new TaxonRelationshipType[]{
227
					TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN(),
228
					TaxonRelationshipType.MISAPPLIED_NAME_FOR(),
229
					TaxonRelationshipType.ALL_RELATIONSHIPS()
230
				});
231

    
232
				List<TaxonRelationshipTypeInverseContainer> relationshipTypeInverseContainers = new ArrayList<>();
233

    
234
				List<TaxonRelationshipType> relationshipTypes = TermStore.getTerms(TaxonRelationshipType.class);
235

    
236
				relationshipTypes.removeAll(excludeTaxonRelationshipTypes);
237

    
238
				for (TaxonRelationshipType relationshipType : relationshipTypes){
239
					if(!relationshipType.isSymmetric()){
240
						TaxonRelationshipTypeInverseContainer inverseContainer = new TaxonRelationshipTypeInverseContainer(relationshipType, true);
241
						relationshipTypeInverseContainers.add(inverseContainer);
242
					}
243
					TaxonRelationshipTypeInverseContainer container = new TaxonRelationshipTypeInverseContainer(relationshipType, false);
244
					relationshipTypeInverseContainers.add(container);
245
				}
246

    
247
				return relationshipTypeInverseContainers;
248
			}
249
		});
250
	}
251

    
252
	private static <T extends DefinedTermBase> ITermStoreEdgeCase<T> getEdgeCase(Class<T> termClass) {
253

    
254
		for (ITermStoreEdgeCase termStoreEdgeCase : termStoreEdgeCases){
255
			if (termStoreEdgeCase.getTermClass().equals(termClass)){
256
				return termStoreEdgeCase;
257
			}
258
		}
259

    
260
		return null;
261
	}
262

    
263
	private interface ITermStoreEdgeCase<TERM> {
264

    
265
		public abstract Class<TERM> getTermClass();
266

    
267
		public abstract List<TERM> getTerms();
268

    
269
	}
270
}
(11-11/13)