* @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
\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
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
@Override\r
public String getMessage(Language language) {\r
//TODO make multi-lingual\r
- return getReadableString();\r
+ return label;\r
}\r
\r
@Override\r
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
//******************* 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
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
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
*/\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
\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
\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
\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
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
\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
@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
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
\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
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
@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
@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
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
\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
@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
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
@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
@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
\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
@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
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