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