2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.io
.common
;
12 import java
.util
.HashMap
;
15 import org
.apache
.log4j
.Logger
;
16 import org
.springframework
.beans
.BeansException
;
17 import org
.springframework
.context
.ApplicationContext
;
18 import org
.springframework
.context
.ApplicationContextAware
;
19 import org
.springframework
.stereotype
.Component
;
21 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
22 import eu
.etaxonomy
.cdm
.io
.common
.events
.IIoObserver
;
23 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
24 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
25 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
26 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
27 import eu
.etaxonomy
.cdm
.model
.occurrence
.Specimen
;
28 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
29 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
37 @Component("defaultImport")
38 public class CdmApplicationAwareDefaultImport
<T
extends IImportConfigurator
> implements ICdmImporter
<T
>, ApplicationContextAware
{
39 private static final Logger logger
= Logger
.getLogger(CdmApplicationAwareDefaultImport
.class);
41 protected ApplicationContext applicationContext
;
44 * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
46 public void setApplicationContext(ApplicationContext applicationContext
) throws BeansException
{
47 this.applicationContext
= applicationContext
;
52 final boolean OBLIGATORY
= true;
53 final boolean FACULTATIVE
= false;
54 final int modCount
= 1000;
56 IService
<CdmBase
> service
= null;
58 //different type of stores that are used by the known imports
59 Map
<String
, MapWrapper
<?
extends CdmBase
>> stores
= new HashMap
<String
, MapWrapper
<?
extends CdmBase
>>();
61 public CdmApplicationAwareDefaultImport(){
64 stores
.put(ICdmIO
.PERSON_STORE
, new MapWrapper
<Person
>(service
));
65 stores
.put(ICdmIO
.TEAM_STORE
, new MapWrapper
<TeamOrPersonBase
<?
>>(service
));
66 stores
.put(ICdmIO
.REFERENCE_STORE
, new MapWrapper
<Reference
>(service
));
67 stores
.put(ICdmIO
.NOMREF_STORE
, new MapWrapper
<Reference
>(service
));
68 stores
.put(ICdmIO
.NOMREF_DETAIL_STORE
, new MapWrapper
<Reference
>(service
));
69 stores
.put(ICdmIO
.REF_DETAIL_STORE
, new MapWrapper
<Reference
>(service
));
70 stores
.put(ICdmIO
.TAXONNAME_STORE
, new MapWrapper
<TaxonNameBase
<?
,?
>>(service
));
71 stores
.put(ICdmIO
.TAXON_STORE
, new MapWrapper
<TaxonBase
>(service
));
72 stores
.put(ICdmIO
.SPECIMEN_STORE
, new MapWrapper
<Specimen
>(service
));
75 public boolean invoke(IImportConfigurator config
){
76 if (config
.getCheck().equals(IImportConfigurator
.CHECK
.CHECK_ONLY
)){
77 return doCheck(config
);
78 }else if (config
.getCheck().equals(IImportConfigurator
.CHECK
.CHECK_AND_IMPORT
)){
80 return doImport(config
);
81 }else if (config
.getCheck().equals(IImportConfigurator
.CHECK
.IMPORT_WITHOUT_CHECK
)){
82 return doImport(config
);
84 logger
.error("Unknown CHECK type");
90 @SuppressWarnings("unchecked")
91 protected <S
extends IImportConfigurator
> boolean doCheck(S config
){
92 boolean result
= true;
96 logger
.warn("CdmImportConfiguration is null");
99 System
.out
.println("Start checking Source ("+ config
.getSourceNameString() + ") ...");
100 if (! config
.isValid()){
101 logger
.warn("CdmImportConfiguration is not valid");
105 ImportStateBase state
= config
.getNewState();
106 state
.initialize(config
);
108 //do check for each class
109 for (Class
<ICdmIO
> ioClass
: config
.getIoClassList()){
111 String ioBeanName
= getComponentBeanName(ioClass
);
112 ICdmIO cdmIo
= (ICdmIO
)applicationContext
.getBean(ioBeanName
, ICdmIO
.class);
114 registerObservers(config
, cdmIo
);
115 state
.setCurrentIO(cdmIo
);
116 result
&= cdmIo
.check(state
);
117 unRegisterObservers(config
, cdmIo
);
119 logger
.error("cdmIO was null");
122 } catch (Exception e
) {
130 System
.out
.println("End checking Source ("+ config
.getSourceNameString() + ") for import to Cdm");
135 private void registerObservers(IImportConfigurator config
, ICdmIO io
){
136 for (IIoObserver observer
: config
.getObservers()){
137 io
.addObserver(observer
);
141 private void unRegisterObservers(IImportConfigurator config
, ICdmIO io
){
142 for (IIoObserver observer
: config
.getObservers()){
143 io
.removeObserver(observer
);
151 protected <S
extends IImportConfigurator
> boolean doImport(S config
){
152 boolean result
= true;
155 logger
.warn("Configuration is null");
157 }else if (! config
.isValid()){
158 logger
.warn("Configuration is not valid");
162 Reference sourceReference
= config
.getSourceReference();
163 logger
.info("Start import from Source '"+ config
.getSourceNameString() + "' to destination '" + config
.getDestinationNameString() + "'");
166 ImportStateBase state
= config
.getNewState();
167 state
.initialize(config
);
169 state
.setSuccess(true);
170 //do invoke for each class
171 for (Class
<ICdmIO
> ioClass
: config
.getIoClassList()){
173 String ioBeanName
= getComponentBeanName(ioClass
);
174 ICdmIO cdmIo
= (ICdmIO
)applicationContext
.getBean(ioBeanName
, ICdmIO
.class);
176 registerObservers(config
, cdmIo
);
177 state
.setCurrentIO(cdmIo
);
178 result
&= cdmIo
.invoke(state
);
179 unRegisterObservers(config
, cdmIo
);
181 logger
.error("cdmIO was null");
184 } catch (Exception e
) {
191 //do invoke for each class
192 // for (String ioBean: config.getIoBeans()){
194 // ICdmIO<S> cdmIo = (ICdmIO<S>)applicationContext.getBean(ioBean, ICdmIO.class);
195 // if (cdmIo != null){
196 // result &= cdmIo.invoke(config, stores);
198 // logger.error("cdmIO was null");
201 // } catch (Exception e) {
203 // e.printStackTrace();
209 logger
.info("End import from source '" + config
.getSourceNameString()
210 + "' to destination '" + config
.getDestinationNameString() + "'"+
211 (result?
"(successful)":"(with errors)")) ;
216 * Returns the name of a component bean. If the name is defined in the Component annotation this name is returned.
217 * Otherwise the class name is returned with starting lower case.
220 * @throws IllegalArgumentException if the class does not have a "Component" annotation
222 public static String
getComponentBeanName(Class
<ICdmIO
> ioClass
) throws IllegalArgumentException
{
223 Component component
= ioClass
.getAnnotation(Component
.class);
224 if (component
== null){
225 throw new IllegalArgumentException("Class " + ioClass
.getName() + " is missing a @Component annotation." );
227 String ioBean
= component
.value();
228 if ("".equals(ioBean
)){
229 ioBean
= ioClass
.getSimpleName();
230 ioBean
= ioBean
.substring(0, 1).toLowerCase() + ioBean
.substring(1); //make camelcase