Project

General

Profile

Download (5.48 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
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
import javax.persistence.Entity;
13
import javax.persistence.Transient;
14
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

    
19
import org.apache.log4j.Logger;
20
import org.hibernate.envers.Audited;
21

    
22
/**
23
 * @author a.mueller
24
 *
25
 */
26
@XmlAccessorType(XmlAccessType.FIELD)
27
@XmlType(name = "OrderedTermVocabulary")
28
@XmlRootElement(name = "OrderedTermVocabulary")
29
@Entity
30
@Audited
31
public class OrderedTermVocabulary<T extends OrderedTermBase> extends TermVocabulary<T> {
32
	private static final long serialVersionUID = 7871741306306371242L;
33
	@SuppressWarnings("unused")
34
	private static final Logger logger = Logger.getLogger(OrderedTermVocabulary.class);
35

    
36
	/**
37
	 * @param term
38
	 * @param label
39
	 * @param termSourceUri
40
	 */
41
	public OrderedTermVocabulary(String term, String label, String labelAbbrev, String termSourceUri) {
42
		super(term, label, labelAbbrev, termSourceUri);
43
	}
44

    
45
	public OrderedTermVocabulary() {
46
		super();
47
	}
48
	
49
	@Transient
50
	@Override
51
	public Set<T> getNewTermSet() {
52
		return new TreeSet<T>();
53
	}
54
	
55
	@Transient
56
	public SortedSet<T> getOrderedTerms() {
57
		SortedSet<T> result = getSortedSetOfTerms();
58
		return result;
59
	}
60

    
61
	public SortedSet<T> getHigherAndEqualTerms(T otb) {
62
		SortedSet<T> result = new TreeSet<T>();
63
		SortedSet<T> sortedSet = getSortedSetOfTerms();
64
		result.addAll( sortedSet.tailSet(otb));
65
		return result;
66
	}
67

    
68
	public SortedSet<T> getHigherTerms(T otb) {
69
		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
	}
77

    
78
	public SortedSet<T> getLowerAndEqualTerms(T otb) {
79
		SortedSet<T> result = new TreeSet<T>();
80
		SortedSet<T> sortedSet = getSortedSetOfTerms();
81
		result.addAll( sortedSet.headSet(otb));
82
		return result;
83
	}
84
	
85
	public SortedSet<T> getLowerTerms(T otb) {
86
		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
	}
94

    
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
	
105
	public T getNextHigherTerm(T otb) {
106
		try {
107
			return getHigherTerms(otb).first();
108
		} catch (NoSuchElementException e) {
109
			return null;
110
		}
111
	}
112
	
113
	public T getNextLowerTerm(T otb) {
114
		try {
115
			return getLowerTerms(otb).last();
116
		} catch (NoSuchElementException e) {
117
			return null;
118
		}
119
	}
120

    
121
	@Transient
122
	public T getLowestTerm() {
123
		try {
124
			SortedSet<T> sortedSet = getSortedSetOfTerms();
125
			return sortedSet.first();
126
			//return ((SortedSet<T>)terms).first();
127
		} catch (NoSuchElementException e) {
128
			return null;
129
		}
130
	}
131
	
132
	@Transient
133
	public T getHighestTerm() {
134
		try {
135
			SortedSet<T> sortedSet = getSortedSetOfTerms();
136
			return sortedSet.last();
137
		} catch (NoSuchElementException e) {
138
			return null;
139
		}
140
	}
141
	
142
	public void addTerm(T term) {
143
		SortedSet<T> sortedTerms = getSortedSetOfTerms();
144
		int lowestOrderIndex;
145
		if (sortedTerms.size() == 0){
146
			lowestOrderIndex = 0;
147
		}else{
148
			T first = sortedTerms.first();
149
			lowestOrderIndex = first.orderIndex;
150
		}
151
		term.orderIndex = lowestOrderIndex + 1;
152
		super.addTerm(term);	
153
	}
154

    
155
	public void addTermAbove(T termToBeAdded, T lowerTerm) throws WrongTermTypeException {
156
		int orderInd = lowerTerm.orderIndex;
157
		termToBeAdded.orderIndex = orderInd;
158
		//increment all orderIndexes of terms below 
159
		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
	public void addTermBelow(T termToBeAdded, T higherTerm) throws WrongTermTypeException {
170
		int orderInd = higherTerm.orderIndex;
171
		termToBeAdded.orderIndex = orderInd + 1;
172
		//increment all orderIndexes of terms below 
173
		Iterator<T> iterator = getLowerTerms(higherTerm).iterator();
174
		while(iterator.hasNext()){
175
			T term = iterator.next();
176
			if (term.orderIndex > orderInd){
177
				term.orderIndex++;
178
			}
179
		}
180
		super.addTerm(termToBeAdded);
181
	}
182
	
183
	public void addTermEqualLevel(T termToBeAdded, T equalLevelTerm) throws WrongTermTypeException {
184
		int orderInd = equalLevelTerm.orderIndex;
185
		termToBeAdded.orderIndex = orderInd;
186
		super.addTerm(termToBeAdded);
187
	}
188
	
189
	@Override
190
	public void removeTerm(T term) {
191
		if (term == null){
192
			return;
193
		}
194
		if (this.getEqualTerms(term).size() == 0){
195
			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
		super.removeTerm(term);
204
	}
205
	
206
	@Transient
207
	private T toBeChangedByObject;
208
	
209
	public boolean indexChangeAllowed(OrderedTermBase<T> orderedTermBase){
210
		return orderedTermBase == toBeChangedByObject ;
211
	}
212
	
213
	
214
	@Transient
215
	private SortedSet<T> getSortedSetOfTerms(){
216
		SortedSet<T> sortedSet = new TreeSet<T>();
217
		sortedSet.addAll(terms);
218
		return sortedSet;
219
	}
220

    
221
}
(38-38/58)