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
;
13 import java
.util
.HashSet
;
16 import javax
.persistence
.Entity
;
17 import javax
.persistence
.OneToMany
;
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
.XmlElement
;
22 import javax
.xml
.bind
.annotation
.XmlElementWrapper
;
23 import javax
.xml
.bind
.annotation
.XmlRootElement
;
24 import javax
.xml
.bind
.annotation
.XmlType
;
26 import org
.apache
.log4j
.Logger
;
27 import org
.hibernate
.annotations
.Cascade
;
28 import org
.hibernate
.annotations
.CascadeType
;
30 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
31 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipBase
;
32 import eu
.etaxonomy
.cdm
.model
.reference
.INomenclaturalReference
;
33 import eu
.etaxonomy
.cdm
.strategy
.cache
.name
.BotanicNameDefaultCacheStrategy
;
34 import eu
.etaxonomy
.cdm
.strategy
.parser
.INonViralNameParser
;
35 import eu
.etaxonomy
.cdm
.strategy
.parser
.NonViralNameParserImpl
;
38 * Taxon name class for plants
41 * @created 08-Nov-2007 13:06:15
43 @XmlAccessorType(XmlAccessType
.FIELD
)
44 @XmlType(name
= "", propOrder
= {
52 @XmlRootElement(name
= "BotanicalName")
54 public class BotanicalName
extends NonViralName
{
56 private static final Logger logger
= Logger
.getLogger(BotanicalName
.class);
58 //if set: this name is a hybrid formula (a hybrid that does not have an own name) and no other hybrid flags may be set. A
59 //hybrid name may not have either an authorteam nor other name components.
60 @XmlElement(name
="IsHybridFormula")
61 private boolean isHybridFormula
= false;
63 @XmlElement(name
="IsMonomHybrid")
64 private boolean isMonomHybrid
= false;
66 @XmlElement(name
="IsBinomHybrid")
67 private boolean isBinomHybrid
= false;
69 @XmlElement(name
="IsTrinomHybrid")
70 private boolean isTrinomHybrid
= false;
72 //Only for fungi: to indicate that the type of the name is asexual or not
73 @XmlElement(name
="IsAnamorphic")
74 private boolean isAnamorphic
;
76 @XmlElementWrapper(name
= "HybridRelationships")
77 @XmlElement(name
= "HybridRelationship")
78 private Set
<HybridRelationship
> hybridRelationships
= new HashSet();
80 static private INonViralNameParser nameParser
= new NonViralNameParserImpl();
87 public static BotanicalName
NewInstance(Rank rank
){
88 return new BotanicalName(rank
, null);
94 * @param homotypicalGroup
97 public static BotanicalName
NewInstance(Rank rank
, HomotypicalGroup homotypicalGroup
){
98 return new BotanicalName(rank
, homotypicalGroup
);
101 public static BotanicalName
NewInstance(Rank rank
, String genusOrUninomial
, String infraGenericEpithet
, String specificEpithet
, String infraSpecificEpithet
, TeamOrPersonBase combinationAuthorTeam
, INomenclaturalReference nomenclaturalReference
, String nomenclMicroRef
, HomotypicalGroup homotypicalGroup
) {
102 return new BotanicalName(rank
, genusOrUninomial
, infraGenericEpithet
, specificEpithet
, infraSpecificEpithet
, combinationAuthorTeam
, nomenclaturalReference
, nomenclMicroRef
, homotypicalGroup
);
106 * Returns a parsed Name
110 public static BotanicalName
PARSED_NAME(String fullNameString
){
111 return PARSED_NAME(fullNameString
, Rank
.GENUS());
115 * Returns a parsed Name
119 public static BotanicalName
PARSED_NAME(String fullNameString
, Rank rank
){
120 if (nameParser
== null){
121 nameParser
= new NonViralNameParserImpl();
123 return (BotanicalName
)nameParser
.parseFullName(fullNameString
, NomenclaturalCode
.ICBN(), rank
);
127 * Returns a parsed Name
131 public static BotanicalName
PARSED_REFERENCE(String fullNameAndReferenceString
){
132 return PARSED_REFERENCE(fullNameAndReferenceString
, Rank
.GENUS());
136 * Returns a parsed Name
140 public static BotanicalName
PARSED_REFERENCE(String fullNameAndReferenceString
, Rank rank
){
141 if (nameParser
== null){
142 nameParser
= new NonViralNameParserImpl();
144 return (BotanicalName
)nameParser
.parseFullReference(fullNameAndReferenceString
, NomenclaturalCode
.ICBN(), rank
);
147 //needed by hibernate
148 protected BotanicalName(){
150 this.cacheStrategy
= BotanicNameDefaultCacheStrategy
.NewInstance();
152 protected BotanicalName(Rank rank
, HomotypicalGroup homotypicalGroup
) {
153 super(rank
, homotypicalGroup
);
154 this.cacheStrategy
= BotanicNameDefaultCacheStrategy
.NewInstance();
156 protected BotanicalName(Rank rank
, String genusOrUninomial
, String infraGenericEpithet
, String specificEpithet
, String infraSpecificEpithet
, TeamOrPersonBase combinationAuthorTeam
, INomenclaturalReference nomenclaturalReference
, String nomenclMicroRef
, HomotypicalGroup homotypicalGroup
) {
157 super(rank
, genusOrUninomial
, infraGenericEpithet
, specificEpithet
, infraSpecificEpithet
, combinationAuthorTeam
, nomenclaturalReference
, nomenclMicroRef
, homotypicalGroup
);
158 this.cacheStrategy
= BotanicNameDefaultCacheStrategy
.NewInstance();
163 @Cascade({CascadeType
.SAVE_UPDATE
, CascadeType
.DELETE_ORPHAN
})
164 public Set
<HybridRelationship
> getHybridRelationships() {
165 return hybridRelationships
;
167 protected void setHybridRelationships(Set
<HybridRelationship
> relationships
) {
168 this.hybridRelationships
= relationships
;
170 public void addHybridRelationship(HybridRelationship relationship
) {
171 this.hybridRelationships
.add(relationship
);
173 public void removeHybridRelationship(HybridRelationship relationship
) {
174 this.hybridRelationships
.remove(relationship
);
178 public Set
<HybridRelationship
> getParentRelationships() {
179 // FIXME: filter relations
180 return hybridRelationships
;
183 public Set
<HybridRelationship
> getChildRelationships() {
184 // FIXME: filter relations
185 return hybridRelationships
;
188 public void addRelationship(RelationshipBase relation
) {
189 if (relation
instanceof HybridRelationship
){
190 addHybridRelationship((HybridRelationship
)relation
);
192 super.addRelationship(relation
);
196 public boolean isHybridFormula(){
197 return this.isHybridFormula
;
202 * @param isHybridFormula isHybridFormula
204 public void setHybridFormula(boolean isHybridFormula
){
205 this.isHybridFormula
= isHybridFormula
;
208 public boolean isMonomHybrid(){
209 return this.isMonomHybrid
;
214 * @param isMonomHybrid isMonomHybrid
216 public void setMonomHybrid(boolean isMonomHybrid
){
217 this.isMonomHybrid
= isMonomHybrid
;
220 public boolean isBinomHybrid(){
221 return this.isBinomHybrid
;
226 * @param isBinomHybrid isBinomHybrid
228 public void setBinomHybrid(boolean isBinomHybrid
){
229 this.isBinomHybrid
= isBinomHybrid
;
232 public boolean isTrinomHybrid(){
233 return this.isTrinomHybrid
;
238 * @param isTrinomHybrid isTrinomHybrid
240 public void setTrinomHybrid(boolean isTrinomHybrid
){
241 this.isTrinomHybrid
= isTrinomHybrid
;
244 public boolean isAnamorphic(){
245 return this.isAnamorphic
;
250 * @param isAnamorphic isAnamorphic
252 public void setAnamorphic(boolean isAnamorphic
){
253 this.isAnamorphic
= isAnamorphic
;
259 public NomenclaturalCode
getNomenclaturalCode(){
260 return NomenclaturalCode
.ICBN();