Project

General

Profile

Download (18 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(2-2/3)