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 org
.apache
.log4j
.Logger
;
14 import org
.hibernate
.annotations
.Cascade
;
15 import org
.hibernate
.annotations
.CascadeType
;
17 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
18 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipBase
;
19 import eu
.etaxonomy
.cdm
.model
.reference
.INomenclaturalReference
;
20 import eu
.etaxonomy
.cdm
.strategy
.cache
.BotanicNameDefaultCacheStrategy
;
21 import eu
.etaxonomy
.cdm
.strategy
.parser
.INonViralNameParser
;
22 import eu
.etaxonomy
.cdm
.strategy
.parser
.NonViralNameParserImpl
;
25 import javax
.persistence
.*;
28 * Taxon name class for plants
31 * @created 08-Nov-2007 13:06:15
34 public class BotanicalName
extends NonViralName
{
35 private static final Logger logger
= Logger
.getLogger(BotanicalName
.class);
36 //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
37 //hybrid name may not have either an authorteam nor other name components.
38 private boolean isHybridFormula
= false;
39 private boolean isMonomHybrid
= false;
40 private boolean isBinomHybrid
= false;
41 private boolean isTrinomHybrid
= false;
42 //Only for fungi: to indicate that the type of the name is asexual or not
43 private boolean isAnamorphic
;
44 private Set
<HybridRelationship
> hybridRelationships
= new HashSet();
46 static private INonViralNameParser nameParser
= new NonViralNameParserImpl();
53 public static BotanicalName
NewInstance(Rank rank
){
54 return new BotanicalName(rank
, null);
60 * @param homotypicalGroup
63 public static BotanicalName
NewInstance(Rank rank
, HomotypicalGroup homotypicalGroup
){
64 return new BotanicalName(rank
, homotypicalGroup
);
67 public static BotanicalName
NewInstance(Rank rank
, String genusOrUninomial
, String specificEpithet
, String infraSpecificEpithet
, TeamOrPersonBase combinationAuthorTeam
, INomenclaturalReference nomenclaturalReference
, String nomenclMicroRef
, HomotypicalGroup homotypicalGroup
) {
68 return new BotanicalName(rank
, genusOrUninomial
, specificEpithet
, infraSpecificEpithet
, combinationAuthorTeam
, nomenclaturalReference
, nomenclMicroRef
, homotypicalGroup
);
72 * Returns a parsed Name
76 public static BotanicalName
PARSED_NAME(String fullNameString
){
77 return PARSED_NAME(fullNameString
, Rank
.GENUS());
81 * Returns a parsed Name
85 public static BotanicalName
PARSED_NAME(String fullNameString
, Rank rank
){
86 if (nameParser
== null){
87 nameParser
= new NonViralNameParserImpl();
89 return (BotanicalName
)nameParser
.parseFullName(fullNameString
, NomenclaturalCode
.ICBN(), rank
);
93 * Returns a parsed Name
97 public static BotanicalName
PARSED_REFERENCE(String fullNameAndReferenceString
){
98 return PARSED_REFERENCE(fullNameAndReferenceString
, Rank
.GENUS());
102 * Returns a parsed Name
106 public static BotanicalName
PARSED_REFERENCE(String fullNameAndReferenceString
, Rank rank
){
107 if (nameParser
== null){
108 nameParser
= new NonViralNameParserImpl();
110 return (BotanicalName
)nameParser
.parseFullReference(fullNameAndReferenceString
, NomenclaturalCode
.ICBN(), rank
);
113 //needed by hibernate
114 protected BotanicalName(){
116 this.cacheStrategy
= BotanicNameDefaultCacheStrategy
.NewInstance();
118 protected BotanicalName(Rank rank
, HomotypicalGroup homotypicalGroup
) {
119 super(rank
, homotypicalGroup
);
120 this.cacheStrategy
= BotanicNameDefaultCacheStrategy
.NewInstance();
122 protected BotanicalName(Rank rank
, String genusOrUninomial
, String specificEpithet
, String infraSpecificEpithet
, TeamOrPersonBase combinationAuthorTeam
, INomenclaturalReference nomenclaturalReference
, String nomenclMicroRef
, HomotypicalGroup homotypicalGroup
) {
123 super(rank
, genusOrUninomial
, specificEpithet
, infraSpecificEpithet
, combinationAuthorTeam
, nomenclaturalReference
, nomenclMicroRef
, homotypicalGroup
);
124 this.cacheStrategy
= BotanicNameDefaultCacheStrategy
.NewInstance();
129 @Cascade({CascadeType
.SAVE_UPDATE
, CascadeType
.DELETE_ORPHAN
})
130 public Set
<HybridRelationship
> getHybridRelationships() {
131 return hybridRelationships
;
133 protected void setHybridRelationships(Set
<HybridRelationship
> relationships
) {
134 this.hybridRelationships
= relationships
;
136 public void addHybridRelationship(HybridRelationship relationship
) {
137 this.hybridRelationships
.add(relationship
);
139 public void removeHybridRelationship(HybridRelationship relationship
) {
140 this.hybridRelationships
.remove(relationship
);
144 public Set
<HybridRelationship
> getParentRelationships() {
145 // FIXME: filter relations
146 return hybridRelationships
;
149 public Set
<HybridRelationship
> getChildRelationships() {
150 // FIXME: filter relations
151 return hybridRelationships
;
154 public void addRelationship(RelationshipBase relation
) {
155 if (relation
instanceof HybridRelationship
){
156 addHybridRelationship((HybridRelationship
)relation
);
158 super.addRelationship(relation
);
162 public boolean isHybridFormula(){
163 return this.isHybridFormula
;
168 * @param isHybridFormula isHybridFormula
170 public void setHybridFormula(boolean isHybridFormula
){
171 this.isHybridFormula
= isHybridFormula
;
174 public boolean isMonomHybrid(){
175 return this.isMonomHybrid
;
180 * @param isMonomHybrid isMonomHybrid
182 public void setMonomHybrid(boolean isMonomHybrid
){
183 this.isMonomHybrid
= isMonomHybrid
;
186 public boolean isBinomHybrid(){
187 return this.isBinomHybrid
;
192 * @param isBinomHybrid isBinomHybrid
194 public void setBinomHybrid(boolean isBinomHybrid
){
195 this.isBinomHybrid
= isBinomHybrid
;
198 public boolean isTrinomHybrid(){
199 return this.isTrinomHybrid
;
204 * @param isTrinomHybrid isTrinomHybrid
206 public void setTrinomHybrid(boolean isTrinomHybrid
){
207 this.isTrinomHybrid
= isTrinomHybrid
;
210 public boolean isAnamorphic(){
211 return this.isAnamorphic
;
216 * @param isAnamorphic isAnamorphic
218 public void setAnamorphic(boolean isAnamorphic
){
219 this.isAnamorphic
= isAnamorphic
;
225 public NomenclaturalCode
getNomeclaturalCode(){
226 return NomenclaturalCode
.ICBN();