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.*;
})
@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")
*/
@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")
@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();
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);
}
+ /* (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);
}
- @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);
}
/* (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