bugfix for failing test on bidirectionality specimen - typeDesignation
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / name / SpecimenTypeDesignation.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 javax.persistence.Entity;
14 import javax.persistence.FetchType;
15 import javax.persistence.JoinColumn;
16 import javax.persistence.ManyToOne;
17 import javax.persistence.Transient;
18 import javax.xml.bind.annotation.XmlAccessType;
19 import javax.xml.bind.annotation.XmlAccessorType;
20 import javax.xml.bind.annotation.XmlElement;
21 import javax.xml.bind.annotation.XmlIDREF;
22 import javax.xml.bind.annotation.XmlRootElement;
23 import javax.xml.bind.annotation.XmlSchemaType;
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 import org.hibernate.envers.Audited;
30
31 import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
32 import eu.etaxonomy.cdm.model.occurrence.Specimen;
33 import eu.etaxonomy.cdm.model.reference.Reference;
34
35 /**
36 * The class representing a typification of one or several {@link TaxonNameBase taxon names} by a
37 * {@link eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase specimen or a figure}. All {@link TaxonNameBase taxon names}
38 * which have a {@link Rank rank} "species aggregate" or lower can only be typified
39 * by specimens. Moreover each typification by a specimen (or by a figure) has a
40 * {@link SpecimenTypeDesignationStatus status} like "holotype" or "isotype".
41 * <P>
42 * This class corresponds to: <ul>
43 * <li> NomenclaturalType according to the TDWG ontology
44 * <li> Typification (partially) according to the TCS
45 * <li> NomenclaturalTypeDesignation according to the ABCD schema
46 * </ul>
47 *
48 * @see TypeDesignationBase
49 * @see NameTypeDesignation
50 * @author m.doering
51 * @version 1.0
52 * @created 08-Nov-2007 13:06:38
53 */
54 @XmlRootElement(name = "SpecimenTypeDesignation")
55 @XmlAccessorType(XmlAccessType.FIELD)
56 @XmlType(name = "SpecimenTypeDesignation", propOrder = {
57 "typeSpecimen"
58 })
59 @Entity
60 @Audited
61 public class SpecimenTypeDesignation extends TypeDesignationBase<SpecimenTypeDesignationStatus> implements ITypeDesignation, Cloneable {
62 private static final long serialVersionUID = 6481627446997275007L;
63 private static final Logger logger = Logger.getLogger(SpecimenTypeDesignation.class);
64
65 @XmlElement(name = "TypeSpecimen")
66 @XmlIDREF
67 @XmlSchemaType(name = "IDREF")
68 @ManyToOne(fetch = FetchType.LAZY)
69 @JoinColumn(name="typeSpecimen_id")
70 @Cascade(CascadeType.SAVE_UPDATE)
71 private DerivedUnitBase typeSpecimen;
72
73 // /**
74 // * Creates a new specimen type designation instance
75 // * (including its {@link reference.Reference reference source} and eventually
76 // * the taxon name string originally used by this reference when establishing
77 // * the former designation) and adds it to the corresponding
78 // * {@link HomotypicalGroup#getSpecimenTypeDesignations() specimen type designation set} of the
79 // * {@link HomotypicalGroup homotypical group}.
80 // *
81 // * @param specimen the derived unit (specimen or figure) used as type
82 // * @param status the type designation status
83 // * @param citation the reference source for the new designation
84 // * @param citationMicroReference the string with the details describing the exact localisation within the reference
85 // * @param originalNameString the taxon name string used originally in the reference source for the new designation
86 // * @see #SpecimenTypeDesignation(DerivedUnitBase, TypeDesignationStatus, Reference, String, String)
87 // * @see HomotypicalGroup#addSpecimenTypeDesignation(SpecimenTypeDesignation, boolean)
88 // * @see occurrence.DerivedUnitBase
89 // */
90 // protected static SpecimenTypeDesignation NewInstance2(DerivedUnitBase specimen, TypeDesignationStatus status,
91 // Reference citation, String citationMicroReference, String originalNameString){
92 // SpecimenTypeDesignation specTypeDesig = new SpecimenTypeDesignation(specimen, status, citation, citationMicroReference, originalNameString);
93 // return specTypeDesig;
94 // }
95
96
97 // ************* CONSTRUCTORS *************/
98 /**
99 * Class constructor: creates a new empty specimen type designation.
100 *
101 * @see #SpecimenTypeDesignation(DerivedUnitBase, SpecimenTypeDesignationStatus,
102 * Reference, String, String, boolean)
103 */
104 protected SpecimenTypeDesignation(){
105 }
106
107 public static SpecimenTypeDesignation NewInstance() {
108 return new SpecimenTypeDesignation();
109 }
110
111 /**
112 * Class constructor: creates a new specimen type designation instance
113 * (including its {@link eu.etaxonomy.cdm.model.reference.Reference reference source} and
114 * eventually the taxon name string originally used by this reference when
115 * establishing the former designation).
116 *
117 * @param specimen the derived unit (specimen or figure) used
118 * as type
119 * @param status the type designation status
120 * @param citation the reference source for the new designation
121 * @param citationMicroReference the string with the details describing
122 * the exact localisation within the reference
123 * @param originalNameString the taxon name string used originally in the
124 * reference source for the new designation
125 * @param isNotDesignated the boolean flag indicating whether there is no specimen type at all for
126 * <i>this</i> specimen type designation
127 * @see #SpecimenTypeDesignation()
128 * @see TaxonNameBase#addSpecimenTypeDesignation(Specimen, SpecimenTypeDesignationStatus, Reference, String, String, boolean, boolean)
129 * @see TypeDesignationBase#isNotDesignated()
130 * @see eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase
131 */
132 protected SpecimenTypeDesignation(DerivedUnitBase specimen, SpecimenTypeDesignationStatus status, Reference citation, String citationMicroReference,
133 String originalNameString, boolean isNotDesignated) {
134 super(citation, citationMicroReference, originalNameString, isNotDesignated);
135 this.setTypeSpecimen(specimen);
136
137 this.setTypeStatus(status);
138 }
139
140 //********* METHODS **************************************/
141
142 /**
143 * Returns the {@link occurrence.DerivedUnitBase derived unit} (specimen or figure) that is used
144 * in <i>this</i> specimen type designation to typify the {@link TaxonNameBase taxon name}.
145 *
146 * @see #getHomotypicalGroup()
147 */
148 public DerivedUnitBase getTypeSpecimen(){
149 return this.typeSpecimen;
150 }
151
152 /**
153 * @see #getTypeSpecimen()
154 */
155 public void setTypeSpecimen(DerivedUnitBase typeSpecimen){
156 if (this.typeSpecimen == typeSpecimen){
157 return;
158 }
159 if (this.typeSpecimen != null){
160 this.typeSpecimen.removeSpecimenTypeDesignation(this);
161 }
162 if (typeSpecimen != null && ! typeSpecimen.getSpecimenTypeDesignations().contains(this)){
163 typeSpecimen.addSpecimenTypeDesignation(this);
164 }
165 this.typeSpecimen = typeSpecimen;
166 }
167
168 /* (non-Javadoc)
169 * @see eu.etaxonomy.cdm.model.name.ITypeDesignation#isLectoType()
170 */
171 @Transient
172 public boolean isLectoType() {
173 if(getTypeStatus() == null){
174 return false;
175 }
176 return getTypeStatus().isLectotype();
177 }
178
179 //*********************** CLONE ********************************************************/
180
181 /**
182 * Clones <i>this</i> type specimen. This is a shortcut that enables to create
183 * a new instance that differs only slightly from <i>this</i> type specimen by
184 * modifying only some of the attributes.
185 *
186 * @see eu.etaxonomy.cdm.model.name.TypeDesignationBase#clone()
187 * @see java.lang.Object#clone()
188 */
189 @Override
190 public Object clone() {
191 SpecimenTypeDesignation result;
192 try {
193 result = (SpecimenTypeDesignation)super.clone();
194 //no changes to: typeSpecimen
195 return result;
196 } catch (CloneNotSupportedException e) {
197 logger.warn("Object does not implement cloneable");
198 e.printStackTrace();
199 return null;
200 }
201 }
202
203 }