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
;
13 import java
.util
.Iterator
;
14 import java
.util
.NoSuchElementException
;
16 import java
.util
.SortedSet
;
17 import java
.util
.TreeSet
;
19 import javax
.persistence
.Entity
;
20 import javax
.persistence
.Transient
;
21 import javax
.xml
.bind
.annotation
.XmlAccessType
;
22 import javax
.xml
.bind
.annotation
.XmlAccessorType
;
23 import javax
.xml
.bind
.annotation
.XmlRootElement
;
24 import javax
.xml
.bind
.annotation
.XmlType
;
26 import org
.apache
.log4j
.Logger
;
27 import org
.hibernate
.envers
.Audited
;
28 import org
.hibernate
.search
.annotations
.Indexed
;
34 @XmlAccessorType(XmlAccessType
.FIELD
)
35 @XmlType(name
= "OrderedTermVocabulary")
36 @XmlRootElement(name
= "OrderedTermVocabulary")
38 @Indexed(index
= "eu.etaxonomy.cdm.model.common.TermVocabulary")
40 public class OrderedTermVocabulary
<T
extends OrderedTermBase
> extends TermVocabulary
<T
> {
41 private static final long serialVersionUID
= 7871741306306371242L;
42 @SuppressWarnings("unused")
43 private static final Logger logger
= Logger
.getLogger(OrderedTermVocabulary
.class);
45 // ************************* FACTORY METHODS ***********************************************/
47 public static OrderedTermVocabulary
NewInstance(String term
, String label
, String labelAbbrev
, URI termSourceUri
){
48 return new OrderedTermVocabulary(term
, label
, labelAbbrev
, termSourceUri
);
52 //************************ CONSTRUCTOR *****************************************************/
54 protected OrderedTermVocabulary() {
61 * @param termSourceUri
63 protected OrderedTermVocabulary(String term
, String label
, String labelAbbrev
, URI termSourceUri
) {
64 super(term
, label
, labelAbbrev
, termSourceUri
);
68 //************************* METHODS **************************************/
72 public Set
<T
> getNewTermSet() {
73 return new TreeSet
<T
>();
77 public SortedSet
<T
> getOrderedTerms() {
78 SortedSet
<T
> result
= getSortedSetOfTerms();
82 public SortedSet
<T
> getHigherAndEqualTerms(T otb
) {
83 SortedSet
<T
> result
= new TreeSet
<T
>();
84 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
85 result
.addAll( sortedSet
.tailSet(otb
));
89 public SortedSet
<T
> getHigherTerms(T otb
) {
90 SortedSet
<T
> result
= getHigherAndEqualTerms(otb
);
91 for (T setObject
: terms
){
92 if (setObject
.compareTo(otb
) == 0){
93 result
.remove(setObject
);
99 public SortedSet
<T
> getLowerAndEqualTerms(T otb
) {
100 SortedSet
<T
> result
= new TreeSet
<T
>();
101 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
103 result
.addAll( sortedSet
.headSet(otb
));
104 //headSet Returns a view of the portion of this set whose elements are STRICTLY less than toElement
105 for (T setObject
: terms
){
106 if (setObject
.compareTo(otb
) == 0){
107 result
.add(setObject
);
113 public SortedSet
<T
> getLowerTerms(T otb
) {
114 SortedSet
<T
> result
= getLowerAndEqualTerms(otb
);
115 for (T setObject
: terms
){
116 if (setObject
.compareTo(otb
) == 0){
117 result
.remove(setObject
);
123 public SortedSet
<T
> getEqualTerms(T otb
) {
124 SortedSet
<T
> result
= new TreeSet
<T
>();
125 for (T setObject
: terms
){
126 if (setObject
.compareTo(otb
) == 0){
127 result
.add(setObject
);
133 public T
getNextHigherTerm(T otb
) {
135 return getHigherTerms(otb
).first();
136 } catch (NoSuchElementException e
) {
141 public T
getNextLowerTerm(T otb
) {
143 return getLowerTerms(otb
).last();
144 } catch (NoSuchElementException e
) {
150 public T
getLowestTerm() {
152 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
153 return sortedSet
.first();
154 //return ((SortedSet<T>)terms).first();
155 } catch (NoSuchElementException e
) {
161 public T
getHighestTerm() {
163 SortedSet
<T
> sortedSet
= getSortedSetOfTerms();
164 return sortedSet
.last();
165 } catch (NoSuchElementException e
) {
171 * Adds a term to the the end / lowest
172 * @see eu.etaxonomy.cdm.model.common.TermVocabulary#addTerm(eu.etaxonomy.cdm.model.common.DefinedTermBase)
174 public void addTerm(T term
) {
175 SortedSet
<T
> sortedTerms
= getSortedSetOfTerms();
176 int lowestOrderIndex
;
177 if (sortedTerms
.isEmpty()){
178 lowestOrderIndex
= 0;
180 T first
= sortedTerms
.first();
181 lowestOrderIndex
= first
.orderIndex
;
183 term
.orderIndex
= lowestOrderIndex
+ 1;
187 public void addTermAbove(T termToBeAdded
, T lowerTerm
) {
188 int orderInd
= lowerTerm
.orderIndex
;
189 termToBeAdded
.orderIndex
= orderInd
;
190 //increment all orderIndexes of terms below
191 Iterator
<T
> iterator
= terms
.iterator();
192 while(iterator
.hasNext()){
193 T term
= iterator
.next();
194 if (term
.orderIndex
>= orderInd
){ //should always be true
198 super.addTerm(termToBeAdded
);
201 public void addTermBelow(T termToBeAdded
, T higherTerm
) {
202 int orderInd
= higherTerm
.orderIndex
;
203 termToBeAdded
.orderIndex
= orderInd
+ 1;
204 //increment all orderIndexes of terms below
205 Iterator
<T
> iterator
= getLowerTerms(higherTerm
).iterator();
206 while(iterator
.hasNext()){
207 T term
= iterator
.next();
208 if (term
.orderIndex
> orderInd
){
212 super.addTerm(termToBeAdded
);
215 public void addTermEqualLevel(T termToBeAdded
, T equalLevelTerm
) throws WrongTermTypeException
{
216 int orderInd
= equalLevelTerm
.orderIndex
;
217 termToBeAdded
.orderIndex
= orderInd
;
218 super.addTerm(termToBeAdded
);
222 public void removeTerm(T term
) {
226 if (this.getEqualTerms(term
).size() == 0){
227 Iterator
<T
> iterator
= getLowerTerms(term
).iterator();
228 while (iterator
.hasNext()){
229 T otb
= iterator
.next();
230 toBeChangedByObject
= otb
;
231 otb
.decreaseIndex(this);
232 toBeChangedByObject
= null;
235 super.removeTerm(term
);
239 private T toBeChangedByObject
;
241 public boolean indexChangeAllowed(OrderedTermBase
<T
> orderedTermBase
){
242 return orderedTermBase
== toBeChangedByObject
;
247 private SortedSet
<T
> getSortedSetOfTerms(){
248 SortedSet
<T
> sortedSet
= new TreeSet
<T
>();
249 sortedSet
.addAll(terms
);