* 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.NotNull;
import javax.xml.bind.annotation.XmlAccessType;
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.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.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;
@Entity
@Audited
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
-@Table(appliesTo="SpecimenOrObservationBase", indexes = { @Index(name = "specimenOrObservationBaseTitleCacheIndex", columnNames = { "titleCache" }),
- @Index(name = "specimenOrObservationBaseIdentityCacheIndex", columnNames = { "identityCache" }) })
+@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);
/**
* The preferred stable identifier (URI) as discussed in
- * {@link http://dev.e-taxonomy.eu/trac/ticket/5606}
+ * {@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;
@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
*/
*/
@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;
}
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 {
+ public SpecimenOrObservationBase<S> clone() throws CloneNotSupportedException {
SpecimenOrObservationBase<S> result = (SpecimenOrObservationBase<S>)super.clone();
//defininion (description, languageString)
//life stage
result.setLifeStage(this.lifeStage);
+ result.descriptions = new HashSet<>();
//Descriptions
for(DescriptionBase<S> description : this.descriptions) {
- result.addDescription(description);
+ 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);
}