Project

General

Profile

Download (4.67 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
			return ((SortedSet<T>)terms).first();
117
		} catch (NoSuchElementException e) {
118
			return null;
119
		}
120
	}
121
	
122
	@Transient
123
	public T getHighestTerm() {
124
		try {
125
			return ((SortedSet<T>)terms).last();
126
		} catch (NoSuchElementException e) {
127
			return null;
128
		}
129
	}
130
	
131
	@Override
132
	public void addTerm(T term) throws WrongTermTypeException {
133
		SortedSet sortedTerms = ((SortedSet<T>)terms);
134
		int lowestOrderIndex;
135
		if (sortedTerms.size() == 0){
136
			lowestOrderIndex = 0;
137
		}else{
138
			Object first = (T)sortedTerms.first();
139
			lowestOrderIndex = ((T)first).orderIndex;
140
		}
141
		term.orderIndex = lowestOrderIndex + 1;
142
		super.addTerm(term);	
143
	}
144

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

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

    
202
}
(30-30/43)