First commit for the CDM Caching api
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / CdmBaseType.java
index 7fcef2219ff16a7b9d2526800ab46cce4be0faa4..f79e1e9cc2666e63acda324fcb4c79a0f6af479f 100644 (file)
 package eu.etaxonomy.cdm.model;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.springframework.beans.factory.config.BeanDefinition;
@@ -33,6 +35,9 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
  */
 public enum CdmBaseType {
 
+    /**
+     * refers to the baseClass {@link TaxonBase}
+     */
     TAXON(TaxonBase.class),
     NONVIRALNAME(TaxonNameBase.class),
     DESCRIPTION_ELEMENT(DescriptionElementBase.class),
@@ -44,15 +49,27 @@ public enum CdmBaseType {
 
     private Set<Class<? extends CdmBase>> subClasses;
 
+    static Map<Class<? extends CdmBase>,  Class<? extends CdmBase>> subTypeToBaseTypeMap;
+
     CdmBaseType(Class<? extends CdmBase> baseClass){
         this.baseClass = baseClass;
         try {
             subClasses = subclassesFor(baseClass);
+            updateBaseTypeMap();
         } catch (ClassNotFoundException e) {
             throw new RuntimeException(e);
         }
     }
 
+    private void updateBaseTypeMap(){
+        if(CdmBaseType.subTypeToBaseTypeMap == null){
+            CdmBaseType.subTypeToBaseTypeMap = new HashMap<Class<? extends CdmBase>,  Class<? extends CdmBase>>();
+        }
+        for(Class<? extends CdmBase> subClass : subClasses){
+            CdmBaseType.subTypeToBaseTypeMap.put(subClass, baseClass);
+        }
+    }
+
     public static Set<Class<? extends CdmBase>> subclassesFor(Class<? extends CdmBase> clazz) throws ClassNotFoundException{
 
         Set<Class<? extends CdmBase>> subClasses = new HashSet<Class<? extends CdmBase>>();
@@ -68,6 +85,10 @@ public enum CdmBaseType {
         return subClasses;
     }
 
+    public static Class<? extends CdmBase> baseTypeFor(Class<? extends CdmBase> cdmType){
+        return subTypeToBaseTypeMap.get(cdmType);
+    }
+
     public Set<Class<? extends CdmBase>> getSubClasses() {
         return subClasses;
     }