Project

General

Profile

Download (7.05 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 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.cdm.model.common;
11

    
12
import java.net.URI;
13
import java.util.Iterator;
14
import java.util.NoSuchElementException;
15
import java.util.Set;
16
import java.util.SortedSet;
17
import java.util.TreeSet;
18

    
19
import javax.persistence.Entity;
20
import javax.persistence.Transient;
21
import javax.xml.bind.annotation.XmlAccessType;
22
import javax.xml.bind.annotation.XmlAccessorType;
23
import javax.xml.bind.annotation.XmlRootElement;
24
import javax.xml.bind.annotation.XmlType;
25

    
26
import org.apache.log4j.Logger;
27
import org.hibernate.envers.Audited;
28
import org.hibernate.search.annotations.Indexed;
29

    
30
/**
31
 * @author a.mueller
32
 *
33
 */
34
@XmlAccessorType(XmlAccessType.FIELD)
35
@XmlType(name = "OrderedTermVocabulary")
36
@XmlRootElement(name = "OrderedTermVocabulary")
37
@Entity
38
@Indexed(index = "eu.etaxonomy.cdm.model.common.TermVocabulary")
39
@Audited
40
public class OrderedTermVocabulary<T extends OrderedTermBase> extends TermVocabulary<T> {
41
	private static final long serialVersionUID = 7871741306306371242L;
42
	@SuppressWarnings("unused")
43
	private static final Logger logger = Logger.getLogger(OrderedTermVocabulary.class);
44

    
45
// ************************* FACTORY METHODS ***********************************************/
46
	
47
	/**
48
	 * @param type the {@link TermType term type}, must be the same as for all included terms
49
	 * @param description the description of this vocabulary
50
	 * @param label 
51
	 * @param labelAbbrev
52
	 * @param termSourceUri
53
	 * @return
54
	 * @throws NullPointerException if type is <code>null</code>
55
	 */
56
	public static OrderedTermVocabulary NewInstance(TermType type, String description, String label, String labelAbbrev, URI termSourceUri){
57
		return new OrderedTermVocabulary(type, description, label, labelAbbrev, termSourceUri);
58
	}
59
	
60
	
61
//************************ CONSTRUCTOR *****************************************************/	
62

    
63
	//for hibernate use only
64
	@Deprecated
65
	protected OrderedTermVocabulary() {
66
		super();
67
	}
68
	
69
	/**
70
	 * @param term
71
	 * @param label
72
	 * @param termSourceUri
73
	 */
74
	protected OrderedTermVocabulary(TermType type, String term, String label, String labelAbbrev, URI termSourceUri) {
75
		super(type, term, label, labelAbbrev, termSourceUri);
76
	}
77

    
78

    
79
//************************* METHODS **************************************/	
80
	
81
	@Transient
82
	@Override
83
	public Set<T> getNewTermSet() {
84
		return new TreeSet<T>();
85
	}
86
	
87
	@Transient
88
	public SortedSet<T> getOrderedTerms() {
89
		SortedSet<T> result = getSortedSetOfTerms();
90
		return result;
91
	}
92

    
93
	public SortedSet<T> getHigherAndEqualTerms(T otb) {
94
		SortedSet<T> result = new TreeSet<T>();
95
		SortedSet<T> sortedSet = getSortedSetOfTerms();
96
		result.addAll( sortedSet.tailSet(otb));
97
		return result;
98
	}
99

    
100
	public SortedSet<T> getHigherTerms(T otb) {
101
		SortedSet<T> result = getHigherAndEqualTerms(otb);
102
		for (T setObject : terms){
103
			if (setObject.compareTo(otb) == 0){
104
				result.remove(setObject);
105
			}
106
		}
107
		return result;
108
	}
109

    
110
	public SortedSet<T> getLowerAndEqualTerms(T otb) {
111
		SortedSet<T> result = new TreeSet<T>();
112
		SortedSet<T> sortedSet = getSortedSetOfTerms();
113
	
114
		result.addAll( sortedSet.headSet(otb));
115
		//headSet Returns a view of the portion of this set whose elements are STRICTLY less than toElement
116
		for (T setObject : terms){
117
			if (setObject.compareTo(otb) == 0){
118
				result.add(setObject);
119
			}
120
		}
121
		return result;
122
	}
123
	
124
	public SortedSet<T> getLowerTerms(T otb) {
125
		SortedSet<T> result = getLowerAndEqualTerms(otb);
126
		for (T setObject : terms){
127
			if (setObject.compareTo(otb) == 0){
128
				result.remove(setObject);
129
			}
130
		}
131
		return result;
132
	}
133

    
134
	public SortedSet<T> getEqualTerms(T otb) {
135
		SortedSet<T> result = new TreeSet<T>();
136
		for (T setObject : terms){
137
			if (setObject.compareTo(otb) == 0){
138
				result.add(setObject);
139
			}
140
		}
141
		return result;
142
	}
143
	
144
	public T getNextHigherTerm(T otb) {
145
		try {
146
			return getHigherTerms(otb).first();
147
		} catch (NoSuchElementException e) {
148
			return null;
149
		}
150
	}
151
	
152
	public T getNextLowerTerm(T otb) {
153
		try {
154
			return getLowerTerms(otb).last();
155
		} catch (NoSuchElementException e) {
156
			return null;
157
		}
158
	}
159

    
160
	@Transient
161
	public T getLowestTerm() {
162
		try {
163
			SortedSet<T> sortedSet = getSortedSetOfTerms();
164
			return sortedSet.first();
165
			//return ((SortedSet<T>)terms).first();
166
		} catch (NoSuchElementException e) {
167
			return null;
168
		}
169
	}
170
	
171
	@Transient
172
	public T getHighestTerm() {
173
		try {
174
			SortedSet<T> sortedSet = getSortedSetOfTerms();
175
			return sortedSet.last();
176
		} catch (NoSuchElementException e) {
177
			return null;
178
		}
179
	}
180
	
181
	/**
182
	 * Adds a term to the the end / lowest
183
	 * @see eu.etaxonomy.cdm.model.common.TermVocabulary#addTerm(eu.etaxonomy.cdm.model.common.DefinedTermBase)
184
	 */
185
	public void addTerm(T term) {
186
		SortedSet<T> sortedTerms = getSortedSetOfTerms();
187
		int lowestOrderIndex;
188
		if (sortedTerms.isEmpty()){
189
			lowestOrderIndex = 0;
190
		}else{
191
			T first = sortedTerms.first();
192
			lowestOrderIndex = first.orderIndex;
193
		}
194
		term.orderIndex = lowestOrderIndex + 1;
195
		super.addTerm(term);	
196
	}
197

    
198
	public void addTermAbove(T termToBeAdded, T lowerTerm)  {
199
		int orderInd = lowerTerm.orderIndex;
200
		termToBeAdded.orderIndex = orderInd;
201
		//increment all orderIndexes of terms below 
202
		Iterator<T> iterator = terms.iterator();
203
		while(iterator.hasNext()){
204
			T term = iterator.next();
205
			if (term.orderIndex >= orderInd){  //should always be true
206
				term.orderIndex++;
207
			}
208
		}
209
		super.addTerm(termToBeAdded);
210
	}
211

    
212
	public void addTermBelow(T termToBeAdded, T higherTerm)  {
213
		int orderInd = higherTerm.orderIndex;
214
		termToBeAdded.orderIndex = orderInd + 1;
215
		//increment all orderIndexes of terms below 
216
		Iterator<T> iterator = getLowerTerms(higherTerm).iterator();
217
		while(iterator.hasNext()){
218
			T term = iterator.next();
219
			if (term.orderIndex > orderInd){
220
				term.orderIndex++;
221
			}
222
		}
223
		super.addTerm(termToBeAdded);
224
	}
225
	
226
	public void addTermEqualLevel(T termToBeAdded, T equalLevelTerm) throws WrongTermTypeException {
227
		int orderInd = equalLevelTerm.orderIndex;
228
		termToBeAdded.orderIndex = orderInd;
229
		super.addTerm(termToBeAdded);
230
	}
231
	
232
	@Override
233
	public void removeTerm(T term) {
234
		if (term == null){
235
			return;
236
		}
237
		if (this.getEqualTerms(term).size() == 0){
238
			Iterator<T> iterator = getLowerTerms(term).iterator();
239
			while (iterator.hasNext()){
240
				T otb = iterator.next(); 
241
				toBeChangedByObject = otb;
242
				otb.decreaseIndex(this);
243
				toBeChangedByObject = null;
244
			}
245
		}
246
		super.removeTerm(term);
247
	}
248
	
249
	@Transient
250
	private T toBeChangedByObject;
251
	
252
	public boolean indexChangeAllowed(OrderedTermBase<T> orderedTermBase){
253
		return orderedTermBase == toBeChangedByObject ;
254
	}
255
	
256
	
257
	@Transient
258
	private SortedSet<T> getSortedSetOfTerms(){
259
		SortedSet<T> sortedSet = new TreeSet<T>();
260
		sortedSet.addAll(terms);
261
		return sortedSet;
262
	}
263

    
264
}
(50-50/70)