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
.HashSet
;
14 import java
.util
.List
;
17 import org
.springframework
.beans
.factory
.config
.BeanDefinition
;
18 import org
.springframework
.context
.annotation
.ClassPathScanningCandidateComponentProvider
;
19 import org
.springframework
.core
.type
.filter
.AssignableTypeFilter
;
21 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
22 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
23 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
24 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
25 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
26 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
29 * Enumeration of all abstract CDM base types. Each provides a set of all sub types.
30 * @author a.kohlbecker
34 public enum CdmBaseType
{
36 TAXON(TaxonBase
.class),
37 NONVIRALNAME(TaxonNameBase
.class),
38 DESCRIPTION_ELEMENT(DescriptionElementBase
.class),
39 DESCRIPTION(DescriptionBase
.class),
40 SPECIMEN_OR_OBSERVATIONBASE(SpecimenOrObservationBase
.class);
41 // TODO add all others
43 private Class
<?
extends CdmBase
> baseClass
;
45 private Set
<Class
<?
extends CdmBase
>> subClasses
;
47 CdmBaseType(Class
<?
extends CdmBase
> baseClass
){
48 this.baseClass
= baseClass
;
50 subClasses
= subclassesFor(baseClass
);
51 } catch (ClassNotFoundException e
) {
52 throw new RuntimeException(e
);
56 public static Set
<Class
<?
extends CdmBase
>> subclassesFor(Class
<?
extends CdmBase
> clazz
) throws ClassNotFoundException
{
58 Set
<Class
<?
extends CdmBase
>> subClasses
= new HashSet
<Class
<?
extends CdmBase
>>();
59 ClassPathScanningCandidateComponentProvider provider
= new ClassPathScanningCandidateComponentProvider(true);
60 provider
.addIncludeFilter(new AssignableTypeFilter(clazz
));
62 // scan only in eu.etaxonomy.cdm.model
63 Set
<BeanDefinition
> components
= provider
.findCandidateComponents("eu/etaxonomy/cdm/model");
64 for (BeanDefinition component
: components
)
66 subClasses
.add((Class
<?
extends CdmBase
>) Class
.forName(component
.getBeanClassName()));
71 public Set
<Class
<?
extends CdmBase
>> getSubClasses() {
75 public Class
<?
extends CdmBase
> getBaseClass() {
79 public List
<String
> getSubClassNames() {
80 List
<String
> names
= new ArrayList
<String
>(subClasses
.size());
81 for(Class
<?
extends CdmBase
> clazz
: subClasses
){
82 names
.add(clazz
.getName());