(no commit message)
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / TermVocabulary.java
index cd7e0c8fd3f45049f9fe3dd3a44053fbebaeefd3..3f2f488865302fdbc3c2479f69bdc79c8540c916 100644 (file)
@@ -15,25 +15,43 @@ import org.hibernate.annotations.Cascade;
 import org.hibernate.annotations.CascadeType;
 import org.hibernate.annotations.Type;
 import java.util.*;
+
 import javax.persistence.*;
 
 
 /**
  * A single enumeration must only contain DefinedTerm instances of one kind
- * (=class)
+ * (this means a subclass of DefinedTerm).
  * @author m.doering
  * @version 1.0
  * @created 08-Nov-2007 13:06:23
  */
 @Entity
+@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
 public class TermVocabulary<T extends DefinedTermBase> extends TermBase implements Iterable<T> {
        static Logger logger = Logger.getLogger(TermVocabulary.class);
        
-       //The order of the enumeration list is a linear order that can be used for statistical purposes. Measurement scale =
-       //ordinal
-       //private boolean isOrdinal;
+       private static final UUID uuidLanguage = UUID.fromString("17ba1c02-256d-47cf-bed0-2964ec1108ba");
+       private static final UUID uuidRank = UUID.fromString("b17451eb-4278-4179-af68-44f27aa3d151");
+       private static final UUID uuidContinent = UUID.fromString("ed4e5948-172a-424c-83d6-6fc7c7da70ed");
        
        
+       public static TermVocabulary findByUuid(UUID uuid){
+               //in tests tems may no be initialised by database access
+//             if (!isInitialized()){
+//                     initTermList(null);
+//             }
+//             return termVocabularyMap.get(uuid);
+               //TODO
+               logger.error("Not yet implemented");
+               return null;
+       }
+       public static final TermVocabulary getUUID(UUID uuid){
+               return (TermVocabulary)findByUuid(uuid);
+       }
+       public static final TermVocabulary LANGUAGE(){
+               return getUUID(uuidLanguage);
+       }
 
        //The vocabulary source (e.g. ontology) defining the terms to be loaded when a database is created for the first time.  
        // Software can go and grap these terms incl labels and description. 
@@ -41,8 +59,11 @@ public class TermVocabulary<T extends DefinedTermBase> extends TermBase implemen
        private String termSourceUri;
        protected Class termClass;
 
-       protected Set<T> terms = getNewTermSet();
+       //TODO Changed
+       public Set<T> terms = getNewTermSet();
+       
        //to be overriden by subclasses, e.g. OrderedTermVocabulary
+       @Transient
        protected Set<T> getNewTermSet(){
                return new HashSet<T>();
        }
@@ -50,28 +71,31 @@ public class TermVocabulary<T extends DefinedTermBase> extends TermBase implemen
        public TermVocabulary() {
                super();
        }
-       public TermVocabulary(String term, String label, String termSourceUri) {
-               super(term, label);
+       public TermVocabulary(String term, String label, String labelAbbrev, String termSourceUri) {
+               super(term, label, labelAbbrev);
                setTermSourceUri(termSourceUri);
        }
-
-//     public boolean isOrdinal(){
-//             return this.isOrdinal;
-//     }
-//     public void setOrdinal(boolean isOrdinal){
-//             this.isOrdinal = isOrdinal;
-//     }
-
        
-       @OneToMany(mappedBy="vocabulary")
-       @Type(type="DefinedTermBase")
-       @Cascade({CascadeType.SAVE_UPDATE})
+       @Transient
        public Set<T> getTerms() {
+               //Set<T> result = getNewTermSet();
+               //result.addAll(terms);
+               //return result;
                return terms;
        }
        protected void setTerms(Set<T> terms) {
                this.terms = terms;
        }
+       
+       @OneToMany(mappedBy="persistentVocabulary", fetch=FetchType.LAZY)
+       @Type(type="DefinedTermBase")
+       @Cascade({CascadeType.SAVE_UPDATE})
+       public Set<T> getPersistentTerms() {
+               return terms;
+       }
+       protected void setPersistentTerms(Set<T> terms) {
+               this.terms = terms;
+       }
        public void addTerm(T term) throws WrongTermTypeException {
                if (terms.size()<1){
                        // no term yet in the list. First term defines the vocabulary kind
@@ -127,5 +151,36 @@ public class TermVocabulary<T extends DefinedTermBase> extends TermBase implemen
        public int size(){
                return terms.size();
        }
+       
+       
+       /**
+        * Returns all terms of this vocabulary sorted by their representation defined by the given language.
+        * If such an representation does not exist, the representation of the default language is testing instead for ordering.
+        * @param language
+        * @return
+        */
+       @Transient
+       public SortedSet<T> getTermsOrderedByLabels(Language language){
+               TermLanguageComparator<T> comp = new TermLanguageComparator<T>();
+               comp.setCompareLanguage(language);
+               
+               SortedSet<T> result = new TreeSet<T>(comp);
+               result.addAll(getTerms());
+               return result;
+       }
+       
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.model.common.ILoadableTerm#readCsvLine(java.util.List)
+        */
+       public TermVocabulary readCsvLine(List<String> csvLine) {
+               return readCsvLine(csvLine, Language.ENGLISH());
+       }
+       public TermVocabulary readCsvLine(List<String> csvLine, Language lang) {
+               this.setUuid(UUID.fromString(csvLine.get(0)));
+               this.setUri(csvLine.get(1));
+               //this.addRepresentation(Representation.NewInstance(csvLine.get(3), csvLine.get(2).trim(), lang) );
+               return this;
+       }
     
 }
\ No newline at end of file