2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.model
.common
;
12 import java
.util
.Iterator
;
13 import java
.util
.NoSuchElementException
;
15 import java
.util
.SortedSet
;
16 import java
.util
.TreeSet
;
18 import javax
.persistence
.Entity
;
19 import javax
.persistence
.Transient
;
20 import javax
.xml
.bind
.annotation
.XmlAccessType
;
21 import javax
.xml
.bind
.annotation
.XmlAccessorType
;
22 import javax
.xml
.bind
.annotation
.XmlRootElement
;
23 import javax
.xml
.bind
.annotation
.XmlType
;
25 import org
.apache
.log4j
.Logger
;
26 import org
.hibernate
.envers
.Audited
;
27 import org
.hibernate
.search
.annotations
.Indexed
;
33 @XmlAccessorType(XmlAccessType
.FIELD
)
34 @XmlType(name
= "OrderedTermVocabulary")
35 @XmlRootElement(name
= "OrderedTermVocabulary")
37 @Indexed(index
= "eu.etaxonomy.cdm.model.common.TermVocabulary")
39 public class OrderedTermVocabulary
<T
extends OrderedTermBase
> extends TermVocabulary
<T
> {
40 private static final long serialVersionUID
= 7871741306306371242L;
41 @SuppressWarnings("unused")
42 private static final Logger logger
= Logger
.getLogger(OrderedTermVocabulary
.class);
47 * @param termSourceUri
49 public OrderedTermVocabulary(String term
, String label
, String labelAbbrev
, String termSourceUri
) {
50 super(term
, label
, labelAbbrev
, termSourceUri
);
53 public OrderedTermVocabulary() {
59 public Set
<T
> getNewTermSet() {
60 return new TreeSet
<T
>();
64 public SortedSet
<T
> getOrderedTerms() {
65 SortedSet
<T
> result
= getSortedSetOfTerms();
69 public SortedSet
<T
> getHigherAndEqualTerms(T otb
) {
70 SortedSet
<T
> result
= new TreeSet
<T
>();
71 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
72 result
.addAll( sortedSet
.tailSet(otb
));
76 public SortedSet
<T
> getHigherTerms(T otb
) {
77 SortedSet
<T
> result
= getHigherAndEqualTerms(otb
);
78 for (T setObject
: terms
){
79 if (setObject
.compareTo(otb
) == 0){
80 result
.remove(setObject
);
86 public SortedSet
<T
> getLowerAndEqualTerms(T otb
) {
87 SortedSet
<T
> result
= new TreeSet
<T
>();
88 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
90 result
.addAll( sortedSet
.headSet(otb
));
91 //headSet Returns a view of the portion of this set whose elements are STRICTLY less than toElement
92 for (T setObject
: terms
){
93 if (setObject
.compareTo(otb
) == 0){
94 result
.add(setObject
);
100 public SortedSet
<T
> getLowerTerms(T otb
) {
101 SortedSet
<T
> result
= getLowerAndEqualTerms(otb
);
102 for (T setObject
: terms
){
103 if (setObject
.compareTo(otb
) == 0){
104 result
.remove(setObject
);
110 public SortedSet
<T
> getEqualTerms(T otb
) {
111 SortedSet
<T
> result
= new TreeSet
<T
>();
112 for (T setObject
: terms
){
113 if (setObject
.compareTo(otb
) == 0){
114 result
.add(setObject
);
120 public T
getNextHigherTerm(T otb
) {
122 return getHigherTerms(otb
).first();
123 } catch (NoSuchElementException e
) {
128 public T
getNextLowerTerm(T otb
) {
130 return getLowerTerms(otb
).last();
131 } catch (NoSuchElementException e
) {
137 public T
getLowestTerm() {
139 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
140 return sortedSet
.first();
141 //return ((SortedSet<T>)terms).first();
142 } catch (NoSuchElementException e
) {
148 public T
getHighestTerm() {
150 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
151 return sortedSet
.last();
152 } catch (NoSuchElementException e
) {
157 public void addTerm(T term
) {
158 SortedSet
<T
> sortedTerms
= getSortedSetOfTerms();
159 int lowestOrderIndex
;
160 if (sortedTerms
.size() == 0){
161 lowestOrderIndex
= 0;
163 T first
= sortedTerms
.first();
164 lowestOrderIndex
= first
.orderIndex
;
166 term
.orderIndex
= lowestOrderIndex
+ 1;
170 public void addTermAbove(T termToBeAdded
, T lowerTerm
) throws WrongTermTypeException
{
171 int orderInd
= lowerTerm
.orderIndex
;
172 termToBeAdded
.orderIndex
= orderInd
;
173 //increment all orderIndexes of terms below
174 Iterator
<T
> iterator
= terms
.iterator();
175 while(iterator
.hasNext()){
176 T term
= iterator
.next();
177 if (term
.orderIndex
>= orderInd
){ //should always be true
181 super.addTerm(termToBeAdded
);
184 public void addTermBelow(T termToBeAdded
, T higherTerm
) throws WrongTermTypeException
{
185 int orderInd
= higherTerm
.orderIndex
;
186 termToBeAdded
.orderIndex
= orderInd
+ 1;
187 //increment all orderIndexes of terms below
188 Iterator
<T
> iterator
= getLowerTerms(higherTerm
).iterator();
189 while(iterator
.hasNext()){
190 T term
= iterator
.next();
191 if (term
.orderIndex
> orderInd
){
195 super.addTerm(termToBeAdded
);
198 public void addTermEqualLevel(T termToBeAdded
, T equalLevelTerm
) throws WrongTermTypeException
{
199 int orderInd
= equalLevelTerm
.orderIndex
;
200 termToBeAdded
.orderIndex
= orderInd
;
201 super.addTerm(termToBeAdded
);
205 public void removeTerm(T term
) {
209 if (this.getEqualTerms(term
).size() == 0){
210 Iterator
<T
> iterator
= getLowerTerms(term
).iterator();
211 while (iterator
.hasNext()){
212 T otb
= iterator
.next();
213 toBeChangedByObject
= otb
;
214 otb
.decreaseIndex(this);
215 toBeChangedByObject
= null;
218 super.removeTerm(term
);
222 private T toBeChangedByObject
;
224 public boolean indexChangeAllowed(OrderedTermBase
<T
> orderedTermBase
){
225 return orderedTermBase
== toBeChangedByObject
;
230 private SortedSet
<T
> getSortedSetOfTerms(){
231 SortedSet
<T
> sortedSet
= new TreeSet
<T
>();
232 sortedSet
.addAll(terms
);