(no commit message)
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / name / BotanicalName.java
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.name;
11
12
13 import org.apache.log4j.Logger;
14 import org.hibernate.annotations.Cascade;
15 import org.hibernate.annotations.CascadeType;
16
17 import eu.etaxonomy.cdm.model.agent.Agent;
18 import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;
19 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
20 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
21 import eu.etaxonomy.cdm.strategy.cache.BotanicNameDefaultCacheStrategy;
22 import eu.etaxonomy.cdm.strategy.parser.TaxonNameParserBotanicalNameImpl;
23
24 import java.util.*;
25
26 import javax.naming.NameParser;
27 import javax.persistence.*;
28
29 /**
30 * Taxon name class for plants
31 * @author m.doering
32 * @version 1.0
33 * @created 08-Nov-2007 13:06:15
34 */
35 @Entity
36 public class BotanicalName extends NonViralName {
37 static Logger logger = Logger.getLogger(BotanicalName.class);
38 //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
39 //hybrid name may not have either an authorteam nor other name components.
40 private boolean isHybridFormula = false;
41 private boolean isMonomHybrid = false;
42 private boolean isBinomHybrid = false;
43 private boolean isTrinomHybrid = false;
44 //Only for fungi: to indicate that the type of the name is asexual or not
45 private boolean isAnamorphic;
46 private Set<HybridRelationship> hybridRelationships = new HashSet();
47
48 /**
49 * @param rank
50 * @return
51 */
52 public static BotanicalName NewInstance(Rank rank){
53 return new BotanicalName(rank, null);
54 }
55
56
57 /**
58 * @param rank
59 * @param homotypicalGroup
60 * @return
61 */
62 public static BotanicalName NewInstance(Rank rank, HomotypicalGroup homotypicalGroup){
63 return new BotanicalName(rank, homotypicalGroup);
64 }
65
66 public static BotanicalName NewInstance(Rank rank, String genusOrUninomial, String specificEpithet, String infraSpecificEpithet, TeamOrPersonBase combinationAuthorTeam, INomenclaturalReference nomenclaturalReference, String nomenclMicroRef, HomotypicalGroup homotypicalGroup) {
67 return new BotanicalName(rank, genusOrUninomial, specificEpithet, infraSpecificEpithet, combinationAuthorTeam, nomenclaturalReference, nomenclMicroRef, homotypicalGroup);
68 }
69
70 /**
71 * Returns a parsed Name
72 * @param fullName
73 * @return
74 */
75 public static BotanicalName PARSED_NAME(String fullNameString){
76 return PARSED_NAME(fullNameString, Rank.GENUS());
77 }
78
79 /**
80 * Returns a parsed Name
81 * @param fullName
82 * @return
83 */
84 public static BotanicalName PARSED_NAME(String fullNameString, Rank rank){
85 if (nameParser == null){
86 nameParser = new TaxonNameParserBotanicalNameImpl();
87 }
88 return (BotanicalName)nameParser.parseFullName(fullNameString, rank);
89 }
90
91 /**
92 * Returns a parsed Name
93 * @param fullName
94 * @return
95 */
96 public static BotanicalName PARSED_REFERENCE(String fullNameAndReferenceString){
97 return PARSED_REFERENCE(fullNameAndReferenceString, Rank.GENUS());
98 }
99
100 /**
101 * Returns a parsed Name
102 * @param fullName
103 * @return
104 */
105 public static BotanicalName PARSED_REFERENCE(String fullNameAndReferenceString, Rank rank){
106 if (nameParser == null){
107 nameParser = new TaxonNameParserBotanicalNameImpl();
108 }
109 return (BotanicalName)nameParser.parseFullReference(fullNameAndReferenceString, rank);
110 }
111
112 //needed by hibernate
113 protected BotanicalName(){
114 super();
115 this.cacheStrategy = BotanicNameDefaultCacheStrategy.NewInstance();
116 }
117 protected BotanicalName(Rank rank, HomotypicalGroup homotypicalGroup) {
118 super(rank, homotypicalGroup);
119 this.cacheStrategy = BotanicNameDefaultCacheStrategy.NewInstance();
120 }
121 protected BotanicalName(Rank rank, String genusOrUninomial, String specificEpithet, String infraSpecificEpithet, TeamOrPersonBase combinationAuthorTeam, INomenclaturalReference nomenclaturalReference, String nomenclMicroRef, HomotypicalGroup homotypicalGroup) {
122 super(rank, genusOrUninomial, specificEpithet, infraSpecificEpithet, combinationAuthorTeam, nomenclaturalReference, nomenclMicroRef, homotypicalGroup);
123 this.cacheStrategy = BotanicNameDefaultCacheStrategy.NewInstance();
124 }
125
126
127 @OneToMany
128 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN})
129 public Set<HybridRelationship> getHybridRelationships() {
130 return hybridRelationships;
131 }
132 protected void setHybridRelationships(Set<HybridRelationship> relationships) {
133 this.hybridRelationships = relationships;
134 }
135 public void addHybridRelationship(HybridRelationship relationship) {
136 this.hybridRelationships.add(relationship);
137 }
138 public void removeHybridRelationship(HybridRelationship relationship) {
139 this.hybridRelationships.remove(relationship);
140 }
141
142 @Transient
143 public Set<HybridRelationship> getParentRelationships() {
144 // FIXME: filter relations
145 return hybridRelationships;
146 }
147 @Transient
148 public Set<HybridRelationship> getChildRelationships() {
149 // FIXME: filter relations
150 return hybridRelationships;
151 }
152
153
154
155 public boolean isHybridFormula(){
156 return this.isHybridFormula;
157 }
158
159 /**
160 *
161 * @param isHybridFormula isHybridFormula
162 */
163 public void setHybridFormula(boolean isHybridFormula){
164 this.isHybridFormula = isHybridFormula;
165 }
166
167 public boolean isMonomHybrid(){
168 return this.isMonomHybrid;
169 }
170
171 /**
172 *
173 * @param isMonomHybrid isMonomHybrid
174 */
175 public void setMonomHybrid(boolean isMonomHybrid){
176 this.isMonomHybrid = isMonomHybrid;
177 }
178
179 public boolean isBinomHybrid(){
180 return this.isBinomHybrid;
181 }
182
183 /**
184 *
185 * @param isBinomHybrid isBinomHybrid
186 */
187 public void setBinomHybrid(boolean isBinomHybrid){
188 this.isBinomHybrid = isBinomHybrid;
189 }
190
191 public boolean isTrinomHybrid(){
192 return this.isTrinomHybrid;
193 }
194
195 /**
196 *
197 * @param isTrinomHybrid isTrinomHybrid
198 */
199 public void setTrinomHybrid(boolean isTrinomHybrid){
200 this.isTrinomHybrid = isTrinomHybrid;
201 }
202
203 public boolean isAnamorphic(){
204 return this.isAnamorphic;
205 }
206
207 /**
208 *
209 * @param isAnamorphic isAnamorphic
210 */
211 public void setAnamorphic(boolean isAnamorphic){
212 this.isAnamorphic = isAnamorphic;
213 }
214
215 }