Project

General

Profile

Download (8.5 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.common;
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
/**
30
 * @author a.mueller
31
 *
32
 */
33
@XmlAccessorType(XmlAccessType.FIELD)
34
@XmlType(name = "OrderedTermVocabulary")
35
@XmlRootElement(name = "OrderedTermVocabulary")
36
@Entity
37
//@Indexed disabled to reduce clutter in indexes, since this type is not used by any search
38
//@Indexed(index = "eu.etaxonomy.cdm.model.common.TermVocabulary")
39
@Audited
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);
44

    
45
// ************************* FACTORY METHODS ***********************************************/
46

    
47

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

    
57

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

    
71

    
72
//************************ CONSTRUCTOR *****************************************************/
73

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

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

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

    
98

    
99
//************************* METHODS **************************************/
100

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

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

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

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

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

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

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

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

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

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

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

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

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

    
230
	public void addTermAbove(T termToBeAdded, T lowerTerm)  {
231
		int orderInd = lowerTerm.orderIndex;
232
		termToBeAdded.orderIndex = orderInd;
233
		//increment all orderIndexes of terms below
234
		Iterator<T> iterator = terms.iterator();
235
		while(iterator.hasNext()){
236
			T term = iterator.next();
237
			if (term.orderIndex >= orderInd){  //should always be true
238
				term.orderIndex++;
239
			}
240
		}
241
		super.addTerm(termToBeAdded);
242
	}
243

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

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

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

    
281
	@Transient
282
	private T toBeChangedByObject;
283

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

    
288

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

    
300
}
(58-58/81)