3 * Copyright (C) 2012 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.model
;
12 import java
.util
.ArrayList
;
13 import java
.util
.HashMap
;
14 import java
.util
.HashSet
;
15 import java
.util
.List
;
19 import org
.springframework
.beans
.factory
.config
.BeanDefinition
;
20 import org
.springframework
.context
.annotation
.ClassPathScanningCandidateComponentProvider
;
21 import org
.springframework
.core
.type
.filter
.AssignableTypeFilter
;
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
;
31 * Enumeration of all abstract CDM base types. Each provides a set of all sub types.
32 * @author a.kohlbecker
36 public enum CdmBaseType
{
39 * refers to the baseClass {@link TaxonBase}
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
48 private Class
<?
extends CdmBase
> baseClass
;
50 private Set
<Class
<?
extends CdmBase
>> subClasses
;
52 static Map
<Class
<?
extends CdmBase
>, Class
<?
extends CdmBase
>> subTypeToBaseTypeMap
;
54 CdmBaseType(Class
<?
extends CdmBase
> baseClass
){
55 this.baseClass
= baseClass
;
57 subClasses
= subclassesFor(baseClass
);
59 } catch (ClassNotFoundException e
) {
60 throw new RuntimeException(e
);
64 private void updateBaseTypeMap(){
65 if(CdmBaseType
.subTypeToBaseTypeMap
== null){
66 CdmBaseType
.subTypeToBaseTypeMap
= new HashMap
<Class
<?
extends CdmBase
>, Class
<?
extends CdmBase
>>();
68 for(Class
<?
extends CdmBase
> subClass
: subClasses
){
69 CdmBaseType
.subTypeToBaseTypeMap
.put(subClass
, baseClass
);
73 public static Set
<Class
<?
extends CdmBase
>> subclassesFor(Class
<?
extends CdmBase
> clazz
) throws ClassNotFoundException
{
75 Set
<Class
<?
extends CdmBase
>> subClasses
= new HashSet
<Class
<?
extends CdmBase
>>();
76 ClassPathScanningCandidateComponentProvider provider
= new ClassPathScanningCandidateComponentProvider(true);
77 provider
.addIncludeFilter(new AssignableTypeFilter(clazz
));
79 // scan only in eu.etaxonomy.cdm.model
80 Set
<BeanDefinition
> components
= provider
.findCandidateComponents("eu/etaxonomy/cdm/model");
81 for (BeanDefinition component
: components
)
83 subClasses
.add((Class
<?
extends CdmBase
>) Class
.forName(component
.getBeanClassName()));
88 public static Class
<?
extends CdmBase
> baseTypeFor(Class
<?
extends CdmBase
> cdmType
){
89 return subTypeToBaseTypeMap
.get(cdmType
);
92 public Set
<Class
<?
extends CdmBase
>> getSubClasses() {
96 public Class
<?
extends CdmBase
> getBaseClass() {
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());