first implementation of alternative identifier #4275
authorAndreas Müller <a.mueller@bgbm.org>
Tue, 19 Aug 2014 14:54:44 +0000 (14:54 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Tue, 19 Aug 2014 14:54:44 +0000 (14:54 +0000)
.gitattributes
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IIdentifiableEntity.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableEntity.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Identifier.java [new file with mode: 0644]

index a891db533ed7869fae4f3285fb0c83f149be5c71..2942e80b8b00cd993bf9556be610ade32314c206 100644 (file)
@@ -744,6 +744,7 @@ cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ITreeNode.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IVersionableEntity.java -text svneol=unset#text/plain
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableEntity.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableSource.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Identifier.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/LSID.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/LSIDAuthority.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/LSIDWSDLLocator.java -text
index 121c2445a7343c45e4419c27b6a026d74977f064..3aae85856a7153ee8aa9f6f6f59873ea8cb96d53 100644 (file)
@@ -80,6 +80,13 @@ public interface IIdentifiableEntity extends ISourceable<IdentifiableSource>, IA
 \r
     public void removeExtension(Extension extension);\r
 \r
+    public Set<Identifier> getIdentifiers();\r
+\r
+    public void addIdentifier(Identifier identifier);\r
+\r
+    public void removeIdentifier(Identifier identifier);\r
+\r
+    \r
     /**\r
      * Overrides {@link eu.etaxonomy.cdm.model.common.CdmBase#toString()}.\r
      * This returns an String that identifies the object well without beeing necessarily unique.\r
index c628fb436eb14311cfcf1cd68e5da21f403401b7..63c99990aa2da176a297077c921f7703fdaebdd6 100644 (file)
@@ -105,7 +105,7 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
 
     @XmlElement(name = "TitleCache", required = true)
     @XmlJavaTypeAdapter(FormattedTextAdapter.class)
-    @Column(length=255, name="titleCache")
+    @Column(name="titleCache")
     @Match(value=MatchMode.CACHE, cacheReplaceMode=ReplaceMode.ALL)
     @NotEmpty(groups = Level2.class) // implictly NotNull
     @Size(max = 800)  //see #1592
@@ -146,6 +146,14 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
     @Merge(MergeMode.ADD_CLONE)
     @NotNull
     private Set<Extension> extensions = new HashSet<Extension>();
+    
+    @XmlElementWrapper(name = "Identifiers", nillable = true)
+    @XmlElement(name = "Identifier")
+    @OneToMany(fetch = FetchType.LAZY, orphanRemoval=true)
+    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE})
+    @Merge(MergeMode.ADD_CLONE)
+    @NotNull
+    private Set<Identifier> identifiers = new HashSet<Identifier>();
 
     @XmlElementWrapper(name = "Sources", nillable = true)
     @XmlElement(name = "IdentifiableSource")
@@ -305,6 +313,55 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
         getCredits().remove(index);
     }
 
+    @Override
+    public Set<Identifier> getIdentifiers(){
+        if(this.identifiers == null) {
+            this.identifiers = new HashSet<Identifier>();
+        }
+        return this.identifiers;
+    }
+    /**
+     * @param type
+     * @return a Set of extension value strings
+     */
+    public Set<String> getIdentifiers(DefinedTerm type){
+       return getIdentifiers(type.getUuid());
+    }
+    /**
+     * @param extensionTypeUuid
+     * @return a Set of extension value strings
+     */
+    public Set<String> getIdentifiers(UUID identifierTypeUuid){
+        Set<String> result = new HashSet<String>();
+        for (Identifier identifier : getIdentifiers()){
+            if (identifier.getType().getUuid().equals(identifierTypeUuid)){
+                result.add(identifier.getIdentifier());
+            }
+        }
+        return result;
+    }
+
+    public Identifier addIdentifier(String identifier, DefinedTerm identifierType){
+       Identifier result = Identifier.NewInstance(this, identifier, identifierType);
+       return result;
+    }
+
+    @Override
+    public void addIdentifier(Identifier identifier){
+        if (identifier != null){
+               identifier.setIdentifiedObj(this);
+            getIdentifiers().add(identifier);
+        }
+    }
+    @Override
+    public void removeIdentifier(Identifier identifier){
+        if (identifier != null){
+               logger.warn("TODO");
+//             identifier.setExtendedObj(null);
+            getIdentifiers().remove(identifier);
+        }
+    }
+    
     @Override
     public Set<Extension> getExtensions(){
         if(extensions == null) {
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Identifier.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Identifier.java
new file mode 100644 (file)
index 0000000..bb35ffe
--- /dev/null
@@ -0,0 +1,122 @@
+// $Id$\r
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.model.common;\r
+\r
+import javax.persistence.Column;\r
+import javax.persistence.Entity;\r
+import javax.persistence.FetchType;\r
+import javax.persistence.JoinColumn;\r
+import javax.persistence.ManyToOne;\r
+import javax.xml.bind.annotation.XmlAccessType;\r
+import javax.xml.bind.annotation.XmlAccessorType;\r
+import javax.xml.bind.annotation.XmlElement;\r
+import javax.xml.bind.annotation.XmlIDREF;\r
+import javax.xml.bind.annotation.XmlSchemaType;\r
+import javax.xml.bind.annotation.XmlType;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.hibernate.annotations.Any;\r
+import org.hibernate.annotations.Index;\r
+import org.hibernate.annotations.Table;\r
+import org.hibernate.envers.Audited;\r
+import org.hibernate.envers.NotAudited;\r
+import org.hibernate.search.annotations.Field;\r
+\r
+import eu.etaxonomy.cdm.validation.annotation.NullOrNotEmpty;\r
+\r
+/**\r
+ * @author a.mueller\r
+ * @date 2014-06-30\r
+ */\r
+\r
+@XmlAccessorType(XmlAccessType.FIELD)\r
+@XmlType(name = "Identifier", propOrder = {\r
+    "identifier",\r
+    "identifierType"\r
+})\r
+@Entity\r
+@Audited\r
+@Table(appliesTo="Identifier", indexes = { @Index(name = "identifierIndex", columnNames = { "identifier" }) })\r
+public class Identifier<T extends IdentifiableEntity> extends VersionableEntity {\r
+       private static final long serialVersionUID = -798893563577142030L;\r
+       private static final Logger logger = Logger.getLogger(IdentifiableSource.class);\r
+\r
+       @XmlElement(name ="Identifier" )\r
+       @Column(length=800, name="identifier")\r
+       @Field\r
+    @NullOrNotEmpty\r
+       private String identifier;\r
+       \r
+    @XmlElement(name = "Type")\r
+    @XmlIDREF\r
+    @XmlSchemaType(name = "IDREF")\r
+    @ManyToOne(fetch = FetchType.LAZY)\r
+//    @IndexedEmbedded(depth=1)\r
+       private DefinedTerm type;\r
+\r
+    @XmlElement(name = "IdentifiedObject")\r
+    @XmlIDREF\r
+    @XmlSchemaType(name = "IDREF")\r
+    @Any(metaDef = "CdmBase",\r
+                metaColumn=@Column(name = "identifiedObj_type"),\r
+                fetch = FetchType.LAZY,\r
+                optional = false)\r
+       @JoinColumn(name = "identifiedObj_id")\r
+       @NotAudited\r
+       private T identifiedObj;\r
+    \r
+// **************************** FACTORY ******************************/    \r
+    \r
+    public static Identifier NewInstance(IdentifiableEntity entity, String identifier, DefinedTerm type){\r
+       return new Identifier(entity, identifier, type);\r
+    }\r
+\r
+// ************************* CONSTRUCTOR ************************************    \r
+    \r
+    @Deprecated  //for hibernate use only\r
+    protected Identifier(){};\r
+    \r
+    public Identifier (IdentifiableEntity<?> entity, String identifier, DefinedTerm type){\r
+       this.identifier = identifier;\r
+       this.type = type;\r
+       logger.warn("Identified object not yet implemented");\r
+//     this.identifiedObj = entity;\r
+    }\r
+\r
+    \r
+// ****************** GETTER / SETTER **********************/    \r
+    \r
+       public String getIdentifier() {\r
+               return identifier;\r
+       }\r
+\r
+\r
+       public void setIdentifier(String identifier) {\r
+               this.identifier = identifier;\r
+       }\r
+\r
+\r
+       public DefinedTerm getType() {\r
+               return type;\r
+       }\r
+\r
+\r
+       public void setType(DefinedTerm identifierType) {\r
+               this.type = identifierType;\r
+       }\r
+       \r
+       public T getIdentifiedObj() {\r
+               return identifiedObj;\r
+       }\r
+       protected void setIdentifiedObj(T identifiedObj) {\r
+               this.identifiedObj = identifiedObj;\r
+       }\r
+       \r
+}\r