removed abstract method getGatheringEvent which was not implemented in DerivedUnitBase
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / occurrence / DerivedUnitBase.java
index 670c644077b93e46897d38b860b33dcb68d70622..3a352f9d62f023a1a1adf4ef4a1673465892db6c 100644 (file)
@@ -9,34 +9,98 @@
 
 package eu.etaxonomy.cdm.model.occurrence;
 
-import java.util.HashSet;
 import java.util.Set;
 
 import javax.persistence.Entity;
-import javax.persistence.ManyToMany;
+import javax.persistence.FetchType;
 import javax.persistence.ManyToOne;
 import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlIDREF;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
 
 import org.hibernate.annotations.Cascade;
 import org.hibernate.annotations.CascadeType;
-import org.hibernate.collection.PersistentSet;
+import org.hibernate.envers.Audited;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.validator.constraints.Length;
 
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
+import eu.etaxonomy.cdm.validation.annotation.NullOrNotEmpty;
 
 /**
  * http://www.bgbm.org/biodivinf/docs/CollectionModel/ReprintTNR.pdf
  * http://www.bgbm.org/biodivinf/docs/CollectionModel/
+ * <BR>
+ * Type figures are derived units with at least a figure object in media
+ *
  * @author markus
  *
  */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "DerivedUnitBase", propOrder = {
+    "collection",
+    "catalogNumber",
+    "storedUnder",
+    "derivationEvent",
+    "accessionNumber",
+    "collectorsNumber"
+})
+@XmlRootElement(name = "DerivedUnitBase")
 @Entity
-public abstract class DerivedUnitBase extends SpecimenOrObservationBase {
+@Indexed(index = "eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase")
+@Audited
+public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy> extends SpecimenOrObservationBase<S> implements Cloneable{
 
+       @XmlElement(name = "Collection")
+       @XmlIDREF
+       @XmlSchemaType(name = "IDREF")
+       @ManyToOne(fetch = FetchType.LAZY)
+       @Cascade(CascadeType.SAVE_UPDATE)
+       @IndexedEmbedded
        private Collection collection;
+
+       @XmlElement(name = "CatalogNumber")
+       @Field(index=Index.UN_TOKENIZED)
+       @NullOrNotEmpty
+       @Length(max = 255)
        private String catalogNumber;
+       
+       @XmlElement(name = "AccessionNumber")
+       @Field(index=Index.UN_TOKENIZED)
+       @NullOrNotEmpty
+       @Length(max = 255)
+       private String accessionNumber;
+       
+       @XmlElement(name = "CollectorsNumber")
+       @Field(index=Index.UN_TOKENIZED)
+       @NullOrNotEmpty
+       @Length(max = 255)
+       private String collectorsNumber;
+       
+       @XmlElement(name = "StoredUnder")
+       @XmlIDREF
+       @XmlSchemaType(name = "IDREF")
+       @ManyToOne(fetch = FetchType.LAZY)
+       @Cascade(CascadeType.SAVE_UPDATE)
+       @IndexedEmbedded
        private TaxonNameBase storedUnder;
-       private DerivationEvent derivedFrom;
+       
+       @XmlElement(name = "DerivedFrom")
+       @XmlIDREF
+       @XmlSchemaType(name = "IDREF")
+       @ManyToOne(fetch = FetchType.LAZY)
+       @Cascade(CascadeType.SAVE_UPDATE)
+       @IndexedEmbedded(depth = 4)
+       private DerivationEvent derivationEvent;
 
        /**
         * Constructor
@@ -64,32 +128,22 @@ public abstract class DerivedUnitBase extends SpecimenOrObservationBase {
         */
        protected DerivedUnitBase(GatheringEvent gatheringEvent) {
                this(new FieldObservation());
-               FieldObservation field = (FieldObservation) this.getOriginalUnit();
+               FieldObservation field = (FieldObservation)this.getOriginalUnit();
                field.setGatheringEvent(gatheringEvent);
        }
-       
-       
-       
-       @ManyToOne
-       @Deprecated //only for bidirectional and persistence use
-       private DerivationEvent getDerivationEvent() {
-               return getDerivedFrom();
-       }
-       @Deprecated //only for bidirectional and persistence use
-       private void setDerivationEvent(DerivationEvent derivationEvent) {
-               this.derivedFrom = derivationEvent;
-       }
-       @Transient
+
+
        public DerivationEvent getDerivedFrom() {
-               return derivedFrom;
+               return derivationEvent;
        }
+       
        public void setDerivedFrom(DerivationEvent derivedFrom){
                if (getDerivedFrom() != null){
                        getDerivedFrom().getDerivatives().remove(derivedFrom);
                }
-               this.derivedFrom = derivedFrom;
+               this.derivationEvent = derivedFrom;
                if (derivedFrom != null){
-                       derivedFrom.getDerivatives().add(this);
+                       derivedFrom.addDerivative(this);
                }
        }
        
@@ -98,21 +152,10 @@ public abstract class DerivedUnitBase extends SpecimenOrObservationBase {
                return this.getDerivedFrom().getOriginals();
        }
 
-
-       @Override
-       @Transient
-       public GatheringEvent getGatheringEvent() {
-               // FIXME: implement efficient way of getting original gathering event
-               // keep link to original gathering event for performance mainly.
-               return null;
-       }
-
-       
-       @ManyToOne
-       @Cascade({CascadeType.SAVE_UPDATE})
        public Collection getCollection(){
                return this.collection;
        }
+       
        public void setCollection(Collection collection){
                this.collection = collection;
        }
@@ -125,14 +168,54 @@ public abstract class DerivedUnitBase extends SpecimenOrObservationBase {
        public void setCatalogNumber(String catalogNumber) {
                this.catalogNumber = catalogNumber;
        }
-
-       @ManyToOne
-       @Cascade({CascadeType.SAVE_UPDATE})
+       
+       public void setStoredUnder(TaxonNameBase storedUnder) {
+               this.storedUnder = storedUnder;
+       }
+       
+       public String getAccessionNumber() {
+               return accessionNumber;
+       }
+       
+       
+       public void setAccessionNumber(String accessionNumber) {
+               this.accessionNumber = accessionNumber;
+       }
+       
+       public String getCollectorsNumber() {
+               return collectorsNumber;
+       }
+       
+       public void setCollectorsNumber(String collectorsNumber) {
+               this.collectorsNumber = collectorsNumber;
+       }
+       
        public TaxonNameBase getStoredUnder() {
                return storedUnder;
        }
-       public void setStoredUnder(TaxonNameBase storedUnder) {
-               this.storedUnder = storedUnder;
+       
+//*********** CLONE **********************************/        
+       
+       /** 
+        * Clones <i>this</i> derivedUnitBase. This is a shortcut that enables to
+        * create a new instance that differs only slightly from <i>this</i> specimen
+        * by modifying only some of the attributes.<BR>
+        * This method overrides the clone method from {@link SpecimenOrObservationBase SpecimenOrObservationBase}.
+        * 
+        * @see SpecimenOrObservationBase#clone()
+        * @see eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity#clone()
+        * @see java.lang.Object#clone()
+        */
+       @Override
+       public Object clone() throws CloneNotSupportedException{
+               DerivedUnitBase result = (DerivedUnitBase)super.clone();
+               //collection
+               result.setCollection(this.collection);
+               //derivedFrom
+               result.setDerivedFrom(this.derivationEvent);
+               //storedUnder
+               result.setStoredUnder(this.storedUnder);
+               //no changes to: accessionNumber, catalogNumber, collectorsNumber
+               return result;
        }
-
 }