root/trunk/cdmlib/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/DerivedUnitBase.java

Revision 12136, 8.4 kB (checked in by a.mueller, 12 months ago)

bugfix for bidirectionality specimen <-> typeDesignation

  • Property svn:keywords set to Id
Line 
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
10package eu.etaxonomy.cdm.model.occurrence;
11
12import java.util.HashSet;
13import java.util.Set;
14
15import javax.persistence.Entity;
16import javax.persistence.FetchType;
17import javax.persistence.ManyToOne;
18import javax.persistence.OneToMany;
19import javax.persistence.Transient;
20import javax.xml.bind.annotation.XmlAccessType;
21import javax.xml.bind.annotation.XmlAccessorType;
22import javax.xml.bind.annotation.XmlElement;
23import javax.xml.bind.annotation.XmlElementWrapper;
24import javax.xml.bind.annotation.XmlIDREF;
25import javax.xml.bind.annotation.XmlRootElement;
26import javax.xml.bind.annotation.XmlSchemaType;
27import javax.xml.bind.annotation.XmlType;
28
29import org.hibernate.annotations.Cascade;
30import org.hibernate.annotations.CascadeType;
31import org.hibernate.envers.Audited;
32import org.hibernate.search.annotations.Field;
33import org.hibernate.search.annotations.Index;
34import org.hibernate.search.annotations.Indexed;
35import org.hibernate.search.annotations.IndexedEmbedded;
36import org.hibernate.validator.constraints.Length;
37
38import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
39import eu.etaxonomy.cdm.model.name.TaxonNameBase;
40import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
41import eu.etaxonomy.cdm.validation.annotation.NullOrNotEmpty;
42
43/**
44 * http://www.bgbm.org/biodivinf/docs/CollectionModel/ReprintTNR.pdf
45 * http://www.bgbm.org/biodivinf/docs/CollectionModel/
46 * <BR>
47 * Type figures are derived units with at least a figure object in media
48 *
49 * @author markus
50 *
51 */
52@XmlAccessorType(XmlAccessType.FIELD)
53@XmlType(name = "DerivedUnitBase", propOrder = {
54    "collection",
55    "catalogNumber",
56    "storedUnder",
57    "derivedFrom",
58    "accessionNumber",
59    "collectorsNumber",
60    "barcode",
61    "specimenTypeDesignations"
62})
63@XmlRootElement(name = "DerivedUnitBase")
64@Entity
65@Indexed(index = "eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase")
66@Audited
67public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy> extends SpecimenOrObservationBase<S> implements Cloneable{
68
69        @XmlElement(name = "Collection")
70        @XmlIDREF
71        @XmlSchemaType(name = "IDREF")
72        @ManyToOne(fetch = FetchType.LAZY)
73        @Cascade(CascadeType.SAVE_UPDATE)
74        @IndexedEmbedded
75        private Collection collection;
76
77        @XmlElement(name = "CatalogNumber")
78        @Field(index=Index.UN_TOKENIZED)
79        @NullOrNotEmpty
80        @Length(max = 255)
81        private String catalogNumber;
82       
83        @XmlElement(name = "AccessionNumber")
84        @Field(index=Index.UN_TOKENIZED)
85        @NullOrNotEmpty
86        @Length(max = 255)
87        private String accessionNumber;
88       
89        @XmlElement(name = "CollectorsNumber")
90        @Field(index=Index.UN_TOKENIZED)
91        @NullOrNotEmpty
92        @Length(max = 255)
93        private String collectorsNumber;
94       
95        @XmlElement(name = "Barcode")
96        @Field(index=Index.UN_TOKENIZED)
97        @NullOrNotEmpty
98        @Length(max = 255)
99        private String barcode;
100       
101        @XmlElement(name = "StoredUnder")
102        @XmlIDREF
103        @XmlSchemaType(name = "IDREF")
104        @ManyToOne(fetch = FetchType.LAZY)
105        @Cascade(CascadeType.SAVE_UPDATE)
106        @IndexedEmbedded
107        private TaxonNameBase storedUnder;
108       
109        @XmlElement(name = "DerivedFrom")
110        @XmlIDREF
111        @XmlSchemaType(name = "IDREF")
112        @ManyToOne(fetch = FetchType.LAZY)
113        @Cascade(CascadeType.SAVE_UPDATE)
114        @IndexedEmbedded(depth = 4)
115        private DerivationEvent derivedFrom;
116       
117        @XmlElementWrapper(name = "SpecimenTypeDesignations")
118        @XmlElement(name = "SpecimenTypeDesignation")
119        @OneToMany(fetch = FetchType.LAZY, mappedBy = "typeSpecimen")
120        @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE })
121        private Set<SpecimenTypeDesignation> specimenTypeDesignations = new HashSet<SpecimenTypeDesignation>();
122
123        /**
124         * Constructor
125         */
126        protected DerivedUnitBase() {
127                super();
128        }
129        /**
130         * create new unit derived from an existing field observation
131         * @param fieldObservation existing field observation from where this unit is derived
132         */
133        protected DerivedUnitBase(FieldObservation fieldObservation) {
134                super();
135                DerivationEvent derivedFrom = new DerivationEvent();
136                // TODO: should be done in a more controlled way. Probably by making derivation event implement a general relationship interface (for bidirectional add/remove etc)
137                fieldObservation.addDerivationEvent(derivedFrom);
138                derivedFrom.getOriginals().add(fieldObservation);
139                derivedFrom.getDerivatives().add(this);
140                this.setDerivedFrom(derivedFrom);
141        }
142        /**
143         * create new unit derived from an existing gathering event,
144         * thereby creating a new empty field observation
145         * @param gatheringEvent the gathering event this unit was collected at
146         */
147        protected DerivedUnitBase(GatheringEvent gatheringEvent) {
148                this(new FieldObservation());
149                FieldObservation field = (FieldObservation)this.getOriginalUnit();
150                field.setGatheringEvent(gatheringEvent);
151        }
152
153
154        public DerivationEvent getDerivedFrom() {
155                return derivedFrom;
156        }
157       
158        public void setDerivedFrom(DerivationEvent derivedFrom){
159                if (getDerivedFrom() != null){
160                        getDerivedFrom().getDerivatives().remove(derivedFrom);
161                }
162                this.derivedFrom = derivedFrom;
163                if (derivedFrom != null){
164                        derivedFrom.addDerivative(this);
165                }
166        }
167       
168        @Transient
169        public Set<SpecimenOrObservationBase> getOriginals(){
170                if(getDerivedFrom() != null){
171                        return getDerivedFrom().getOriginals();                 
172                }
173                return null;
174        }
175
176        public Collection getCollection(){
177                return this.collection;
178        }
179       
180        public void setCollection(Collection collection){
181                this.collection = collection;
182        }
183       
184
185        public String getCatalogNumber() {
186                return catalogNumber;
187        }
188
189        public void setCatalogNumber(String catalogNumber) {
190                this.catalogNumber = catalogNumber;
191        }
192       
193        public void setBarcode(String barcode) {
194                this.barcode = barcode;
195        }
196        public String getBarcode() {
197                return barcode;
198        }
199       
200        public void setStoredUnder(TaxonNameBase storedUnder) {
201                this.storedUnder = storedUnder;
202        }
203       
204        public String getAccessionNumber() {
205                return accessionNumber;
206        }
207       
208       
209        public void setAccessionNumber(String accessionNumber) {
210                this.accessionNumber = accessionNumber;
211        }
212       
213        /**
214         * Will be removed in future versions as semantics is not clear.
215         * For accessing the collecting number use
216         * {@link FieldObservation#getFieldNumber()} instead.
217         * @return
218         */
219        @Deprecated
220        public String getCollectorsNumber() {
221                return collectorsNumber;
222        }
223       
224        /**
225         * Will be removed in future versions as semantics is not clear.
226         * For editing the collecting number use
227         * {@link FieldObservation#getFieldNumber()} instead.
228         * @return
229         */
230        @Deprecated
231        public void setCollectorsNumber(String collectorsNumber) {
232                this.collectorsNumber = collectorsNumber;
233        }
234       
235        public TaxonNameBase getStoredUnder() {
236                return storedUnder;
237        }
238       
239        public void addSpecimenTypeDesignation(SpecimenTypeDesignation specimenTypeDesignation){
240                if (specimenTypeDesignation.getTypeSpecimen() == this){
241                        return ;
242                }else if (specimenTypeDesignation.getTypeSpecimen() != null){
243                        specimenTypeDesignation.getTypeSpecimen().removeSpecimenTypeDesignation(specimenTypeDesignation);
244                       
245                }
246                specimenTypeDesignations.add(specimenTypeDesignation);
247                specimenTypeDesignation.setTypeSpecimen(this);
248        }
249       
250        public void removeSpecimenTypeDesignation(SpecimenTypeDesignation specimenTypeDesignation){
251                if (specimenTypeDesignation == null){
252                        return;
253                }
254                if (specimenTypeDesignations.contains(specimenTypeDesignation)){
255                        specimenTypeDesignations.remove(specimenTypeDesignation);
256                        specimenTypeDesignation.setTypeSpecimen(null);
257                }
258        }
259               
260        public Set<SpecimenTypeDesignation> getSpecimenTypeDesignations(){
261                return specimenTypeDesignations;
262        }
263       
264//*********** CLONE **********************************/
265       
266        /**
267         * Clones <i>this</i> derivedUnitBase. This is a shortcut that enables to
268         * create a new instance that differs only slightly from <i>this</i> specimen
269         * by modifying only some of the attributes.<BR>
270         * This method overrides the clone method from {@link SpecimenOrObservationBase SpecimenOrObservationBase}.
271         *
272         * @see SpecimenOrObservationBase#clone()
273         * @see eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity#clone()
274         * @see java.lang.Object#clone()
275         */
276        @Override
277        public Object clone() throws CloneNotSupportedException{
278                DerivedUnitBase result = (DerivedUnitBase)super.clone();
279                //collection
280                result.setCollection(this.collection);
281                //derivedFrom
282                result.setDerivedFrom(this.derivedFrom);
283                //storedUnder
284                result.setStoredUnder(this.storedUnder);
285                //no changes to: accessionNumber, catalogNumber, collectorsNumber
286                return result;
287        }
288
289}
Note: See TracBrowser for help on using the browser.