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
*/
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);
}
}
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;
}
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;
}
-
}