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