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.
9 package eu
.etaxonomy
.taxeditor
.io
;
11 import java
.io
.BufferedWriter
;
13 import java
.io
.FileOutputStream
;
14 import java
.io
.OutputStreamWriter
;
15 import java
.io
.Writer
;
16 import java
.text
.SimpleDateFormat
;
17 import java
.util
.ArrayList
;
18 import java
.util
.Calendar
;
19 import java
.util
.List
;
22 import java
.util
.UUID
;
23 import java
.util
.zip
.ZipEntry
;
24 import java
.util
.zip
.ZipOutputStream
;
26 import org
.apache
.log4j
.Logger
;
27 import org
.eclipse
.core
.runtime
.Assert
;
28 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
29 import org
.eclipse
.core
.runtime
.IStatus
;
30 import org
.eclipse
.core
.runtime
.Status
;
31 import org
.eclipse
.core
.runtime
.SubMonitor
;
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
;
62 * @created Sep 11, 2009
64 public class ExportManager
65 extends AbstractIOManager
<IExportConfigurator
>
66 implements IPostMoniteredOperationEnabled
{
68 private static final Logger logger
= Logger
.getLogger(ExportManager
.class);
69 /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
70 public static final String DATE_FORMAT_NOW
= "yyyyMMddHHmm";
72 private final String successMessage
= "The export was successful";
74 private ExportManager(ICdmRepository applicationConfiguration
) {
75 super(applicationConfiguration
);
78 public static ExportManager
NewInstance(
79 ICdmRepository applicationConfiguration
) {
80 return new ExportManager(applicationConfiguration
);
84 protected Job
createIOJob(final IExportConfigurator configurator
) {
86 Assert
.isNotNull(configurator
, "Configuration may not be null");
88 final Display display
= Display
.getCurrent();
90 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) {
92 protected IStatus
run(IProgressMonitor monitor
) {
94 "Exporting database. This will take some time.", 100);
97 /** see ticket # 4456 and */
98 // display.asyncExec(new Runnable() {
101 // public void run() {
103 // // terminate any open transactions
104 // IConversationEnabled activePart = (IConversationEnabled) StoreUtil
105 // .getActivePage().getActivePart();
106 // activePart.getConversationHolder().commit(false);
110 // monitor.worked(10);
112 CdmDefaultExport
<IExportConfigurator
> exporter
= new CdmDefaultExport
<>();
113 configurator
.setProgressMonitor(CdmProgressMonitorAdapter
114 .CreateSubMonitor(monitor
, 80));
115 exporter
.setCdmAppController(applicationConfiguration
);
119 exporter
.invoke(configurator
);
121 } catch (RuntimeException e
) {
122 MessagingUtils
.messageDialog("Error exporting data", this,
123 "An error occurred while"
124 + "exporting to destination '"
125 + configurator
.getDestinationNameString()
127 + "Please check error log for details.", e
);
130 display
.asyncExec(()-> {
131 Object activePart
= EventUtility
.getActivePart();
132 if (activePart
instanceof IConversationEnabled
) {
133 // terminate any open transactions
134 IConversationEnabled conversationEnabled
= (IConversationEnabled
) activePart
;
135 // restarting transaction and committing it to
138 // TODO verify correct behaviour
141 conversationEnabled
.getConversationHolder()
144 conversationEnabled
.getConversationHolder()
146 }catch(RuntimeException e
){
147 MessagingUtils
.messageDialog("Error starting conversation handling", this, "" +
148 "Conversation Error: "+ e
);
154 return Status
.OK_STATUS
;
161 public Job
createIOServiceJob(final IExportConfigurator configurator
, final File exportFile
) {
162 Assert
.isNotNull(configurator
, "Configuration may not be null");
164 final Display display
= Display
.getCurrent();
166 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
168 protected IStatus
run(IProgressMonitor monitor
) {
169 SubMonitor subMonitor
= SubMonitor
.convert(monitor
, 100);
170 subMonitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
172 IIOService ioService
= CdmApplicationState
.getIOService();
173 UUID uuid
= ioService
.monitExportData(configurator
);
174 IRemotingProgressMonitor remotingMonitor
;
175 List
<IFeedbackGenerator
> feedBackGeneratorList
= new ArrayList
<>();
177 remotingMonitor
= CdmStore
.getProgressMonitorClientManager().pollMonitor("Export Data",
181 feedBackGeneratorList
,
184 } catch (Exception ex
) {
185 return new Status(IStatus
.ERROR
, TaxeditorStorePlugin
.PLUGIN_ID
, "Operation Interrupted", ex
);
188 ExportResult result
= (ExportResult
)remotingMonitor
.getResult();
189 ExportDataWrapper
<?
> data
= result
.getExportData();
191 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
) || result
.getExportData().getType().equals(ExportResultType
.LIST_BYTE_ARRAY
)){
192 if (data
.getExportData() instanceof byte[]){
193 byte[] exportData
= (byte[])data
.getExportData();
194 if(exportData
!= null){
195 FileOutputStream stream
= new FileOutputStream(exportFile
);
196 Writer out
= new BufferedWriter(new OutputStreamWriter(
199 stream
.write(exportData
);
203 }else if (data
.getExportData() instanceof List
<?
>){
204 //TODO:This needs to be improved
205 @SuppressWarnings("unchecked")
206 List
<byte[]> exportData
= (List
<byte[]>)data
.getExportData();
207 if(exportData
!= null){
208 FileOutputStream stream
= new FileOutputStream(exportFile
);
209 Writer out
= new BufferedWriter(new OutputStreamWriter(
212 stream
.write(exportData
.get(0));
218 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
219 @SuppressWarnings("unchecked")
220 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
221 Set
<String
> keySet
= resultMap
.keySet();
222 String fileEnding
= ".zip";
223 if (configurator
instanceof DwcaTaxExportConfigurator
){
224 DwcaTaxExportConfigurator dwcaConfig
= (DwcaTaxExportConfigurator
)configurator
;
226 File file
= new File(dwcaConfig
.getDestination().toURI());
227 FileOutputStream stream
= new FileOutputStream(file
);
228 ZipOutputStream zos
= new ZipOutputStream(stream
);
229 for (String key
: keySet
){
230 byte[] fileData
= resultMap
.get(key
);
231 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
232 zos
.putNextEntry(entry
);
239 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
242 } catch(Exception e
){
243 logger
.error(e
.getStackTrace());
246 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
249 } catch (Exception e
) {
250 MessagingUtils
.errorDialog("Error exporting data",
253 TaxeditorStorePlugin
.PLUGIN_ID
,
257 return Status
.OK_STATUS
;
263 private IIoConfigurator
getConfigurator(TYPE type
) {
264 Assert
.isNotNull(type
, "Type should not be null");
268 return JaxbExportConfigurator
.NewInstance(null, null);
270 return SDDExportConfigurator
.NewInstance(null, null, null);
272 MessagingUtils
.notImplementedMessage(this);
273 throw new IllegalArgumentException("Export not supported yet");
277 public final JaxbExportConfigurator
JaxbConfigurator() {
278 return (JaxbExportConfigurator
) getConfigurator(TYPE
.Jaxb
);
281 public final SDDExportConfigurator
SddConfigurator() {
282 return (SDDExportConfigurator
) getConfigurator(TYPE
.Sdd
);
285 public Job
createIOServiceJob(CdmLightExportConfigurator configurator
, String urlString
) {
286 Assert
.isNotNull(configurator
, "Configuration may not be null");
287 final Display display
= Display
.getDefault();
289 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
291 protected IStatus
run(IProgressMonitor monitor
) {
292 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
294 IIOService ioService
= CdmApplicationState
.getIOService();
296 "Exporting database. This will take some time.", 100);
298 configurator
.setProgressMonitor(CdmProgressMonitorAdapter
299 .CreateSubMonitor(monitor
, 80));
300 ExportResult result
= ioService
.export(configurator
);
301 ExportDataWrapper
<?
> data
= result
.getExportData();
303 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
) || result
.getExportData().getType().equals(ExportResultType
.LIST_BYTE_ARRAY
)){
304 byte[] exportData
= (byte[])data
.getExportData();
305 if(exportData
!= null){
306 File file
= new File(urlString
);
307 FileOutputStream stream
= new FileOutputStream(file
);
308 Writer out
= new BufferedWriter(new OutputStreamWriter(
311 stream
.write(exportData
);
315 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
316 @SuppressWarnings("unchecked")
317 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
318 Set
<String
> keySet
= resultMap
.keySet();
319 SimpleDateFormat sdf
= new SimpleDateFormat(DATE_FORMAT_NOW
);
320 Calendar cal
= Calendar
.getInstance();
321 String fileEnding
= ".csv";
323 if (configurator
.isCreateZipFile()){
324 File file
= new File(urlString
+File
.separator
+ "csv_light_" + sdf
.format(cal
.getTime())+ ".zip");
325 FileOutputStream stream
= new FileOutputStream(file
);
326 ZipOutputStream zos
= new ZipOutputStream(stream
);
327 for (String key
: keySet
){
328 byte[] fileData
= resultMap
.get(key
);
329 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
330 zos
.putNextEntry(entry
);
336 for (String key
: keySet
){
337 byte[] fileData
= resultMap
.get(key
);
338 File file
= new File(urlString
+File
.separator
+ key
+ fileEnding
);
339 FileOutputStream stream
= new FileOutputStream(file
);
340 Writer out
= new BufferedWriter(new OutputStreamWriter(
342 stream
.write(fileData
);
347 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
349 } catch(Exception e
){
350 logger
.error(e
.getStackTrace());
352 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
355 } catch (Exception e
) {
356 MessagingUtils
.errorDialog("Error exporting data",
359 TaxeditorStorePlugin
.PLUGIN_ID
,
364 return Status
.OK_STATUS
;
370 public void runMoniteredOperation(final IExportConfigurator configurator
, String urlString
) {
371 IIOService ioService
= CdmApplicationState
.getIOService();
372 final UUID uuid
= ioService
.monitExportData(configurator
);
374 Display
.getDefault().asyncExec(new Runnable() {
377 boolean isZip
= false;
378 if (configurator
instanceof CdmLightExportConfigurator
){
379 isZip
= ((CdmLightExportConfigurator
)configurator
).isCreateZipFile();
381 AbstractUtility
.executeMoniteredExport(configurator
.getUserFriendlyIOName() != null? configurator
.getUserFriendlyIOName(): "Export",
394 public void postOperation(IRemotingProgressMonitor monitor
) {
395 Display
.getDefault().asyncExec(()-> {
396 CdmStore
.getContextManager().notifyContextRefresh();