Project

General

Profile

Download (8.21 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
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.
8
*/
9

    
10
package eu.etaxonomy.cdm.model.term;
11

    
12
import java.net.URI;
13
import java.util.Iterator;
14
import java.util.NoSuchElementException;
15
import java.util.Set;
16
import java.util.SortedSet;
17
import java.util.TreeSet;
18

    
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;
25

    
26
import org.apache.log4j.Logger;
27
import org.hibernate.envers.Audited;
28

    
29
import eu.etaxonomy.cdm.model.common.CdmBase;
30

    
31
/**
32
 * @author a.mueller
33
 *
34
 */
35
@XmlAccessorType(XmlAccessType.FIELD)
36
@XmlType(name = "OrderedTermVocabulary")
37
@XmlRootElement(name = "OrderedTermVocabulary")
38
@Entity
39
//@Indexed disabled to reduce clutter in indexes, since this type is not used by any search
40
//@Indexed(index = "eu.etaxonomy.cdm.model.common.TermVocabulary")
41
@Audited
42
public class OrderedTermVocabulary<T extends OrderedTermBase> extends TermVocabulary<T> {
43
	private static final long serialVersionUID = 7871741306306371242L;
44
	@SuppressWarnings("unused")
45
	private static final Logger logger = Logger.getLogger(OrderedTermVocabulary.class);
46

    
47
// ************************* FACTORY METHODS ***********************************************/
48

    
49

    
50
	/**
51
	 * @param type the {@link TermType term type}, must be the same as for all included terms
52
	 * @return
53
	 * @throws NullPointerException if type is <code>null</code>
54
	 */
55
	public static OrderedTermVocabulary NewInstance(TermType type){
56
		return new OrderedTermVocabulary(type);
57
	}
58

    
59

    
60
	/**
61
	 * @param type the {@link TermType term type}, must be the same as for all included terms
62
	 * @param description the description of this vocabulary
63
	 * @param label
64
	 * @param labelAbbrev
65
	 * @param termSourceUri
66
	 * @return
67
	 * @throws NullPointerException if type is <code>null</code>
68
	 */
69
	public static OrderedTermVocabulary NewInstance(TermType type, String description, String label, String labelAbbrev, URI termSourceUri){
70
		return new OrderedTermVocabulary(type, description, label, labelAbbrev, termSourceUri);
71
	}
72

    
73

    
74
//************************ CONSTRUCTOR *****************************************************/
75

    
76
	//for hibernate use only
77
	@Deprecated
78
	protected OrderedTermVocabulary() {
79
		super();
80
	}
81

    
82
	/**
83
	 * @param term
84
	 * @param label
85
	 * @param termSourceUri
86
	 */
87
	protected OrderedTermVocabulary(TermType type) {
88
		super(type);
89
	}
90

    
91
	/**
92
	 * @param term
93
	 * @param label
94
	 * @param termSourceUri
95
	 */
96
	protected OrderedTermVocabulary(TermType type, String term, String label, String labelAbbrev, URI termSourceUri) {
97
		super(type, term, label, labelAbbrev, termSourceUri);
98
	}
99

    
100

    
101
//************************* METHODS **************************************/
102

    
103
	@Transient
104
	@Override
105
	public Set<T> getNewTermSet() {
106
		return new TreeSet<T>();
107
	}
108

    
109
	@Transient
110
	public SortedSet<T> getOrderedTerms() {
111
		SortedSet<T> result = getSortedSetOfTerms();
112
		return result;
113
	}
114

    
115
	public SortedSet<T> getHigherAndEqualTerms(T otb) {
116
		SortedSet<T> result = new TreeSet<>();
117
		SortedSet<T> sortedSet = getSortedSetOfTerms();
118
		result.addAll( sortedSet.tailSet(otb));
119
		return result;
120
	}
121

    
122
	public SortedSet<T> getHigherTerms(T otb) {
123
		SortedSet<T> result = getHigherAndEqualTerms(otb);
124
		for (DefinedTermBase<?> setObjectUnproxied : terms){
125
		    @SuppressWarnings("unchecked")
126
            T setObject = (T)CdmBase.deproxy(setObjectUnproxied, OrderedTermBase.class);
127
            if (setObject.compareTo(otb) == 0){
128
				result.remove(setObject);
129
			}
130
		}
131
		return result;
132
	}
133

    
134
	public SortedSet<T> getLowerAndEqualTerms(T otb) {
135
		SortedSet<T> result = new TreeSet<>();
136
		result = getLowerTerms(otb);
137
		/*SortedSet<T> sortedSet = getSortedSetOfTerms();
138

    
139
		result.addAll( sortedSet.headSet(otb));*/
140
		//getLowerTerms Returns a view of the portion of this set whose elements are STRICTLY less than toElement
141
		for (DefinedTermBase<?> setObjectUnproxied : terms){
142
		    @SuppressWarnings("unchecked")
143
            T setObject = (T)CdmBase.deproxy(setObjectUnproxied, OrderedTermBase.class);
144
            if (setObject.compareTo(otb) == 0){
145
				result.add(setObject);
146
			}
147
		}
148
		return result;
149
	}
150

    
151
	public SortedSet<T> getLowerTerms(T otb) {
152
		/*SortedSet<T> result = getLowerAndEqualTerms(otb);
153
		for (T setObject : terms){
154
			if (setObject.compareTo(otb) == 0){
155
				result.remove(setObject);
156
			}
157
		}*/
158
	    SortedSet<T> result = new TreeSet<>();
159
        SortedSet<T> sortedSet = getSortedSetOfTerms();
160
        //headSet Returns a view of the portion of this set whose elements are STRICTLY less than toElement
161
        result.addAll( sortedSet.headSet(otb));
162
		return result;
163
	}
164

    
165
	public SortedSet<T> getEqualTerms(T otb) {
166
		SortedSet<T> result = new TreeSet<>();
167
		for (DefinedTermBase<?> setObjectUnproxied : terms){  //use Unproxied to avoid ClassCastException in certain contexts
168
		    @SuppressWarnings("unchecked")
169
            T setObject = (T)CdmBase.deproxy(setObjectUnproxied, OrderedTermBase.class);
170
			if (setObject.compareTo(otb) == 0){
171
				result.add(setObject);
172
			}
173
		}
174
		return result;
175
	}
176

    
177
	public T getNextHigherTerm(T otb) {
178
		try {
179
			return getHigherTerms(otb).first();
180
		} catch (NoSuchElementException e) {
181
			return null;
182
		}
183
	}
184

    
185
	public T getNextLowerTerm(T otb) {
186
		try {
187
			return getLowerTerms(otb).last();
188
		} catch (NoSuchElementException e) {
189
			return null;
190
		}
191
	}
192

    
193
	@Transient
194
	public T getLowestTerm() {
195
		try {
196
			SortedSet<T> sortedSet = getSortedSetOfTerms();
197
			return sortedSet.first();
198
			//return ((SortedSet<T>)terms).first();
199
		} catch (NoSuchElementException e) {
200
			return null;
201
		}
202
	}
203

    
204
	@Transient
205
	public T getHighestTerm() {
206
		try {
207
			SortedSet<T> sortedSet = getSortedSetOfTerms();
208
			return sortedSet.last();
209
		} catch (NoSuchElementException e) {
210
			return null;
211
		}
212
	}
213

    
214
	/**
215
	 * Adds a term to the the end / lowest
216
	 * @see eu.etaxonomy.cdm.model.term.TermVocabulary#addTerm(eu.etaxonomy.cdm.model.term.DefinedTermBase)
217
	 */
218
	@Override
219
    public void addTerm(T term) {
220
		SortedSet<T> sortedTerms = getSortedSetOfTerms();
221
		int lowestOrderIndex;
222
		if (sortedTerms.isEmpty()){
223
			lowestOrderIndex = 0;
224
		}else{
225
			T first = sortedTerms.first();
226
			lowestOrderIndex = first.orderIndex;
227
		}
228
		term.orderIndex = lowestOrderIndex + 1;
229
		super.addTerm(term);
230
	}
231

    
232
	public void addTermAbove(T termToBeAdded, T lowerTerm)  {
233
		int orderInd = lowerTerm.orderIndex;
234
		termToBeAdded.orderIndex = orderInd;
235
		//increment all orderIndexes of terms below
236
		Set<T> myTerms = getSortedSetOfTerms();
237
		for(T term : myTerms){
238
		    if (term.orderIndex >= orderInd){  //should always be true
239
				term.orderIndex++;
240
			}
241
		}
242
		super.addTerm(termToBeAdded);
243
	}
244

    
245
	public void addTermBelow(T termToBeAdded, T higherTerm)  {
246
		int orderInd = higherTerm.orderIndex;
247
		termToBeAdded.orderIndex = orderInd + 1;
248
		//increment all orderIndexes of terms below
249
		Iterator<T> iterator = getLowerTerms(higherTerm).iterator();
250
		while(iterator.hasNext()){
251
			T term = iterator.next();
252
			if (term.orderIndex > orderInd){
253
				term.orderIndex++;
254
			}
255
		}
256
		super.addTerm(termToBeAdded);
257
	}
258

    
259
	public void addTermEqualLevel(T termToBeAdded, T equalLevelTerm) {
260
		int orderInd = equalLevelTerm.orderIndex;
261
		termToBeAdded.orderIndex = orderInd;
262
		super.addTerm(termToBeAdded);
263
	}
264

    
265
	@Override
266
	public void removeTerm(T term) {
267
		if (term == null){
268
			return;
269
		}
270
		if (this.getEqualTerms(term).size() == 0){
271
			Iterator<T> iterator = getLowerTerms(term).iterator();
272
			while (iterator.hasNext()){
273
				T otb = iterator.next();
274
				toBeChangedByObject = otb;
275
				otb.decreaseIndex(this);
276
				toBeChangedByObject = null;
277
			}
278
		}
279
		super.removeTerm(term);
280
	}
281

    
282
	@Transient
283
	private T toBeChangedByObject;
284

    
285
	public boolean indexChangeAllowed(OrderedTermBase orderedTermBase){
286
		return orderedTermBase == toBeChangedByObject ;
287
	}
288

    
289

    
290
	@Transient
291
	private SortedSet<T> getSortedSetOfTerms(){
292
		SortedSet<T> sortedSet = new TreeSet<>();
293
		for (DefinedTermBase<?> termUnproxied : terms){
294
            @SuppressWarnings("unchecked")
295
            T term = (T)CdmBase.deproxy(termUnproxied, OrderedTermBase.class);
296
            sortedSet.add(term);
297
        }
298
		return sortedSet;
299
	}
300

    
301
}
(15-15/23)