(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 java.util.HashSet;
14 import java.util.Set;
15
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;
25
26 import org.apache.log4j.Logger;
27 import org.hibernate.annotations.Cascade;
28 import org.hibernate.annotations.CascadeType;
29
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;
36
37 /**
38 * Taxon name class for plants
39 * @author m.doering
40 * @version 1.0
41 * @created 08-Nov-2007 13:06:15
42 */
43 @XmlAccessorType(XmlAccessType.FIELD)
44 @XmlType(name = "", propOrder = {
45 "isHybridFormula",
46 "isMonomHybrid",
47 "isBinomHybrid",
48 "isTrinomHybrid",
49 "isAnamorphic",
50 "hybridRelationships"
51 })
52 @XmlRootElement(name = "BotanicalName")
53 @Entity
54 public class BotanicalName extends NonViralName {
55
56 private static final Logger logger = Logger.getLogger(BotanicalName.class);
57
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;
62
63 @XmlElement(name ="IsMonomHybrid")
64 private boolean isMonomHybrid = false;
65
66 @XmlElement(name ="IsBinomHybrid")
67 private boolean isBinomHybrid = false;
68
69 @XmlElement(name ="IsTrinomHybrid")
70 private boolean isTrinomHybrid = false;
71
72 //Only for fungi: to indicate that the type of the name is asexual or not
73 @XmlElement(name ="IsAnamorphic")
74 private boolean isAnamorphic;
75
76 @XmlElementWrapper(name = "HybridRelationships")
77 @XmlElement(name = "HybridRelationship")
78 private Set<HybridRelationship> hybridRelationships = new HashSet();
79
80 static private INonViralNameParser nameParser = new NonViralNameParserImpl();
81
82
83 /**
84 * @param rank
85 * @return
86 */
87 public static BotanicalName NewInstance(Rank rank){
88 return new BotanicalName(rank, null);
89 }
90
91
92 /**
93 * @param rank
94 * @param homotypicalGroup
95 * @return
96 */
97 public static BotanicalName NewInstance(Rank rank, HomotypicalGroup homotypicalGroup){
98 return new BotanicalName(rank, homotypicalGroup);
99 }
100
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);
103 }
104
105 /**
106 * Returns a parsed Name
107 * @param fullName
108 * @return
109 */
110 public static BotanicalName PARSED_NAME(String fullNameString){
111 return PARSED_NAME(fullNameString, Rank.GENUS());
112 }
113
114 /**
115 * Returns a parsed Name
116 * @param fullName
117 * @return
118 */
119 public static BotanicalName PARSED_NAME(String fullNameString, Rank rank){
120 if (nameParser == null){
121 nameParser = new NonViralNameParserImpl();
122 }
123 return (BotanicalName)nameParser.parseFullName(fullNameString, NomenclaturalCode.ICBN(), rank);
124 }
125
126 /**
127 * Returns a parsed Name
128 * @param fullName
129 * @return
130 */
131 public static BotanicalName PARSED_REFERENCE(String fullNameAndReferenceString){
132 return PARSED_REFERENCE(fullNameAndReferenceString, Rank.GENUS());
133 }
134
135 /**
136 * Returns a parsed Name
137 * @param fullName
138 * @return
139 */
140 public static BotanicalName PARSED_REFERENCE(String fullNameAndReferenceString, Rank rank){
141 if (nameParser == null){
142 nameParser = new NonViralNameParserImpl();
143 }
144 return (BotanicalName)nameParser.parseFullReference(fullNameAndReferenceString, NomenclaturalCode.ICBN(), rank);
145 }
146
147 //needed by hibernate
148 protected BotanicalName(){
149 super();
150 this.cacheStrategy = BotanicNameDefaultCacheStrategy.NewInstance();
151 }
152 protected BotanicalName(Rank rank, HomotypicalGroup homotypicalGroup) {
153 super(rank, homotypicalGroup);
154 this.cacheStrategy = BotanicNameDefaultCacheStrategy.NewInstance();
155 }
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();
159 }
160
161
162 @OneToMany
163 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN})
164 public Set<HybridRelationship> getHybridRelationships() {
165 return hybridRelationships;
166 }
167 protected void setHybridRelationships(Set<HybridRelationship> relationships) {
168 this.hybridRelationships = relationships;
169 }
170 public void addHybridRelationship(HybridRelationship relationship) {
171 this.hybridRelationships.add(relationship);
172 }
173 public void removeHybridRelationship(HybridRelationship relationship) {
174 this.hybridRelationships.remove(relationship);
175 }
176
177 @Transient
178 public Set<HybridRelationship> getParentRelationships() {
179 // FIXME: filter relations
180 return hybridRelationships;
181 }
182 @Transient
183 public Set<HybridRelationship> getChildRelationships() {
184 // FIXME: filter relations
185 return hybridRelationships;
186 }
187
188 public void addRelationship(RelationshipBase relation) {
189 if (relation instanceof HybridRelationship){
190 addHybridRelationship((HybridRelationship)relation);
191 }else {
192 super.addRelationship(relation);
193 }
194 }
195
196 public boolean isHybridFormula(){
197 return this.isHybridFormula;
198 }
199
200 /**
201 *
202 * @param isHybridFormula isHybridFormula
203 */
204 public void setHybridFormula(boolean isHybridFormula){
205 this.isHybridFormula = isHybridFormula;
206 }
207
208 public boolean isMonomHybrid(){
209 return this.isMonomHybrid;
210 }
211
212 /**
213 *
214 * @param isMonomHybrid isMonomHybrid
215 */
216 public void setMonomHybrid(boolean isMonomHybrid){
217 this.isMonomHybrid = isMonomHybrid;
218 }
219
220 public boolean isBinomHybrid(){
221 return this.isBinomHybrid;
222 }
223
224 /**
225 *
226 * @param isBinomHybrid isBinomHybrid
227 */
228 public void setBinomHybrid(boolean isBinomHybrid){
229 this.isBinomHybrid = isBinomHybrid;
230 }
231
232 public boolean isTrinomHybrid(){
233 return this.isTrinomHybrid;
234 }
235
236 /**
237 *
238 * @param isTrinomHybrid isTrinomHybrid
239 */
240 public void setTrinomHybrid(boolean isTrinomHybrid){
241 this.isTrinomHybrid = isTrinomHybrid;
242 }
243
244 public boolean isAnamorphic(){
245 return this.isAnamorphic;
246 }
247
248 /**
249 *
250 * @param isAnamorphic isAnamorphic
251 */
252 public void setAnamorphic(boolean isAnamorphic){
253 this.isAnamorphic = isAnamorphic;
254 }
255
256
257 @Transient
258 @Override
259 public NomenclaturalCode getNomenclaturalCode(){
260 return NomenclaturalCode.ICBN();
261
262 }
263
264 }