LazyInitError in Representation.getLanguage and minor changes
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / DefinedTermBase.java
index 365b403092f5e3688c551173125b1b5fb319ccd7..88aefc78b0ad13766067265b8505601ca81edba0 100644 (file)
@@ -13,11 +13,13 @@ import org.apache.log4j.Logger;
 import org.hibernate.annotations.Cascade;
 import org.hibernate.annotations.CascadeType;
 import org.hibernate.collection.AbstractPersistentCollection;
+import org.hibernate.search.annotations.Indexed;
 
 import au.com.bytecode.opencsv.CSVWriter;
-import eu.etaxonomy.cdm.model.common.init.DefaultVocabularyStore;
-import eu.etaxonomy.cdm.model.common.init.IVocabularyStore;
+import eu.etaxonomy.cdm.model.common.init.ITermInitializer;
 import eu.etaxonomy.cdm.model.media.Media;
+import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
+
 import java.lang.reflect.Field;
 import java.util.*;
 
@@ -52,18 +54,13 @@ import javax.xml.bind.annotation.XmlType;
 })
 @XmlRootElement(name = "DefinedTermBase")
 @Entity
+//@Audited
 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
-public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBase implements ILoadableTerm<T> {
+@Indexed
+public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBase implements ILoadableTerm<T>, IDefinedTerm<T> {
        private static final long serialVersionUID = 2931811562248571531L;
-       @SuppressWarnings("unused")
        private static final Logger logger = Logger.getLogger(DefinedTermBase.class);
-       
-       static protected IVocabularyStore vocabularyStore = new DefaultVocabularyStore();
-
-       public static void setVocabularyStore(IVocabularyStore vocabularyStore){
-               DefinedTermBase.vocabularyStore = vocabularyStore;
-       }
-       
+               
        @XmlElement(name = "KindOf")
     @XmlIDREF
     @XmlSchemaType(name = "IDREF")
@@ -90,9 +87,7 @@ public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBas
         */
        @XmlElementWrapper(name = "Includes")
        @XmlElement(name = "Include")
-    @XmlIDREF
-    @XmlSchemaType(name = "IDREF")
-       private Set<T> includes = new HashSet<T>();
+    private Set<T> includes = new HashSet<T>();
        
        @XmlElementWrapper(name = "Media")
        @XmlElement(name = "Medium")
@@ -103,12 +98,9 @@ public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBas
        @XmlElement(name = "TermVocabulary")
        @XmlIDREF
        @XmlSchemaType(name = "IDREF")
-       protected TermVocabulary<T> vocabulary;
+       protected TermVocabulary<T> vocabulary; 
        
-
-       public static DefinedTermBase findByUuid(UUID uuid){
-               return vocabularyStore.getTermByUuid(uuid);
-       }
+// ************** Constructor ******************************************/
        
        public DefinedTermBase() {
                super();
@@ -117,62 +109,102 @@ public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBas
                super(term, label, labelAbbrev);
        }
 
+       protected abstract void setDefaultTerms(TermVocabulary<T> termVocabulary);
 
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.ILoadableTerm#readCsvLine(java.util.List)
         */
-       public ILoadableTerm readCsvLine(List<String> csvLine) {
-               return readCsvLine(csvLine, Language.ENGLISH());
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#readCsvLine(java.lang.Class, java.util.List, java.util.Map)
+        */
+       public T readCsvLine(Class<T> termClass, List<String> csvLine, Map<UUID,DefinedTermBase> terms) {
+               try {
+                       T newInstance = termClass.newInstance();
+                   return readCsvLine(newInstance, csvLine, Language.ENGLISH());
+               } catch (Exception e) {
+                       logger.error(e);
+                       for(StackTraceElement ste : e.getStackTrace()) {
+                               logger.error(ste);
+                       }
+               }
+               
+           return null;
        }
 
-       public ILoadableTerm readCsvLine(List<String> csvLine, Language lang) {
-               this.setUuid(UUID.fromString(csvLine.get(0)));
-               this.setUri(csvLine.get(1));
-               String label = csvLine.get(2).trim();
-               String text = csvLine.get(3);
-               String abbreviatedLabel = null;
-               this.addRepresentation(Representation.NewInstance(text, label, abbreviatedLabel, lang) );
-               return this;
+       protected static <TERM extends DefinedTermBase> TERM readCsvLine(TERM newInstance, List<String> csvLine, Language lang) {
+                       newInstance.setUuid(UUID.fromString(csvLine.get(0)));
+                       newInstance.setUri(csvLine.get(1));
+                       String label = csvLine.get(2).trim();
+                       String text = csvLine.get(3);
+                       String abbreviatedLabel = csvLine.get(4);
+                       newInstance.addRepresentation(Representation.NewInstance(text, label, abbreviatedLabel, lang) );
+                       return newInstance;
        }
 
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.ILoadableTerm#writeCsvLine(au.com.bytecode.opencsv.CSVWriter)
         */
-       public void writeCsvLine(CSVWriter writer) {
+       public void writeCsvLine(CSVWriter writer, T term) {
                String [] line = new String[4];
-               line[0] = getUuid().toString();
-               line[1] = getUri();
-               line[2] = getLabel();
-               line[3] = getDescription();
+               line[0] = term.getUuid().toString();
+               line[1] = term.getUri();
+               line[2] = term.getLabel();
+               line[3] = term.getDescription();
                writer.writeNext(line);
        }
        
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#getByUuid(java.util.UUID)
+        */
+       @Transient
+       public T getByUuid(UUID uuid){
+               return this.vocabulary.findTermByUuid(uuid);
+       }
        
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#getKindOf()
+        */
        @ManyToOne(fetch = FetchType.LAZY, targetEntity = DefinedTermBase.class)
        @Cascade({CascadeType.SAVE_UPDATE})
        public T getKindOf(){
                return this.kindOf;
        }
        
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#setKindOf(T)
+        */
        public void setKindOf(T kindOf){
                this.kindOf = kindOf;
        }
 
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#getGeneralizationOf()
+        */
        @OneToMany(fetch=FetchType.LAZY, mappedBy = "kindOf", targetEntity = DefinedTermBase.class)
        @Cascade({CascadeType.SAVE_UPDATE})
        public Set<T> getGeneralizationOf(){
                return this.generalizationOf;
        }
        
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#setGeneralizationOf(java.util.Set)
+        */
        public void setGeneralizationOf(Set<T> generalizationOf) {
                this.generalizationOf = generalizationOf;
        }
        
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#addGeneralizationOf(T)
+        */
        public void addGeneralizationOf(T generalization) {
                generalization.setKindOf(this);
                this.generalizationOf.add(generalization);
        }
        
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#removeGeneralization(T)
+        */
        public void removeGeneralization(T generalization) {
                if(generalizationOf.contains(generalization)){
                        generalization.setKindOf(null);
@@ -181,28 +213,46 @@ public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBas
        }
 
 
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#getPartOf()
+        */
        @ManyToOne(fetch = FetchType.LAZY, targetEntity = DefinedTermBase.class)
        @Cascade({CascadeType.SAVE_UPDATE})
        public T getPartOf(){
                return this.partOf;
        }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#setPartOf(T)
+        */
        public void setPartOf(T partOf){
                this.partOf = partOf;
        }
 
        
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#getIncludes()
+        */
        @OneToMany(fetch=FetchType.LAZY, mappedBy = "partOf", targetEntity = DefinedTermBase.class)
        @Cascade({CascadeType.SAVE_UPDATE})
        public Set<T> getIncludes(){
                return this.includes;
        }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#setIncludes(java.util.Set)
+        */
        public void setIncludes(Set<T> includes) {
                this.includes = includes;
        }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#addIncludes(T)
+        */
        public void addIncludes(T includes) {
                includes.setPartOf(this);
                this.includes.add(includes);
        }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#removeIncludes(T)
+        */
        public void removeIncludes(T includes) {
                if(this.includes.contains(includes)) {
                        includes.setPartOf(null);
@@ -211,17 +261,29 @@ public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBas
        }
 
 
-       @OneToMany
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#getMedia()
+        */
+       @ManyToMany(fetch = FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE})
        public Set<Media> getMedia(){
                return this.media;
        }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#setMedia(java.util.Set)
+        */
        public void setMedia(Set<Media> media) {
                this.media = media;
        }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#addMedia(eu.etaxonomy.cdm.model.media.Media)
+        */
        public void addMedia(Media media) {
                this.media.add(media);
        }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#removeMedia(eu.etaxonomy.cdm.model.media.Media)
+        */
        public void removeMedia(Media media) {
                this.media.remove(media);
        }
@@ -229,71 +291,22 @@ public abstract class DefinedTermBase<T extends DefinedTermBase> extends TermBas
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.IDefTerm#getVocabulary()
         */
-       @Transient
-       @XmlTransient
-       public TermVocabulary<T> getVocabulary() {
-               return this.vocabulary;
-       }
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.cdm.model.common.IDefTerm#setVocabulary(eu.etaxonomy.cdm.model.common.TermVocabulary)
-        */
-       public void setVocabulary(TermVocabulary<T> newVocabulary) {
-               // Hibernate bidirectional cascade hack: 
-               // http://opensource.atlassian.com/projects/hibernate/browse/HHH-1054
-               if(this.vocabulary == newVocabulary){ return;}
-               if (this.vocabulary != null) { 
-                       this.vocabulary.terms.remove(this);
-               }
-               if (newVocabulary!= null) { 
-                       newVocabulary.terms.add((T)this);
-               }
-               this.vocabulary = newVocabulary;                
-       }
-       
-       
        /* (non-Javadoc)
-        * @see eu.etaxonomy.cdm.model.common.IDefTerm#getVocabulary()
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#getVocabulary()
         */
+       @XmlTransient
        @ManyToOne(fetch=FetchType.LAZY)
        @Cascade( { CascadeType.SAVE_UPDATE })
-       protected TermVocabulary<T> getPersistentVocabulary() {
+       public TermVocabulary<T> getVocabulary() {
                return this.vocabulary;
        }
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.IDefTerm#setVocabulary(eu.etaxonomy.cdm.model.common.TermVocabulary)
         */
-       protected void setPersistentVocabulary(TermVocabulary newVocabulary) {
-               // Hibernate bidirectional cascade hack: 
-               // http://opensource.atlassian.com/projects/hibernate/browse/HHH-1054
-               if(this.vocabulary == newVocabulary){ return;}
-               if (this.vocabulary != null) { 
-                       this.vocabulary.terms.remove(this);
-               }
-               if (newVocabulary!= null) { 
-                       try {
-                               Field fieldInitializing = AbstractPersistentCollection.class.getDeclaredField("initializing");
-                               fieldInitializing.setAccessible(true);
-                               if (AbstractPersistentCollection.class.isAssignableFrom(newVocabulary.terms.getClass())){
-                                       boolean initValue = fieldInitializing.getBoolean(newVocabulary.terms);
-                                       if (initValue == false){
-                                               newVocabulary.terms.add(this);
-                                       }else{
-                                               //nothing
-                                       }
-                               }else{
-                                       newVocabulary.terms.add(this);
-                               }
-                       } catch (SecurityException e) {
-                               e.printStackTrace();
-                       } catch (IllegalArgumentException e) {
-                               e.printStackTrace();
-                       } catch (NoSuchFieldException e) {
-                               e.printStackTrace();
-                       } catch (IllegalAccessException e) {
-                               e.printStackTrace();
-                       }
-               }
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.IDefinedTerm#setVocabulary(eu.etaxonomy.cdm.model.common.TermVocabulary)
+        */
+       public void setVocabulary(TermVocabulary<T> newVocabulary) {
                this.vocabulary = newVocabulary;                
-       }
-       
+       }       
 }
\ No newline at end of file