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 |
ee91bcd9
|
ben.clark
|
import org.hibernate.envers.Audited;
|
21 |
0a5d50a0
|
Andreas Müller
|
|
22 |
|
|
/**
|
23 |
|
|
* @author a.mueller
|
24 |
|
|
*
|
25 |
|
|
*/
|
26 |
01b7ddbf
|
a.babadshanjan
|
@XmlAccessorType(XmlAccessType.FIELD)
|
27 |
|
|
@XmlType(name = "OrderedTermVocabulary")
|
28 |
|
|
@XmlRootElement(name = "OrderedTermVocabulary")
|
29 |
230dda5c
|
Andreas Müller
|
@Entity
|
30 |
ee91bcd9
|
ben.clark
|
@Audited
|
31 |
0a5d50a0
|
Andreas Müller
|
public class OrderedTermVocabulary<T extends OrderedTermBase> extends TermVocabulary<T> {
|
32 |
0d575644
|
Andreas Müller
|
private static final long serialVersionUID = 7871741306306371242L;
|
33 |
|
|
@SuppressWarnings("unused")
|
34 |
0a5d50a0
|
Andreas Müller
|
private static final Logger logger = Logger.getLogger(OrderedTermVocabulary.class);
|
35 |
|
|
|
36 |
|
|
/**
|
37 |
|
|
* @param term
|
38 |
|
|
* @param label
|
39 |
|
|
* @param termSourceUri
|
40 |
|
|
*/
|
41 |
41b23b4e
|
Andreas Müller
|
public OrderedTermVocabulary(String term, String label, String labelAbbrev, String termSourceUri) {
|
42 |
|
|
super(term, label, labelAbbrev, termSourceUri);
|
43 |
0a5d50a0
|
Andreas Müller
|
}
|
44 |
f6765014
|
ben.clark
|
|
45 |
|
|
public OrderedTermVocabulary() {
|
46 |
|
|
super();
|
47 |
|
|
}
|
48 |
0a5d50a0
|
Andreas Müller
|
|
49 |
b70a7f94
|
Andreas Kohlbecker
|
@Transient
|
50 |
f6765014
|
ben.clark
|
@Override
|
51 |
|
|
public Set<T> getNewTermSet() {
|
52 |
0a5d50a0
|
Andreas Müller
|
return new TreeSet<T>();
|
53 |
|
|
}
|
54 |
b70a7f94
|
Andreas Kohlbecker
|
|
55 |
f480cc13
|
Andreas Kohlbecker
|
@Transient
|
56 |
|
|
public SortedSet<T> getOrderedTerms() {
|
57 |
a1c4f027
|
Andreas Müller
|
SortedSet<T> result = getSortedSetOfTerms();
|
58 |
32b86483
|
Andreas Müller
|
return result;
|
59 |
|
|
}
|
60 |
a1c4f027
|
Andreas Müller
|
|
61 |
fb2451a1
|
Andreas Müller
|
public SortedSet<T> getHigherAndEqualTerms(T otb) {
|
62 |
|
|
SortedSet<T> result = new TreeSet<T>();
|
63 |
a1c4f027
|
Andreas Müller
|
SortedSet<T> sortedSet = getSortedSetOfTerms();
|
64 |
b51607bc
|
Andreas Müller
|
result.addAll( sortedSet.tailSet(otb));
|
65 |
fb2451a1
|
Andreas Müller
|
return result;
|
66 |
|
|
}
|
67 |
ee91bcd9
|
ben.clark
|
|
68 |
0a5d50a0
|
Andreas Müller
|
public SortedSet<T> getHigherTerms(T otb) {
|
69 |
fb2451a1
|
Andreas Müller
|
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 |
0a5d50a0
|
Andreas Müller
|
}
|
77 |
fb2451a1
|
Andreas Müller
|
|
78 |
|
|
public SortedSet<T> getLowerAndEqualTerms(T otb) {
|
79 |
|
|
SortedSet<T> result = new TreeSet<T>();
|
80 |
a1c4f027
|
Andreas Müller
|
SortedSet<T> sortedSet = getSortedSetOfTerms();
|
81 |
b51607bc
|
Andreas Müller
|
result.addAll( sortedSet.headSet(otb));
|
82 |
fb2451a1
|
Andreas Müller
|
return result;
|
83 |
|
|
}
|
84 |
|
|
|
85 |
0a5d50a0
|
Andreas Müller
|
public SortedSet<T> getLowerTerms(T otb) {
|
86 |
fb2451a1
|
Andreas Müller
|
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 |
0a5d50a0
|
Andreas Müller
|
}
|
94 |
aebcb6a1
|
Andreas Müller
|
|
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 |
fb2451a1
|
Andreas Müller
|
|
105 |
0a5d50a0
|
Andreas Müller
|
public T getNextHigherTerm(T otb) {
|
106 |
|
|
try {
|
107 |
aebcb6a1
|
Andreas Müller
|
return getHigherTerms(otb).first();
|
108 |
0a5d50a0
|
Andreas Müller
|
} catch (NoSuchElementException e) {
|
109 |
|
|
return null;
|
110 |
|
|
}
|
111 |
|
|
}
|
112 |
3fd06fea
|
Andreas Müller
|
|
113 |
0a5d50a0
|
Andreas Müller
|
public T getNextLowerTerm(T otb) {
|
114 |
|
|
try {
|
115 |
aebcb6a1
|
Andreas Müller
|
return getLowerTerms(otb).last();
|
116 |
0a5d50a0
|
Andreas Müller
|
} catch (NoSuchElementException e) {
|
117 |
|
|
return null;
|
118 |
|
|
}
|
119 |
|
|
}
|
120 |
b70a7f94
|
Andreas Kohlbecker
|
|
121 |
|
|
@Transient
|
122 |
0a5d50a0
|
Andreas Müller
|
public T getLowestTerm() {
|
123 |
|
|
try {
|
124 |
a1c4f027
|
Andreas Müller
|
SortedSet<T> sortedSet = getSortedSetOfTerms();
|
125 |
99491025
|
Andreas Müller
|
return sortedSet.first();
|
126 |
|
|
//return ((SortedSet<T>)terms).first();
|
127 |
0a5d50a0
|
Andreas Müller
|
} catch (NoSuchElementException e) {
|
128 |
|
|
return null;
|
129 |
|
|
}
|
130 |
|
|
}
|
131 |
|
|
|
132 |
b70a7f94
|
Andreas Kohlbecker
|
@Transient
|
133 |
0a5d50a0
|
Andreas Müller
|
public T getHighestTerm() {
|
134 |
|
|
try {
|
135 |
a1c4f027
|
Andreas Müller
|
SortedSet<T> sortedSet = getSortedSetOfTerms();
|
136 |
b51607bc
|
Andreas Müller
|
return sortedSet.last();
|
137 |
0a5d50a0
|
Andreas Müller
|
} catch (NoSuchElementException e) {
|
138 |
|
|
return null;
|
139 |
|
|
}
|
140 |
|
|
}
|
141 |
|
|
|
142 |
f6765014
|
ben.clark
|
public void addTerm(T term) {
|
143 |
a1c4f027
|
Andreas Müller
|
SortedSet<T> sortedTerms = getSortedSetOfTerms();
|
144 |
fb2451a1
|
Andreas Müller
|
int lowestOrderIndex;
|
145 |
|
|
if (sortedTerms.size() == 0){
|
146 |
aebcb6a1
|
Andreas Müller
|
lowestOrderIndex = 0;
|
147 |
fb2451a1
|
Andreas Müller
|
}else{
|
148 |
f6765014
|
ben.clark
|
T first = sortedTerms.first();
|
149 |
|
|
lowestOrderIndex = first.orderIndex;
|
150 |
fb2451a1
|
Andreas Müller
|
}
|
151 |
0a5d50a0
|
Andreas Müller
|
term.orderIndex = lowestOrderIndex + 1;
|
152 |
|
|
super.addTerm(term);
|
153 |
|
|
}
|
154 |
|
|
|
155 |
aebcb6a1
|
Andreas Müller
|
public void addTermAbove(T termToBeAdded, T lowerTerm) throws WrongTermTypeException {
|
156 |
|
|
int orderInd = lowerTerm.orderIndex;
|
157 |
0a5d50a0
|
Andreas Müller
|
termToBeAdded.orderIndex = orderInd;
|
158 |
aebcb6a1
|
Andreas Müller
|
//increment all orderIndexes of terms below
|
159 |
0a5d50a0
|
Andreas Müller
|
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 |
aebcb6a1
|
Andreas Müller
|
public void addTermBelow(T termToBeAdded, T higherTerm) throws WrongTermTypeException {
|
170 |
|
|
int orderInd = higherTerm.orderIndex;
|
171 |
0a5d50a0
|
Andreas Müller
|
termToBeAdded.orderIndex = orderInd + 1;
|
172 |
aebcb6a1
|
Andreas Müller
|
//increment all orderIndexes of terms below
|
173 |
|
|
Iterator<T> iterator = getLowerTerms(higherTerm).iterator();
|
174 |
0a5d50a0
|
Andreas Müller
|
while(iterator.hasNext()){
|
175 |
|
|
T term = iterator.next();
|
176 |
|
|
if (term.orderIndex > orderInd){
|
177 |
|
|
term.orderIndex++;
|
178 |
|
|
}
|
179 |
|
|
}
|
180 |
|
|
super.addTerm(termToBeAdded);
|
181 |
aebcb6a1
|
Andreas Müller
|
}
|
182 |
|
|
|
183 |
f6765014
|
ben.clark
|
public void addTermEqualLevel(T termToBeAdded, T equalLevelTerm) throws WrongTermTypeException {
|
184 |
|
|
int orderInd = equalLevelTerm.orderIndex;
|
185 |
|
|
termToBeAdded.orderIndex = orderInd;
|
186 |
|
|
super.addTerm(termToBeAdded);
|
187 |
|
|
}
|
188 |
0a5d50a0
|
Andreas Müller
|
|
189 |
|
|
@Override
|
190 |
|
|
public void removeTerm(T term) {
|
191 |
fb2451a1
|
Andreas Müller
|
if (term == null){
|
192 |
|
|
return;
|
193 |
|
|
}
|
194 |
aebcb6a1
|
Andreas Müller
|
if (this.getEqualTerms(term).size() == 0){
|
195 |
0a5d50a0
|
Andreas Müller
|
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 |
f6765014
|
ben.clark
|
super.removeTerm(term);
|
204 |
0a5d50a0
|
Andreas Müller
|
}
|
205 |
|
|
|
206 |
ee91bcd9
|
ben.clark
|
@Transient
|
207 |
0a5d50a0
|
Andreas Müller
|
private T toBeChangedByObject;
|
208 |
|
|
|
209 |
ee91bcd9
|
ben.clark
|
public boolean indexChangeAllowed(OrderedTermBase<T> orderedTermBase){
|
210 |
|
|
return orderedTermBase == toBeChangedByObject ;
|
211 |
0a5d50a0
|
Andreas Müller
|
}
|
212 |
a1c4f027
|
Andreas Müller
|
|
213 |
|
|
|
214 |
|
|
@Transient
|
215 |
|
|
private SortedSet<T> getSortedSetOfTerms(){
|
216 |
|
|
SortedSet<T> sortedSet = new TreeSet<T>();
|
217 |
|
|
sortedSet.addAll(terms);
|
218 |
|
|
return sortedSet;
|
219 |
|
|
}
|
220 |
0a5d50a0
|
Andreas Müller
|
|
221 |
|
|
}
|