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
.logging
.log4j
.LogManager
;
27 import org
.apache
.logging
.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
.SubMonitor
;
33 import org
.eclipse
.core
.runtime
.jobs
.Job
;
34 import org
.eclipse
.swt
.widgets
.Display
;
36 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
37 import eu
.etaxonomy
.cdm
.api
.application
.ICdmRepository
;
38 import eu
.etaxonomy
.cdm
.common
.monitor
.IRemotingProgressMonitor
;
39 import eu
.etaxonomy
.cdm
.io
.cdmLight
.CdmLightExportConfigurator
;
40 import eu
.etaxonomy
.cdm
.io
.coldp
.ColDpExportConfigurator
;
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
.cdm
.io
.wfo
.out
.WfoBackboneExportConfigurator
;
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 * @created Sep 11, 2009
63 public class ExportManager
64 extends AbstractIOManager
<IExportConfigurator
>
65 implements IPostMoniteredOperationEnabled
{
67 private static final Logger logger
= LogManager
.getLogger();
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
);
83 public Job
createIOServiceJob(final IExportConfigurator configurator
, final File exportFile
) {
84 Assert
.isNotNull(configurator
, "Configuration may not be null");
86 final Display display
= Display
.getCurrent();
88 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
90 protected IStatus
run(IProgressMonitor monitor
) {
91 SubMonitor subMonitor
= SubMonitor
.convert(monitor
, 100);
92 subMonitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
94 IIOService ioService
= CdmApplicationState
.getIOService();
95 UUID uuid
= ioService
.monitExportData(configurator
);
96 IRemotingProgressMonitor remotingMonitor
;
97 List
<IFeedbackGenerator
> feedBackGeneratorList
= new ArrayList
<>();
99 remotingMonitor
= CdmStore
.getProgressMonitorClientManager().pollMonitor("Export Data",
103 feedBackGeneratorList
,
106 } catch (Exception ex
) {
107 return new Status(IStatus
.ERROR
, TaxeditorStorePlugin
.PLUGIN_ID
, "Operation Interrupted", ex
);
110 ExportResult result
= (ExportResult
)remotingMonitor
.getResult();
111 ExportDataWrapper
<?
> data
= result
.getExportData();
113 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
) || result
.getExportData().getType().equals(ExportResultType
.LIST_BYTE_ARRAY
)){
114 if (data
.getExportData() instanceof byte[]){
115 byte[] exportData
= (byte[])data
.getExportData();
116 if(exportData
!= null){
117 FileOutputStream stream
= new FileOutputStream(exportFile
);
118 Writer out
= new BufferedWriter(new OutputStreamWriter(
121 stream
.write(exportData
);
125 }else if (data
.getExportData() instanceof List
<?
>){
126 //TODO:This needs to be improved
127 @SuppressWarnings("unchecked")
128 List
<byte[]> exportData
= (List
<byte[]>)data
.getExportData();
129 if(exportData
!= null){
130 FileOutputStream stream
= new FileOutputStream(exportFile
);
131 Writer out
= new BufferedWriter(new OutputStreamWriter(
134 stream
.write(exportData
.get(0));
140 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
141 @SuppressWarnings("unchecked")
142 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
143 Set
<String
> keySet
= resultMap
.keySet();
144 String fileEnding
= ".zip";
145 if (configurator
instanceof DwcaTaxExportConfigurator
){
146 DwcaTaxExportConfigurator dwcaConfig
= (DwcaTaxExportConfigurator
)configurator
;
148 File file
= new File(dwcaConfig
.getDestination().toURI());
149 FileOutputStream stream
= new FileOutputStream(file
);
150 ZipOutputStream zos
= new ZipOutputStream(stream
);
151 for (String key
: keySet
){
152 byte[] fileData
= resultMap
.get(key
);
153 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
154 zos
.putNextEntry(entry
);
161 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
164 } catch(Exception e
){
165 logger
.error(e
.getStackTrace());
168 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
171 } catch (Exception e
) {
172 MessagingUtils
.errorDialog("Error exporting data",
175 TaxeditorStorePlugin
.PLUGIN_ID
,
179 return Status
.OK_STATUS
;
185 private IIoConfigurator
getConfigurator(TYPE type
) {
186 Assert
.isNotNull(type
, "Type should not be null");
190 return JaxbExportConfigurator
.NewInstance(null, null);
192 return SDDExportConfigurator
.NewInstance(null, null, null);
194 MessagingUtils
.notImplementedMessage(this);
195 throw new IllegalArgumentException("Export not supported yet");
199 public final JaxbExportConfigurator
JaxbConfigurator() {
200 return (JaxbExportConfigurator
) getConfigurator(TYPE
.Jaxb
);
203 public final SDDExportConfigurator
SddConfigurator() {
204 return (SDDExportConfigurator
) getConfigurator(TYPE
.Sdd
);
207 public Job
createIOServiceJob(CdmLightExportConfigurator configurator
, String urlString
) {
208 Assert
.isNotNull(configurator
, "Configuration may not be null");
209 final Display display
= Display
.getDefault();
211 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
213 protected IStatus
run(IProgressMonitor monitor
) {
214 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
216 IIOService ioService
= CdmApplicationState
.getIOService();
218 "Exporting database. This will take some time.", 100);
220 configurator
.setProgressMonitor(CdmProgressMonitorAdapter
221 .CreateSubMonitor(monitor
, 80));
222 ExportResult result
= ioService
.export(configurator
);
223 ExportDataWrapper
<?
> data
= result
.getExportData();
225 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
) || result
.getExportData().getType().equals(ExportResultType
.LIST_BYTE_ARRAY
)){
226 byte[] exportData
= (byte[])data
.getExportData();
227 if(exportData
!= null){
228 File file
= new File(urlString
);
229 FileOutputStream stream
= new FileOutputStream(file
);
230 Writer out
= new BufferedWriter(new OutputStreamWriter(
233 stream
.write(exportData
);
237 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
238 @SuppressWarnings("unchecked")
239 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
240 Set
<String
> keySet
= resultMap
.keySet();
241 SimpleDateFormat sdf
= new SimpleDateFormat(DATE_FORMAT_NOW
);
242 Calendar cal
= Calendar
.getInstance();
243 String fileEnding
= ".csv";
245 if (configurator
.isCreateZipFile()){
246 File file
= new File(urlString
+File
.separator
+ "csv_light_" + sdf
.format(cal
.getTime())+ ".zip");
247 FileOutputStream stream
= new FileOutputStream(file
);
248 ZipOutputStream zos
= new ZipOutputStream(stream
);
249 for (String key
: keySet
){
250 byte[] fileData
= resultMap
.get(key
);
251 ZipEntry entry
= new ZipEntry( key
+ fileEnding
);
252 zos
.putNextEntry(entry
);
258 for (String key
: keySet
){
259 byte[] fileData
= resultMap
.get(key
);
260 File file
= new File(urlString
+File
.separator
+ key
+ fileEnding
);
261 FileOutputStream stream
= new FileOutputStream(file
);
262 Writer out
= new BufferedWriter(new OutputStreamWriter(
264 stream
.write(fileData
);
271 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
273 } catch(Exception e
){
274 logger
.error(e
.getStackTrace());
276 showResult(configurator
.getClass().getSimpleName(), display
, result
, successMessage
);
279 } catch (Exception e
) {
280 MessagingUtils
.errorDialog("Error exporting data",
283 TaxeditorStorePlugin
.PLUGIN_ID
,
288 return Status
.OK_STATUS
;
294 public void runMoniteredOperation(final IExportConfigurator configurator
, String urlString
) {
295 IIOService ioService
= CdmApplicationState
.getIOService();
296 final UUID uuid
= ioService
.monitExportData(configurator
);
298 Display
.getDefault().asyncExec(new Runnable() {
301 boolean isZip
= false;
302 String urlAddition
= "";
303 if (configurator
instanceof CdmLightExportConfigurator
304 || configurator
instanceof ColDpExportConfigurator
305 || configurator
instanceof WfoBackboneExportConfigurator
){
307 if (configurator
instanceof CdmLightExportConfigurator
) {
308 isZip
= ((CdmLightExportConfigurator
)configurator
).isCreateZipFile();
309 }else if (configurator
instanceof ColDpExportConfigurator
){
310 isZip
= ((ColDpExportConfigurator
)configurator
).isCreateZipFile();
311 }else if (configurator
instanceof WfoBackboneExportConfigurator
){
312 isZip
= ((WfoBackboneExportConfigurator
)configurator
).isCreateZipFile();
314 SimpleDateFormat sdf
= new SimpleDateFormat(DATE_FORMAT_NOW
);
315 Calendar cal
= Calendar
.getInstance();
316 urlAddition
= File
.separator
+ ((WfoBackboneExportConfigurator
)configurator
).getFamilyStr() + "_WFO_" + sdf
.format(cal
.getTime());
320 AbstractUtility
.executeMoniteredExport(
321 configurator
.getUserFriendlyIOName() != null? configurator
.getUserFriendlyIOName(): "Export",
327 urlString
+urlAddition
,
334 public void postOperation(IRemotingProgressMonitor monitor
) {
335 Display
.getDefault().asyncExec(()-> {
336 CdmStore
.getContextManager().notifyContextRefresh();