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
.ArrayList
;
13 import java
.util
.HashMap
;
14 import java
.util
.List
;
17 import org
.apache
.log4j
.Logger
;
18 import org
.springframework
.beans
.BeansException
;
19 import org
.springframework
.context
.ApplicationContext
;
20 import org
.springframework
.context
.ApplicationContextAware
;
21 import org
.springframework
.stereotype
.Component
;
23 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
24 import eu
.etaxonomy
.cdm
.common
.monitor
.IProgressMonitor
;
25 import eu
.etaxonomy
.cdm
.common
.monitor
.SubProgressMonitor
;
26 import eu
.etaxonomy
.cdm
.io
.common
.events
.IIoObserver
;
27 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
30 * This class is an default exporter class that is a spring bean and therefore it knows all other IO classes that are beans
36 @Component("defaultExport")
37 public class CdmApplicationAwareDefaultExport
<T
extends IExportConfigurator
>
38 implements ICdmExporter
<T
>, ApplicationContextAware
{
40 private static final Logger logger
= Logger
.getLogger(CdmApplicationAwareDefaultExport
.class);
42 protected ApplicationContext applicationContext
;
45 public void setApplicationContext(ApplicationContext applicationContext
)
46 throws BeansException
{
47 this.applicationContext
= applicationContext
;
52 final static boolean OBLIGATORY
= true;
53 final static boolean FACULTATIVE
= false;
54 final int modCount
= 1000;
56 private final IService 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 CdmApplicationAwareDefaultExport(){
62 stores
.put(ICdmIO
.TEAM_STORE
, new MapWrapper
<>(service
));
63 stores
.put(ICdmIO
.REFERENCE_STORE
, new MapWrapper
<>(service
));
64 stores
.put(ICdmIO
.NOMREF_STORE
, new MapWrapper
<>(service
));
65 stores
.put(ICdmIO
.TAXONNAME_STORE
, new MapWrapper
<>(service
));
66 stores
.put(ICdmIO
.TAXON_STORE
, new MapWrapper
<>(service
));
67 stores
.put(ICdmIO
.SPECIMEN_STORE
, new MapWrapper
<>(service
));
72 public ExportResult
invoke(T config
){
74 if (config
.getCheck().equals(IExportConfigurator
.CHECK
.CHECK_ONLY
)){
75 result
= ExportResult
.NewInstance(config
.getResultType());
76 boolean success
= doCheck(config
);
80 }else if (config
.getCheck().equals(IExportConfigurator
.CHECK
.CHECK_AND_EXPORT
)){
81 boolean success
= doCheck(config
);
83 result
= doExport(config
);
85 result
= ExportResult
.NewInstance(config
.getResultType());
88 }else if (config
.getCheck().equals(IExportConfigurator
.CHECK
.EXPORT_WITHOUT_CHECK
)){
89 result
= doExport(config
);
91 result
= ExportResult
.NewInstance(config
.getResultType());
92 String message
= "Unknown CHECK type";
93 logger
.error(message
);
94 result
.addError(message
);
100 public ExportResult
execute(T config
) {
101 ExportResult result
= ExportResult
.NewInstance(config
.getResultType());
102 if (config
.getCheck().equals(IExportConfigurator
.CHECK
.CHECK_ONLY
)){
103 boolean success
= doCheck(config
);
107 } else if (config
.getCheck().equals(IExportConfigurator
.CHECK
.CHECK_AND_EXPORT
)){
108 boolean success
= doCheck(config
);
110 result
= doExport(config
);
114 } else if (config
.getCheck().equals(IExportConfigurator
.CHECK
.EXPORT_WITHOUT_CHECK
)){
115 result
= doExport(config
);
117 String message
= "Unknown CHECK type";
118 logger
.error(message
);
119 result
.addError(message
);
124 @SuppressWarnings("unchecked")
125 protected <S
extends IExportConfigurator
> boolean doCheck(S config
){
127 boolean result
= true;
131 logger
.warn("CdmExportConfiguration is null");
132 // result.setState(ExportResultState.ABORTED);
134 }else if (! config
.isValid()){
135 logger
.warn("CdmExportConfiguration is not valid");
136 // result.setState(ExportResultState.ABORTED);
139 System
.out
.println("Start checking Source ("+ config
.getSourceNameString() + ") ...");
141 ExportStateBase state
= config
.getNewState();
142 state
.initialize(config
);
144 //do check for each class
145 for (Class
<ICdmExport
> ioClass
: config
.getIoClassList()){
147 String ioBeanName
= getComponentBeanName(ioClass
);
148 ICdmIO cdmIo
= applicationContext
.getBean(ioBeanName
, ICdmIO
.class);
150 registerObservers(config
, cdmIo
);
151 result
&= cdmIo
.check(state
);
152 unRegisterObservers(config
, cdmIo
);
154 String message
= "cdmIO for class " + (ioClass
== null ?
"(null)" : ioClass
.getSimpleName()) + " was null";
155 logger
.error(message
);
158 } catch (Exception e
) {
166 System
.out
.println("End checking Source ("+ config
.getSourceNameString() + ") for export from Cdm");
172 private void registerObservers(IExportConfigurator config
, ICdmIO io
){
173 for (IIoObserver observer
: config
.getObservers()){
174 io
.addObserver(observer
);
178 private void unRegisterObservers(IExportConfigurator config
, ICdmIO io
){
179 for (IIoObserver observer
: config
.getObservers()){
180 io
.removeObserver(observer
);
189 protected <CONFIG
extends T
> ExportResult
doExport(CONFIG config
){
192 ExportResult result
= ExportResult
.NewInstance(null);
193 String message
= "Configuration is null";
194 logger
.error(message
);
195 result
.addError(message
);
199 ExportResult result
= ExportResult
.NewInstance(config
.getResultType());
200 if (! config
.isValid()){
201 String message
= "Configuration is not valid";
202 logger
.error(message
);
203 result
.addError(message
);
208 System
.out
.println("Start export from source '" + config
.getSourceNameString()
209 + "' to destination '" + config
.getDestinationNameString() + "'");
211 ExportStateBase state
= config
.getNewState();
212 state
.initialize(config
);
213 state
.setResult(result
);
215 List
<ICdmExport
> ioList
= makeIoList(state
, config
);
217 List
<Integer
> stepCounts
= countSteps(state
, ioList
);
218 Integer totalCount
= stepCounts
.get(stepCounts
.size()-1);
219 config
.getProgressMonitor().beginTask("Start Export", totalCount
);
220 config
.getProgressMonitor().worked(1);
221 IProgressMonitor parentMonitor
= SubProgressMonitor
222 .NewStarted(config
.getProgressMonitor(), 99, "Process data", totalCount
);
224 //do invoke for each class
225 for (int i
= 0; i
< ioList
.size(); i
++){
226 ICdmExport export
= ioList
.get(i
);
227 Integer counts
= stepCounts
.get(i
);
229 String ioName
= export
.getClass().getSimpleName();
230 SubProgressMonitor ioMonitor
= SubProgressMonitor
231 .NewStarted(parentMonitor
, counts
, ioName
, counts
);
232 // state.getConfig().setProgressMonitor(ioMonitor);
233 state
.setCurrentIO(export
);
234 export
.invoke(state
);
236 } catch (Exception e
) {
237 String message
= "Unexpected exception in " + export
.getClass().getSimpleName()+ ": " + e
.getMessage();
238 logger
.error(message
);
240 result
.addException(e
, message
);
244 System
.out
.println("End export from source '" + config
.getSourceNameString()
245 + "' to destination '" + config
.getDestinationNameString() + "' "
246 + "("+ result
.toString() + ")"
256 private List
<Integer
> countSteps(ExportStateBase state
, List
<ICdmExport
> ioList
) {
257 //do invoke for each class
258 List
<Integer
> result
= new ArrayList
<>();
260 for (ICdmExport export
: ioList
){
263 // state.setCurrentIO(export);
264 count
= ((Long
)export
.countSteps(state
)).intValue();
265 } catch (Exception e
) {
266 String message
= "Unexpected exception when count steps for progress monitoring " + export
.getClass().getSimpleName()+ ": " + e
.getMessage();
267 logger
.error(message
);
269 state
.getResult().addException(e
, message
);
284 private <CONFIG
extends T
> List
<ICdmExport
> makeIoList(ExportStateBase state
, CONFIG config
) {
286 List
<ICdmExport
> result
= new ArrayList
<>();
288 for (Class
<ICdmExport
> ioClass
: config
.getIoClassList()){
290 String ioBeanName
= getComponentBeanName(ioClass
);
291 ICdmExport cdmIo
= applicationContext
.getBean(ioBeanName
, ICdmExport
.class);
295 String message
= "cdmIO was null: " + ioBeanName
;
296 logger
.error(message
);
297 state
.getResult().addError(message
);
299 } catch (Exception e
) {
300 String message
= "Unexpected exception in " + ioClass
.getSimpleName()+ ": " + e
.getMessage();
301 logger
.error(message
);
303 state
.getResult().addException(e
, message
);
310 private String
getComponentBeanName(Class
<ICdmExport
> ioClass
){
311 Component component
= ioClass
.getAnnotation(Component
.class);
312 String ioBean
= component
.value();
313 if ("".equals(ioBean
)){
314 ioBean
= ioClass
.getSimpleName();
315 ioBean
= ioBean
.substring(0, 1).toLowerCase() + ioBean
.substring(1); //make camelcase