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 |
|
|
}
|