Project

General

Profile

Download (5.48 KB) Statistics
| Branch: | Tag: | Revision:
1 0a5d50a0 Andreas Müller
/**
2
 * 
3
 */
4
package eu.etaxonomy.cdm.model.common;
5
6
import java.util.Iterator;
7
import java.util.NoSuchElementException;
8
import java.util.Set;
9
import java.util.SortedSet;
10
import java.util.TreeSet;
11
12 230dda5c Andreas Müller
import javax.persistence.Entity;
13 3fd06fea Andreas Müller
import javax.persistence.Transient;
14 01b7ddbf a.babadshanjan
import javax.xml.bind.annotation.XmlAccessType;
15
import javax.xml.bind.annotation.XmlAccessorType;
16
import javax.xml.bind.annotation.XmlRootElement;
17
import javax.xml.bind.annotation.XmlType;
18 230dda5c Andreas Müller
19 0a5d50a0 Andreas Müller
import org.apache.log4j.Logger;
20 ee91bcd9 ben.clark
import org.hibernate.envers.Audited;
21 0a5d50a0 Andreas Müller
22
/**
23
 * @author a.mueller
24
 *
25
 */
26 01b7ddbf a.babadshanjan
@XmlAccessorType(XmlAccessType.FIELD)
27
@XmlType(name = "OrderedTermVocabulary")
28
@XmlRootElement(name = "OrderedTermVocabulary")
29 230dda5c Andreas Müller
@Entity
30 ee91bcd9 ben.clark
@Audited
31 0a5d50a0 Andreas Müller
public class OrderedTermVocabulary<T extends OrderedTermBase> extends TermVocabulary<T> {
32 0d575644 Andreas Müller
	private static final long serialVersionUID = 7871741306306371242L;
33
	@SuppressWarnings("unused")
34 0a5d50a0 Andreas Müller
	private static final Logger logger = Logger.getLogger(OrderedTermVocabulary.class);
35
36
	/**
37
	 * @param term
38
	 * @param label
39
	 * @param termSourceUri
40
	 */
41 41b23b4e Andreas Müller
	public OrderedTermVocabulary(String term, String label, String labelAbbrev, String termSourceUri) {
42
		super(term, label, labelAbbrev, termSourceUri);
43 0a5d50a0 Andreas Müller
	}
44 f6765014 ben.clark
45
	public OrderedTermVocabulary() {
46
		super();
47
	}
48 0a5d50a0 Andreas Müller
	
49 b70a7f94 Andreas Kohlbecker
	@Transient
50 f6765014 ben.clark
	@Override
51
	public Set<T> getNewTermSet() {
52 0a5d50a0 Andreas Müller
		return new TreeSet<T>();
53
	}
54 b70a7f94 Andreas Kohlbecker
	
55 f480cc13 Andreas Kohlbecker
	@Transient
56
	public SortedSet<T> getOrderedTerms() {
57 a1c4f027 Andreas Müller
		SortedSet<T> result = getSortedSetOfTerms();
58 32b86483 Andreas Müller
		return result;
59
	}
60 a1c4f027 Andreas Müller
61 fb2451a1 Andreas Müller
	public SortedSet<T> getHigherAndEqualTerms(T otb) {
62
		SortedSet<T> result = new TreeSet<T>();
63 a1c4f027 Andreas Müller
		SortedSet<T> sortedSet = getSortedSetOfTerms();
64 b51607bc Andreas Müller
		result.addAll( sortedSet.tailSet(otb));
65 fb2451a1 Andreas Müller
		return result;
66
	}
67 ee91bcd9 ben.clark
68 0a5d50a0 Andreas Müller
	public SortedSet<T> getHigherTerms(T otb) {
69 fb2451a1 Andreas Müller
		SortedSet<T> result = getHigherAndEqualTerms(otb);
70
		for (T setObject : terms){
71
			if (setObject.compareTo(otb) == 0){
72
				result.remove(setObject);
73
			}
74
		}
75
		return result;
76 0a5d50a0 Andreas Müller
	}
77 fb2451a1 Andreas Müller
78
	public SortedSet<T> getLowerAndEqualTerms(T otb) {
79
		SortedSet<T> result = new TreeSet<T>();
80 a1c4f027 Andreas Müller
		SortedSet<T> sortedSet = getSortedSetOfTerms();
81 b51607bc Andreas Müller
		result.addAll( sortedSet.headSet(otb));
82 fb2451a1 Andreas Müller
		return result;
83
	}
84
	
85 0a5d50a0 Andreas Müller
	public SortedSet<T> getLowerTerms(T otb) {
86 fb2451a1 Andreas Müller
		SortedSet<T> result = getLowerAndEqualTerms(otb);
87
		for (T setObject : terms){
88
			if (setObject.compareTo(otb) == 0){
89
				result.remove(setObject);
90
			}
91
		}
92
		return result;
93 0a5d50a0 Andreas Müller
	}
94 aebcb6a1 Andreas Müller
95
	public SortedSet<T> getEqualTerms(T otb) {
96
		SortedSet<T> result = new TreeSet<T>();
97
		for (T setObject : terms){
98
			if (setObject.compareTo(otb) == 0){
99
				result.add(setObject);
100
			}
101
		}
102
		return result;
103
	}
104 fb2451a1 Andreas Müller
	
105 0a5d50a0 Andreas Müller
	public T getNextHigherTerm(T otb) {
106
		try {
107 aebcb6a1 Andreas Müller
			return getHigherTerms(otb).first();
108 0a5d50a0 Andreas Müller
		} catch (NoSuchElementException e) {
109
			return null;
110
		}
111
	}
112 3fd06fea Andreas Müller
	
113 0a5d50a0 Andreas Müller
	public T getNextLowerTerm(T otb) {
114
		try {
115 aebcb6a1 Andreas Müller
			return getLowerTerms(otb).last();
116 0a5d50a0 Andreas Müller
		} catch (NoSuchElementException e) {
117
			return null;
118
		}
119
	}
120 b70a7f94 Andreas Kohlbecker
121
	@Transient
122 0a5d50a0 Andreas Müller
	public T getLowestTerm() {
123
		try {
124 a1c4f027 Andreas Müller
			SortedSet<T> sortedSet = getSortedSetOfTerms();
125 99491025 Andreas Müller
			return sortedSet.first();
126
			//return ((SortedSet<T>)terms).first();
127 0a5d50a0 Andreas Müller
		} catch (NoSuchElementException e) {
128
			return null;
129
		}
130
	}
131
	
132 b70a7f94 Andreas Kohlbecker
	@Transient
133 0a5d50a0 Andreas Müller
	public T getHighestTerm() {
134
		try {
135 a1c4f027 Andreas Müller
			SortedSet<T> sortedSet = getSortedSetOfTerms();
136 b51607bc Andreas Müller
			return sortedSet.last();
137 0a5d50a0 Andreas Müller
		} catch (NoSuchElementException e) {
138
			return null;
139
		}
140
	}
141
	
142 f6765014 ben.clark
	public void addTerm(T term) {
143 a1c4f027 Andreas Müller
		SortedSet<T> sortedTerms = getSortedSetOfTerms();
144 fb2451a1 Andreas Müller
		int lowestOrderIndex;
145
		if (sortedTerms.size() == 0){
146 aebcb6a1 Andreas Müller
			lowestOrderIndex = 0;
147 fb2451a1 Andreas Müller
		}else{
148 f6765014 ben.clark
			T first = sortedTerms.first();
149
			lowestOrderIndex = first.orderIndex;
150 fb2451a1 Andreas Müller
		}
151 0a5d50a0 Andreas Müller
		term.orderIndex = lowestOrderIndex + 1;
152
		super.addTerm(term);	
153
	}
154
155 aebcb6a1 Andreas Müller
	public void addTermAbove(T termToBeAdded, T lowerTerm) throws WrongTermTypeException {
156
		int orderInd = lowerTerm.orderIndex;
157 0a5d50a0 Andreas Müller
		termToBeAdded.orderIndex = orderInd;
158 aebcb6a1 Andreas Müller
		//increment all orderIndexes of terms below 
159 0a5d50a0 Andreas Müller
		Iterator<T> iterator = terms.iterator();
160
		while(iterator.hasNext()){
161
			T term = iterator.next();
162
			if (term.orderIndex >= orderInd){  //should always be true
163
				term.orderIndex++;
164
			}
165
		}
166
		super.addTerm(termToBeAdded);
167
	}
168
169 aebcb6a1 Andreas Müller
	public void addTermBelow(T termToBeAdded, T higherTerm) throws WrongTermTypeException {
170
		int orderInd = higherTerm.orderIndex;
171 0a5d50a0 Andreas Müller
		termToBeAdded.orderIndex = orderInd + 1;
172 aebcb6a1 Andreas Müller
		//increment all orderIndexes of terms below 
173
		Iterator<T> iterator = getLowerTerms(higherTerm).iterator();
174 0a5d50a0 Andreas Müller
		while(iterator.hasNext()){
175
			T term = iterator.next();
176
			if (term.orderIndex > orderInd){
177
				term.orderIndex++;
178
			}
179
		}
180
		super.addTerm(termToBeAdded);
181 aebcb6a1 Andreas Müller
	}
182
	
183 f6765014 ben.clark
	public void addTermEqualLevel(T termToBeAdded, T equalLevelTerm) throws WrongTermTypeException {
184
		int orderInd = equalLevelTerm.orderIndex;
185
		termToBeAdded.orderIndex = orderInd;
186
		super.addTerm(termToBeAdded);
187
	}
188 0a5d50a0 Andreas Müller
	
189
	@Override
190
	public void removeTerm(T term) {
191 fb2451a1 Andreas Müller
		if (term == null){
192
			return;
193
		}
194 aebcb6a1 Andreas Müller
		if (this.getEqualTerms(term).size() == 0){
195 0a5d50a0 Andreas Müller
			Iterator<T> iterator = getLowerTerms(term).iterator();
196
			while (iterator.hasNext()){
197
				T otb = iterator.next(); 
198
				toBeChangedByObject = otb;
199
				otb.decreaseIndex(this);
200
				toBeChangedByObject = null;
201
			}
202
		}
203 f6765014 ben.clark
		super.removeTerm(term);
204 0a5d50a0 Andreas Müller
	}
205
	
206 ee91bcd9 ben.clark
	@Transient
207 0a5d50a0 Andreas Müller
	private T toBeChangedByObject;
208
	
209 ee91bcd9 ben.clark
	public boolean indexChangeAllowed(OrderedTermBase<T> orderedTermBase){
210
		return orderedTermBase == toBeChangedByObject ;
211 0a5d50a0 Andreas Müller
	}
212 a1c4f027 Andreas Müller
	
213
	
214
	@Transient
215
	private SortedSet<T> getSortedSetOfTerms(){
216
		SortedSet<T> sortedSet = new TreeSet<T>();
217
		sortedSet.addAll(terms);
218
		return sortedSet;
219
	}
220 0a5d50a0 Andreas Müller
221
}