added isKindOf and getGeneralisationOf(recursive) to IEnumTerm #3611
authorAndreas Müller <a.mueller@bgbm.org>
Mon, 15 Jul 2013 19:27:36 +0000 (19:27 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Mon, 15 Jul 2013 19:27:36 +0000 (19:27 +0000)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/EnumeratedTermVoc.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IEnumTerm.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ISimpleTerm.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSourceType.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/TermType.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/NomenclaturalCode.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/RankClass.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/SpecimenOrObservationType.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceType.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/common/TermTypeTest.java

index 5192cdbced65af76861f82c625e9c772ad79c556..ea4e81e72908e8c2e4ffea2898d35c3fef9fbb78 100644 (file)
@@ -20,9 +20,9 @@ import java.util.UUID;
  * @author a.mueller\r
  *\r
  */\r
-public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {\r
+public class EnumeratedTermVoc<T extends IEnumTerm<T>> {\r
 \r
-       private static Map<Class<? extends ISimpleTerm<?>>,EnumeratedTermVoc<ISimpleTerm>> vocsMap= new HashMap<Class<? extends ISimpleTerm<?>>, EnumeratedTermVoc<ISimpleTerm>>();\r
+       private static Map<Class<? extends IEnumTerm<?>>,EnumeratedTermVoc<?>> vocsMap= new HashMap<Class<? extends IEnumTerm<?>>, EnumeratedTermVoc<?>>();\r
        \r
        private final Map<T,SingleEnumTerm<T>> lookup = new HashMap<T, SingleEnumTerm<T>>();\r
        \r
@@ -32,17 +32,17 @@ public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {
        \r
        private class SingleEnumTerm<S extends T> implements IEnumTerm<T>{\r
                private S term;\r
-               private String readableString;\r
+               private String label;\r
                private UUID uuid;\r
                private String key;\r
-               private Set<T> children = new HashSet<T>();\r
+               private Set<S> children = new HashSet<S>();\r
                private S parent;\r
 \r
 \r
                \r
                private SingleEnumTerm(S term, UUID uuid, String defaultString, String key, S parent){\r
                        this.term = term;\r
-                       this.readableString = defaultString;\r
+                       this.label = defaultString;\r
                        this.key = key;\r
                        this.uuid = uuid;\r
                        this.parent = parent;\r
@@ -59,8 +59,6 @@ public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {
                public T getTerm() {return term;}\r
                @Override\r
                public String getKey() {return key;     }\r
-               @Override\r
-               public String getReadableString() {return readableString;}\r
 \r
                @Override\r
                public String getMessage() {return getMessage(Language.DEFAULT());}\r
@@ -68,7 +66,7 @@ public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {
                @Override\r
                public String getMessage(Language language) {\r
                        //TODO make multi-lingual\r
-                       return getReadableString();\r
+                       return label;\r
                }\r
                \r
                @Override\r
@@ -77,11 +75,32 @@ public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {
                        return new HashSet<T>(children);\r
                }\r
 \r
+               @Override\r
+               public boolean isKindOf(T ancestor) {\r
+                       if (parent == null || ancestor == null){\r
+                               return false;\r
+                       }else if (parent.equals(ancestor)){\r
+                               return true;\r
+                       }else{\r
+                               return parent.isKindOf(ancestor);\r
+                       }\r
+               }\r
+\r
+               @Override\r
+               public Set<T> getGeneralizationOf(boolean recursive) {\r
+                       Set<T> result = new HashSet<T>();\r
+                       result.addAll(this.children);\r
+                       if (recursive){\r
+                               for (T child : this.children){\r
+                                       result.addAll(child.getGeneralizationOf());\r
+                               }\r
+                       }\r
+                       return result;\r
+               }\r
+\r
        } //end of inner class\r
 \r
 //******************* DELEGATE NETHODS ************************\r
-       \r
-       public String getReadableString(T term) {return lookup.get(term).getReadableString();}\r
 \r
        public String getKey(T term) {return lookup.get(term).getKey();}\r
 \r
@@ -94,7 +113,7 @@ public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {
 //******************* DELEGATE CLASS NETHODS ************************\r
 \r
        \r
-       public static <S extends ISimpleTerm<?>> IEnumTerm addTerm(Class<? extends ISimpleTerm<?>> clazz, S term, UUID uuid, String defaultString, String key, S parent){\r
+       public static <S extends IEnumTerm<?>> IEnumTerm addTerm(Class<? extends IEnumTerm<?>> clazz, S term, UUID uuid, String defaultString, String key, S parent){\r
                if (vocsMap.get(clazz) == null){\r
                        vocsMap.put(clazz, new EnumeratedTermVoc());\r
                }\r
@@ -132,12 +151,12 @@ public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {
                return false;\r
        }\r
 \r
-       public static <R extends ISimpleTerm<?>> R byKey(Class<R> clazz, String key) {\r
+       public static <R extends IEnumTerm<R>> R byKey(Class<R> clazz, String key) {\r
                EnumeratedTermVoc<R> voc = getVoc(clazz);\r
                return voc == null? null:voc.getByKey(key);\r
        }\r
 \r
-       public static <R extends ISimpleTerm<?>> R byUuid(Class<R> clazz, UUID uuid) {\r
+       public static <R extends IEnumTerm<R>> R byUuid(Class<R> clazz, UUID uuid) {\r
                EnumeratedTermVoc<R> voc = getVoc(clazz);\r
                return voc == null? null:voc.getByUuid(uuid);\r
        }\r
@@ -161,7 +180,7 @@ public class EnumeratedTermVoc<T extends ISimpleTerm<?>> {
                return null;\r
        }\r
 \r
-       public static <R extends ISimpleTerm<?>> EnumeratedTermVoc<R> getVoc(Class<R> clazz) {\r
+       public static <R extends IEnumTerm<R>> EnumeratedTermVoc<R> getVoc(Class<R> clazz) {\r
                return (EnumeratedTermVoc<R>)vocsMap.get(clazz);\r
        }\r
 \r
index edff5122d155ec4eb49865ce8fac5c13b56f84c8..9f83ad925917ae03a3da17a1adc204edbdcc07d4 100644 (file)
@@ -3,19 +3,53 @@
  */\r
 package eu.etaxonomy.cdm.model.common;\r
 \r
+import java.util.Set;\r
+\r
 /**\r
  * @author a.mueller\r
  * @created 15-Jul-2013\r
  *\r
  */\r
-public interface IEnumTerm<T extends ISimpleTerm> extends ISimpleTerm<T> {\r
+public interface IEnumTerm<T extends IEnumTerm<T>> extends ISimpleTerm<T> {\r
 \r
+       /**\r
+        * @return\r
+        */\r
        String getKey();\r
 \r
-       String getReadableString();\r
-\r
+       /**\r
+        * Returns a human readable preferably for the default language.\r
+        * @return\r
+        */\r
        String getMessage();    \r
 \r
+       /**\r
+        * Returns a human readable preferably for the given language.\r
+        * @param language\r
+        * @return\r
+        */\r
        String getMessage(Language language);\r
+       \r
 \r
+       /**\r
+        * Computes if <code>this</code> term is kind of the <code>ancestor</code> term.\r
+        * So the <code>ancestor</code> term is direct or indirect (recursive) generalization\r
+        * of <code>this</code> term.\r
+        * @param ancestor the potential ancestor term\r
+        * @see #getKindOf()\r
+        * @see #getGeneralizationOf()\r
+        */\r
+       public boolean isKindOf(T ancestor);\r
+       \r
+       /**\r
+        * Returns all defined terms this term is a generalization for.\r
+        * Therefore the returned terms are kind of <code>this</code> term.\r
+        * If parameter <code>recursive</code> is <code>false</code> only the\r
+        * direct descendants will be returned. If it is <code>true</code>\r
+        * the direct descendants and there recursive descendants (all descendants)\r
+        * will be returned. \r
+        */\r
+       //TODO move up to ISimpleTerm\r
+       public Set<T> getGeneralizationOf(boolean recursive);\r
+       \r
 }\r
index c48b2ffea52b202bfaceb2200e1e4f8c283ad41a..c8cf892674bbc8770ae748e9a20fe3e7f331761c 100644 (file)
@@ -32,8 +32,8 @@ public interface ISimpleTerm<T extends ISimpleTerm> {
        \r
 \r
        /**\r
-        * Returns all defined terms this term is a generalization for.\r
-        * Therefore the returned terms are kind of <code>this</code> term\r
+        * Returns all defined terms this term is a direct generalization for.\r
+        * Therefore the returned terms are kind of <code>this</code> term.\r
         */\r
        public Set<T> getGeneralizationOf();\r
 \r
index 66f1dc2ccc392d8010c952724fd5c86d4594b146..2225f4c4eb9d5d4dc5a18b77ec794d67b1a13700 100644 (file)
@@ -143,9 +143,6 @@ public enum OriginalSourceType implements IEnumTerm<OriginalSourceType>, Seriali
 \r
        @Override\r
     public String getMessage(Language language){return delegateVocTerm.getMessage(language);}\r
-\r
-       @Override\r
-       public String getReadableString() {return delegateVocTerm.getReadableString();}\r
                \r
        @Override\r
     public UUID getUuid() {return delegateVocTerm.getUuid();}\r
@@ -155,7 +152,14 @@ public enum OriginalSourceType implements IEnumTerm<OriginalSourceType>, Seriali
        \r
        @Override\r
     public Set<OriginalSourceType> getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();}\r
+       \r
+       @Override\r
+       public boolean isKindOf(OriginalSourceType ancestor) {return delegateVocTerm.isKindOf(ancestor);        }\r
 \r
+       @Override\r
+    public Set<OriginalSourceType> getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);}\r
+\r
+       \r
        public static OriginalSourceType getByKey(String key){return delegateVoc.getByKey(key);}\r
     public static OriginalSourceType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);}\r
 \r
index 66150495827dd08d28e574ce042ebc7614d50690..311287b9f2f0aa7283b8ecfed431d60222e28597 100644 (file)
@@ -38,6 +38,7 @@ import eu.etaxonomy.cdm.model.name.HybridRelationship;
 import eu.etaxonomy.cdm.model.name.NameRelationship;\r
 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;\r
+import eu.etaxonomy.cdm.model.name.RankClass;\r
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;\r
@@ -407,9 +408,6 @@ public enum TermType implements IEnumTerm<TermType>, Serializable{
 \r
        @Override\r
     public String getMessage(Language language){return delegateVocTerm.getMessage(language);}\r
-\r
-       @Override\r
-       public String getReadableString() {return delegateVocTerm.getReadableString();}\r
                \r
        @Override\r
     public UUID getUuid() {return delegateVocTerm.getUuid();}\r
@@ -420,6 +418,12 @@ public enum TermType implements IEnumTerm<TermType>, Serializable{
        @Override\r
     public Set<TermType> getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();}\r
 \r
+       @Override\r
+       public boolean isKindOf(TermType ancestor) {return delegateVocTerm.isKindOf(ancestor);  }\r
+\r
+       @Override\r
+    public Set<TermType> getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);}\r
+\r
        public static TermType getByKey(String key){return delegateVoc.getByKey(key);}\r
     public static TermType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);}\r
 \r
index 5e96168bed61dbfe38a739d7f3168ccc651534c9..20a827abebf5d86f8e3c299205f6db609f2215ac 100644 (file)
@@ -10,7 +10,6 @@
 package eu.etaxonomy.cdm.model.name;\r
 \r
 import java.io.Serializable;\r
-import java.util.HashSet;\r
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
@@ -23,9 +22,7 @@ import org.apache.log4j.Logger;
 \r
 import eu.etaxonomy.cdm.model.common.EnumeratedTermVoc;\r
 import eu.etaxonomy.cdm.model.common.IEnumTerm;\r
-import eu.etaxonomy.cdm.model.common.ISimpleTerm;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
-import eu.etaxonomy.cdm.model.common.TermType;\r
 \r
 /**\r
  * The class for the five nomenclature codes (ICNB, ICBN, ICNCP, ICZN and ICVCN)\r
@@ -87,7 +84,7 @@ public enum NomenclaturalCode implements IEnumTerm<NomenclaturalCode>, Serializa
        private static final Logger logger = Logger.getLogger(NomenclaturalCode.class);\r
        \r
        public String getTitleCache() {\r
-               return getReadableString();\r
+               return getMessage();\r
        }\r
        \r
        private NomenclaturalCode(UUID uuid, String titleCache){\r
@@ -242,8 +239,6 @@ public enum NomenclaturalCode implements IEnumTerm<NomenclaturalCode>, Serializa
        @Override\r
     public String getMessage(Language language){return delegateVocTerm.getMessage(language);}\r
 \r
-       @Override\r
-       public String getReadableString() {return delegateVocTerm.getReadableString();}\r
                \r
        @Override\r
     public UUID getUuid() {return delegateVocTerm.getUuid();}\r
@@ -254,6 +249,13 @@ public enum NomenclaturalCode implements IEnumTerm<NomenclaturalCode>, Serializa
        @Override\r
     public Set<NomenclaturalCode> getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();}\r
 \r
+       @Override\r
+       public boolean isKindOf(NomenclaturalCode ancestor) {return delegateVocTerm.isKindOf(ancestor); }\r
+\r
+       @Override\r
+    public Set<NomenclaturalCode> getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);}\r
+\r
+       \r
        public static NomenclaturalCode getByKey(String key){return delegateVoc.getByKey(key);}\r
     public static NomenclaturalCode getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);}\r
        \r
index bbabbfba54c6476d0d00754308bf0c7953e1c726..14e51f370a6bf9c05f3dda833585f6579af7ddae 100644 (file)
@@ -22,6 +22,7 @@ import org.apache.log4j.Logger;
 import eu.etaxonomy.cdm.model.common.EnumeratedTermVoc;\r
 import eu.etaxonomy.cdm.model.common.IEnumTerm;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;\r
 \r
 /**\r
  * The rank class defines the category of ranks a certain rank belongs to. This information is\r
@@ -98,9 +99,6 @@ public enum RankClass implements IEnumTerm<RankClass>, Serializable{
 \r
        @Override\r
     public String getMessage(Language language){return delegateVocTerm.getMessage(language);}\r
-\r
-       @Override\r
-       public String getReadableString() {return delegateVocTerm.getReadableString();}\r
                \r
        @Override\r
     public UUID getUuid() {return delegateVocTerm.getUuid();}\r
@@ -111,6 +109,14 @@ public enum RankClass implements IEnumTerm<RankClass>, Serializable{
        @Override\r
     public Set<RankClass> getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();}\r
 \r
+       @Override\r
+       public boolean isKindOf(RankClass ancestor) {return delegateVocTerm.isKindOf(ancestor); }\r
+\r
+       @Override\r
+    public Set<RankClass> getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);}\r
+\r
+\r
+       \r
        public static RankClass getByKey(String key){return delegateVoc.getByKey(key);}\r
     public static RankClass getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);}\r
 \r
index cc0684cad9aa4e70737075bea6fdee53af2ebf2c..5a00e1579effffad99b92da92ac1eac245630f15 100644 (file)
@@ -22,6 +22,7 @@ import org.apache.log4j.Logger;
 import eu.etaxonomy.cdm.model.common.EnumeratedTermVoc;\r
 import eu.etaxonomy.cdm.model.common.IEnumTerm;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceType;\r
 \r
 \r
 /**\r
@@ -293,8 +294,6 @@ public enum SpecimenOrObservationType implements IEnumTerm<SpecimenOrObservation
                @Override\r
            public String getMessage(Language language){return delegateVocTerm.getMessage(language);}\r
 \r
-               @Override\r
-               public String getReadableString() {return delegateVocTerm.getReadableString();}\r
                        \r
                @Override\r
            public UUID getUuid() {return delegateVocTerm.getUuid();}\r
@@ -305,6 +304,12 @@ public enum SpecimenOrObservationType implements IEnumTerm<SpecimenOrObservation
                @Override\r
            public Set<SpecimenOrObservationType> getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();}\r
 \r
+               @Override\r
+               public boolean isKindOf(SpecimenOrObservationType ancestor) {return delegateVocTerm.isKindOf(ancestor); }\r
+\r
+               @Override\r
+           public Set<SpecimenOrObservationType> getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);}\r
+\r
                public static SpecimenOrObservationType getByKey(String key){return delegateVoc.getByKey(key);}\r
            public static SpecimenOrObservationType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);}\r
 \r
index 6c077841697f27e9990dd0d18fcbac1071e8a55f..b75d9eca1ffe2b858315c19f9c2cba89612d7abd 100644 (file)
@@ -179,9 +179,6 @@ public enum ReferenceType implements IEnumTerm<ReferenceType>, Serializable{
 \r
        @Override\r
     public String getMessage(Language language){return delegateVocTerm.getMessage(language);}\r
-\r
-       @Override\r
-       public String getReadableString() {return delegateVocTerm.getReadableString();}\r
                \r
        @Override\r
     public UUID getUuid() {return delegateVocTerm.getUuid();}\r
@@ -192,6 +189,12 @@ public enum ReferenceType implements IEnumTerm<ReferenceType>, Serializable{
        @Override\r
     public Set<ReferenceType> getGeneralizationOf() {return delegateVocTerm.getGeneralizationOf();}\r
 \r
+       @Override\r
+       public boolean isKindOf(ReferenceType ancestor) {return delegateVocTerm.isKindOf(ancestor);     }\r
+\r
+       @Override\r
+    public Set<ReferenceType> getGeneralizationOf(boolean recursive) {return delegateVocTerm.getGeneralizationOf(recursive);}\r
+\r
        public static ReferenceType getByKey(String key){return delegateVoc.getByKey(key);}\r
     public static ReferenceType getByUuid(UUID uuid) {return delegateVoc.getByUuid(uuid);}\r
 \r
index 762657296790d028872cb4d08b67dc5398077962..ab59b4929437bfb593d6e9669fed51ed79a26db8 100644 (file)
@@ -34,9 +34,19 @@ public class TermTypeTest {
                assertTrue(TermType.Modifier.getGeneralizationOf().contains(TermType.DeterminationModifier));\r
                assertTrue(TermType.Modifier.getGeneralizationOf().contains(TermType.Scope));\r
                assertTrue(TermType.Scope.getGeneralizationOf().contains(TermType.Sex));\r
-               assertTrue(TermType.Scope.getGeneralizationOf().contains(TermType.Stage));              \r
+               assertTrue(TermType.Scope.getGeneralizationOf().contains(TermType.Stage));\r
+               assertFalse("generalisationOf may contain only contain only direct children, but stage is a grandchild", TermType.Modifier.getGeneralizationOf().contains(TermType.Stage));     \r
        }\r
        \r
+       @Test\r
+       public void testGeneralisationOfRecursive(){\r
+               boolean recursive = true;\r
+               assertTrue(TermType.Modifier.getGeneralizationOf(recursive).contains(TermType.Scope));\r
+               assertTrue(TermType.Modifier.getGeneralizationOf(! recursive).contains(TermType.Scope));\r
+               assertTrue(TermType.Scope.getGeneralizationOf(recursive).contains(TermType.Sex));\r
+               assertTrue(TermType.Modifier.getGeneralizationOf(recursive).contains(TermType.Stage));          \r
+               assertFalse(TermType.Modifier.getGeneralizationOf(!recursive).contains(TermType.Stage));                \r
+       }\r
        \r
 \r
 }\r