2 * Copyright (C) 2007 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
.name
;
12 import java
.util
.HashMap
;
13 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import javax
.persistence
.Entity
;
18 import javax
.persistence
.Transient
;
19 import javax
.xml
.bind
.annotation
.XmlAccessType
;
20 import javax
.xml
.bind
.annotation
.XmlAccessorType
;
21 import javax
.xml
.bind
.annotation
.XmlType
;
23 import org
.apache
.log4j
.Logger
;
24 import org
.hibernate
.envers
.Audited
;
25 import org
.hibernate
.search
.annotations
.Indexed
;
27 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
28 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
29 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
30 import eu
.etaxonomy
.cdm
.model
.common
.OrderedTermBase
;
31 import eu
.etaxonomy
.cdm
.model
.common
.Representation
;
32 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
33 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.UnknownCdmTypeException
;
36 * The class representing the taxonomical ranks (like "Family", "Genus" or
37 * "Species") used for {@link TaxonNameBase taxon names} across all {@link NomenclaturalCode nomenclatural codes}
38 * for bacteria (ICNB), viruses (ICVCN), plants and fungi (ICBN),
39 * cultivars (ICNCP) and animals (ICZN).
41 * A standard (ordered) list of taxonomical rank instances will be automatically
42 * created as the project starts. But this class allows to extend this standard
43 * list by creating new instances of additional taxonomical ranks if needed.
45 * This class corresponds to: <ul>
46 * <li> TaxonRankTerm according to the TDWG ontology
47 * <li> TaxonomicRankEnum according to the TCS
48 * <li> Rank according to the ABCD schema
53 * @created 08-Nov-2007 13:06:46
55 @XmlAccessorType(XmlAccessType
.FIELD
)
56 @XmlType(name
= "Rank")
58 @Indexed(index
= "eu.etaxonomy.cdm.model.common.DefinedTermBase")
60 public class Rank
extends OrderedTermBase
<Rank
> {
61 private static final long serialVersionUID
= -8648081681348758485L;
62 private static final Logger logger
= Logger
.getLogger(Rank
.class);
64 private static final UUID uuidEmpire
= UUID
.fromString("ac470211-1586-4b24-95ca-1038050b618d");
65 private static final UUID uuidDomain
= UUID
.fromString("ffca6ec8-8b88-417b-a6a0-f7c992aac19b");
66 private static final UUID uuidSuperkingdom
= UUID
.fromString("64223610-7625-4cfd-83ad-b797bf7f0edd");
67 private static final UUID uuidKingdom
= UUID
.fromString("fbe7109d-66b3-498c-a697-c6c49c686162");
68 private static final UUID uuidSubkingdom
= UUID
.fromString("a71bd9d8-f3ab-4083-afb5-d89315d71655");
69 private static final UUID uuidInfrakingdom
= UUID
.fromString("1e37930c-86cf-44f6-90fd-7822928df260");
70 private static final UUID uuidSuperphylum
= UUID
.fromString("0d0cecb1-e254-4607-b210-6801e7ecbb04");
71 private static final UUID uuidPhylum
= UUID
.fromString("773430d2-76b4-438c-b817-97a543a33287");
72 private static final UUID uuidSubphylum
= UUID
.fromString("23a9b6ff-9408-49c9-bd9e-7a2ca5ab4725");
73 private static final UUID uuidInfraphylum
= UUID
.fromString("1701de3a-7693-42a5-a2d3-42697f944190");
74 private static final UUID uuidSuperdivision
= UUID
.fromString("a735a48f-4fc8-49a7-ae0c-6a984f658131");
75 private static final UUID uuidDivision
= UUID
.fromString("7e56f5cc-123a-4fd1-8cbb-6fd80358b581");
76 private static final UUID uuidSubdivision
= UUID
.fromString("931c840f-7a6b-4d76-ad38-bfdd77d7b2e8");
77 private static final UUID uuidInfradivision
= UUID
.fromString("c0ede273-be52-4dee-b411-66ee08d30c94");
78 private static final UUID uuidSuperclass
= UUID
.fromString("e65b4e1a-21ec-428d-9b9f-e87721ab967c");
79 private static final UUID uuidClass
= UUID
.fromString("f23d14c4-1d34-4ee6-8b4e-eee2eb9a3daf");
80 private static final UUID uuidSubclass
= UUID
.fromString("8cb26733-e2f5-46cb-ab5c-f99254f877aa");
81 private static final UUID uuidInfraclass
= UUID
.fromString("ad23cfda-879a-4021-8629-c54d27caf717");
82 private static final UUID uuidSuperorder
= UUID
.fromString("c8c67a22-301a-4219-b882-4a49121232ff");
83 private static final UUID uuidOrder
= UUID
.fromString("b0785a65-c1c1-4eb4-88c7-dbd3df5aaad1");
84 private static final UUID uuidSuborder
= UUID
.fromString("768ad378-fa85-42ab-b668-763225832f57");
85 private static final UUID uuidInfraorder
= UUID
.fromString("84099182-a6f5-47d7-8586-33c9e9955a10");
86 private static final UUID uuidSectionZoology
= UUID
.fromString("691d371e-10d7-43f0-93db-3d7fa1a62c54");
87 private static final UUID uuidSubsectionZoology
= UUID
.fromString("0ed32d28-adc4-4303-a9ca-68e2acd67e33");
88 private static final UUID uuidSuperfamily
= UUID
.fromString("2cfa510a-dcea-4a03-b66a-b1528f9b0796");
89 private static final UUID uuidFamily
= UUID
.fromString("af5f2481-3192-403f-ae65-7c957a0f02b6");
90 private static final UUID uuidSubfamily
= UUID
.fromString("862526ee-7592-4760-a23a-4ff3641541c5");
91 private static final UUID uuidInfrafamily
= UUID
.fromString("c3f2e3bb-6eef-4a26-9fb7-b14f4c8c5e4f");
92 private static final UUID uuidSupertribe
= UUID
.fromString("11e94828-8c61-499b-87d6-1de35ce2c51c");
93 private static final UUID uuidTribe
= UUID
.fromString("4aa6890b-0363-4899-8d7c-ee0cb78e6166");
94 private static final UUID uuidSubtribe
= UUID
.fromString("ae41ecc5-5165-4126-9d24-79939ae5d822");
95 private static final UUID uuidInfratribe
= UUID
.fromString("1ec02e8f-f2b7-4c65-af9f-b436b34c79a3");
96 private static final UUID uuidSupragenericTaxon
= UUID
.fromString("1fdc0b93-c354-441a-8406-091e0303ff5c");
97 public static final UUID uuidGenus
= UUID
.fromString("1b11c34c-48a8-4efa-98d5-84f7f66ef43a");
98 private static final UUID uuidSubgenus
= UUID
.fromString("78786e16-2a70-48af-a608-494023b91904");
99 private static final UUID uuidInfragenus
= UUID
.fromString("a9972969-82cd-4d54-b693-a096422f13fa");
100 private static final UUID uuidSectionBotany
= UUID
.fromString("3edff68f-8527-49b5-bf91-7e4398bb975c");
101 private static final UUID uuidSubsectionBotany
= UUID
.fromString("d20f5b61-d463-4448-8f8a-c1ff1f262f59");
102 private static final UUID uuidSeries
= UUID
.fromString("d7381ecf-48f8-429b-9c54-f461656978cd");
103 private static final UUID uuidSubseries
= UUID
.fromString("80c9a263-f4db-4a13-b6c2-b7fec1aa1200");
104 private static final UUID uuidSpeciesAggregate
= UUID
.fromString("1ecae058-4217-4f75-9c27-6d8ba099ac7a");
105 private static final UUID uuidSpeciesGroup
= UUID
.fromString("d1988a11-292b-46fa-8fb7-bc64ea6d8fc6");
106 public static final UUID uuidInfragenericTaxon
= UUID
.fromString("41bcc6ac-37d3-4fd4-bb80-3cc5b04298b9");
107 public static final UUID uuidSpecies
= UUID
.fromString("b301f787-f319-4ccc-a10f-b4ed3b99a86d");
108 private static final UUID uuidSubspecificAggregate
= UUID
.fromString("72c248b9-027d-4402-b375-dd4f0850c9ad");
109 private static final UUID uuidSubspecies
= UUID
.fromString("462a7819-8b00-4190-8313-88b5be81fad5");
110 private static final UUID uuidInfraspecies
= UUID
.fromString("f28ebc9e-bd50-4194-9af1-42f5cb971a2c");
111 private static final UUID uuidNatio
= UUID
.fromString("965f2f38-7f97-4270-ab5a-1999bf050a22");
112 private static final UUID uuidVariety
= UUID
.fromString("d5feb6a5-af5c-45ef-9878-bb4f36aaf490");
113 private static final UUID uuidBioVariety
= UUID
.fromString("a3a364cb-1a92-43fc-a717-3c44980a0991");
114 private static final UUID uuidPathoVariety
= UUID
.fromString("2f4f4303-a099-47e3-9048-d749d735423b");
115 private static final UUID uuidSubvariety
= UUID
.fromString("9a83862a-7aee-480c-a98d-4bceaf8712ca");
116 private static final UUID uuidSubsubvariety
= UUID
.fromString("bff22f84-553a-4429-a4e7-c4b3796c3a18");
117 private static final UUID uuidConvar
= UUID
.fromString("2cc740c9-cebb-43c8-9b06-1bef79e6a56a");
118 private static final UUID uuidForm
= UUID
.fromString("0461281e-458a-47b9-8d41-19a3d39356d5");
119 private static final UUID uuidSpecialForm
= UUID
.fromString("bed20aee-2f5a-4635-9c02-eff06246d067");
120 private static final UUID uuidSubform
= UUID
.fromString("47cfc5b0-0fb7-4ceb-b61d-e1dd8de8b569");
121 private static final UUID uuidSubsubform
= UUID
.fromString("1c8ac389-4349-4ae0-87be-7239f6635068");
122 public static final UUID uuidInfraspecificTaxon
= UUID
.fromString("eb75c27d-e154-4570-9d96-227b2df60474");
123 private static final UUID uuidCandidate
= UUID
.fromString("ead9a1f5-dfd4-4de2-9121-70a47accb10b");
124 private static final UUID uuidDenominationClass
= UUID
.fromString("49bdf74a-2170-40ed-8be2-887a0db517bf");
125 private static final UUID uuidGrex
= UUID
.fromString("08dcb4ff-ac58-48a3-93af-efb3d836ac84");
126 private static final UUID uuidGraftChimaera
= UUID
.fromString("6b4063bc-f934-4796-9bf3-0ef3aea5c1cb");
127 private static final UUID uuidCultivarGroup
= UUID
.fromString("d763e7d3-e7de-4bb1-9d75-225ca6948659");
128 private static final UUID uuidCultivar
= UUID
.fromString("5e98415b-dc6e-440b-95d6-ea33dbb39ad0");
129 private static final UUID uuidUnknownRank
= UUID
.fromString("5c4d6755-2cf6-44ca-9220-cccf8881700b");
131 private static Map
<String
, UUID
> abbrevMap
= null;
132 private static Map
<String
, UUID
> labelMap
= null;
134 protected static Map
<UUID
, Rank
> termMap
= null;
136 //*********************** Factory methods ********************************************/
139 * Creates a new empty rank.
141 * @see #NewInstance(String, String, String)
143 private static Rank
NewInstance(){
148 * Creates an additional rank with a description (in the {@link Language#DEFAULT() default language}),
149 * a label and a label abbreviation.
151 * @param term the string (in the default language) describing the
152 * new rank to be created
153 * @param label the string identifying the new rank to be created
154 * @param labelAbbrev the string identifying (in abbreviated form) the
155 * new rank to be created
156 * @see #NewInstance()
158 private static Rank
NewInstance(String term
, String label
, String labelAbbrev
){
159 return new Rank(term
, label
, labelAbbrev
);
162 // ********************* CONSTRUCTORS ************************************+/
164 * Class constructor: creates a new empty rank instance.
166 * @see #Rank(String, String, String)
172 * Class constructor: creates an additional rank instance with a description
173 * (in the {@link eu.etaxonomy.cdm.model.common.Language#DEFAULT() default language}), a label and a label abbreviation.
175 * @param term the string (in the default language) describing the
176 * new rank to be created
177 * @param label the string identifying the new rank to be created
178 * @param labelAbbrev the string identifying (in abbreviated form) the
179 * new rank to be created
182 public Rank(String term
, String label
, String labelAbbrev
) {
183 super(term
, label
, labelAbbrev
);
187 //********* METHODS **************************************/
190 * @see eu.etaxonomy.cdm.model.common.DefinedTermBase#resetTerms()
193 public void resetTerms(){
199 protected static Rank
getTermByUuid(UUID uuid
){
200 if (termMap
== null){
201 return null; //better return null then initialize the termMap in an unwanted way
203 return (Rank
)termMap
.get(uuid
);
206 public static final Rank
EMPIRE(){
207 return getTermByUuid(uuidEmpire
);
209 public static final Rank
DOMAIN(){
210 return getTermByUuid(uuidDomain
);
212 public static final Rank
SUPERKINGDOM(){
213 return getTermByUuid(uuidSuperkingdom
);
215 public static final Rank
KINGDOM(){
216 return getTermByUuid(uuidKingdom
);
218 public static final Rank
SUBKINGDOM(){
219 return getTermByUuid(uuidSubkingdom
);
221 public static final Rank
INFRAKINGDOM(){
222 return getTermByUuid(uuidInfrakingdom
);
224 public static final Rank
SUPERPHYLUM(){
225 return getTermByUuid(uuidSuperphylum
);
227 public static final Rank
PHYLUM(){
228 return getTermByUuid(uuidPhylum
);
230 public static final Rank
SUBPHYLUM(){
231 return getTermByUuid(uuidSubphylum
);
233 public static final Rank
INFRAPHYLUM(){
234 return getTermByUuid(uuidInfraphylum
);
236 public static final Rank
SUPERDIVISION(){
237 return getTermByUuid(uuidSuperdivision
);
239 public static final Rank
DIVISION(){
240 return getTermByUuid(uuidDivision
);
242 public static final Rank
SUBDIVISION(){
243 return getTermByUuid(uuidSubdivision
);
245 public static final Rank
INFRADIVISION(){
246 return getTermByUuid(uuidInfradivision
);
248 public static final Rank
SUPERCLASS(){
249 return getTermByUuid(uuidSuperclass
);
251 public static final Rank
CLASS(){
252 return getTermByUuid(uuidClass
);
254 public static final Rank
SUBCLASS(){
255 return getTermByUuid(uuidSubclass
);
257 public static final Rank
INFRACLASS(){
258 return getTermByUuid(uuidInfraclass
);
260 public static final Rank
SUPERORDER(){
261 return getTermByUuid(uuidSuperorder
);
263 public static final Rank
ORDER(){
264 return getTermByUuid(uuidOrder
);
266 public static final Rank
SUBORDER(){
267 return getTermByUuid(uuidSuborder
);
269 public static final Rank
INFRAORDER(){
270 return getTermByUuid(uuidInfraorder
);
272 public static final Rank
SUPERFAMILY(){
273 return getTermByUuid(uuidSuperfamily
);
275 public static final Rank
FAMILY(){
276 return getTermByUuid(uuidFamily
);
278 public static final Rank
SUBFAMILY(){
279 return getTermByUuid(uuidSubfamily
);
281 public static final Rank
INFRAFAMILY(){
282 return getTermByUuid(uuidInfrafamily
);
284 public static final Rank
SUPERTRIBE(){
285 return getTermByUuid(uuidSupertribe
);
287 public static final Rank
TRIBE(){
288 return getTermByUuid(uuidTribe
);
290 public static final Rank
SUBTRIBE(){
291 return getTermByUuid(uuidSubtribe
);
293 public static final Rank
INFRATRIBE(){
294 return getTermByUuid(uuidInfratribe
);
296 public static final Rank
SUPRAGENERICTAXON(){
297 return getTermByUuid(uuidSupragenericTaxon
);
299 public static final Rank
GENUS(){
300 return getTermByUuid(uuidGenus
);
302 public static final Rank
SUBGENUS(){
303 return getTermByUuid(uuidSubgenus
);
305 public static final Rank
INFRAGENUS(){
306 return getTermByUuid(uuidInfragenus
);
308 public static final Rank
SECTION_BOTANY(){
309 return getTermByUuid(uuidSectionBotany
);
311 public static final Rank
SUBSECTION_BOTANY(){
312 return getTermByUuid(uuidSubsectionBotany
);
314 public static final Rank
SECTION_ZOOLOGY(){
315 return getTermByUuid(uuidSectionZoology
);
317 public static final Rank
SUBSECTION_ZOOLOGY(){
318 return getTermByUuid(uuidSubsectionZoology
);
320 public static final Rank
SERIES(){
321 return getTermByUuid(uuidSeries
);
323 public static final Rank
SUBSERIES(){
324 return getTermByUuid(uuidSubseries
);
326 public static final Rank
SPECIESAGGREGATE(){
327 return getTermByUuid(uuidSpeciesAggregate
);
329 public static final Rank
SPECIESGROUP(){
330 return getTermByUuid(uuidSpeciesGroup
);
333 * 'Unranked infrageneric'. An infrageneric rank which is on purpose not further defined.
334 * This sometimes holds for names from the 19th century.
336 public static final Rank
INFRAGENERICTAXON(){
337 return getTermByUuid(uuidInfragenericTaxon
);
339 public static final Rank
SPECIES(){
340 return getTermByUuid(uuidSpecies
);
342 public static final Rank
SUBSPECIFICAGGREGATE(){
343 return getTermByUuid(uuidSubspecificAggregate
);
345 public static final Rank
SUBSPECIES(){
346 return getTermByUuid(uuidSubspecies
);
348 public static final Rank
INFRASPECIES(){
349 return getTermByUuid(uuidInfraspecies
);
351 public static final Rank
VARIETY(){
352 return getTermByUuid(uuidVariety
);
354 public static final Rank
BIOVARIETY(){
355 return getTermByUuid(uuidBioVariety
);
357 public static final Rank
PATHOVARIETY(){
358 return getTermByUuid(uuidPathoVariety
);
360 public static final Rank
SUBVARIETY(){
361 return getTermByUuid(uuidSubvariety
);
363 public static final Rank
SUBSUBVARIETY(){
364 return getTermByUuid(uuidSubsubvariety
);
366 public static final Rank
CONVAR(){
367 return getTermByUuid(uuidConvar
);
369 public static final Rank
FORM(){
370 return getTermByUuid(uuidForm
);
372 public static final Rank
SPECIALFORM(){
373 return getTermByUuid(uuidSpecialForm
);
375 public static final Rank
SUBFORM(){
376 return getTermByUuid(uuidSubform
);
378 public static final Rank
SUBSUBFORM(){
379 return getTermByUuid(uuidSubsubform
);
382 * 'Unranked infraspecific'. An infraspecific rank which is on purpose not further defined.
383 * This sometimes holds for names from the 19th century.
385 public static final Rank
INFRASPECIFICTAXON(){
386 return getTermByUuid(uuidInfraspecificTaxon
);
388 public static final Rank
CANDIDATE(){
389 return getTermByUuid(uuidCandidate
);
391 public static final Rank
DENOMINATIONCLASS(){
392 return getTermByUuid(uuidDenominationClass
);
394 public static final Rank
GREX(){
395 return getTermByUuid(uuidGrex
);
397 public static final Rank
GRAFTCHIMAERA(){
398 return getTermByUuid(uuidGraftChimaera
);
400 public static final Rank
CULTIVARGROUP(){
401 return getTermByUuid(uuidCultivarGroup
);
403 public static final Rank
CULTIVAR(){
404 return getTermByUuid(uuidCultivar
);
406 public static final Rank
UNKNOWN_RANK(){
407 return getTermByUuid(uuidUnknownRank
);
409 public static final Rank
NATIO(){
410 return getTermByUuid(uuidNatio
);
413 * @see #INFRASPECIFICTAXON()
415 public static final Rank
UNRANKED_INFRASPECIFIC(){
416 return getTermByUuid(uuidInfraspecificTaxon
);
419 * @see #INFRAGENERICTAXON()
421 public static final Rank
UNRANKED_INFRAGENERIC(){
422 return getTermByUuid(uuidInfragenericTaxon
);
426 * Returns the boolean value indicating whether <i>this</i> rank is higher than
427 * the genus rank (true) or not (false). Returns false if <i>this</i> rank is null.
430 * @see #isInfraGeneric()
432 * @see #isInfraSpecific()
435 public boolean isSupraGeneric(){
436 return (this.isHigher(Rank
.GENUS()));
440 * Returns the boolean value indicating whether <i>this</i> rank is the genus rank
441 * (true) or not (false). Returns false if <i>this</i> rank is null.
443 * @see #isSupraGeneric()
444 * @see #isInfraGeneric()
446 * @see #isInfraSpecific()
449 public boolean isGenus(){
450 return (this.equals(Rank
.GENUS()));
454 * Returns the boolean value indicating whether <i>this</i> rank is higher than the
455 * species rank and lower than the genus rank (true) or not (false). Species groups or
456 * aggregates are also handled as infrageneric ranks.
457 * Returns false if <i>this</i> rank is null.
459 * @see #isSupraGeneric()
461 * @see #isSpeciesAggregate()
463 * @see #isInfraSpecific()
466 public boolean isInfraGeneric(){
467 return (this.isLower(Rank
.GENUS()) && this.isHigher(Rank
.SPECIES()));
471 * Returns true if this rank indicates a rank that aggregates species
472 * like species aggregates or species groups, false otherwise. This methods
473 * currently returns false for all user defined ranks.
477 public boolean isSpeciesAggregate(){
478 return (this.equals(Rank
.SPECIESAGGREGATE()) || (this.isLower(Rank
.SPECIESAGGREGATE()) && this.isHigher(Rank
.SPECIES())));
482 * Returns the boolean value indicating whether <i>this</i> rank is the species
483 * rank (true) or not (false). Returns false if <i>this</i> rank is null.
485 * @see #isSupraGeneric()
487 * @see #isInfraGeneric()
488 * @see #isInfraSpecific()
491 public boolean isSpecies(){
492 return (this.equals(Rank
.SPECIES()));
496 * Returns the boolean value indicating whether <i>this</i> rank is lower than the
497 * species rank (true) or not (false). Returns false if <i>this</i> rank is null.
499 * @see #isSupraGeneric()
501 * @see #isInfraGeneric()
505 public boolean isInfraSpecific(){
506 return (this.isLower(Rank
.SPECIES()));
511 * Returns the rank identified through a name (abbreviated or not).
512 * Preliminary implementation for BotanicalNameParser.
514 * @param strRank the string identifying the rank
517 public static Rank
getRankByNameOrAbbreviation(String strRank
)
518 throws UnknownCdmTypeException
{
519 return getRankByNameOrAbbreviation(strRank
, false);
523 * Returns the rank identified through a name (abbreviated or not) for a given nomenclatural code.
524 * Preliminary implementation for BotanicalNameParser.
526 * @param strRank the string identifying the rank
527 * @param nc the nomenclatural code
530 public static Rank
getRankByNameOrAbbreviation(String strRank
, NomenclaturalCode nc
)
531 throws UnknownCdmTypeException
{
532 return getRankByNameOrAbbreviation(strRank
, nc
, false);
536 // Preliminary implementation for BotanicalNameParser.
539 * Returns the rank identified through a name (abbreviated or not).
540 * Preliminary implementation for BotanicalNameParser.
542 * @param strRank the string identifying the rank
543 * @param useUnknown if true the rank UNKNOWN_RANK is returned if the abbrev is
544 * unknown or not yet implemented
547 public static Rank
getRankByNameOrAbbreviation(String strRank
, boolean useUnknown
)
548 throws UnknownCdmTypeException
{
550 return getRankByAbbreviation(strRank
);
551 } catch (UnknownCdmTypeException e
) {
552 return getRankByName(strRank
, useUnknown
);
557 // Preliminary implementation for BotanicalNameParser.
560 * Returns the rank identified through a name (abbreviated or not).
561 * Preliminary implementation for BotanicalNameParser.
563 * @param strRank the string identifying the rank
564 * @param nc the nomenclatural code
565 * @param useUnknown if true the rank UNKNOWN_RANK is returned if the abbrev is
566 * unknown or not yet implemented
569 public static Rank
getRankByNameOrAbbreviation(String strRank
, NomenclaturalCode nc
, boolean useUnknown
)
570 throws UnknownCdmTypeException
{
572 return getRankByAbbreviation(strRank
, nc
);
573 } catch (UnknownCdmTypeException e
) {
574 return getRankByName(strRank
, nc
, useUnknown
);
579 * Returns the rank identified through an abbreviated name.
580 * Preliminary implementation for BotanicalNameParser.<BR>
581 * Note: For abbrev = "[unranked]" the result is undefined.
582 * It maybe the infrageneric unranked or the infraspecific unranked.
583 * You need to define by context which one is correct.
585 * @param abbrev the string for the name abbreviation
588 public static Rank
getRankByAbbreviation(String abbrev
)
589 throws UnknownCdmTypeException
{
590 return getRankByAbbreviation(abbrev
, false);
594 * Returns the rank identified through an abbreviated name for a given nomenclatural code.
595 * See also {@link #getRankByAbbreviation(String, boolean)}
597 * @param abbrev the string for the name abbreviation
598 * @param nc the nomenclatural code
601 public static Rank
getRankByAbbreviation(String abbrev
, NomenclaturalCode nc
) throws UnknownCdmTypeException
{
602 return getRankByAbbreviation(abbrev
, nc
, false);
606 // Preliminary implementation for BotanicalNameParser.
609 * Returns the rank identified through an abbreviated representation.
610 * At the moment it uses the English abbreviations (being Latin because
611 * we do not have Latin representations yet.
613 * If no according abbreviation is available it throws either an UnknownCdmTypeException
614 * or an #Rank.UNKNOWN() object depending on the useUnknown flag.
616 * @param abbrev the string for the name abbreviation
617 * @param useUnknown if true the rank UNKNOWN_RANK is returned if the abbrev is
618 * unknown or not yet existent
621 public static Rank
getRankByAbbreviation(String abbrev
, boolean useUnknown
) throws UnknownCdmTypeException
{
624 throw new NullPointerException("Abbrev is NULL in getRankByAbbreviation");
626 if (abbrev
.trim().equals("")){
627 //handle empty abbrev as unknown
628 abbrev
= "oijaämöö";
630 if (abbrevMap
== null){
633 UUID uuid
= abbrevMap
.get(abbrev
);
635 result
= getTermByUuid(uuid
);
644 logger
.info("Unknown rank name: " + abbrev
+ ". Rank 'UNKNOWN_RANK' created instead");
645 return Rank
.UNKNOWN_RANK();
647 throw new UnknownCdmTypeException("Unknown rank abbreviation: " + abbrev
);
653 // Preliminary implementation to cover Botany and Zoology.
655 * Returns the rank identified through an abbreviated name for a given nomenclatural code.
656 * Preliminary implementation for ICBN and ICZN.
657 * See also {@link #getRankByAbbreviation(String, boolean)}
660 * @param abbrev the string for the name abbreviation
661 * @param nc the nomenclatural code
662 * @param useUnknown if true the rank UNKNOWN_RANK is returned if the abbrev is
663 * unknown or not yet implemented
666 public static Rank
getRankByAbbreviation(String abbrev
, NomenclaturalCode nc
, boolean useUnknown
)
667 throws UnknownCdmTypeException
{
669 if (nc
!= null && nc
.equals(NomenclaturalCode
.ICZN
)) {
670 if (abbrev
.equalsIgnoreCase("sect.")) { return Rank
.SECTION_ZOOLOGY();
671 } else if (abbrev
.equalsIgnoreCase("subsect.")) { return Rank
.SUBSECTION_ZOOLOGY();
674 return getRankByAbbreviation(abbrev
, useUnknown
);
678 // Preliminary implementation for BotanicalNameParser.
681 * Returns the rank identified through a name.
682 * Preliminary implementation for BotanicalNameParser.
684 * @param rankName the string for the name of the rank
687 public static Rank
getRankByName(String rankName
) throws UnknownCdmTypeException
{
688 return getRankByName(rankName
, false);
693 // Preliminary implementation for ICBN and ICZN.
696 * Returns the rank identified through a name for a given nomenclatural code.
697 * Preliminary implementation for ICBN and ICZN.
699 * @param rankName the string for the name of the rank
700 * @param nc the nomenclatural code
703 public static Rank
getRankByName(String rankName
, NomenclaturalCode nc
) throws UnknownCdmTypeException
{
704 return getRankByName(rankName
, nc
, false);
708 * Returns the rank identified through a name.
709 * Preliminary implementation for BotanicalNameParser.
710 * TODO At the moment we do not have Latin representations yet.
712 * @param rankName the string for the name of the rank
713 * @param useUnknown if true the rank UNKNOWN_RANK is returned if the rank name is
714 * unknown or not yet implemented
717 public static Rank
getRankByName(String rankName
, boolean useUnknown
)
718 throws UnknownCdmTypeException
{
719 if (rankName
.equalsIgnoreCase("Regnum")){ return Rank
.KINGDOM();
720 }else if (rankName
.equalsIgnoreCase("Subregnum")){ return Rank
.SUBKINGDOM();
721 }else if (rankName
.equalsIgnoreCase("Phylum")){ return Rank
.PHYLUM();
722 }else if (rankName
.equalsIgnoreCase("Subphylum")){ return Rank
.SUBPHYLUM();
723 }else if (rankName
.equalsIgnoreCase("Divisio")){ return Rank
.DIVISION();
724 }else if (rankName
.equalsIgnoreCase("Subdivisio")){ return Rank
.SUBDIVISION();
725 }else if (rankName
.equalsIgnoreCase("Classis")){ return Rank
.CLASS();
726 }else if (rankName
.equalsIgnoreCase("Subclassis")){ return Rank
.SUBCLASS();
727 }else if (rankName
.equalsIgnoreCase("Superordo")){ return Rank
.SUPERORDER();
728 }else if (rankName
.equalsIgnoreCase("Ordo")){ return Rank
.ORDER();
729 }else if (rankName
.equalsIgnoreCase("Subordo")){ return Rank
.SUBORDER();
730 }else if (rankName
.equalsIgnoreCase("Familia")){ return Rank
.FAMILY();
731 }else if (rankName
.equalsIgnoreCase("Subfamilia")){ return Rank
.SUBFAMILY();
732 }else if (rankName
.equalsIgnoreCase("Tribus")){ return Rank
.TRIBE();
733 }else if (rankName
.equalsIgnoreCase("Subtribus")){ return Rank
.SUBTRIBE();
734 }else if (rankName
.equalsIgnoreCase("Genus")){ return Rank
.GENUS();
735 }else if (rankName
.equalsIgnoreCase("Subgenus")){ return Rank
.SUBGENUS();
736 }else if (rankName
.equalsIgnoreCase("Sectio")){ return Rank
.SECTION_BOTANY();
737 }else if (rankName
.equalsIgnoreCase("Subsectio")){ return Rank
.SUBSECTION_BOTANY();
738 }else if (rankName
.equalsIgnoreCase("Series")){ return Rank
.SERIES();
739 }else if (rankName
.equalsIgnoreCase("Subseries")){ return Rank
.SUBSERIES();
740 }else if (rankName
.equalsIgnoreCase("Aggregate")){ return Rank
.SPECIESAGGREGATE();
741 }else if (rankName
.equalsIgnoreCase("Speciesgroup")){ return Rank
.SPECIESGROUP();
742 }else if (rankName
.equalsIgnoreCase("Species")){ return Rank
.SPECIES();
743 }else if (rankName
.equalsIgnoreCase("Subspecies")){ return Rank
.SUBSPECIES();
744 }else if (rankName
.equalsIgnoreCase("Convarietas")){ return Rank
.CONVAR();
745 }else if (rankName
.equalsIgnoreCase("Varietas")){ return Rank
.VARIETY();
746 }else if (rankName
.equalsIgnoreCase("Subvarietas")){ return Rank
.SUBVARIETY();
747 }else if (rankName
.equalsIgnoreCase("Forma")){ return Rank
.FORM();
748 }else if (rankName
.equalsIgnoreCase("Subforma")){ return Rank
.SUBFORM();
749 }else if (rankName
.equalsIgnoreCase("Forma spec.")){ return Rank
.SPECIALFORM();
750 }else if (rankName
.equalsIgnoreCase("tax.infragen.")){ return Rank
.INFRAGENERICTAXON();
751 }else if (rankName
.equalsIgnoreCase("tax.infrasp.")){ return Rank
.INFRASPECIFICTAXON();
753 }else if (rankName
.equalsIgnoreCase("proles")){ return Rank
.INFRASPECIFICTAXON(); //to create the name put prol. and the infraspeciesepi to the field unnamed namephrase
754 }else if (rankName
.equalsIgnoreCase("race")){ return Rank
.INFRASPECIFICTAXON(); //to create the name put prol. and the infraspeciesepi to the field unnamed namephrase
755 }else if (rankName
.equalsIgnoreCase("taxon")){ return Rank
.INFRASPECIFICTAXON(); //to create the name put prol. and the infraspeciesepi to the field unnamed namephrase
756 }else if (rankName
.equalsIgnoreCase("sublusus")){ return Rank
.INFRASPECIFICTAXON(); //to create the name put prol. and the infraspeciesepi to the field unnamed namephrase
759 if (rankName
== null){
760 rankName
= "(null)"; //see NPE above
763 logger
.info("Unknown rank name: " + rankName
+". Rank 'UNKNOWN_RANK' created instead");
764 return Rank
.UNKNOWN_RANK();
766 throw new UnknownCdmTypeException("Unknown rank name: " + rankName
);
772 * Defines the rank according to the English name.
773 * @param rankName English rank name.
774 * @param nc Defines the handling of the section and subsection ranks. These are in different orders depending on the
775 * nomenclatural code.
776 * @param useUnknown if true, the "Unknown" rank is returned as a placeholder.
778 * @throws UnknownCdmTypeException never thrown if useUnknown is true
780 public static Rank
getRankByEnglishName(String rankName
, NomenclaturalCode nc
, boolean useUnknown
) throws UnknownCdmTypeException
{
782 if (rankName
== null){
783 throw new NullPointerException("Abbrev is NULL in getRankByAbbreviation");
785 if (labelMap
== null){
788 //handle section and subsection (not unique representations)
789 if (rankName
.equalsIgnoreCase("Section")){
790 if (nc
!= null && nc
.equals(NomenclaturalCode
.ICZN
)){ return Rank
.SECTION_ZOOLOGY();
791 }else if (nc
!= null && nc
.equals(NomenclaturalCode
.ICBN
)){return Rank
.SECTION_BOTANY();
793 String errorWarning
= "Section is only defined for ICZN and ICBN at the moment but here needed for " + ((nc
== null)?
"(null)": nc
.toString());
794 logger
.warn(errorWarning
);
795 throw new UnknownCdmTypeException (errorWarning
);
797 }else if (rankName
.equalsIgnoreCase("Subsection")){
798 if (nc
!= null && nc
.equals(NomenclaturalCode
.ICZN
)){ return Rank
.SECTION_ZOOLOGY();
799 }else if (nc
!= null && nc
.equals(NomenclaturalCode
.ICBN
)){ return Rank
.SECTION_BOTANY();
801 String errorWarning
= "Subsection is only defined for ICZN and ICBN at the moment but here needed for " + ((nc
== null)?
"(null)": nc
.toString());
802 logger
.warn(errorWarning
);
803 throw new UnknownCdmTypeException (errorWarning
);
807 rankName
= rankName
.toLowerCase();
809 UUID uuid
= labelMap
.get(rankName
);
811 result
= getTermByUuid(uuid
);
816 if (rankName
== null){
820 logger
.info("Unknown rank name: " + rankName
+ ". Rank 'UNKNOWN_RANK' created instead");
821 return Rank
.UNKNOWN_RANK();
823 throw new UnknownCdmTypeException("Unknown rank: " + rankName
);
829 public static Rank
getRankByName(String rankName
, NomenclaturalCode nc
, boolean useUnknown
)
830 throws UnknownCdmTypeException
{
832 if (nc
.equals(NomenclaturalCode
.ICZN
)) {
833 if (rankName
.equalsIgnoreCase("Sectio")) { return Rank
.SECTION_ZOOLOGY();
834 }else if (rankName
.equalsIgnoreCase("Subsectio")) { return Rank
.SUBSECTION_ZOOLOGY();
837 return getRankByName(rankName
, useUnknown
);
841 * Returns the abbreviated rank name for <i>this</i> rank according to the English representation
843 * TODO Needs to be changed to Latin as soon as Latin representations are available.
845 * @return the abbreviation string for <i>this</i> rank
847 public String
getAbbreviation(){
848 Language language
= Language
.ENGLISH();
849 String result
= this.getRepresentation(language
).getAbbreviatedLabel();
851 logger
.warn("Abbreviation for this Rank " + this.toString() + " not yet implemented");
852 return "no abbreviation available.";
858 public String
getInfraGenericMarker() throws UnknownCdmTypeException
{
859 String result
= null;
860 if (! this.isInfraGeneric()){
861 throw new IllegalStateException("An infrageneric marker is only available for a infrageneric rank but was asked for rank: " + this.toString());
863 result
= this.getAbbreviation();
866 throw new UnknownCdmTypeException("Abbreviation for rank unknown: " + this.toString());
874 public Rank
readCsvLine(Class
<Rank
> termClass
, List
<String
> csvLine
, Map
<UUID
, DefinedTermBase
> terms
) {
875 return super.readCsvLine(termClass
, csvLine
, terms
);
879 protected void setDefaultTerms(TermVocabulary
<Rank
> termVocabulary
) {
880 termMap
= new HashMap
<UUID
, Rank
>();
881 for (Rank term
: termVocabulary
.getTerms()){
882 termMap
.put(term
.getUuid(), (Rank
)term
);
890 private void addRank(Rank rank
) {
892 logger
.warn("rank is NULL");
895 if (rank
.getUuid().equals(uuidSectionZoology
) || rank
.getUuid().equals(uuidSubsectionZoology
)){
896 //sect./subsect. is used for botanical sections, see also #getRankByAbbreviation(String, NomenclaturalCode, boolean)
899 Language lang
= Language
.DEFAULT(); //TODO should be Latin but at the moment we have only English representations
900 Representation representation
= rank
.getRepresentation(lang
);
901 String abbrevLabel
= representation
.getAbbreviatedLabel();
902 String label
= representation
.getLabel();
903 if (abbrevLabel
== null){
904 logger
.warn("Abbreviated label for rank is NULL.Can't add rank: " + CdmUtils
.Nz(rank
.getLabel()));
908 if (abbrevMap
== null){
909 abbrevMap
= new HashMap
<String
, UUID
>();
911 if (labelMap
== null){
912 labelMap
= new HashMap
<String
, UUID
>();
915 abbrevMap
.put(abbrevLabel
, rank
.getUuid());
916 labelMap
.put(label
.toLowerCase(), rank
.getUuid());
921 * It is nessecary to skip the vocabulary check, otherwise we would have
922 * problems in some CacheStrategies, due to uninitialized Vocabularies.
924 * @see eu.etaxonomy.cdm.model.common.OrderedTermBase#compareTo(eu.etaxonomy.cdm.model.common.OrderedTermBase)
927 public int compareTo(Rank orderedTerm
) {
928 return performCompareTo(orderedTerm
, true);