4 package eu
.etaxonomy
.cdm
.model
.common
;
6 import java
.util
.HashSet
;
7 import java
.util
.Iterator
;
9 import java
.util
.NoSuchElementException
;
11 import java
.util
.SortedSet
;
12 import java
.util
.TreeSet
;
14 import javax
.persistence
.Entity
;
15 import javax
.persistence
.Transient
;
17 import org
.apache
.log4j
.Logger
;
24 public class OrderedTermVocabulary
<T
extends OrderedTermBase
> extends TermVocabulary
<T
> {
25 private static final Logger logger
= Logger
.getLogger(OrderedTermVocabulary
.class);
30 public OrderedTermVocabulary() {
37 * @param termSourceUri
39 public OrderedTermVocabulary(String term
, String label
, String termSourceUri
) {
40 super(term
, label
, termSourceUri
);
45 protected Set
<T
> getNewTermSet(){
46 return new TreeSet
<T
>();
50 public SortedSet
<T
> getHigherAndEqualTerms(T otb
) {
51 SortedSet
<T
> result
= new TreeSet
<T
>();
52 result
.addAll( ((SortedSet
<T
>)terms
).tailSet(otb
));
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
);
67 public SortedSet
<T
> getLowerAndEqualTerms(T otb
) {
68 SortedSet
<T
> result
= new TreeSet
<T
>();
69 result
.addAll( ((SortedSet
<T
>)terms
).headSet(otb
));
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
);
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
);
96 public T
getNextHigherTerm(T otb
) {
98 return getHigherTerms(otb
).first();
99 } catch (NoSuchElementException e
) {
105 public T
getNextLowerTerm(T otb
) {
107 return getLowerTerms(otb
).last();
108 } catch (NoSuchElementException e
) {
114 public T
getLowestTerm() {
116 return ((SortedSet
<T
>)terms
).first();
117 } catch (NoSuchElementException e
) {
123 public T
getHighestTerm() {
125 return ((SortedSet
<T
>)terms
).last();
126 } catch (NoSuchElementException e
) {
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;
138 Object first
= (T
)sortedTerms
.first();
139 lowestOrderIndex
= ((T
)first
).orderIndex
;
141 term
.orderIndex
= lowestOrderIndex
+ 1;
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
156 super.addTerm(termToBeAdded
);
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
){
170 super.addTerm(termToBeAdded
);
173 // public void addTermEqualLevel(T termToBeAdded, T equalLevelTerm) throws WrongTermTypeException {
174 // int orderInd = equalLevelTerm.orderIndex;
175 // termToBeAdded.orderIndex = orderInd;
176 // super.addTerm(termToBeAdded);
180 public void removeTerm(T term
) {
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;
193 term
.setVocabulary(null);
196 private T toBeChangedByObject
;
198 public boolean indexChangeAllowed(T otb
){
199 return otb
== toBeChangedByObject
;