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.
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>();
}
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
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