Merge branch 'develop' into remoting-4.0
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / io / ExportManager.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.io;
12
13 import java.io.File;
14 import java.io.FileOutputStream;
15 import java.util.List;
16
17 import org.eclipse.core.runtime.Assert;
18 import org.eclipse.core.runtime.IProgressMonitor;
19 import org.eclipse.core.runtime.IStatus;
20 import org.eclipse.core.runtime.Status;
21 import org.eclipse.core.runtime.jobs.Job;
22 import org.eclipse.swt.widgets.Display;
23 import org.eclipse.ui.IWorkbenchPart;
24
25 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
26 import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
27 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
28 import eu.etaxonomy.cdm.io.common.CdmDefaultExport;
29 import eu.etaxonomy.cdm.io.common.ExportResult;
30 import eu.etaxonomy.cdm.io.common.IExportConfigurator;
31 import eu.etaxonomy.cdm.io.common.IIoConfigurator;
32 import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
33 import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
34 import eu.etaxonomy.cdm.io.service.IIOService;
35 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
36 import eu.etaxonomy.taxeditor.model.MessagingUtils;
37 import eu.etaxonomy.taxeditor.store.StoreUtil;
38 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
39
40 /**
41 * <p>
42 * ExportHandler class.
43 * </p>
44 *
45 * @author n.hoffmann
46 * @created Sep 11, 2009
47 * @version 1.0
48 */
49 public class ExportManager extends AbstractIOManager<IExportConfigurator> {
50
51 /**
52 *
53 * @param applicationConfiguration
54 */
55 private ExportManager(ICdmApplicationConfiguration applicationConfiguration) {
56 super(applicationConfiguration);
57 }
58
59 /**
60 * <p>
61 * NewInstance
62 * </p>
63 *
64 * @param applicationConfiguration
65 * a
66 * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
67 * object.
68 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
69 */
70 public static ExportManager NewInstance(
71 ICdmApplicationConfiguration applicationConfiguration) {
72 return new ExportManager(applicationConfiguration);
73 }
74
75 /**
76 * <p>
77 * createIOJob
78 * </p>
79 *
80 * @param configurator
81 * a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
82 * object.
83 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
84 */
85 @Override
86 protected Job createIOJob(final IExportConfigurator configurator) {
87
88 Assert.isNotNull(configurator, "Configuration may not be null");
89
90 final Display display = Display.getCurrent();
91
92 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
93 @Override
94 protected IStatus run(IProgressMonitor monitor) {
95 monitor.beginTask(
96 "Exporting database. This will take some time.", 100);
97 monitor.worked(10);
98
99 /** see ticket # 4456 and */
100 // display.asyncExec(new Runnable() {
101 //
102 // @Override
103 // public void run() {
104 //
105 // // terminate any open transactions
106 // IConversationEnabled activePart = (IConversationEnabled) StoreUtil
107 // .getActivePage().getActivePart();
108 // activePart.getConversationHolder().commit(false);
109 // }
110 // });
111
112 // monitor.worked(10);
113
114 CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<IExportConfigurator>();
115 configurator.setProgressMonitor(CdmProgressMonitorAdapter
116 .CreateSubMonitor(monitor, 80));
117 exporter.setCdmAppController(applicationConfiguration);
118 monitor.worked(10);
119
120 try {
121 exporter.invoke(configurator);
122 monitor.worked(60);
123 } catch (RuntimeException e) {
124 MessagingUtils.messageDialog("Error exporting data", this,
125 "An error occured while"
126 + "exporting to destination '"
127 + configurator.getDestinationNameString()
128 + "'.\n"
129 + "Please check error log for details.", e);
130 }
131
132 display.asyncExec(new Runnable() {
133
134 @Override
135 public void run() {
136 IWorkbenchPart activePart = StoreUtil.getActivePage()
137 .getActivePart();
138 if (activePart instanceof IConversationEnabled) {
139 // terminate any open transactions
140 IConversationEnabled conversationEnabled = (IConversationEnabled) activePart;
141 // restarting transaction and committing it to
142 // trigger
143 // change listener
144 // TODO verify correct behaviour
145
146 try{
147 conversationEnabled.getConversationHolder()
148 .startTransaction();
149
150 conversationEnabled.getConversationHolder()
151 .commit();
152 }catch(RuntimeException e){
153 MessagingUtils.messageDialog("Error starting conversation handling", this, "" +
154 "Conversation Error: "+ e);
155 }
156 }
157 }
158 });
159 monitor.worked(10);
160
161 return Status.OK_STATUS;
162 }
163 };
164
165 return job;
166 }
167
168 public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
169 Assert.isNotNull(configurator, "Configuration may not be null");
170
171 final Display display = Display.getCurrent();
172
173 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
174 @Override
175 protected IStatus run(IProgressMonitor monitor) {
176 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
177 try {
178 IIOService ioService = CdmApplicationState.getIOService();
179
180 ExportResult result = ioService.export(configurator);
181 List<byte[]> dataList = result.getExportData();
182 byte[] exportData = dataList.get(0);
183
184 FileOutputStream stream = new FileOutputStream(exportFile);
185 try {
186 stream.write(exportData);
187 } finally {
188 stream.close();
189 }
190
191 } catch (Exception e) {
192 MessagingUtils.errorDialog("Error exporting data",
193 this,
194 e.getMessage(),
195 TaxeditorStorePlugin.PLUGIN_ID,
196 e,
197 true);
198 }
199 return Status.OK_STATUS;
200 }
201 };
202 return job;
203 }
204 /**
205 * @param jaxb
206 * @return
207 */
208 private IIoConfigurator getConfigurator(TYPE type) {
209 Assert.isNotNull(type, "Type should not be null");
210
211 switch (type) {
212 case Jaxb:
213 return JaxbExportConfigurator.NewInstance(null, null);
214 case Sdd:
215 return SDDExportConfigurator.NewInstance(null, null, null);
216 default:
217 MessagingUtils.notImplementedMessage(this);
218 throw new IllegalArgumentException("Export not supported yet");
219 }
220 }
221
222 /**
223 * <p>
224 * JaxbConfigurator
225 * </p>
226 *
227 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
228 */
229 public final JaxbExportConfigurator JaxbConfigurator() {
230 return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
231 }
232
233 /**
234 * <p>
235 * SddConfigurator
236 * </p>
237 *
238 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
239 * object.
240 */
241 public final SDDExportConfigurator SddConfigurator() {
242 return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
243 }
244
245
246
247 }