From: Andreas Müller Date: Mon, 15 Jul 2013 19:27:36 +0000 (+0000) Subject: added isKindOf and getGeneralisationOf(recursive) to IEnumTerm #3611 X-Git-Tag: cdmlib-parent-3.3.0~396^2~181 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/commitdiff_plain/4e6343a46b353380cc44a73c12855371df6f1fff added isKindOf and getGeneralisationOf(recursive) to IEnumTerm #3611 --- diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/EnumeratedTermVoc.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/EnumeratedTermVoc.java index 5192cdbced..ea4e81e729 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/EnumeratedTermVoc.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/EnumeratedTermVoc.java @@ -20,9 +20,9 @@ import java.util.UUID; * @author a.mueller * */ -public class EnumeratedTermVoc> { +public class EnumeratedTermVoc> { - private static Map>,EnumeratedTermVoc> vocsMap= new HashMap>, EnumeratedTermVoc>(); + private static Map>,EnumeratedTermVoc> vocsMap= new HashMap>, EnumeratedTermVoc>(); private final Map> lookup = new HashMap>(); @@ -32,17 +32,17 @@ public class EnumeratedTermVoc> { private class SingleEnumTerm implements IEnumTerm{ private S term; - private String readableString; + private String label; private UUID uuid; private String key; - private Set children = new HashSet(); + private Set children = new HashSet(); private S parent; private SingleEnumTerm(S term, UUID uuid, String defaultString, String key, S parent){ this.term = term; - this.readableString = defaultString; + this.label = defaultString; this.key = key; this.uuid = uuid; this.parent = parent; @@ -59,8 +59,6 @@ public class EnumeratedTermVoc> { public T getTerm() {return term;} @Override public String getKey() {return key; } - @Override - public String getReadableString() {return readableString;} @Override public String getMessage() {return getMessage(Language.DEFAULT());} @@ -68,7 +66,7 @@ public class EnumeratedTermVoc> { @Override public String getMessage(Language language) { //TODO make multi-lingual - return getReadableString(); + return label; } @Override @@ -77,11 +75,32 @@ public class EnumeratedTermVoc> { return new HashSet(children); } + @Override + public boolean isKindOf(T ancestor) { + if (parent == null || ancestor == null){ + return false; + }else if (parent.equals(ancestor)){ + return true; + }else{ + return parent.isKindOf(ancestor); + } + } + + @Override + public Set getGeneralizationOf(boolean recursive) { + Set result = new HashSet(); + result.addAll(this.children); + if (recursive){ + for (T child : this.children){ + result.addAll(child.getGeneralizationOf()); + } + } + return result; + } + } //end of inner class //******************* DELEGATE NETHODS ************************ - - public String getReadableString(T term) {return lookup.get(term).getReadableString();} public String getKey(T term) {return lookup.get(term).getKey();} @@ -94,7 +113,7 @@ public class EnumeratedTermVoc> { //******************* DELEGATE CLASS NETHODS ************************ - public static > IEnumTerm addTerm(Class> clazz, S term, UUID uuid, String defaultString, String key, S parent){ + public static > IEnumTerm addTerm(Class> clazz, S term, UUID uuid, String defaultString, String key, S parent){ if (vocsMap.get(clazz) == null){ vocsMap.put(clazz, new EnumeratedTermVoc()); } @@ -132,12 +151,12 @@ public class EnumeratedTermVoc> { return false; } - public static > R byKey(Class clazz, String key) { + public static > R byKey(Class clazz, String key) { EnumeratedTermVoc voc = getVoc(clazz); return voc == null? null:voc.getByKey(key); } - public static > R byUuid(Class clazz, UUID uuid) { + public static > R byUuid(Class clazz, UUID uuid) { EnumeratedTermVoc voc = getVoc(clazz); return voc == null? null:voc.getByUuid(uuid); } @@ -161,7 +180,7 @@ public class EnumeratedTermVoc> { return null; } - public static > EnumeratedTermVoc getVoc(Class clazz) { + public static > EnumeratedTermVoc getVoc(Class clazz) { return (EnumeratedTermVoc)vocsMap.get(clazz); } diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IEnumTerm.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IEnumTerm.java index edff5122d1..9f83ad9259 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IEnumTerm.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IEnumTerm.java @@ -3,19 +3,53 @@ */ package eu.etaxonomy.cdm.model.common; +import java.util.Set; + /** * @author a.mueller * @created 15-Jul-2013 * */ -public interface IEnumTerm extends ISimpleTerm { +public interface IEnumTerm> extends ISimpleTerm { + /** + * @return + */ String getKey(); - String getReadableString(); - + /** + * Returns a human readable preferably for the default language. + * @return + */ String getMessage(); + /** + * Returns a human readable preferably for the given language. + * @param language + * @return + */ String getMessage(Language language); + + /** + * Computes if this term is kind of the ancestor term. + * So the ancestor term is direct or indirect (recursive) generalization + * of this term. + * @param ancestor the potential ancestor term + * @see #getKindOf() + * @see #getGeneralizationOf() + */ + public boolean isKindOf(T ancestor); + + /** + * Returns all defined terms this term is a generalization for. + * Therefore the returned terms are kind of this term. + * If parameter recursive is false only the + * direct descendants will be returned. If it is true + * the direct descendants and there recursive descendants (all descendants) + * will be returned. + */ + //TODO move up to ISimpleTerm + public Set getGeneralizationOf(boolean recursive); + } diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ISimpleTerm.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ISimpleTerm.java index c48b2ffea5..c8cf892674 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ISimpleTerm.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ISimpleTerm.java @@ -32,8 +32,8 @@ public interface ISimpleTerm { /** - * Returns all defined terms this term is a generalization for. - * Therefore the returned terms are kind of this term + * Returns all defined terms this term is a direct generalization for. + * Therefore the returned terms are kind of this term. */ public Set getGeneralizationOf(); diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSourceType.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSourceType.java index 66f1dc2ccc..2225f4c4eb 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSourceType.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSourceType.java @@ -143,9 +143,6 @@ public enum OriginalSourceType implements IEnumTerm, Seriali @Override public String getMessage(Language language){return delegateVocTerm.getMessage(language);} - - @Override - public String getReadableString() {return delegateVocTerm.getReadableString();} @Override public UUID getUuid() {return delegateVocTerm.getUuid();} @@ -155,7 +152,14 @@ public enum OriginalSourceType implements IEnumTerm, Seriali @Override public Set getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();} + + @Override + public boolean isKindOf(OriginalSourceType ancestor) {return delegateVocTerm.isKindOf(ancestor); } + @Override + public Set getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);} + + public static OriginalSourceType getByKey(String key){return delegateVoc.getByKey(key);} public static OriginalSourceType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);} diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/TermType.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/TermType.java index 6615049582..311287b9f2 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/TermType.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/TermType.java @@ -38,6 +38,7 @@ import eu.etaxonomy.cdm.model.name.HybridRelationship; import eu.etaxonomy.cdm.model.name.NameRelationship; import eu.etaxonomy.cdm.model.name.NameTypeDesignation; import eu.etaxonomy.cdm.model.name.NomenclaturalStatus; +import eu.etaxonomy.cdm.model.name.RankClass; import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation; import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.occurrence.DerivationEvent; @@ -407,9 +408,6 @@ public enum TermType implements IEnumTerm, Serializable{ @Override public String getMessage(Language language){return delegateVocTerm.getMessage(language);} - - @Override - public String getReadableString() {return delegateVocTerm.getReadableString();} @Override public UUID getUuid() {return delegateVocTerm.getUuid();} @@ -420,6 +418,12 @@ public enum TermType implements IEnumTerm, Serializable{ @Override public Set getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();} + @Override + public boolean isKindOf(TermType ancestor) {return delegateVocTerm.isKindOf(ancestor); } + + @Override + public Set getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);} + public static TermType getByKey(String key){return delegateVoc.getByKey(key);} public static TermType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);} diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/NomenclaturalCode.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/NomenclaturalCode.java index 5e96168bed..20a827abeb 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/NomenclaturalCode.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/NomenclaturalCode.java @@ -10,7 +10,6 @@ package eu.etaxonomy.cdm.model.name; import java.io.Serializable; -import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -23,9 +22,7 @@ import org.apache.log4j.Logger; import eu.etaxonomy.cdm.model.common.EnumeratedTermVoc; import eu.etaxonomy.cdm.model.common.IEnumTerm; -import eu.etaxonomy.cdm.model.common.ISimpleTerm; import eu.etaxonomy.cdm.model.common.Language; -import eu.etaxonomy.cdm.model.common.TermType; /** * The class for the five nomenclature codes (ICNB, ICBN, ICNCP, ICZN and ICVCN) @@ -87,7 +84,7 @@ public enum NomenclaturalCode implements IEnumTerm, Serializa private static final Logger logger = Logger.getLogger(NomenclaturalCode.class); public String getTitleCache() { - return getReadableString(); + return getMessage(); } private NomenclaturalCode(UUID uuid, String titleCache){ @@ -242,8 +239,6 @@ public enum NomenclaturalCode implements IEnumTerm, Serializa @Override public String getMessage(Language language){return delegateVocTerm.getMessage(language);} - @Override - public String getReadableString() {return delegateVocTerm.getReadableString();} @Override public UUID getUuid() {return delegateVocTerm.getUuid();} @@ -254,6 +249,13 @@ public enum NomenclaturalCode implements IEnumTerm, Serializa @Override public Set getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();} + @Override + public boolean isKindOf(NomenclaturalCode ancestor) {return delegateVocTerm.isKindOf(ancestor); } + + @Override + public Set getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);} + + public static NomenclaturalCode getByKey(String key){return delegateVoc.getByKey(key);} public static NomenclaturalCode getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);} diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/RankClass.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/RankClass.java index bbabbfba54..14e51f370a 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/RankClass.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/RankClass.java @@ -22,6 +22,7 @@ import org.apache.log4j.Logger; import eu.etaxonomy.cdm.model.common.EnumeratedTermVoc; import eu.etaxonomy.cdm.model.common.IEnumTerm; import eu.etaxonomy.cdm.model.common.Language; +import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType; /** * The rank class defines the category of ranks a certain rank belongs to. This information is @@ -98,9 +99,6 @@ public enum RankClass implements IEnumTerm, Serializable{ @Override public String getMessage(Language language){return delegateVocTerm.getMessage(language);} - - @Override - public String getReadableString() {return delegateVocTerm.getReadableString();} @Override public UUID getUuid() {return delegateVocTerm.getUuid();} @@ -111,6 +109,14 @@ public enum RankClass implements IEnumTerm, Serializable{ @Override public Set getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();} + @Override + public boolean isKindOf(RankClass ancestor) {return delegateVocTerm.isKindOf(ancestor); } + + @Override + public Set getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);} + + + public static RankClass getByKey(String key){return delegateVoc.getByKey(key);} public static RankClass getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);} diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/SpecimenOrObservationType.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/SpecimenOrObservationType.java index cc0684cad9..5a00e1579e 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/SpecimenOrObservationType.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/SpecimenOrObservationType.java @@ -22,6 +22,7 @@ import org.apache.log4j.Logger; import eu.etaxonomy.cdm.model.common.EnumeratedTermVoc; import eu.etaxonomy.cdm.model.common.IEnumTerm; import eu.etaxonomy.cdm.model.common.Language; +import eu.etaxonomy.cdm.model.reference.ReferenceType; /** @@ -293,8 +294,6 @@ public enum SpecimenOrObservationType implements IEnumTerm getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();} + @Override + public boolean isKindOf(SpecimenOrObservationType ancestor) {return delegateVocTerm.isKindOf(ancestor); } + + @Override + public Set getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);} + public static SpecimenOrObservationType getByKey(String key){return delegateVoc.getByKey(key);} public static SpecimenOrObservationType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);} diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceType.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceType.java index 6c07784169..b75d9eca1f 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceType.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceType.java @@ -179,9 +179,6 @@ public enum ReferenceType implements IEnumTerm, Serializable{ @Override public String getMessage(Language language){return delegateVocTerm.getMessage(language);} - - @Override - public String getReadableString() {return delegateVocTerm.getReadableString();} @Override public UUID getUuid() {return delegateVocTerm.getUuid();} @@ -192,6 +189,12 @@ public enum ReferenceType implements IEnumTerm, Serializable{ @Override public Set getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();} + @Override + public boolean isKindOf(ReferenceType ancestor) {return delegateVocTerm.isKindOf(ancestor); } + + @Override + public Set getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);} + public static ReferenceType getByKey(String key){return delegateVoc.getByKey(key);} public static ReferenceType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);} diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/common/TermTypeTest.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/common/TermTypeTest.java index 7626572967..ab59b49294 100644 --- a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/common/TermTypeTest.java +++ b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/common/TermTypeTest.java @@ -34,9 +34,19 @@ public class TermTypeTest { assertTrue(TermType.Modifier.getGeneralizationOf().contains(TermType.DeterminationModifier)); assertTrue(TermType.Modifier.getGeneralizationOf().contains(TermType.Scope)); assertTrue(TermType.Scope.getGeneralizationOf().contains(TermType.Sex)); - assertTrue(TermType.Scope.getGeneralizationOf().contains(TermType.Stage)); + assertTrue(TermType.Scope.getGeneralizationOf().contains(TermType.Stage)); + assertFalse("generalisationOf may contain only contain only direct children, but stage is a grandchild", TermType.Modifier.getGeneralizationOf().contains(TermType.Stage)); } + @Test + public void testGeneralisationOfRecursive(){ + boolean recursive = true; + assertTrue(TermType.Modifier.getGeneralizationOf(recursive).contains(TermType.Scope)); + assertTrue(TermType.Modifier.getGeneralizationOf(! recursive).contains(TermType.Scope)); + assertTrue(TermType.Scope.getGeneralizationOf(recursive).contains(TermType.Sex)); + assertTrue(TermType.Modifier.getGeneralizationOf(recursive).contains(TermType.Stage)); + assertFalse(TermType.Modifier.getGeneralizationOf(!recursive).contains(TermType.Stage)); + } }