(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.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;
23
24 import java.util.*;
25 import javax.persistence.*;
26
27 /**
28 * Taxon name class for plants
29 * @author m.doering
30 * @version 1.0
31 * @created 08-Nov-2007 13:06:15
32 */
33 @Entity
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();
45
46 static private INonViralNameParser nameParser = new NonViralNameParserImpl();
47
48
49 /**
50 * @param rank
51 * @return
52 */
53 public static BotanicalName NewInstance(Rank rank){
54 return new BotanicalName(rank, null);
55 }
56
57
58 /**
59 * @param rank
60 * @param homotypicalGroup
61 * @return
62 */
63 public static BotanicalName NewInstance(Rank rank, HomotypicalGroup homotypicalGroup){
64 return new BotanicalName(rank, homotypicalGroup);
65 }
66
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);
69 }
70
71 /**
72 * Returns a parsed Name
73 * @param fullName
74 * @return
75 */
76 public static BotanicalName PARSED_NAME(String fullNameString){
77 return PARSED_NAME(fullNameString, Rank.GENUS());
78 }
79
80 /**
81 * Returns a parsed Name
82 * @param fullName
83 * @return
84 */
85 public static BotanicalName PARSED_NAME(String fullNameString, Rank rank){
86 if (nameParser == null){
87 nameParser = new NonViralNameParserImpl();
88 }
89 return (BotanicalName)nameParser.parseFullName(fullNameString, NomenclaturalCode.ICBN(), rank);
90 }
91
92 /**
93 * Returns a parsed Name
94 * @param fullName
95 * @return
96 */
97 public static BotanicalName PARSED_REFERENCE(String fullNameAndReferenceString){
98 return PARSED_REFERENCE(fullNameAndReferenceString, Rank.GENUS());
99 }
100
101 /**
102 * Returns a parsed Name
103 * @param fullName
104 * @return
105 */
106 public static BotanicalName PARSED_REFERENCE(String fullNameAndReferenceString, Rank rank){
107 if (nameParser == null){
108 nameParser = new NonViralNameParserImpl();
109 }
110 return (BotanicalName)nameParser.parseFullReference(fullNameAndReferenceString, NomenclaturalCode.ICBN(), rank);
111 }
112
113 //needed by hibernate
114 protected BotanicalName(){
115 super();
116 this.cacheStrategy = BotanicNameDefaultCacheStrategy.NewInstance();
117 }
118 protected BotanicalName(Rank rank, HomotypicalGroup homotypicalGroup) {
119 super(rank, homotypicalGroup);
120 this.cacheStrategy = BotanicNameDefaultCacheStrategy.NewInstance();
121 }
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();
125 }
126
127
128 @OneToMany
129 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN})
130 public Set<HybridRelationship> getHybridRelationships() {
131 return hybridRelationships;
132 }
133 protected void setHybridRelationships(Set<HybridRelationship> relationships) {
134 this.hybridRelationships = relationships;
135 }
136 public void addHybridRelationship(HybridRelationship relationship) {
137 this.hybridRelationships.add(relationship);
138 }
139 public void removeHybridRelationship(HybridRelationship relationship) {
140 this.hybridRelationships.remove(relationship);
141 }
142
143 @Transient
144 public Set<HybridRelationship> getParentRelationships() {
145 // FIXME: filter relations
146 return hybridRelationships;
147 }
148 @Transient
149 public Set<HybridRelationship> getChildRelationships() {
150 // FIXME: filter relations
151 return hybridRelationships;
152 }
153
154 public void addRelationship(RelationshipBase relation) {
155 if (relation instanceof HybridRelationship){
156 addHybridRelationship((HybridRelationship)relation);
157 }else {
158 super.addRelationship(relation);
159 }
160 }
161
162 public boolean isHybridFormula(){
163 return this.isHybridFormula;
164 }
165
166 /**
167 *
168 * @param isHybridFormula isHybridFormula
169 */
170 public void setHybridFormula(boolean isHybridFormula){
171 this.isHybridFormula = isHybridFormula;
172 }
173
174 public boolean isMonomHybrid(){
175 return this.isMonomHybrid;
176 }
177
178 /**
179 *
180 * @param isMonomHybrid isMonomHybrid
181 */
182 public void setMonomHybrid(boolean isMonomHybrid){
183 this.isMonomHybrid = isMonomHybrid;
184 }
185
186 public boolean isBinomHybrid(){
187 return this.isBinomHybrid;
188 }
189
190 /**
191 *
192 * @param isBinomHybrid isBinomHybrid
193 */
194 public void setBinomHybrid(boolean isBinomHybrid){
195 this.isBinomHybrid = isBinomHybrid;
196 }
197
198 public boolean isTrinomHybrid(){
199 return this.isTrinomHybrid;
200 }
201
202 /**
203 *
204 * @param isTrinomHybrid isTrinomHybrid
205 */
206 public void setTrinomHybrid(boolean isTrinomHybrid){
207 this.isTrinomHybrid = isTrinomHybrid;
208 }
209
210 public boolean isAnamorphic(){
211 return this.isAnamorphic;
212 }
213
214 /**
215 *
216 * @param isAnamorphic isAnamorphic
217 */
218 public void setAnamorphic(boolean isAnamorphic){
219 this.isAnamorphic = isAnamorphic;
220 }
221
222
223 @Transient
224 @Override
225 public NomenclaturalCode getNomeclaturalCode(){
226 return NomenclaturalCode.ICBN();
227
228 }
229
230 }