increased storage capacity of mock cdm cachers
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / CdmBaseType.java
1 // $Id$
2 /**
3 * Copyright (C) 2012 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.cdm.model;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Set;
18
19 import org.springframework.beans.factory.config.BeanDefinition;
20 import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
21 import org.springframework.core.type.filter.AssignableTypeFilter;
22
23 import eu.etaxonomy.cdm.model.common.CdmBase;
24 import eu.etaxonomy.cdm.model.description.DescriptionBase;
25 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
26 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
27 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
28 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
29
30 /**
31 * Enumeration of all abstract CDM base types. Each provides a set of all sub types.
32 * @author a.kohlbecker
33 * @date Sep 28, 2012
34 *
35 */
36 public enum CdmBaseType {
37
38 /**
39 * refers to the baseClass {@link TaxonBase}
40 */
41 TAXON(TaxonBase.class),
42 NONVIRALNAME(TaxonNameBase.class),
43 DESCRIPTION_ELEMENT(DescriptionElementBase.class),
44 DESCRIPTION(DescriptionBase.class),
45 SPECIMEN_OR_OBSERVATIONBASE(SpecimenOrObservationBase.class);
46 // TODO add all others
47
48 private Class<? extends CdmBase> baseClass;
49
50 private Set<Class<? extends CdmBase>> subClasses;
51
52 static Map<Class<? extends CdmBase>, Class<? extends CdmBase>> subTypeToBaseTypeMap;
53
54 CdmBaseType(Class<? extends CdmBase> baseClass){
55 this.baseClass = baseClass;
56 try {
57 subClasses = subclassesFor(baseClass);
58 updateBaseTypeMap();
59 } catch (ClassNotFoundException e) {
60 throw new RuntimeException(e);
61 }
62 }
63
64 private void updateBaseTypeMap(){
65 if(CdmBaseType.subTypeToBaseTypeMap == null){
66 CdmBaseType.subTypeToBaseTypeMap = new HashMap<Class<? extends CdmBase>, Class<? extends CdmBase>>();
67 }
68 for(Class<? extends CdmBase> subClass : subClasses){
69 CdmBaseType.subTypeToBaseTypeMap.put(subClass, baseClass);
70 }
71 }
72
73 public static Set<Class<? extends CdmBase>> subclassesFor(Class<? extends CdmBase> clazz) throws ClassNotFoundException{
74
75 Set<Class<? extends CdmBase>> subClasses = new HashSet<Class<? extends CdmBase>>();
76 ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
77 provider.addIncludeFilter(new AssignableTypeFilter(clazz));
78
79 // scan only in eu.etaxonomy.cdm.model
80 Set<BeanDefinition> components = provider.findCandidateComponents("eu/etaxonomy/cdm/model");
81 for (BeanDefinition component : components)
82 {
83 subClasses.add((Class<? extends CdmBase>) Class.forName(component.getBeanClassName()));
84 }
85 return subClasses;
86 }
87
88 public static Class<? extends CdmBase> baseTypeFor(Class<? extends CdmBase> cdmType){
89 return subTypeToBaseTypeMap.get(cdmType);
90 }
91
92 public Set<Class<? extends CdmBase>> getSubClasses() {
93 return subClasses;
94 }
95
96 public Class<? extends CdmBase> getBaseClass() {
97 return baseClass;
98 }
99
100 public List<String> getSubClassNames() {
101 List<String> names = new ArrayList<String>(subClasses.size());
102 for(Class<? extends CdmBase> clazz : subClasses){
103 names.add(clazz.getName());
104 }
105 return names;
106 }
107
108 }