Project

General

Profile

Download (16.6 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 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.description;
11

    
12
import java.text.ParseException;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.UUID;
17

    
18
import javax.persistence.Entity;
19
import javax.xml.bind.annotation.XmlAccessType;
20
import javax.xml.bind.annotation.XmlAccessorType;
21
import javax.xml.bind.annotation.XmlAttribute;
22
import javax.xml.bind.annotation.XmlRootElement;
23
import javax.xml.bind.annotation.XmlType;
24

    
25
import org.apache.commons.lang.StringUtils;
26
import org.apache.log4j.Logger;
27
import org.hibernate.envers.Audited;
28

    
29
import eu.etaxonomy.cdm.model.common.CdmBase;
30
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
31
import eu.etaxonomy.cdm.model.common.Language;
32
import eu.etaxonomy.cdm.model.common.OrderedTermBase;
33
import eu.etaxonomy.cdm.model.common.TermType;
34
import eu.etaxonomy.cdm.model.common.TermVocabulary;
35
import eu.etaxonomy.cdm.model.location.NamedArea;
36
import eu.etaxonomy.cdm.model.taxon.Taxon;
37

    
38

    
39
/**
40
 * This class represents terms describing the {@link AbsenceTerm absence}
41
 * (like "extinct") or the {@link PresenceTerm presence} (like "cultivated") of a
42
 * {@link Taxon taxon} in a {@link NamedArea named area}. These terms are only
43
 * used for {@link Distribution distributions}.
44

    
45
 *
46
 * @author m.doering
47
 * @created 08-Nov-2007 13:06:44
48
 * @author a.mueller
49
 */
50
@XmlAccessorType(XmlAccessType.FIELD)
51
@XmlType(name = "PresenceAbsenceTerm")
52
@XmlRootElement(name = "PresenceAbsenceTerm")
53
@Entity
54
//@Indexed disabled to reduce clutter in indexes, since this type is not used by any search
55
//@Indexed(index = "eu.etaxonomy.cdm.model.common.DefinedTermBase")
56
@Audited
57
public class PresenceAbsenceTerm extends OrderedTermBase<PresenceAbsenceTerm> {
58
	private static final long serialVersionUID = 1036807546935584396L;
59
	private static final Logger logger = Logger.getLogger(PresenceAbsenceTerm.class);
60

    
61

    
62
	//presence base
63
	private static final UUID uuidP=UUID.fromString("cef81d25-501c-48d8-bbea-542ec50de2c2");
64
	private static final UUID uuidPD=UUID.fromString("75a60279-a4c2-4f53-bc57-466028a4b3db");
65

    
66
	//presence
67
	private static final UUID uuidN=UUID.fromString("ddeac4f2-d8fa-43b8-ad7e-ca13abdd32c7");
68
	private static final UUID uuidNQ=UUID.fromString("925662c1-bb10-459a-8c53-da5a738ac770");
69
	private static final UUID uuidND=UUID.fromString("310373bf-7df4-4d02-8cb3-bcc7448805fc");
70
	private static final UUID uuidC=UUID.fromString("9eb99fe6-59e2-4445-8e6a-478365bd0fa9");
71
	private static final UUID uuidCQ=UUID.fromString("4f31bfc8-3058-4d83-aea5-3a1fe9773f9f");
72
	private static final UUID uuidI=UUID.fromString("643cf9d1-a5f1-4622-9837-82ef961e880b");
73
	private static final UUID uuidIQ=UUID.fromString("83eb0aa0-1a45-495a-a3ca-bf6958b74366");
74
	private static final UUID uuidID=UUID.fromString("0c54761e-4887-4788-9dfa-7190c88746e3");
75
	private static final UUID uuidIP=UUID.fromString("da159544-b0dd-4599-a9c9-640826af8c17");
76
	private static final UUID uuidIA=UUID.fromString("42946bd6-9c22-45ad-a910-7427e8f60bfd");
77
	private static final UUID uuidIN=UUID.fromString("e191e89a-a751-4b0c-b883-7f1de70915c9");
78
	private static final UUID uuidIC=UUID.fromString("fac8c347-8262-44a1-b0a4-db4de451c021");
79
	private static final UUID uuidE=UUID.fromString("c3ee7048-15b7-4be1-b687-9ce9c1a669d6");
80
	private static final UUID uuidNA=UUID.fromString("4e04990a-66fe-4fdf-856c-f40772fbcf0a");
81
	private static final UUID uuidIV=UUID.fromString("dc536e3d-a753-4bbe-a386-dd8aff35c234");
82

    
83
	//absence
84
	private static final UUID uuidAbsence=UUID.fromString("59709861-f7d9-41f9-bb21-92559cedd598");
85
	private static final UUID uuidReportedInError = UUID.fromString("38604788-cf05-4607-b155-86db456f7680");
86

    
87
	private static final UUID uuidNF=UUID.fromString("61cee840-801e-41d8-bead-015ad866c2f1");
88
	private static final UUID uuidIF=UUID.fromString("aeec2947-2700-4623-8e32-9e3a430569d1");
89
	private static final UUID uuidCF=UUID.fromString("9d4d3431-177a-4abe-8e4b-1558573169d6");
90
	private static final UUID uuidNE=UUID.fromString("5c397f7b-59ef-4c11-a33c-45691ceda91b");
91
	private static final UUID uuidIE=UUID.fromString("b74dc30b-ee93-496d-8c00-4d00abae1ec7");
92

    
93

    
94
	protected static Map<UUID, PresenceAbsenceTerm> termMap = null;
95

    
96
    private String defaultColor = "000000";
97

    
98
    @XmlAttribute(name = "absenceTerm")
99
    private boolean absenceTerm = false;
100

    
101
	//********* METHODS **************************************/
102
	/**
103
	 * Creates a new empty presence term.
104
	 *
105
	 * @see #NewInstance(String, String, String)
106
	 */
107
	public static PresenceAbsenceTerm NewInstance(){
108
		return new PresenceAbsenceTerm();
109
	}
110

    
111
	/**
112
	 * Creates a new presence term with a description (in the {@link Language#DEFAULT() default language}),
113
	 * a label and a label abbreviation.
114
	 *
115
	 * @param	term  		 the string (in the default language) describing the
116
	 * 						 new presence term to be created
117
	 * @param	label  		 the string identifying the new presence term to be created
118
	 * @param	labelAbbrev  the string identifying (in abbreviated form) the
119
	 * 						 new presence term to be created
120
	 * @see 				 #NewInstance()
121
	 */
122
	public static PresenceAbsenceTerm NewPresenceInstance(String term, String label, String labelAbbrev){
123
		return new PresenceAbsenceTerm(term, label, labelAbbrev, false);
124
	}
125

    
126
	/**
127
	 * Creates a new absence term with a description (in the {@link Language#DEFAULT() default language}),
128
	 * a label and a label abbreviation.
129
	 *
130
	 * @param	term  		 the string (in the default language) describing the
131
	 * 						 new presence term to be created
132
	 * @param	label  		 the string identifying the new presence term to be created
133
	 * @param	labelAbbrev  the string identifying (in abbreviated form) the
134
	 * 						 new presence term to be created
135
	 * @see 				 #NewInstance()
136
	 */
137
	public static PresenceAbsenceTerm NewAbsenceInstance(String term, String label, String labelAbbrev){
138
		return new PresenceAbsenceTerm(term, label, labelAbbrev, true);
139
	}
140

    
141

    
142
//********************************** Constructor *******************************************************************/
143

    
144
  	//for hibernate use only
145
  	@Deprecated
146
  	protected PresenceAbsenceTerm() {
147
    	super(TermType.PresenceAbsenceTerm);
148
    }
149

    
150
    /**
151
     * Class constructor: creates a new presence or absence term with a description
152
     * (in the {@link Language#DEFAULT() default language}), a label and a label abbreviation.
153
     *
154
     * @param	term  		 the string (in the default language) describing the
155
     * 						 new presence or absence term to be created
156
     * @param	label  		 the string identifying the new presence or absence term to be created
157
     * @param	labelAbbrev  the string identifying (in abbreviated form) the
158
     * 						 new presence or absence term to be created
159
     * @param   isAbsenceTerm  boolean value indicating if this term represents an absence or not
160
     * @see 				 #PresenceAbsenceTermBase()
161
     */
162
    protected PresenceAbsenceTerm(String term, String label, String labelAbbrev, boolean isAbsenceTerm) {
163
        super(TermType.PresenceAbsenceTerm, term, label, labelAbbrev);
164
        this.setAbsenceTerm(isAbsenceTerm);
165
    }
166

    
167

    
168
  //******************************* STATIC METHODS *****************************************
169

    
170
  	protected static PresenceAbsenceTerm getTermByUuid(UUID uuid){
171
        if (termMap == null || termMap.isEmpty()){
172
            return getTermByClassAndUUID(PresenceAbsenceTerm.class, uuid);
173
        } else {
174
  			return termMap.get(uuid);
175
  		}
176
  	}
177

    
178
   	//TODO read from label(abbrevs) like in TDWGArea
179
  	public static PresenceAbsenceTerm getPresenceAbsenceTermByAbbreviation(String abbrev) {
180
  		if (abbrev == null) { throw new NullPointerException("abbrev is 'null' in getPresenceTermByAbbreviation");
181
  		} else if (abbrev.equalsIgnoreCase("c"))  { return PresenceAbsenceTerm.CULTIVATED();
182
  		} else if (abbrev.equalsIgnoreCase("e"))  { return PresenceAbsenceTerm.ENDEMIC_FOR_THE_RELEVANT_AREA();
183
  		} else if (abbrev.equalsIgnoreCase("i"))  { return PresenceAbsenceTerm.INTRODUCED();
184
  		} else if (abbrev.equalsIgnoreCase("ia")) { return PresenceAbsenceTerm.INTRODUCED_ADVENTITIOUS();
185
  		} else if (abbrev.equalsIgnoreCase("ic")) { return PresenceAbsenceTerm.INTRODUCED_CULTIVATED();
186
  		} else if (abbrev.equalsIgnoreCase("id")) { return PresenceAbsenceTerm.INTRODUCED_DOUBTFULLY_INTRODUCED();
187
  		} else if (abbrev.equalsIgnoreCase("in")) { return PresenceAbsenceTerm.INTRODUCED_NATURALIZED();
188
  		} else if (abbrev.equalsIgnoreCase("ip")) { return PresenceAbsenceTerm.INTRODUCED_UNCERTAIN_DEGREE_OF_NATURALISATION();
189
  		} else if (abbrev.equalsIgnoreCase("iq")) { return PresenceAbsenceTerm.INTRODUCED_PRESENCE_QUESTIONABLE();
190
  		} else if (abbrev.equalsIgnoreCase("n"))  { return PresenceAbsenceTerm.NATIVE();
191
  		} else if (abbrev.equalsIgnoreCase("nd")) { return PresenceAbsenceTerm.NATIVE_DOUBTFULLY_NATIVE();
192
  		} else if (abbrev.equalsIgnoreCase("nq")) { return PresenceAbsenceTerm.NATIVE_PRESENCE_QUESTIONABLE();
193
  		} else if (abbrev.equalsIgnoreCase("p"))  { return PresenceAbsenceTerm.PRESENT();
194
  		} else if (abbrev.equalsIgnoreCase("na"))  { return PresenceAbsenceTerm.NATURALISED();
195
  		} else if (abbrev.equalsIgnoreCase("iv"))  { return PresenceAbsenceTerm.INVASIVE();
196
  		//absence
197
		} else if (abbrev.equalsIgnoreCase("cf")) { return PresenceAbsenceTerm.CULTIVATED_REPORTED_IN_ERROR();
198
		} else if (abbrev.equalsIgnoreCase("if")) { return PresenceAbsenceTerm.INTRODUCED_REPORTED_IN_ERROR();
199
		} else if (abbrev.equalsIgnoreCase("nf")) { return PresenceAbsenceTerm.NATIVE_REPORTED_IN_ERROR();
200
		} else if (abbrev.equalsIgnoreCase("ne")) { return PresenceAbsenceTerm.NATIVE_FORMERLY_NATIVE();
201
		} else if (abbrev.equalsIgnoreCase("ie")) { return PresenceAbsenceTerm.INTRODUCED_FORMERLY_INTRODUCED();
202
		} else {
203
			logger.warn("Unknown presence or absence status term abbreviation: " + abbrev);
204
			return null;
205
		}
206
  	}
207

    
208

    
209
	public static final PresenceAbsenceTerm PRESENT(){
210
		return getTermByUuid(uuidP);
211
	}
212
	public static final PresenceAbsenceTerm PRESENT_DOUBTFULLY(){
213
		return getTermByUuid(uuidPD);
214
	}
215
	public static final PresenceAbsenceTerm CULTIVATED(){
216
		return getTermByUuid(uuidC);
217
	}
218
    public static final PresenceAbsenceTerm CULTIVATED_PRESENCE_QUESTIONABLE(){
219
        return getTermByUuid(uuidCQ);
220
    }
221
	public static final PresenceAbsenceTerm ENDEMIC_FOR_THE_RELEVANT_AREA(){
222
		return getTermByUuid(uuidE);
223
	}
224
		public static final PresenceAbsenceTerm INTRODUCED(){
225
		return getTermByUuid(uuidI);
226
	}
227
		public static final PresenceAbsenceTerm INTRODUCED_ADVENTITIOUS(){
228
		return getTermByUuid(uuidIA);
229
	}
230

    
231
	public static final PresenceAbsenceTerm INTRODUCED_CULTIVATED(){
232
		return getTermByUuid(uuidIC);
233
	}
234

    
235
	public static final PresenceAbsenceTerm INTRODUCED_DOUBTFULLY_INTRODUCED(){
236
		return getTermByUuid(uuidID);
237
	}
238

    
239
	public static final PresenceAbsenceTerm INTRODUCED_NATURALIZED(){
240
		return getTermByUuid(uuidIN);
241
	}
242

    
243
	public static final PresenceAbsenceTerm INTRODUCED_PRESENCE_QUESTIONABLE(){
244
		return getTermByUuid(uuidIQ);
245
	}
246

    
247
	public static final PresenceAbsenceTerm INTRODUCED_UNCERTAIN_DEGREE_OF_NATURALISATION(){
248
		return getTermByUuid(uuidIP);
249
	}
250

    
251
	public static final PresenceAbsenceTerm NATIVE(){
252
		return getTermByUuid(uuidN);
253
	}
254

    
255
	public static final PresenceAbsenceTerm NATIVE_DOUBTFULLY_NATIVE(){
256
		return getTermByUuid(uuidND);
257
	}
258

    
259
	public static final PresenceAbsenceTerm NATIVE_PRESENCE_QUESTIONABLE(){
260
		return getTermByUuid(uuidNQ);
261
	}
262

    
263
	public static final PresenceAbsenceTerm INVASIVE(){
264
		return getTermByUuid(uuidIV);
265
	}
266

    
267
	public static final PresenceAbsenceTerm NATURALISED(){
268
		return getTermByUuid(uuidNA);
269
	}
270

    
271
	public static final PresenceAbsenceTerm ABSENT(){
272
		return getTermByUuid(uuidAbsence);
273
	}
274

    
275
	public static final PresenceAbsenceTerm REPORTED_IN_ERROR(){
276
        return getTermByUuid(uuidReportedInError);
277
    }
278

    
279
	public static final PresenceAbsenceTerm NATIVE_REPORTED_IN_ERROR(){
280
		return getTermByUuid(uuidNF);
281
	}
282

    
283
	public static final PresenceAbsenceTerm CULTIVATED_REPORTED_IN_ERROR(){
284
		return getTermByUuid(uuidCF);
285
	}
286

    
287
	public static final PresenceAbsenceTerm INTRODUCED_REPORTED_IN_ERROR(){
288
		return getTermByUuid(uuidIF);
289
	}
290

    
291
	public static final PresenceAbsenceTerm NATIVE_FORMERLY_NATIVE(){
292
		return getTermByUuid(uuidNE);
293
	}
294

    
295
	public static final PresenceAbsenceTerm INTRODUCED_FORMERLY_INTRODUCED(){
296
		return getTermByUuid(uuidIE);
297
	}
298

    
299

    
300
//******************************** METHODS ****************************/
301

    
302
	@Override
303
	public void resetTerms(){
304
		termMap = null;
305
	}
306

    
307
	@Override
308
	protected void setDefaultTerms(TermVocabulary<PresenceAbsenceTerm> termVocabulary) {
309
		termMap = new HashMap<UUID, PresenceAbsenceTerm>();
310
		for (PresenceAbsenceTerm term : termVocabulary.getTerms()){
311
			termMap.put(term.getUuid(), term);
312
		}
313
	}
314

    
315
    @Override
316
    public PresenceAbsenceTerm readCsvLine(Class<PresenceAbsenceTerm> termClass, List<String> csvLine, Map<UUID,DefinedTermBase> terms, boolean abbrevAsId){
317
    	PresenceAbsenceTerm newInstance = super.readCsvLine(termClass, csvLine, terms, abbrevAsId);
318
        String abbreviatedLabel = csvLine.get(4);
319
//		String uuid = (String)csvLine.get(0);
320
//		map.put(abbreviatedLabel, UUID.fromString(uuid));
321
        String symbol = csvLine.get(5);
322
        newInstance.setSymbol(symbol);
323
        String color = csvLine.get(6);
324
        try {
325
			newInstance.setDefaultColor(color);
326
		} catch (ParseException e) {
327
			throw new RuntimeException(e);
328
		}
329
        boolean isAbsence = csvLine.get(7).equals("1") ? true : false;
330
        newInstance.setAbsenceTerm(isAbsence);
331

    
332
        newInstance.getRepresentation(Language.DEFAULT()).setAbbreviatedLabel(abbreviatedLabel);
333
        newInstance.setSymbol(abbreviatedLabel);
334
        return newInstance;
335
    }
336

    
337
    /**
338
     * @return the defaultColor
339
     */
340
    public String getDefaultColor() {
341
        return defaultColor;
342
    }
343

    
344
    /**
345
     * @param defaultColor the defaultColor to set
346
     * @throws ParseException
347
     */
348
    //TODO make format checking a hibernate validation rule
349
    public void setDefaultColor(String defaultColor) throws ParseException  {
350
    	String regEx = "[0-9a-fA-F]{6}";
351
    	if (StringUtils.isEmpty(defaultColor)){
352
    		this.defaultColor = null;
353
    	}else if (StringUtils.isEmpty(defaultColor) || defaultColor.matches(regEx)){
354
        		this.defaultColor = defaultColor;
355
    	}else{
356
    		throw new java.text.ParseException("Default color is not of correct format. Required is 'FFFFFF'", -1);
357
    	}
358
    }
359

    
360
    /**
361
     * Compares this OrderedTermBase with the specified OrderedTermBase for
362
     * order. Returns a -1, 0, or +1 if the orderId of this object is greater
363
     * than, equal to, or less than the specified object.
364
     * <p>
365
     * <b>Note:</b> The compare logic of this method is the <b>inverse logic</b>
366
     * of the the one implemented in
367
     * {@link java.lang.Comparable#compareTo(java.lang.Object)}
368
     *
369
     * @param orderedTerm
370
     *            the OrderedTermBase to be compared
371
     * @param skipVocabularyCheck
372
     *            whether to skip checking if both terms to compare are in the
373
     *            same vocabulary
374
     * @throws NullPointerException
375
     *             if the specified object is null
376
     */
377
    @Override
378
    protected int performCompareTo(PresenceAbsenceTerm presenceAbsenceTerm, boolean skipVocabularyCheck) {
379

    
380
    	PresenceAbsenceTerm presenceAbsenceTermLocal = CdmBase.deproxy(presenceAbsenceTerm, PresenceAbsenceTerm.class);
381
        if(! skipVocabularyCheck){
382
            if (this.vocabulary == null || presenceAbsenceTermLocal.vocabulary == null){
383
                throw new IllegalStateException("An ordered term (" + this.toString() + " or " +
384
                		presenceAbsenceTermLocal.toString() + ") of class " + this.getClass() + " or " +
385
                		presenceAbsenceTermLocal.getClass() + " does not belong to a vocabulary and therefore "
386
                		+ "can not be compared");
387
            }
388
            if (presenceAbsenceTermLocal.isAbsenceTerm() != this.isAbsenceTerm() ){
389
              if (presenceAbsenceTermLocal.isAbsenceTerm()){
390
            		return 1;
391
            	}else{
392
            		return -1;
393
            	}
394

    
395
            }
396
        }
397

    
398
        int orderThat;
399
        int orderThis;
400
        try {
401
            orderThat = presenceAbsenceTermLocal.orderIndex;//OLD: this.getVocabulary().getTerms().indexOf(orderedTerm);
402
            orderThis = orderIndex; //OLD: this.getVocabulary().getTerms().indexOf(this);
403
        } catch (RuntimeException e) {
404
            throw e;
405
        }
406
        if (orderThis > orderThat){
407
            return -1;
408
        }else if (orderThis < orderThat){
409
            return 1;
410
        }else {
411
            return 0;
412
        }
413
    }
414

    
415

    
416
	public boolean isAbsenceTerm() {
417
		return absenceTerm;
418
	}
419

    
420
	public void setAbsenceTerm(boolean isAbsenceTerm) {
421
		this.absenceTerm = isAbsenceTerm;
422
	}
423

    
424

    
425
}
(22-22/36)