Project

General

Profile

Download (4.78 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * 
3
 */
4
package eu.etaxonomy.cdm.model.common;
5

    
6
import java.util.HashSet;
7
import java.util.Iterator;
8
import java.util.List;
9
import java.util.NoSuchElementException;
10
import java.util.Set;
11
import java.util.SortedSet;
12
import java.util.TreeSet;
13

    
14
import javax.persistence.Entity;
15
import javax.persistence.Transient;
16

    
17
import org.apache.log4j.Logger;
18

    
19
/**
20
 * @author a.mueller
21
 *
22
 */
23
@Entity
24
public class OrderedTermVocabulary<T extends OrderedTermBase> extends TermVocabulary<T> {
25
	private static final Logger logger = Logger.getLogger(OrderedTermVocabulary.class);
26
	
27
	/**
28
	 * 
29
	 */
30
	public OrderedTermVocabulary() {
31
		super();
32
	}
33

    
34
	/**
35
	 * @param term
36
	 * @param label
37
	 * @param termSourceUri
38
	 */
39
	public OrderedTermVocabulary(String term, String label, String termSourceUri) {
40
		super(term, label, termSourceUri);
41
	}
42
	
43
	@Override
44
	@Transient
45
	protected Set<T> getNewTermSet(){
46
		return new TreeSet<T>();
47
	}
48
	
49
	@Transient
50
	public SortedSet<T> getHigherAndEqualTerms(T otb) {
51
		SortedSet<T> result = new TreeSet<T>();
52
		result.addAll( ((SortedSet<T>)terms).tailSet(otb));
53
		return result;
54
	}
55
	@Transient
56
	public SortedSet<T> getHigherTerms(T otb) {
57
		SortedSet<T> result = getHigherAndEqualTerms(otb);
58
		for (T setObject : terms){
59
			if (setObject.compareTo(otb) == 0){
60
				result.remove(setObject);
61
			}
62
		}
63
		return result;
64
	}
65

    
66
	@Transient
67
	public SortedSet<T> getLowerAndEqualTerms(T otb) {
68
		SortedSet<T> result = new TreeSet<T>();
69
		result.addAll( ((SortedSet<T>)terms).headSet(otb));
70
		return result;
71
	}
72
	
73
	@Transient
74
	public SortedSet<T> getLowerTerms(T otb) {
75
		SortedSet<T> result = getLowerAndEqualTerms(otb);
76
		for (T setObject : terms){
77
			if (setObject.compareTo(otb) == 0){
78
				result.remove(setObject);
79
			}
80
		}
81
		return result;
82
	}
83

    
84
	@Transient
85
	public SortedSet<T> getEqualTerms(T otb) {
86
		SortedSet<T> result = new TreeSet<T>();
87
		for (T setObject : terms){
88
			if (setObject.compareTo(otb) == 0){
89
				result.add(setObject);
90
			}
91
		}
92
		return result;
93
	}
94
	
95
	@Transient
96
	public T getNextHigherTerm(T otb) {
97
		try {
98
			return getHigherTerms(otb).first();
99
		} catch (NoSuchElementException e) {
100
			return null;
101
		}
102
	}
103
	
104
	@Transient
105
	public T getNextLowerTerm(T otb) {
106
		try {
107
			return getLowerTerms(otb).last();
108
		} catch (NoSuchElementException e) {
109
			return null;
110
		}
111
	}
112
	
113
	@Transient
114
	public T getLowestTerm() {
115
		try {
116
			SortedSet<T> sortedSet = new TreeSet();
117
			sortedSet.addAll(terms);
118
			return sortedSet.first();
119
			//return ((SortedSet<T>)terms).first();
120
		} catch (NoSuchElementException e) {
121
			return null;
122
		}
123
	}
124
	
125
	@Transient
126
	public T getHighestTerm() {
127
		try {
128
			return ((SortedSet<T>)terms).last();
129
		} catch (NoSuchElementException e) {
130
			return null;
131
		}
132
	}
133
	
134
	@Override
135
	public void addTerm(T term) throws WrongTermTypeException {
136
		SortedSet sortedTerms = ((SortedSet<T>)terms);
137
		int lowestOrderIndex;
138
		if (sortedTerms.size() == 0){
139
			lowestOrderIndex = 0;
140
		}else{
141
			Object first = (T)sortedTerms.first();
142
			lowestOrderIndex = ((T)first).orderIndex;
143
		}
144
		term.orderIndex = lowestOrderIndex + 1;
145
		super.addTerm(term);	
146
	}
147

    
148
	public void addTermAbove(T termToBeAdded, T lowerTerm) throws WrongTermTypeException {
149
		int orderInd = lowerTerm.orderIndex;
150
		termToBeAdded.orderIndex = orderInd;
151
		//increment all orderIndexes of terms below 
152
		Iterator<T> iterator = terms.iterator();
153
		while(iterator.hasNext()){
154
			T term = iterator.next();
155
			if (term.orderIndex >= orderInd){  //should always be true
156
				term.orderIndex++;
157
			}
158
		}
159
		super.addTerm(termToBeAdded);
160
	}
161

    
162
	public void addTermBelow(T termToBeAdded, T higherTerm) throws WrongTermTypeException {
163
		int orderInd = higherTerm.orderIndex;
164
		termToBeAdded.orderIndex = orderInd + 1;
165
		//increment all orderIndexes of terms below 
166
		Iterator<T> iterator = getLowerTerms(higherTerm).iterator();
167
		while(iterator.hasNext()){
168
			T term = iterator.next();
169
			if (term.orderIndex > orderInd){
170
				term.orderIndex++;
171
			}
172
		}
173
		super.addTerm(termToBeAdded);
174
	}
175
	
176
//	public void addTermEqualLevel(T termToBeAdded, T equalLevelTerm) throws WrongTermTypeException {
177
//		int orderInd = equalLevelTerm.orderIndex;
178
//		termToBeAdded.orderIndex = orderInd;
179
//		super.addTerm(termToBeAdded);
180
//	}
181
	
182
	@Override
183
	public void removeTerm(T term) {
184
		if (term == null){
185
			return;
186
		}
187
		if (this.getEqualTerms(term).size() == 0){
188
			Iterator<T> iterator = getLowerTerms(term).iterator();
189
			while (iterator.hasNext()){
190
				T otb = iterator.next(); 
191
				toBeChangedByObject = otb;
192
				otb.decreaseIndex(this);
193
				toBeChangedByObject = null;
194
			}
195
		}
196
		term.setVocabulary(null);
197
	}
198
	
199
	private T toBeChangedByObject;
200
	
201
	public boolean indexChangeAllowed(T otb){
202
		return otb == toBeChangedByObject ;
203
	}
204

    
205
}
(30-30/43)