TermBase and descendants indexed using hibernate search
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / Annotation.java
index ab029ebe5879c5fe5cdddcce3716baeef0ae3c96..f89c0d7a8f4d990d716afdab20742c37bedfd6a4 100644 (file)
@@ -9,14 +9,14 @@
 
 package eu.etaxonomy.cdm.model.common;
 
-import eu.etaxonomy.cdm.model.agent.Person;
-import org.apache.log4j.Logger;
-import org.hibernate.annotations.Cascade;
-import org.hibernate.annotations.CascadeType;
-
 import java.net.MalformedURLException;
 import java.net.URL;
-import javax.persistence.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
@@ -24,6 +24,15 @@ import javax.xml.bind.annotation.XmlIDREF;
 import javax.xml.bind.annotation.XmlSchemaType;
 import javax.xml.bind.annotation.XmlType;
 
+import org.apache.log4j.Logger;
+import org.hibernate.annotations.Any;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.NotAudited;
+
+import eu.etaxonomy.cdm.model.agent.Person;
+
 /**
  * @author m.doering
  * @version 1.0
@@ -37,6 +46,7 @@ import javax.xml.bind.annotation.XmlType;
     "linkbackUrl"
 })
 @Entity
+@Audited
 public class Annotation extends LanguageStringBase implements Cloneable {
        private static final long serialVersionUID = -4484677078599520233L;
        private static final Logger logger = Logger.getLogger(Annotation.class);
@@ -52,6 +62,12 @@ public class Annotation extends LanguageStringBase implements Cloneable {
                return new Annotation(text, lang);
        }
        
+       public static Annotation NewInstance(String text, AnnotationType annotationType, Language lang){
+               Annotation annotation = new Annotation(text, lang);
+               annotation.setAnnotationType(annotationType);
+               return annotation;
+       }
+       
        /**
         * Factory method. Using default language.
         * @param text
@@ -61,7 +77,7 @@ public class Annotation extends LanguageStringBase implements Cloneable {
                return new Annotation(text, Language.DEFAULT());
        }
        
-       private Annotation(){
+       protected Annotation(){
                super();
        }
        
@@ -79,17 +95,26 @@ public class Annotation extends LanguageStringBase implements Cloneable {
        @XmlElement(name = "Commentator")
     @XmlIDREF
     @XmlSchemaType(name = "IDREF")
+    @ManyToOne(fetch = FetchType.LAZY)
+    @Cascade(CascadeType.SAVE_UPDATE)
        private Person commentator;
        
        @XmlElement(name = "AnnotatedObject")
     @XmlIDREF
     @XmlSchemaType(name = "IDREF")
+    @Any(metaDef = "CdmBase",
+                metaColumn=@Column(name = "annotatedObj_type"),
+                fetch = FetchType.EAGER,
+                optional = false)
+       @JoinColumn(name = "annotatedObj_id")
+       @NotAudited
        private AnnotatableEntity annotatedObj;
        
     @XmlElement(name = "AnnotationType")
     @XmlIDREF
     @XmlSchemaType(name = "IDREF")
-       private MarkerType annotationType;
+    @ManyToOne(fetch = FetchType.LAZY)
+       private AnnotationType annotationType;
        
        // for external annotations/comments the URL of these can be set.
        // should be useful to implement trackback, pingback or linkback:
@@ -97,16 +122,26 @@ public class Annotation extends LanguageStringBase implements Cloneable {
        @XmlElement(name = "LinkbackURL")
        private URL linkbackUrl;
        
-       @Transient
+       /**
+        * Currently envers does not support @Any
+        * @return
+        */
        public AnnotatableEntity getAnnotatedObj() {
                return annotatedObj;
        }
-       protected void setAnnotatedObj(AnnotatableEntity newAnnotatedObj) {
-               this.annotatedObj = newAnnotatedObj;            
+       //TODO make not public, but TaxonTaoHibernateImpl.delete has to be changed then
+       public void setAnnotatedObj(AnnotatableEntity newAnnotatedObj) {
+               this.annotatedObj = newAnnotatedObj;
+       }
+
+       public AnnotationType getAnnotationType() {
+               return annotationType;
+       }
+
+       public void setAnnotationType(AnnotationType annotationType) {
+               this.annotationType = annotationType;
        }
 
-       @ManyToOne
-       @Cascade({CascadeType.SAVE_UPDATE})
        public Person getCommentator(){
                return this.commentator;
        }
@@ -114,7 +149,7 @@ public class Annotation extends LanguageStringBase implements Cloneable {
                this.commentator = commentator;
        }
        
-       @Transient
+       
        public URL getLinkbackUrl() {
                return linkbackUrl;
        }