Project

General

Profile

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