861ce1ec752585ae06512c9649e2131b387a18a4
[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.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;
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 successful";
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 SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
203 subMonitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
204 try {
205 IIOService ioService = CdmApplicationState.getIOService();
206 UUID uuid = ioService.monitExportData(configurator);
207 IRemotingProgressMonitor remotingMonitor;
208 List<IFeedbackGenerator> feedBackGeneratorList = new ArrayList<IFeedbackGenerator>();
209 try {
210 remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data",
211 uuid,
212 1000,
213 ExportManager.this,
214 feedBackGeneratorList,
215 subMonitor);
216
217 } catch (Exception ex) {
218 return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
219 }
220
221 ExportResult result = (ExportResult)remotingMonitor.getResult();
222 ExportDataWrapper data = result.getExportData();
223 try{
224 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
225 if (data.getExportData() instanceof byte[]){
226 byte[] exportData = (byte[])data.getExportData();
227 if(exportData != null){
228 FileOutputStream stream = new FileOutputStream(exportFile);
229 Writer out = new BufferedWriter(new OutputStreamWriter(
230 stream, "UTF8"));
231
232 stream.write(exportData);
233 out.flush();
234 stream.close();
235 }
236 }else if (data.getExportData() instanceof List<?>){
237 //TODO:This needs to be improved
238 List<byte[]> exportData = (List<byte[]>)data.getExportData();
239 if(exportData != null){
240 FileOutputStream stream = new FileOutputStream(exportFile);
241 Writer out = new BufferedWriter(new OutputStreamWriter(
242 stream, "UTF8"));
243
244 stream.write(exportData.get(0));
245 out.flush();
246 stream.close();
247 }
248 }
249
250 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
251 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
252 Set<String> keySet = resultMap.keySet();
253 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
254 Calendar cal = Calendar.getInstance();
255 String fileEnding = ".zip";
256 if (configurator instanceof DwcaTaxExportConfigurator){
257 DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator;
258
259 File file = new File(dwcaConfig.getDestination().toURI());
260 FileOutputStream stream = new FileOutputStream(file);
261 ZipOutputStream zos = new ZipOutputStream(stream);
262 for (String key: keySet){
263 byte[] fileData = resultMap.get(key);
264 ZipEntry entry = new ZipEntry( key + fileEnding);
265 zos.putNextEntry(entry);
266 zos.write(fileData);
267 zos.closeEntry();
268 }
269 zos.close();
270 }
271 } else{
272 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
273 }
274
275 } catch(Exception e){
276 logger.error(e.getStackTrace());
277 }
278
279 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
280
281
282 } catch (Exception e) {
283 MessagingUtils.errorDialog("Error exporting data",
284 this,
285 e.getMessage(),
286 TaxeditorStorePlugin.PLUGIN_ID,
287 e,
288 true);
289 }
290 return Status.OK_STATUS;
291 }
292 };
293 return job;
294 }
295 /**
296 * @param jaxb
297 * @return
298 */
299 private IIoConfigurator getConfigurator(TYPE type) {
300 Assert.isNotNull(type, "Type should not be null");
301
302 switch (type) {
303 case Jaxb:
304 return JaxbExportConfigurator.NewInstance(null, null);
305 case Sdd:
306 return SDDExportConfigurator.NewInstance(null, null, null);
307 default:
308 MessagingUtils.notImplementedMessage(this);
309 throw new IllegalArgumentException("Export not supported yet");
310 }
311 }
312
313 /**
314 * <p>
315 * JaxbConfigurator
316 * </p>
317 *
318 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
319 */
320 public final JaxbExportConfigurator JaxbConfigurator() {
321 return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
322 }
323
324 /**
325 * <p>
326 * SddConfigurator
327 * </p>
328 *
329 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
330 * object.
331 */
332 public final SDDExportConfigurator SddConfigurator() {
333 return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
334 }
335
336 /**
337 * @param configurator
338 * @param urlString
339 * @return
340 */
341 public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) {
342 Assert.isNotNull(configurator, "Configuration may not be null");
343 final Display display = Display.getDefault();
344
345 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
346 @Override
347 protected IStatus run(IProgressMonitor monitor) {
348 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
349 try {
350 IIOService ioService = CdmApplicationState.getIOService();
351 monitor.beginTask(
352 "Exporting database. This will take some time.", 100);
353 monitor.worked(10);
354 configurator.setProgressMonitor(CdmProgressMonitorAdapter
355 .CreateSubMonitor(monitor, 80));
356 ExportResult result = ioService.export(configurator);
357 ExportDataWrapper data = result.getExportData();
358 try{
359 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
360 byte[] exportData = (byte[])data.getExportData();
361 if(exportData != null){
362 File file = new File(urlString);
363 FileOutputStream stream = new FileOutputStream(file);
364 Writer out = new BufferedWriter(new OutputStreamWriter(
365 stream, "UTF8"));
366
367 stream.write(exportData);
368 out.flush();
369 stream.close();
370 }
371 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
372 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
373 Set<String> keySet = resultMap.keySet();
374 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
375 Calendar cal = Calendar.getInstance();
376 String fileEnding = ".csv";
377
378 if (configurator.isCreateZipFile()){
379 File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip");
380 FileOutputStream stream = new FileOutputStream(file);
381 ZipOutputStream zos = new ZipOutputStream(stream);
382 for (String key: keySet){
383 byte[] fileData = resultMap.get(key);
384 ZipEntry entry = new ZipEntry( key + fileEnding);
385 zos.putNextEntry(entry);
386 zos.write(fileData);
387 zos.closeEntry();
388 }
389 zos.close();
390 }else{
391 for (String key: keySet){
392 byte[] fileData = resultMap.get(key);
393 File file = new File(urlString+File.separator + key + fileEnding);
394 FileOutputStream stream = new FileOutputStream(file);
395 Writer out = new BufferedWriter(new OutputStreamWriter(
396 stream, "UTF8"));
397 stream.write(fileData);
398 stream.close();
399 }
400 }
401 }else{
402 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
403 }
404 } catch(Exception e){
405 logger.error(e.getStackTrace());
406 }
407 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
408
409
410 } catch (Exception e) {
411 MessagingUtils.errorDialog("Error exporting data",
412 this,
413 e.getMessage(),
414 TaxeditorStorePlugin.PLUGIN_ID,
415 e,
416 true);
417 }
418
419 return Status.OK_STATUS;
420 }
421 };
422 return job;
423 }
424
425 public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
426 IIOService ioService = CdmApplicationState.getIOService();
427 final UUID uuid = ioService.monitExportData(configurator);
428
429 Display.getDefault().asyncExec(new Runnable() {
430 @Override
431 public void run() {
432 boolean isZip = false;
433 if (configurator instanceof CdmLightExportConfigurator){
434 isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
435 }
436 AbstractUtility.executeMoniteredExport("Export: " + configurator.getClass().getSimpleName(),
437 uuid,
438 1000,
439 true,
440 ExportManager.this,
441 null,
442 urlString,
443 isZip);
444
445 }
446 });
447
448 }
449
450 @Override
451 public void postOperation(IRemotingProgressMonitor monitor) {
452 Display.getDefault().asyncExec(new Runnable() {
453
454 @Override
455 public void run() {
456 CdmStore.getContextManager().notifyContextRefresh();
457 }
458 });
459
460 }
461
462 }