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
;
13 import java
.io
.FileOutputStream
;
14 import java
.util
.List
;
18 import org
.apache
.log4j
.Logger
;
19 import org
.eclipse
.core
.runtime
.Assert
;
20 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
21 import org
.eclipse
.core
.runtime
.IStatus
;
22 import org
.eclipse
.core
.runtime
.Status
;
23 import org
.eclipse
.core
.runtime
.jobs
.Job
;
24 import org
.eclipse
.swt
.widgets
.Display
;
25 import org
.eclipse
.ui
.IWorkbenchPart
;
26 import org
.eclipse
.ui
.PlatformUI
;
28 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
29 import eu
.etaxonomy
.cdm
.api
.application
.ICdmRepository
;
30 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
31 import eu
.etaxonomy
.cdm
.io
.common
.CdmDefaultExport
;
32 import eu
.etaxonomy
.cdm
.io
.common
.ExportDataWrapper
;
33 import eu
.etaxonomy
.cdm
.io
.common
.ExportResult
;
34 import eu
.etaxonomy
.cdm
.io
.common
.ExportResultType
;
35 import eu
.etaxonomy
.cdm
.io
.common
.IExportConfigurator
;
36 import eu
.etaxonomy
.cdm
.io
.common
.IIoConfigurator
;
37 import eu
.etaxonomy
.cdm
.io
.common
.IoResultBase
;
38 import eu
.etaxonomy
.cdm
.io
.common
.IoResultBase
.IoInfo
;
39 import eu
.etaxonomy
.cdm
.io
.jaxb
.JaxbExportConfigurator
;
40 import eu
.etaxonomy
.cdm
.io
.outputmodel
.OutputModelConfigurator
;
41 import eu
.etaxonomy
.cdm
.io
.sdd
.out
.SDDExportConfigurator
;
42 import eu
.etaxonomy
.cdm
.io
.service
.IIOService
;
43 import eu
.etaxonomy
.taxeditor
.model
.CdmProgressMonitorAdapter
;
44 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
45 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
46 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
47 import eu
.etaxonomy
.taxeditor
.store
.internal
.TaxeditorStorePlugin
;
48 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.ReportTextDialog
;
52 * ExportHandler class.
56 * @created Sep 11, 2009
59 public class ExportManager
extends AbstractIOManager
<IExportConfigurator
> {
61 private static final Logger logger
= Logger
.getLogger(ExportManager
.class);
65 * @param applicationConfiguration
67 private ExportManager(ICdmRepository applicationConfiguration
) {
68 super(applicationConfiguration
);
76 * @param applicationConfiguration
78 * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
80 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
82 public static ExportManager
NewInstance(
83 ICdmRepository applicationConfiguration
) {
84 return new ExportManager(applicationConfiguration
);
93 * a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
95 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
98 protected Job
createIOJob(final IExportConfigurator configurator
) {
100 Assert
.isNotNull(configurator
, "Configuration may not be null");
102 final Display display
= Display
.getCurrent();
104 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) {
106 protected IStatus
run(IProgressMonitor monitor
) {
108 "Exporting database. This will take some time.", 100);
111 /** see ticket # 4456 and */
112 // display.asyncExec(new Runnable() {
115 // public void run() {
117 // // terminate any open transactions
118 // IConversationEnabled activePart = (IConversationEnabled) StoreUtil
119 // .getActivePage().getActivePart();
120 // activePart.getConversationHolder().commit(false);
124 // monitor.worked(10);
126 CdmDefaultExport
<IExportConfigurator
> exporter
= new CdmDefaultExport
<IExportConfigurator
>();
127 configurator
.setProgressMonitor(CdmProgressMonitorAdapter
128 .CreateSubMonitor(monitor
, 80));
129 exporter
.setCdmAppController(applicationConfiguration
);
133 exporter
.invoke(configurator
);
135 } catch (RuntimeException e
) {
136 MessagingUtils
.messageDialog("Error exporting data", this,
137 "An error occured while"
138 + "exporting to destination '"
139 + configurator
.getDestinationNameString()
141 + "Please check error log for details.", e
);
144 display
.asyncExec(new Runnable() {
148 IWorkbenchPart activePart
= StoreUtil
.getActivePage()
150 if (activePart
instanceof IConversationEnabled
) {
151 // terminate any open transactions
152 IConversationEnabled conversationEnabled
= (IConversationEnabled
) activePart
;
153 // restarting transaction and committing it to
156 // TODO verify correct behaviour
159 conversationEnabled
.getConversationHolder()
162 conversationEnabled
.getConversationHolder()
164 }catch(RuntimeException e
){
165 MessagingUtils
.messageDialog("Error starting conversation handling", this, "" +
166 "Conversation Error: "+ e
);
173 return Status
.OK_STATUS
;
180 public Job
createIOServiceJob(final IExportConfigurator configurator
, final File exportFile
) {
181 Assert
.isNotNull(configurator
, "Configuration may not be null");
183 // final Display display = Display.getCurrent();
185 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
187 protected IStatus
run(IProgressMonitor monitor
) {
188 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
190 IIOService ioService
= CdmApplicationState
.getIOService();
192 ExportResult result
= ioService
.export(configurator
);
193 ExportDataWrapper data
= result
.getExportData();
195 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
)){
196 byte[] exportData
= (byte[])data
.getExportData();
197 if(exportData
!= null){
198 FileOutputStream stream
= new FileOutputStream(exportFile
);
199 stream
.write(exportData
);
202 // } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
203 // Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
204 // Set<String> keySet = resultMap.keySet();
205 // for (String key: keySet){
206 // byte[] fileData = resultMap.get(key);
207 // File file = new File(urlString)
208 // FileOutputStream stream = new FileOutputStream(key);
209 // stream.write(fileData);
214 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
216 } catch(Exception e
){
217 logger
.error(e
.getStackTrace());
223 } catch (Exception e
) {
224 MessagingUtils
.errorDialog("Error exporting data",
227 TaxeditorStorePlugin
.PLUGIN_ID
,
231 return Status
.OK_STATUS
;
240 private IIoConfigurator
getConfigurator(TYPE type
) {
241 Assert
.isNotNull(type
, "Type should not be null");
245 return JaxbExportConfigurator
.NewInstance(null, null);
247 return SDDExportConfigurator
.NewInstance(null, null, null);
249 MessagingUtils
.notImplementedMessage(this);
250 throw new IllegalArgumentException("Export not supported yet");
259 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
261 public final JaxbExportConfigurator
JaxbConfigurator() {
262 return (JaxbExportConfigurator
) getConfigurator(TYPE
.Jaxb
);
270 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
273 public final SDDExportConfigurator
SddConfigurator() {
274 return (SDDExportConfigurator
) getConfigurator(TYPE
.Sdd
);
278 * @param configurator
282 public Job
createIOServiceJob(OutputModelConfigurator configurator
, String urlString
) {
283 Assert
.isNotNull(configurator
, "Configuration may not be null");
285 // final Display display = Display.getCurrent();
287 Job job
= new Job("Export: " + configurator
.getClass().getSimpleName()) { //$NON-NLS-1$
289 protected IStatus
run(IProgressMonitor monitor
) {
290 monitor
.beginTask("Exporting database. This will take some time.", IProgressMonitor
.UNKNOWN
);
292 IIOService ioService
= CdmApplicationState
.getIOService();
294 ExportResult result
= ioService
.export(configurator
);
295 ExportDataWrapper data
= result
.getExportData();
297 if (result
.getExportData().getType().equals(ExportResultType
.BYTE_ARRAY
)){
298 byte[] exportData
= (byte[])data
.getExportData();
299 if(exportData
!= null){
300 File file
= new File(urlString
);
301 FileOutputStream stream
= new FileOutputStream(file
);
302 stream
.write(exportData
);
305 } else if (result
.getExportData().getType().equals(ExportResultType
.MAP_BYTE_ARRAY
)){
306 Map
<String
, byte[]> resultMap
= (Map
<String
, byte[]>)data
.getExportData();
307 Set
<String
> keySet
= resultMap
.keySet();
308 for (String key
: keySet
){
309 byte[] fileData
= resultMap
.get(key
);
310 String fileEnding
="";
311 if (configurator
instanceof OutputModelConfigurator
){
314 File file
= new File(urlString
+File
.separator
+ key
+ fileEnding
);
315 FileOutputStream stream
= new FileOutputStream(file
);
316 stream
.write(fileData
);
321 logger
.error("This kind of result data is not supported yet." + result
.getExportData().getType().toString());
323 } catch(Exception e
){
324 logger
.error(e
.getStackTrace());
326 final StringBuilder reportText
= new StringBuilder();
328 List
<IoInfo
> reports
= result
.getErrors();
329 reportText
.append("Errors:\\r");
330 for (IoInfo bs
: reports
) {
331 reportText
.append(bs
.getMessage() + " - " +bs
.getException().getStackTrace());
333 List
<IoResultBase
.IoInfo
> warnings
= result
.getWarnings();
334 reportText
.append("Warnings:\\r");
335 for (IoResultBase
.IoInfo bs
: warnings
) {
336 reportText
.append(bs
);
338 List
<IoInfo
> exceptions
= result
.getExceptions();
339 reportText
.append("Exceptions:\\r");
340 for (IoInfo bs
: exceptions
) {
341 reportText
.append(bs
.getMessage() + " - " +bs
.getException().getStackTrace());
346 final Display display
= Display
.getDefault();
347 display
.asyncExec(new Runnable() {
351 // display reports with possibility to save
352 ReportTextDialog dialog
= new ReportTextDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell());
353 dialog
.setTitle(configurator
.getClass().getSimpleName()+" Report");
354 dialog
.setReportText(reportText
.toString());
356 CdmStore
.getContextManager().notifyContextRefresh();
362 } catch (Exception e
) {
363 MessagingUtils
.errorDialog("Error exporting data",
366 TaxeditorStorePlugin
.PLUGIN_ID
,
371 return Status
.OK_STATUS
;