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
.taxeditor
.io
;
12 import java
.io
.BufferedWriter
;
14 import java
.io
.FileOutputStream
;
15 import java
.io
.OutputStreamWriter
;
16 import java
.io
.Writer
;
17 import java
.text
.SimpleDateFormat
;
18 import java
.util
.ArrayList
;
19 import java
.util
.Calendar
;
20 import java
.util
.List
;
23 import java
.util
.UUID
;
24 import java
.util
.zip
.ZipEntry
;
25 import java
.util
.zip
.ZipOutputStream
;
27 import org
.apache
.log4j
.Logger
;
28 import org
.eclipse
.core
.runtime
.Assert
;
29 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
30 import org
.eclipse
.core
.runtime
.IStatus
;
31 import org
.eclipse
.core
.runtime
.Status
;
32 import org
.eclipse
.core
.runtime
.jobs
.Job
;
33 import org
.eclipse
.swt
.widgets
.Display
;
35 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
36 import eu
.etaxonomy
.cdm
.api
.application
.ICdmRepository
;
37 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
38 import eu
.etaxonomy
.cdm
.common
.monitor
.IRemotingProgressMonitor
;
39 import eu
.etaxonomy
.cdm
.io
.cdmLight
.CdmLightExportConfigurator
;
40 import eu
.etaxonomy
.cdm
.io
.common
.CdmDefaultExport
;
41 import eu
.etaxonomy
.cdm
.io
.common
.ExportDataWrapper
;
42 import eu
.etaxonomy
.cdm
.io
.common
.ExportResult
;
43 import eu
.etaxonomy
.cdm
.io
.common
.ExportResultType
;
44 import eu
.etaxonomy
.cdm
.io
.common
.IExportConfigurator
;
45 import eu
.etaxonomy
.cdm
.io
.common
.IIoConfigurator
;
46 import eu
.etaxonomy
.cdm
.io
.dwca
.out
.DwcaTaxExportConfigurator
;
47 import eu
.etaxonomy
.cdm
.io
.jaxb
.JaxbExportConfigurator
;
48 import eu
.etaxonomy
.cdm
.io
.sdd
.out
.SDDExportConfigurator
;
49 import eu
.etaxonomy
.cdm
.io
.service
.IIOService
;
50 import eu
.etaxonomy
.taxeditor
.event
.EventUtility
;
51 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
52 import eu
.etaxonomy
.taxeditor
.model
.CdmProgressMonitorAdapter
;
53 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
54 import eu
.etaxonomy
.taxeditor
.operation
.IFeedbackGenerator
;
55 import eu
.etaxonomy
.taxeditor
.operation
.IPostMoniteredOperationEnabled
;
56 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
57 import eu
.etaxonomy
.taxeditor
.store
.internal
.TaxeditorStorePlugin
;
61 * ExportHandler class.
65 * @created Sep 11, 2009
68 public class ExportManager
extends AbstractIOManager
<IExportConfigurator
> implements IPostMoniteredOperationEnabled
{
70 private final String successMessage
= "The export was successfull";
72 private static final Logger logger
= Logger
.getLogger(ExportManager
.class);
73 /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
74 public static final String DATE_FORMAT_NOW
= "yyyyMMddHHmm";
77 * @param applicationConfiguration
79 private ExportManager(ICdmRepository applicationConfiguration
) {
80 super(applicationConfiguration
);
88 * @param applicationConfiguration
90 * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
92 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
94 public static ExportManager
NewInstance(
95 ICdmRepository applicationConfiguration
) {
96 return new ExportManager(applicationConfiguration
);
104 * @param configurator
105 * a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
107 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
110 protected Job
createIOJob(final IExportConfigurator configurator
) {
112 Assert
.isNotNull(configurator
, "Configuration may not be null");
114 final Display display
= Display
.getCurrent();
116 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) {
118 protected IStatus
run(IProgressMonitor monitor
) {
120 "Exporting database. This will take some time.", 100);
123 /** see ticket # 4456 and */
124 // display.asyncExec(new Runnable() {
127 // public void run() {
129 // // terminate any open transactions
130 // IConversationEnabled activePart = (IConversationEnabled) StoreUtil
131 // .getActivePage().getActivePart();
132 // activePart.getConversationHolder().commit(false);
136 // monitor.worked(10);
138 CdmDefaultExport
<IExportConfigurator
> exporter
= new CdmDefaultExport
<IExportConfigurator
>();
139 configurator
.setProgressMonitor(CdmProgressMonitorAdapter
140 .CreateSubMonitor(monitor
, 80));
141 exporter
.setCdmAppController(applicationConfiguration
);
145 exporter
.invoke(configurator
);
147 } catch (RuntimeException e
) {
148 MessagingUtils
.messageDialog("Error exporting data", this,
149 "An error occured while"
150 + "exporting to destination '"
151 + configurator
.getDestinationNameString()
153 + "Please check error log for details.", e
);
156 display
.asyncExec(new Runnable() {
160 Object activePart
= EventUtility
.getActivePart();
161 if (activePart
instanceof IConversationEnabled
) {
162 // terminate any open transactions
163 IConversationEnabled conversationEnabled
= (IConversationEnabled
) activePart
;
164 // restarting transaction and committing it to
167 // TODO verify correct behaviour
170 conversationEnabled
.getConversationHolder()
173 conversationEnabled
.getConversationHolder()
175 }catch(RuntimeException e
){
176 MessagingUtils
.messageDialog("Error starting conversation handling", this, "" +
177 "Conversation Error: "+ e
);
184 return Status
.OK_STATUS
;
191 public Job
createIOServiceJob(final IExportConfigurator configurator
, final File exportFile
) {
192 Assert
.isNotNull(configurator
, "Configuration may not be null");
194 final Display display
= Display
.getCurrent();
196 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
198 protected IStatus
run(IProgressMonitor monitor
) {
199 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
201 IIOService ioService
= CdmApplicationState
.getIOService();
202 UUID uuid
= ioService
.monitExportData(configurator
);
203 IRemotingProgressMonitor remotingMonitor
;
204 List
<IFeedbackGenerator
> feedBackGeneratorList
= new ArrayList
<IFeedbackGenerator
>();
206 remotingMonitor
= CdmStore
.getProgressMonitorClientManager().pollMonitor("Export Data",
210 feedBackGeneratorList
,
213 } catch (Exception ex
) {
214 return new Status(Status
.ERROR
, TaxeditorStorePlugin
.PLUGIN_ID
, "Operation Interrupted", ex
);
217 ExportResult result
= (ExportResult
)remotingMonitor
.getResult();
218 ExportDataWrapper data
= result
.getExportData();
220 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
)){
221 byte[] exportData
= (byte[])data
.getExportData();
222 if(exportData
!= null){
223 FileOutputStream stream
= new FileOutputStream(exportFile
);
224 stream
.write(exportData
);
227 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
228 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
229 Set
<String
> keySet
= resultMap
.keySet();
230 SimpleDateFormat sdf
= new SimpleDateFormat(DATE_FORMAT_NOW
);
231 Calendar cal
= Calendar
.getInstance();
232 String fileEnding
= ".zip";
233 if (configurator
instanceof DwcaTaxExportConfigurator
){
234 DwcaTaxExportConfigurator dwcaConfig
= (DwcaTaxExportConfigurator
)configurator
;
236 File file
= new File(dwcaConfig
.getDestination().toURI());
237 FileOutputStream stream
= new FileOutputStream(file
);
238 ZipOutputStream zos
= new ZipOutputStream(stream
);
239 for (String key
: keySet
){
240 byte[] fileData
= resultMap
.get(key
);
241 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
242 zos
.putNextEntry(entry
);
249 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
252 } catch(Exception e
){
253 logger
.error(e
.getStackTrace());
256 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
259 } catch (Exception e
) {
260 MessagingUtils
.errorDialog("Error exporting data",
263 TaxeditorStorePlugin
.PLUGIN_ID
,
267 return Status
.OK_STATUS
;
276 private IIoConfigurator
getConfigurator(TYPE type
) {
277 Assert
.isNotNull(type
, "Type should not be null");
281 return JaxbExportConfigurator
.NewInstance(null, null);
283 return SDDExportConfigurator
.NewInstance(null, null, null);
285 MessagingUtils
.notImplementedMessage(this);
286 throw new IllegalArgumentException("Export not supported yet");
295 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
297 public final JaxbExportConfigurator
JaxbConfigurator() {
298 return (JaxbExportConfigurator
) getConfigurator(TYPE
.Jaxb
);
306 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
309 public final SDDExportConfigurator
SddConfigurator() {
310 return (SDDExportConfigurator
) getConfigurator(TYPE
.Sdd
);
314 * @param configurator
318 public Job
createIOServiceJob(CdmLightExportConfigurator configurator
, String urlString
) {
319 Assert
.isNotNull(configurator
, "Configuration may not be null");
320 final Display display
= Display
.getDefault();
322 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
324 protected IStatus
run(IProgressMonitor monitor
) {
325 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
327 IIOService ioService
= CdmApplicationState
.getIOService();
329 ExportResult result
= ioService
.export(configurator
);
330 ExportDataWrapper data
= result
.getExportData();
332 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
)){
333 byte[] exportData
= (byte[])data
.getExportData();
334 if(exportData
!= null){
335 File file
= new File(urlString
);
336 FileOutputStream stream
= new FileOutputStream(file
);
337 Writer out
= new BufferedWriter(new OutputStreamWriter(
340 stream
.write(exportData
);
344 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
345 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
346 Set
<String
> keySet
= resultMap
.keySet();
347 SimpleDateFormat sdf
= new SimpleDateFormat(DATE_FORMAT_NOW
);
348 Calendar cal
= Calendar
.getInstance();
349 String fileEnding
= ".csv";
351 if (configurator
.isCreateZipFile()){
352 File file
= new File(urlString
+File
.separator
+ "csv_light_" + sdf
.format(cal
.getTime())+ ".zip");
353 FileOutputStream stream
= new FileOutputStream(file
);
354 ZipOutputStream zos
= new ZipOutputStream(stream
);
355 for (String key
: keySet
){
356 byte[] fileData
= resultMap
.get(key
);
357 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
358 zos
.putNextEntry(entry
);
364 for (String key
: keySet
){
365 byte[] fileData
= resultMap
.get(key
);
366 File file
= new File(urlString
+File
.separator
+ key
+ fileEnding
);
367 FileOutputStream stream
= new FileOutputStream(file
);
368 Writer out
= new BufferedWriter(new OutputStreamWriter(
370 stream
.write(fileData
);
375 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
377 } catch(Exception e
){
378 logger
.error(e
.getStackTrace());
380 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
383 } catch (Exception e
) {
384 MessagingUtils
.errorDialog("Error exporting data",
387 TaxeditorStorePlugin
.PLUGIN_ID
,
392 return Status
.OK_STATUS
;
398 public void runMoniteredOperation(final IExportConfigurator configurator
, String urlString
) {
399 IIOService ioService
= CdmApplicationState
.getIOService();
400 final UUID uuid
= ioService
.monitExportData(configurator
);
402 Display
.getDefault().asyncExec(new Runnable() {
405 boolean isZip
= false;
406 if (configurator
instanceof CdmLightExportConfigurator
){
407 isZip
= ((CdmLightExportConfigurator
)configurator
).isCreateZipFile();
409 AbstractUtility
.executeMoniteredExport("Export: " + configurator
.getClass().getSimpleName(),
423 public void postOperation(IRemotingProgressMonitor monitor
) {
424 Display
.getDefault().asyncExec(new Runnable() {
428 CdmStore
.getContextManager().notifyContextRefresh();