* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
-
package eu.etaxonomy.cdm.model.occurrence;
-import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
+import javax.persistence.Index;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.MapKeyJoinColumn;
import javax.persistence.OneToMany;
+import javax.persistence.Table;
import javax.persistence.Transient;
-import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import org.apache.log4j.Logger;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
-import org.hibernate.annotations.Index;
-import org.hibernate.annotations.Table;
import org.hibernate.annotations.Type;
import org.hibernate.envers.Audited;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.FieldBridge;
import org.hibernate.search.annotations.Fields;
import org.hibernate.search.annotations.IndexedEmbedded;
-import org.hibernate.search.annotations.NumericField;
import org.hibernate.search.annotations.SortableField;
import org.hibernate.search.annotations.Store;
+import org.hibernate.search.bridge.builtin.BooleanBridge;
+import eu.etaxonomy.cdm.common.URI;
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
import eu.etaxonomy.cdm.hibernate.search.StripHtmlBridge;
+import eu.etaxonomy.cdm.hibernate.search.UriBridge;
import eu.etaxonomy.cdm.jaxb.FormattedTextAdapter;
import eu.etaxonomy.cdm.jaxb.MultilanguageTextAdapter;
-import eu.etaxonomy.cdm.model.common.DefinedTerm;
+import eu.etaxonomy.cdm.model.common.IIntextReferenceTarget;
import eu.etaxonomy.cdm.model.common.IMultiLanguageTextHolder;
import eu.etaxonomy.cdm.model.common.IPublishable;
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
import eu.etaxonomy.cdm.model.common.Language;
import eu.etaxonomy.cdm.model.common.LanguageString;
import eu.etaxonomy.cdm.model.common.MultilanguageText;
-import eu.etaxonomy.cdm.model.common.TermType;
import eu.etaxonomy.cdm.model.description.DescriptionBase;
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
import eu.etaxonomy.cdm.model.description.IDescribable;
import eu.etaxonomy.cdm.model.description.SpecimenDescription;
import eu.etaxonomy.cdm.model.description.TaxonDescription;
import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
+import eu.etaxonomy.cdm.model.term.DefinedTerm;
+import eu.etaxonomy.cdm.model.term.TermType;
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
import eu.etaxonomy.cdm.strategy.match.Match;
import eu.etaxonomy.cdm.strategy.match.Match.ReplaceMode;
/**
* type figures are observations with at least a figure object in media
* @author m.doering
- * @created 08-Nov-2007 13:06:41
+ * @since 08-Nov-2007 13:06:41
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SpecimenOrObservationBase", propOrder = {
@Entity
@Audited
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
-@Table(appliesTo="SpecimenOrObservationBase", indexes = { @Index(name = "specimenOrObservationBaseTitleCacheIndex", columnNames = { "titleCache" }),
- @Index(name = "specimenOrObservationBaseIdentityCacheIndex", columnNames = { "identityCache" }) })
-public abstract class SpecimenOrObservationBase<S extends IIdentifiableEntityCacheStrategy> extends IdentifiableEntity<S>
- implements IMultiLanguageTextHolder, IDescribable<DescriptionBase>, IPublishable {
+@Table(name="SpecimenOrObservationBase", indexes = { @Index(name = "specimenOrObservationBaseTitleCacheIndex", columnList = "titleCache"),
+ @Index(name = "specimenOrObservationBaseIdentityCacheIndex", columnList = "identityCache") })
+public abstract class SpecimenOrObservationBase<S extends IIdentifiableEntityCacheStrategy<?>>
+ extends IdentifiableEntity<S>
+ implements IMultiLanguageTextHolder, IIntextReferenceTarget, IDescribable<DescriptionBase<S>>, IPublishable {
+
private static final long serialVersionUID = 6932680139334408031L;
private static final Logger logger = Logger.getLogger(SpecimenOrObservationBase.class);
@Column(name="recordBasis")
@NotNull
@Type(type = "eu.etaxonomy.cdm.hibernate.EnumUserType",
- parameters = {@org.hibernate.annotations.Parameter(name = "enumClass", value = "eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType")}
+ parameters = {@org.hibernate.annotations.Parameter(name = "enumClass", value = "eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType")}
)
@Audited
private SpecimenOrObservationType recordBasis;
@OneToMany(mappedBy="describedSpecimenOrObservation", fetch = FetchType.LAZY)
@Cascade({CascadeType.SAVE_UPDATE,CascadeType.MERGE})
@NotNull
- private Set<DescriptionBase> descriptions = new HashSet<DescriptionBase>();
+ private Set<DescriptionBase<S>> descriptions = new HashSet<>();
@XmlElementWrapper(name = "Determinations")
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE})
@IndexedEmbedded(depth = 2)
@NotNull
- private Set<DeterminationEvent> determinations = new HashSet<DeterminationEvent>();
+ private Set<DeterminationEvent> determinations = new HashSet<>();
@XmlElement(name = "Sex")
@XmlIDREF
@XmlElement(name = "IndividualCount")
@Field(analyze = Analyze.NO)
- @NumericField
- @Min(0)
- private Integer individualCount;
+ private String individualCount;
/**
- * The preferred stable identifer (URI) as discussed in
- * {@link http://dev.e-taxonomy.eu/trac/ticket/5606}
+ * The preferred stable identifier (URI) as discussed in
+ * {@link https://dev.e-taxonomy.eu/redmine/issues/5606}
*/
@XmlElement(name = "PreferredStableUri")
@Field(analyze = Analyze.NO)
+ @FieldBridge(impl = UriBridge.class)
@Type(type="uriUserType")
private URI preferredStableUri;
@ManyToMany(fetch=FetchType.LAZY)
@Cascade({CascadeType.SAVE_UPDATE,CascadeType.MERGE, CascadeType.DELETE})
@NotNull
- protected Set<DerivationEvent> derivationEvents = new HashSet<DerivationEvent>();
+ protected Set<DerivationEvent> derivationEvents = new HashSet<>();
@XmlAttribute(name = "publish")
+ @Field(analyze = Analyze.NO)
+ @FieldBridge(impl=BooleanBridge.class)
private boolean publish = true;
@XmlElement(name = "IdentityCache", required = false)
@XmlJavaTypeAdapter(FormattedTextAdapter.class)
@Match(value=MatchMode.CACHE, cacheReplaceMode=ReplaceMode.ALL)
-// @NotEmpty(groups = Level2.class) // implictly NotNull
+// @NotEmpty(groups = Level2.class) // implicitly NotNull
@Fields({
@Field(store=Store.YES),
// If the field is only needed for sorting and nothing else, you may configure it as
this.recordBasis = recordBasis;
}
-
- /**
- * Subclasses should implement setting the default cache strate
- */
- protected abstract void initDefaultCacheStrategy();
-
-
//************************* GETTER / SETTER ***********************/
-
/**@see #recordBasis */
public SpecimenOrObservationType getRecordBasis() {
return recordBasis;
return identityCache;
}
/**
- * @param identityCache the identityCache to set
+ * @Deprecated For special use only.
+ * Use {@link #setIdentityCache(String, boolean)} instead
*/
+ @Deprecated
public void setIdentityCache(String identityCache) {
this.identityCache = identityCache;
}
+ public void setIdentityCache(String identityCache, boolean isProtected) {
+ this.protectedIdentityCache = isProtected;
+ setIdentityCache(identityCache);
+ }
+
/**
* @return the protectedIdentityCache
*/
* @return
*/
@Override
- public Set<DescriptionBase> getDescriptions() {
+ public Set<DescriptionBase<S>> getDescriptions() {
if(descriptions == null) {
- this.descriptions = new HashSet<DescriptionBase>();
+ this.descriptions = new HashSet<>();
}
return this.descriptions;
}
*/
@Transient
public Set<SpecimenDescription> getSpecimenDescriptions(boolean includeImageGallery) {
- Set<SpecimenDescription> specimenDescriptions = new HashSet<SpecimenDescription>();
- for (DescriptionBase descriptionBase : getDescriptions()){
+ Set<SpecimenDescription> specimenDescriptions = new HashSet<>();
+ for (DescriptionBase<?> descriptionBase : getDescriptions()){
if (descriptionBase.isInstanceOf(SpecimenDescription.class)){
if (includeImageGallery || descriptionBase.isImageGallery() == false){
specimenDescriptions.add(descriptionBase.deproxy(descriptionBase, SpecimenDescription.class));
*/
@Transient
public Set<SpecimenDescription> getSpecimenDescriptionImageGallery() {
- Set<SpecimenDescription> specimenDescriptions = new HashSet<SpecimenDescription>();
- for (DescriptionBase descriptionBase : getDescriptions()){
+ Set<SpecimenDescription> specimenDescriptions = new HashSet<>();
+ for (DescriptionBase<?> descriptionBase : getDescriptions()){
if (descriptionBase.isInstanceOf(SpecimenDescription.class)){
if (descriptionBase.isImageGallery() == true){
specimenDescriptions.add(descriptionBase.deproxy(descriptionBase, SpecimenDescription.class));
public Set<DerivationEvent> getDerivationEvents() {
if(derivationEvents == null) {
- this.derivationEvents = new HashSet<DerivationEvent>();
+ this.derivationEvents = new HashSet<>();
}
return this.derivationEvents;
}
public Set<DeterminationEvent> getDeterminations() {
if(determinations == null) {
- this.determinations = new HashSet<DeterminationEvent>();
+ this.determinations = new HashSet<>();
}
return this.determinations;
}
this.kindOfUnit = kindOfUnit;
}
- public Integer getIndividualCount() {
+ public String getIndividualCount() {
return individualCount;
}
- public void setIndividualCount(Integer individualCount) {
+ public void setIndividualCount(String individualCount) {
this.individualCount = individualCount;
}
public boolean hasCharacterData() {
- Set<DescriptionBase> descriptions = this.getDescriptions();
+ Set<DescriptionBase<S>> descriptions = this.getDescriptions();
for (DescriptionBase<?> descriptionBase : descriptions) {
if (descriptionBase.isInstanceOf(SpecimenDescription.class)) {
SpecimenDescription specimenDescription = HibernateProxyHelper.deproxy(descriptionBase, SpecimenDescription.class);
*/
@Transient
public Collection<DescriptionElementBase> characterData() {
- Collection<DescriptionElementBase> states = new ArrayList<DescriptionElementBase>();
- Set<DescriptionBase> descriptions = this.getDescriptions();
+ Collection<DescriptionElementBase> states = new ArrayList<>();
+ Set<DescriptionBase<S>> descriptions = this.getDescriptions();
for (DescriptionBase<?> descriptionBase : descriptions) {
if (descriptionBase.isInstanceOf(SpecimenDescription.class)) {
SpecimenDescription specimenDescription = HibernateProxyHelper.deproxy(descriptionBase, SpecimenDescription.class);
return states;
}
-
+ public Collection<DerivedUnit> collectDerivedUnits(boolean addFullSubTree) {
+ Collection<DerivedUnit> derivedUnits = new ArrayList<>();
+ for (DerivationEvent derivationEvent : getDerivationEvents()) {
+ for (DerivedUnit derivative : derivationEvent.getDerivatives()) {
+ derivedUnits.add(derivative);
+ if(addFullSubTree) {
+ derivedUnits.addAll(derivative.collectDerivedUnits(false));
+ }
+ }
+ }
+ return derivedUnits;
+ }
//******************** CLONE **********************************************/
- /* (non-Javadoc)
- * @see eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity#clone()
- * @see eu.etaxonomy.cdm.model.common.IdentifiableEntity#clone()
- * @see java.lang.Object#clone()
- */
@Override
- public Object clone() throws CloneNotSupportedException {
- SpecimenOrObservationBase result = null;
- result = (SpecimenOrObservationBase)super.clone();
+ public SpecimenOrObservationBase<S> clone() throws CloneNotSupportedException {
+ SpecimenOrObservationBase<S> result = (SpecimenOrObservationBase<S>)super.clone();
//defininion (description, languageString)
result.definition = cloneLanguageString(this.definition);
//life stage
result.setLifeStage(this.lifeStage);
+ result.descriptions = new HashSet<>();
//Descriptions
- for(DescriptionBase description : this.descriptions) {
- result.addDescription(description);
+ for(DescriptionBase<S> description : this.descriptions) {
+ result.addDescription(description.clone());
}
- //DeterminationEvent FIXME should clone() the determination
- // as the relationship is OneToMany
+ result.determinations = new HashSet<>();
for(DeterminationEvent determination : this.determinations) {
- result.addDetermination(determination);
+ result.addDetermination(determination.clone());
}
+ result.derivationEvents = new HashSet<>();
//DerivationEvent
for(DerivationEvent derivationEvent : this.derivationEvents) {
+ //TODO should we clone this?
result.addDerivationEvent(derivationEvent);
}
//no changes to: individualCount
return result;
}
-
-
-}
\ No newline at end of file
+}