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
.IStatus
;
29 import org
.eclipse
.core
.runtime
.jobs
.Job
;
30 import org
.eclipse
.swt
.widgets
.Display
;
31 import org
.eclipse
.core
.runtime
.Assert
;
32 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
33 import org
.eclipse
.core
.runtime
.Status
;
36 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
37 import eu
.etaxonomy
.cdm
.api
.application
.ICdmRepository
;
38 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
39 import eu
.etaxonomy
.cdm
.common
.monitor
.IRemotingProgressMonitor
;
40 import eu
.etaxonomy
.cdm
.io
.cdmLight
.CdmLightExportConfigurator
;
41 import eu
.etaxonomy
.cdm
.io
.common
.CdmDefaultExport
;
42 import eu
.etaxonomy
.cdm
.io
.common
.ExportDataWrapper
;
43 import eu
.etaxonomy
.cdm
.io
.common
.ExportResult
;
44 import eu
.etaxonomy
.cdm
.io
.common
.ExportResultType
;
45 import eu
.etaxonomy
.cdm
.io
.common
.IExportConfigurator
;
46 import eu
.etaxonomy
.cdm
.io
.common
.IIoConfigurator
;
47 import eu
.etaxonomy
.cdm
.io
.dwca
.out
.DwcaTaxExportConfigurator
;
48 import eu
.etaxonomy
.cdm
.io
.jaxb
.JaxbExportConfigurator
;
49 import eu
.etaxonomy
.cdm
.io
.sdd
.out
.SDDExportConfigurator
;
50 import eu
.etaxonomy
.cdm
.io
.service
.IIOService
;
51 import eu
.etaxonomy
.taxeditor
.event
.EventUtility
;
52 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
53 import eu
.etaxonomy
.taxeditor
.model
.CdmProgressMonitorAdapter
;
54 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
55 import eu
.etaxonomy
.taxeditor
.operation
.IFeedbackGenerator
;
56 import eu
.etaxonomy
.taxeditor
.operation
.IPostMoniteredOperationEnabled
;
57 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
58 import eu
.etaxonomy
.taxeditor
.store
.internal
.TaxeditorStorePlugin
;
62 * ExportHandler class.
66 * @created Sep 11, 2009
69 public class ExportManager
extends AbstractIOManager
<IExportConfigurator
> implements IPostMoniteredOperationEnabled
{
71 private final String successMessage
= "The export was successfull";
73 private static final Logger logger
= Logger
.getLogger(ExportManager
.class);
74 /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
75 public static final String DATE_FORMAT_NOW
= "yyyyMMddHHmm";
78 * @param applicationConfiguration
80 private ExportManager(ICdmRepository applicationConfiguration
) {
81 super(applicationConfiguration
);
89 * @param applicationConfiguration
91 * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
93 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
95 public static ExportManager
NewInstance(
96 ICdmRepository applicationConfiguration
) {
97 return new ExportManager(applicationConfiguration
);
105 * @param configurator
106 * a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
108 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
111 protected Job
createIOJob(final IExportConfigurator configurator
) {
113 Assert
.isNotNull(configurator
, "Configuration may not be null");
115 final Display display
= Display
.getCurrent();
117 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) {
119 protected IStatus
run(IProgressMonitor monitor
) {
121 "Exporting database. This will take some time.", 100);
124 /** see ticket # 4456 and */
125 // display.asyncExec(new Runnable() {
128 // public void run() {
130 // // terminate any open transactions
131 // IConversationEnabled activePart = (IConversationEnabled) StoreUtil
132 // .getActivePage().getActivePart();
133 // activePart.getConversationHolder().commit(false);
137 // monitor.worked(10);
139 CdmDefaultExport
<IExportConfigurator
> exporter
= new CdmDefaultExport
<IExportConfigurator
>();
140 configurator
.setProgressMonitor(CdmProgressMonitorAdapter
141 .CreateSubMonitor(monitor
, 80));
142 exporter
.setCdmAppController(applicationConfiguration
);
146 exporter
.invoke(configurator
);
148 } catch (RuntimeException e
) {
149 MessagingUtils
.messageDialog("Error exporting data", this,
150 "An error occurred while"
151 + "exporting to destination '"
152 + configurator
.getDestinationNameString()
154 + "Please check error log for details.", e
);
157 display
.asyncExec(new Runnable() {
161 Object activePart
= EventUtility
.getActivePart();
162 if (activePart
instanceof IConversationEnabled
) {
163 // terminate any open transactions
164 IConversationEnabled conversationEnabled
= (IConversationEnabled
) activePart
;
165 // restarting transaction and committing it to
168 // TODO verify correct behaviour
171 conversationEnabled
.getConversationHolder()
174 conversationEnabled
.getConversationHolder()
176 }catch(RuntimeException e
){
177 MessagingUtils
.messageDialog("Error starting conversation handling", this, "" +
178 "Conversation Error: "+ e
);
185 return Status
.OK_STATUS
;
194 public Job
createIOServiceJob(final IExportConfigurator configurator
, final File exportFile
) {
195 Assert
.isNotNull(configurator
, "Configuration may not be null");
197 final Display display
= Display
.getCurrent();
199 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
201 protected IStatus
run(IProgressMonitor monitor
) {
202 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
204 IIOService ioService
= CdmApplicationState
.getIOService();
205 UUID uuid
= ioService
.monitExportData(configurator
);
206 IRemotingProgressMonitor remotingMonitor
;
207 List
<IFeedbackGenerator
> feedBackGeneratorList
= new ArrayList
<IFeedbackGenerator
>();
209 remotingMonitor
= CdmStore
.getProgressMonitorClientManager().pollMonitor("Export Data",
213 feedBackGeneratorList
,
216 } catch (Exception ex
) {
217 return new Status(Status
.ERROR
, TaxeditorStorePlugin
.PLUGIN_ID
, "Operation Interrupted", ex
);
220 ExportResult result
= (ExportResult
)remotingMonitor
.getResult();
221 ExportDataWrapper data
= result
.getExportData();
223 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
) || result
.getExportData().getType().equals(ExportResultType
.LIST_BYTE_ARRAY
)){
224 if (data
.getExportData() instanceof byte[]){
225 byte[] exportData
= (byte[])data
.getExportData();
226 if(exportData
!= null){
227 FileOutputStream stream
= new FileOutputStream(exportFile
);
228 Writer out
= new BufferedWriter(new OutputStreamWriter(
231 stream
.write(exportData
);
235 }else if (data
.getExportData() instanceof List
<?
>){
236 //TODO:This needs to be improved
237 List
<byte[]> exportData
= (List
<byte[]>)data
.getExportData();
238 if(exportData
!= null){
239 FileOutputStream stream
= new FileOutputStream(exportFile
);
240 Writer out
= new BufferedWriter(new OutputStreamWriter(
243 stream
.write(exportData
.get(0));
249 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
250 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
251 Set
<String
> keySet
= resultMap
.keySet();
252 SimpleDateFormat sdf
= new SimpleDateFormat(DATE_FORMAT_NOW
);
253 Calendar cal
= Calendar
.getInstance();
254 String fileEnding
= ".zip";
255 if (configurator
instanceof DwcaTaxExportConfigurator
){
256 DwcaTaxExportConfigurator dwcaConfig
= (DwcaTaxExportConfigurator
)configurator
;
258 File file
= new File(dwcaConfig
.getDestination().toURI());
259 FileOutputStream stream
= new FileOutputStream(file
);
260 ZipOutputStream zos
= new ZipOutputStream(stream
);
261 for (String key
: keySet
){
262 byte[] fileData
= resultMap
.get(key
);
263 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
264 zos
.putNextEntry(entry
);
271 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
274 } catch(Exception e
){
275 logger
.error(e
.getStackTrace());
278 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
281 } catch (Exception e
) {
282 MessagingUtils
.errorDialog("Error exporting data",
285 TaxeditorStorePlugin
.PLUGIN_ID
,
289 return Status
.OK_STATUS
;
298 private IIoConfigurator
getConfigurator(TYPE type
) {
299 Assert
.isNotNull(type
, "Type should not be null");
303 return JaxbExportConfigurator
.NewInstance(null, null);
305 return SDDExportConfigurator
.NewInstance(null, null, null);
307 MessagingUtils
.notImplementedMessage(this);
308 throw new IllegalArgumentException("Export not supported yet");
317 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
319 public final JaxbExportConfigurator
JaxbConfigurator() {
320 return (JaxbExportConfigurator
) getConfigurator(TYPE
.Jaxb
);
328 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
331 public final SDDExportConfigurator
SddConfigurator() {
332 return (SDDExportConfigurator
) getConfigurator(TYPE
.Sdd
);
336 * @param configurator
340 public Job
createIOServiceJob(CdmLightExportConfigurator configurator
, String urlString
) {
341 Assert
.isNotNull(configurator
, "Configuration may not be null");
342 final Display display
= Display
.getDefault();
344 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
346 protected IStatus
run(IProgressMonitor monitor
) {
347 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
349 IIOService ioService
= CdmApplicationState
.getIOService();
351 ExportResult result
= ioService
.export(configurator
);
352 ExportDataWrapper data
= result
.getExportData();
354 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
) || result
.getExportData().getType().equals(ExportResultType
.LIST_BYTE_ARRAY
)){
355 byte[] exportData
= (byte[])data
.getExportData();
356 if(exportData
!= null){
357 File file
= new File(urlString
);
358 FileOutputStream stream
= new FileOutputStream(file
);
359 Writer out
= new BufferedWriter(new OutputStreamWriter(
362 stream
.write(exportData
);
366 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
367 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
368 Set
<String
> keySet
= resultMap
.keySet();
369 SimpleDateFormat sdf
= new SimpleDateFormat(DATE_FORMAT_NOW
);
370 Calendar cal
= Calendar
.getInstance();
371 String fileEnding
= ".csv";
373 if (configurator
.isCreateZipFile()){
374 File file
= new File(urlString
+File
.separator
+ "csv_light_" + sdf
.format(cal
.getTime())+ ".zip");
375 FileOutputStream stream
= new FileOutputStream(file
);
376 ZipOutputStream zos
= new ZipOutputStream(stream
);
377 for (String key
: keySet
){
378 byte[] fileData
= resultMap
.get(key
);
379 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
380 zos
.putNextEntry(entry
);
386 for (String key
: keySet
){
387 byte[] fileData
= resultMap
.get(key
);
388 File file
= new File(urlString
+File
.separator
+ key
+ fileEnding
);
389 FileOutputStream stream
= new FileOutputStream(file
);
390 Writer out
= new BufferedWriter(new OutputStreamWriter(
392 stream
.write(fileData
);
397 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
399 } catch(Exception e
){
400 logger
.error(e
.getStackTrace());
402 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
405 } catch (Exception e
) {
406 MessagingUtils
.errorDialog("Error exporting data",
409 TaxeditorStorePlugin
.PLUGIN_ID
,
414 return Status
.OK_STATUS
;
420 public void runMoniteredOperation(final IExportConfigurator configurator
, String urlString
) {
421 IIOService ioService
= CdmApplicationState
.getIOService();
422 final UUID uuid
= ioService
.monitExportData(configurator
);
424 Display
.getDefault().asyncExec(new Runnable() {
427 boolean isZip
= false;
428 if (configurator
instanceof CdmLightExportConfigurator
){
429 isZip
= ((CdmLightExportConfigurator
)configurator
).isCreateZipFile();
431 AbstractUtility
.executeMoniteredExport("Export: " + configurator
.getClass().getSimpleName(),
445 public void postOperation(IRemotingProgressMonitor monitor
) {
446 Display
.getDefault().asyncExec(new Runnable() {
450 CdmStore
.getContextManager().notifyContextRefresh();