ref #6786 fix window title of selection dialogs
[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.BufferedWriter;
13 import java.io.File;
14 import java.io.FileOutputStream;
15 import java.io.OutputStreamWriter;
16 import java.io.Writer;
17 import java.text.SimpleDateFormat;
18 import java.util.ArrayList;
19 import java.util.Calendar;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.Set;
23 import java.util.UUID;
24 import java.util.zip.ZipEntry;
25 import java.util.zip.ZipOutputStream;
26
27 import org.apache.log4j.Logger;
28 import org.eclipse.core.runtime.IStatus;
29 import org.eclipse.core.runtime.jobs.Job;
30 import org.eclipse.swt.widgets.Display;
31 import org.eclipse.core.runtime.Assert;
32 import org.eclipse.core.runtime.IProgressMonitor;
33 import org.eclipse.core.runtime.Status;
34
35
36 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
37 import eu.etaxonomy.cdm.api.application.ICdmRepository;
38 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
39 import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
40 import eu.etaxonomy.cdm.io.cdmLight.CdmLightExportConfigurator;
41 import eu.etaxonomy.cdm.io.common.CdmDefaultExport;
42 import eu.etaxonomy.cdm.io.common.ExportDataWrapper;
43 import eu.etaxonomy.cdm.io.common.ExportResult;
44 import eu.etaxonomy.cdm.io.common.ExportResultType;
45 import eu.etaxonomy.cdm.io.common.IExportConfigurator;
46 import eu.etaxonomy.cdm.io.common.IIoConfigurator;
47 import eu.etaxonomy.cdm.io.dwca.out.DwcaTaxExportConfigurator;
48 import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
49 import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
50 import eu.etaxonomy.cdm.io.service.IIOService;
51 import eu.etaxonomy.taxeditor.event.EventUtility;
52 import eu.etaxonomy.taxeditor.model.AbstractUtility;
53 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
54 import eu.etaxonomy.taxeditor.model.MessagingUtils;
55 import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
56 import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
57 import eu.etaxonomy.taxeditor.store.CdmStore;
58 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
59
60 /**
61 * <p>
62 * ExportHandler class.
63 * </p>
64 *
65 * @author n.hoffmann
66 * @created Sep 11, 2009
67 * @version 1.0
68 */
69 public class ExportManager extends AbstractIOManager<IExportConfigurator> implements IPostMoniteredOperationEnabled {
70
71 private final String successMessage = "The export was successfull";
72
73 private static final Logger logger = Logger.getLogger(ExportManager.class);
74 /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
75 public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm";
76 /**
77 *
78 * @param applicationConfiguration
79 */
80 private ExportManager(ICdmRepository applicationConfiguration) {
81 super(applicationConfiguration);
82 }
83
84 /**
85 * <p>
86 * NewInstance
87 * </p>
88 *
89 * @param applicationConfiguration
90 * a
91 * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
92 * object.
93 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
94 */
95 public static ExportManager NewInstance(
96 ICdmRepository applicationConfiguration) {
97 return new ExportManager(applicationConfiguration);
98 }
99
100 /**
101 * <p>
102 * createIOJob
103 * </p>
104 *
105 * @param configurator
106 * a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
107 * object.
108 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
109 */
110 @Override
111 protected Job createIOJob(final IExportConfigurator configurator) {
112
113 Assert.isNotNull(configurator, "Configuration may not be null");
114
115 final Display display = Display.getCurrent();
116
117 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
118 @Override
119 protected IStatus run(IProgressMonitor monitor) {
120 monitor.beginTask(
121 "Exporting database. This will take some time.", 100);
122 monitor.worked(10);
123
124 /** see ticket # 4456 and */
125 // display.asyncExec(new Runnable() {
126 //
127 // @Override
128 // public void run() {
129 //
130 // // terminate any open transactions
131 // IConversationEnabled activePart = (IConversationEnabled) StoreUtil
132 // .getActivePage().getActivePart();
133 // activePart.getConversationHolder().commit(false);
134 // }
135 // });
136
137 // monitor.worked(10);
138
139 CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<IExportConfigurator>();
140 configurator.setProgressMonitor(CdmProgressMonitorAdapter
141 .CreateSubMonitor(monitor, 80));
142 exporter.setCdmAppController(applicationConfiguration);
143 monitor.worked(10);
144
145 try {
146 exporter.invoke(configurator);
147 monitor.worked(60);
148 } catch (RuntimeException e) {
149 MessagingUtils.messageDialog("Error exporting data", this,
150 "An error occurred while"
151 + "exporting to destination '"
152 + configurator.getDestinationNameString()
153 + "'.\n"
154 + "Please check error log for details.", e);
155 }
156
157 display.asyncExec(new Runnable() {
158
159 @Override
160 public void run() {
161 Object activePart = EventUtility.getActivePart();
162 if (activePart instanceof IConversationEnabled) {
163 // terminate any open transactions
164 IConversationEnabled conversationEnabled = (IConversationEnabled) activePart;
165 // restarting transaction and committing it to
166 // trigger
167 // change listener
168 // TODO verify correct behaviour
169
170 try{
171 conversationEnabled.getConversationHolder()
172 .startTransaction();
173
174 conversationEnabled.getConversationHolder()
175 .commit();
176 }catch(RuntimeException e){
177 MessagingUtils.messageDialog("Error starting conversation handling", this, "" +
178 "Conversation Error: "+ e);
179 }
180 }
181 }
182 });
183 monitor.worked(10);
184
185 return Status.OK_STATUS;
186 }
187
188
189 };
190
191 return job;
192 }
193
194 public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
195 Assert.isNotNull(configurator, "Configuration may not be null");
196
197 final Display display = Display.getCurrent();
198
199 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
200 @Override
201 protected IStatus run(IProgressMonitor monitor) {
202 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
203 try {
204 IIOService ioService = CdmApplicationState.getIOService();
205 UUID uuid = ioService.monitExportData(configurator);
206 IRemotingProgressMonitor remotingMonitor;
207 List<IFeedbackGenerator> feedBackGeneratorList = new ArrayList<IFeedbackGenerator>();
208 try {
209 remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data",
210 uuid,
211 1000,
212 ExportManager.this,
213 feedBackGeneratorList,
214 monitor);
215
216 } catch (Exception ex) {
217 return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
218 }
219
220 ExportResult result = (ExportResult)remotingMonitor.getResult();
221 ExportDataWrapper data = result.getExportData();
222 try{
223 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
224 if (data.getExportData() instanceof byte[]){
225 byte[] exportData = (byte[])data.getExportData();
226 if(exportData != null){
227 FileOutputStream stream = new FileOutputStream(exportFile);
228 Writer out = new BufferedWriter(new OutputStreamWriter(
229 stream, "UTF8"));
230
231 stream.write(exportData);
232 out.flush();
233 stream.close();
234 }
235 }else if (data.getExportData() instanceof List<?>){
236 //TODO:This needs to be improved
237 List<byte[]> exportData = (List<byte[]>)data.getExportData();
238 if(exportData != null){
239 FileOutputStream stream = new FileOutputStream(exportFile);
240 Writer out = new BufferedWriter(new OutputStreamWriter(
241 stream, "UTF8"));
242
243 stream.write(exportData.get(0));
244 out.flush();
245 stream.close();
246 }
247 }
248
249 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
250 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
251 Set<String> keySet = resultMap.keySet();
252 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
253 Calendar cal = Calendar.getInstance();
254 String fileEnding = ".zip";
255 if (configurator instanceof DwcaTaxExportConfigurator){
256 DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator;
257
258 File file = new File(dwcaConfig.getDestination().toURI());
259 FileOutputStream stream = new FileOutputStream(file);
260 ZipOutputStream zos = new ZipOutputStream(stream);
261 for (String key: keySet){
262 byte[] fileData = resultMap.get(key);
263 ZipEntry entry = new ZipEntry( key + fileEnding);
264 zos.putNextEntry(entry);
265 zos.write(fileData);
266 zos.closeEntry();
267 }
268 zos.close();
269 }
270 } else{
271 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
272 }
273
274 } catch(Exception e){
275 logger.error(e.getStackTrace());
276 }
277
278 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
279
280
281 } catch (Exception e) {
282 MessagingUtils.errorDialog("Error exporting data",
283 this,
284 e.getMessage(),
285 TaxeditorStorePlugin.PLUGIN_ID,
286 e,
287 true);
288 }
289 return Status.OK_STATUS;
290 }
291 };
292 return job;
293 }
294 /**
295 * @param jaxb
296 * @return
297 */
298 private IIoConfigurator getConfigurator(TYPE type) {
299 Assert.isNotNull(type, "Type should not be null");
300
301 switch (type) {
302 case Jaxb:
303 return JaxbExportConfigurator.NewInstance(null, null);
304 case Sdd:
305 return SDDExportConfigurator.NewInstance(null, null, null);
306 default:
307 MessagingUtils.notImplementedMessage(this);
308 throw new IllegalArgumentException("Export not supported yet");
309 }
310 }
311
312 /**
313 * <p>
314 * JaxbConfigurator
315 * </p>
316 *
317 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
318 */
319 public final JaxbExportConfigurator JaxbConfigurator() {
320 return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
321 }
322
323 /**
324 * <p>
325 * SddConfigurator
326 * </p>
327 *
328 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
329 * object.
330 */
331 public final SDDExportConfigurator SddConfigurator() {
332 return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
333 }
334
335 /**
336 * @param configurator
337 * @param urlString
338 * @return
339 */
340 public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) {
341 Assert.isNotNull(configurator, "Configuration may not be null");
342 final Display display = Display.getDefault();
343
344 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
345 @Override
346 protected IStatus run(IProgressMonitor monitor) {
347 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
348 try {
349 IIOService ioService = CdmApplicationState.getIOService();
350
351 ExportResult result = ioService.export(configurator);
352 ExportDataWrapper data = result.getExportData();
353 try{
354 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
355 byte[] exportData = (byte[])data.getExportData();
356 if(exportData != null){
357 File file = new File(urlString);
358 FileOutputStream stream = new FileOutputStream(file);
359 Writer out = new BufferedWriter(new OutputStreamWriter(
360 stream, "UTF8"));
361
362 stream.write(exportData);
363 out.flush();
364 stream.close();
365 }
366 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
367 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
368 Set<String> keySet = resultMap.keySet();
369 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
370 Calendar cal = Calendar.getInstance();
371 String fileEnding = ".csv";
372
373 if (configurator.isCreateZipFile()){
374 File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip");
375 FileOutputStream stream = new FileOutputStream(file);
376 ZipOutputStream zos = new ZipOutputStream(stream);
377 for (String key: keySet){
378 byte[] fileData = resultMap.get(key);
379 ZipEntry entry = new ZipEntry( key + fileEnding);
380 zos.putNextEntry(entry);
381 zos.write(fileData);
382 zos.closeEntry();
383 }
384 zos.close();
385 }else{
386 for (String key: keySet){
387 byte[] fileData = resultMap.get(key);
388 File file = new File(urlString+File.separator + key + fileEnding);
389 FileOutputStream stream = new FileOutputStream(file);
390 Writer out = new BufferedWriter(new OutputStreamWriter(
391 stream, "UTF8"));
392 stream.write(fileData);
393 stream.close();
394 }
395 }
396 }else{
397 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
398 }
399 } catch(Exception e){
400 logger.error(e.getStackTrace());
401 }
402 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
403
404
405 } catch (Exception e) {
406 MessagingUtils.errorDialog("Error exporting data",
407 this,
408 e.getMessage(),
409 TaxeditorStorePlugin.PLUGIN_ID,
410 e,
411 true);
412 }
413
414 return Status.OK_STATUS;
415 }
416 };
417 return job;
418 }
419
420 public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
421 IIOService ioService = CdmApplicationState.getIOService();
422 final UUID uuid = ioService.monitExportData(configurator);
423
424 Display.getDefault().asyncExec(new Runnable() {
425 @Override
426 public void run() {
427 boolean isZip = false;
428 if (configurator instanceof CdmLightExportConfigurator){
429 isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
430 }
431 AbstractUtility.executeMoniteredExport("Export: " + configurator.getClass().getSimpleName(),
432 uuid,
433 1000,
434 true,
435 ExportManager.this,
436 null,
437 urlString,
438 isZip);
439 }
440 });
441
442 }
443
444 @Override
445 public void postOperation(IRemotingProgressMonitor monitor) {
446 Display.getDefault().asyncExec(new Runnable() {
447
448 @Override
449 public void run() {
450 CdmStore.getContextManager().notifyContextRefresh();
451 }
452 });
453
454 }
455
456 }