Bug fix for DnaSample record basis
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / molecular / DnaSample.java
index 1426ec91701e281f0f6446ff8752dd6800edf68d..2ef4788c93caa60052d9bbe73bac8db88b751a3c 100644 (file)
 package eu.etaxonomy.cdm.model.molecular;
 
 
-import eu.etaxonomy.cdm.model.occurrence.Collection;
-import eu.etaxonomy.cdm.model.occurrence.Specimen;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
-import org.apache.log4j.Logger;
+import java.util.HashSet;
+import java.util.Set;
 
-import java.util.*;
-
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+import javax.persistence.Transient;
+import javax.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
+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.apache.log4j.Logger;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+import org.hibernate.envers.Audited;
+import org.hibernate.search.annotations.ContainedIn;
+import org.hibernate.search.annotations.Indexed;
+
+import eu.etaxonomy.cdm.model.occurrence.Collection;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.cdm.strategy.cache.common.IdentifiableEntityDefaultCacheStrategy;
+
 /**
+ * A DNA Sample is the extracted DNA of a given tissue sample. It may be stored in
+ * a DNA Bank and should then be handled as a collection unit.
+ * DNA Sample are used to determine their {@link Sequence DNA sequences}
+ * starting with a process called {@link Amplification amplification}.
+ *  
  * @author m.doering
- * @version 1.0
- * @created 08-Nov-2007 13:06:22
+ * @created 08-Nov-2007
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "DnaSample", propOrder = {
-    "bankNumber",
-    "sequences"
+    "sequences",
+    "amplifications"
 })
 @XmlRootElement(name = "DnaSample")
 @Entity
-public class DnaSample extends Specimen {
+@Indexed(index = "eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase")
+@Audited
+public class DnaSample extends DerivedUnit implements Cloneable {
+       private static final long serialVersionUID = -2978411330023671805L;
+       @SuppressWarnings("unused")
+       private static final Logger logger = Logger.getLogger(DnaSample.class);
        
-       static Logger logger = Logger.getLogger(DnaSample.class);
+// ****************** FACTORY METHOD *****************/
        
-       @XmlElement(name = "BankNumber")
-       private String bankNumber;
+       /**
+        * Factory method
+        * @return
+        */
+       public static DnaSample NewInstance(){
+               return new DnaSample();
+       }
+
+// ************** ATTRIBUTES ****************************/     
+       
+//     @XmlElement(name = "BankNumber")
+//     private String bankNumber;
        
        @XmlElementWrapper(name = "Sequences")
        @XmlElement(name = "sequence")
-       private Set<Sequence> sequences = new HashSet();
+    @XmlIDREF
+    @XmlSchemaType(name = "IDREF")
+    @OneToMany(fetch = FetchType.LAZY)
+       @Cascade(CascadeType.SAVE_UPDATE)
+    private Set<Sequence> sequences = new HashSet<Sequence>();
+
+       
+       @XmlElementWrapper(name = "Amplifications")
+       @XmlElement(name = "Amplification")
+       @OneToMany(mappedBy="dnaSample", fetch = FetchType.LAZY)
+       @Cascade( { CascadeType.SAVE_UPDATE, CascadeType.DELETE})
+    @ContainedIn
+    @NotNull
+       private Set<Amplification> amplifications = new HashSet<Amplification>();
+
 
-       @OneToMany
+// ******************* CONSTRUCTOR *************************/
+       
+       /**
+        * Constructor
+        */
+       private DnaSample() {
+               super(SpecimenOrObservationType.DnaSample);
+               this.cacheStrategy = new IdentifiableEntityDefaultCacheStrategy<DerivedUnit>();
+       }
+       
+//************ GETTER / SETTER  **********************************/    
+
+       //sequencings
        public Set<Sequence> getSequences() {
                return sequences;
        }
-       protected void setSequences(Set<Sequence> sequences) {
-               this.sequences = sequences;
-       }
-       public void addSequences(Sequence sequence) {
+
+       public void addSequence(Sequence sequence) {
                this.sequences.add(sequence);
        }
-       public void removeSequences(Sequence sequence) {
+
+       public void removeSequence(Sequence sequence) {
                this.sequences.remove(sequence);
        }
+       
+       //amplifications
+       public Set<Amplification> getAmplifications() {
+               return amplifications;
+       }
+
+       public void addAmplification(Amplification amplification) {
+               this.amplifications.add(amplification);
+               amplification.setDnaSample(this);
+       }
 
+       public void removeAmplification(Amplification amplification) {
+               this.amplifications.remove(amplification);
+       }
 
+// ************* Convenience Getter / Setter ************/
+       
        @Transient
        public Collection getStoredAt(){
                return this.getCollection();
        }
+       
        public void setStoredAt(Collection storedAt){
                this.setCollection(storedAt);
        }
@@ -80,8 +155,35 @@ public class DnaSample extends Specimen {
        public String getBankNumber(){
                return this.getCatalogNumber();
        }
+       
        public void setBankNumber(String bankNumber){
                this.setCatalogNumber(bankNumber);
        }
+       
 
+//*********** CLONE **********************************/        
+       
+       /** 
+        * Clones <i>this</i> dna sample. This is a shortcut that enables to
+        * create a new instance that differs only slightly from <i>this</i> dna sample
+        * by modifying only some of the attributes.<BR>
+        * This method overrides the clone method from {@link Specimen Specimen}.
+        * @throws CloneNotSupportedException 
+        * 
+        * @see Specimen#clone()
+        * @see DerivedUnit#clone()
+        * @see eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity#clone()
+        * @see java.lang.Object#clone()
+        */
+       @Override
+       public DnaSample clone() {
+               DnaSample result = (DnaSample)super.clone();
+               //sequenceSet
+               result.sequences = new HashSet<Sequence>();
+               for(Sequence sequence : this.sequences) {
+                       result.addSequence(sequence);
+               }
+               //no changes to: bankNumber
+               return result;
+       }
 }
\ No newline at end of file