Project

General

Profile

Download (17.8 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.jobs.Job;
33
import org.eclipse.swt.widgets.Display;
34

    
35
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
36
import eu.etaxonomy.cdm.api.application.ICdmRepository;
37
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
38
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
39
import eu.etaxonomy.cdm.io.cdmLight.CdmLightExportConfigurator;
40
import eu.etaxonomy.cdm.io.common.CdmDefaultExport;
41
import eu.etaxonomy.cdm.io.common.ExportDataWrapper;
42
import eu.etaxonomy.cdm.io.common.ExportResult;
43
import eu.etaxonomy.cdm.io.common.ExportResultType;
44
import eu.etaxonomy.cdm.io.common.IExportConfigurator;
45
import eu.etaxonomy.cdm.io.common.IIoConfigurator;
46
import eu.etaxonomy.cdm.io.dwca.out.DwcaTaxExportConfigurator;
47
import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
48
import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
49
import eu.etaxonomy.cdm.io.service.IIOService;
50
import eu.etaxonomy.taxeditor.event.EventUtility;
51
import eu.etaxonomy.taxeditor.model.AbstractUtility;
52
import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
53
import eu.etaxonomy.taxeditor.model.MessagingUtils;
54
import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
55
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
56
import eu.etaxonomy.taxeditor.store.CdmStore;
57
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
58

    
59
/**
60
 * <p>
61
 * ExportHandler class.
62
 * </p>
63
 *
64
 * @author n.hoffmann
65
 * @created Sep 11, 2009
66
 * @version 1.0
67
 */
68
public class ExportManager extends AbstractIOManager<IExportConfigurator> implements IPostMoniteredOperationEnabled {
69

    
70
	private final String successMessage = "The export was successfull";
71

    
72
    private static final Logger logger = Logger.getLogger(ExportManager.class);
73
    /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
74
	public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm";
75
	/**
76
	 *
77
	 * @param applicationConfiguration
78
	 */
79
	private ExportManager(ICdmRepository applicationConfiguration) {
80
		super(applicationConfiguration);
81
	}
82

    
83
	/**
84
	 * <p>
85
	 * NewInstance
86
	 * </p>
87
	 *
88
	 * @param applicationConfiguration
89
	 *            a
90
	 *            {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
91
	 *            object.
92
	 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
93
	 */
94
	public static ExportManager NewInstance(
95
			ICdmRepository applicationConfiguration) {
96
		return new ExportManager(applicationConfiguration);
97
	}
98

    
99
	/**
100
	 * <p>
101
	 * createIOJob
102
	 * </p>
103
	 *
104
	 * @param configurator
105
	 *            a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
106
	 *            object.
107
	 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
108
	 */
109
	@Override
110
	protected Job createIOJob(final IExportConfigurator configurator) {
111

    
112
		Assert.isNotNull(configurator, "Configuration may not be null");
113

    
114
		final Display display = Display.getCurrent();
115

    
116
		Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
117
			@Override
118
			protected IStatus run(IProgressMonitor monitor) {
119
				monitor.beginTask(
120
						"Exporting database. This will take some time.", 100);
121
				monitor.worked(10);
122

    
123
			    /** see ticket # 4456 and */
124
//				display.asyncExec(new Runnable() {
125
//
126
//					@Override
127
//					public void run() {
128
//
129
//					    // terminate any open transactions
130
//						IConversationEnabled activePart = (IConversationEnabled) StoreUtil
131
//								.getActivePage().getActivePart();
132
//						activePart.getConversationHolder().commit(false);
133
//					}
134
//				});
135

    
136
//				monitor.worked(10);
137

    
138
				CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<IExportConfigurator>();
139
				configurator.setProgressMonitor(CdmProgressMonitorAdapter
140
						.CreateSubMonitor(monitor, 80));
141
				exporter.setCdmAppController(applicationConfiguration);
142
				monitor.worked(10);
143

    
144
				try {
145
					exporter.invoke(configurator);
146
					monitor.worked(60);
147
				} catch (RuntimeException e) {
148
					MessagingUtils.messageDialog("Error exporting data", this,
149
							"An error occurred while"
150
									+ "exporting to destination '"
151
									+ configurator.getDestinationNameString()
152
									+ "'.\n"
153
									+ "Please check error log for details.", e);
154
				}
155

    
156
				display.asyncExec(new Runnable() {
157

    
158
					@Override
159
					public void run() {
160
						Object activePart = EventUtility.getActivePart();
161
						if (activePart instanceof IConversationEnabled) {
162
							// terminate any open transactions
163
							IConversationEnabled conversationEnabled = (IConversationEnabled) activePart;
164
							// restarting transaction and committing it to
165
							// trigger
166
							// change listener
167
							// TODO verify correct behaviour
168

    
169
							try{
170
								conversationEnabled.getConversationHolder()
171
									.startTransaction();
172

    
173
								conversationEnabled.getConversationHolder()
174
									.commit();
175
							}catch(RuntimeException e){
176
								MessagingUtils.messageDialog("Error starting conversation handling", this, "" +
177
										"Conversation Error: "+ e);
178
							}
179
						}
180
					}
181
				});
182
				monitor.worked(10);
183

    
184
				return Status.OK_STATUS;
185
			}
186

    
187

    
188
		};
189

    
190
		return job;
191
	}
192

    
193
	public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
194
	    Assert.isNotNull(configurator, "Configuration may not be null");
195

    
196
	    final Display display = Display.getCurrent();
197

    
198
	    Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
199
	        @Override
200
	        protected IStatus run(IProgressMonitor monitor) {
201
	            monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
202
	            try {
203
	                IIOService ioService = CdmApplicationState.getIOService();
204
	                UUID uuid = ioService.monitExportData(configurator);
205
	                IRemotingProgressMonitor remotingMonitor;
206
	                List<IFeedbackGenerator> feedBackGeneratorList = new ArrayList<IFeedbackGenerator>();
207
                    try {
208
                        remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data",
209
                                uuid,
210
                                1000,
211
                                ExportManager.this,
212
                                feedBackGeneratorList,
213
                                monitor);
214

    
215
                    } catch (Exception ex) {
216
                        return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
217
                    }
218

    
219
	                ExportResult result = (ExportResult)remotingMonitor.getResult();
220
	                ExportDataWrapper data = result.getExportData();
221
	                try{
222
    	                if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
223
    	                    if (data.getExportData() instanceof byte[]){
224
    	                        byte[] exportData = (byte[])data.getExportData();
225
    	                        if(exportData != null){
226
                                    FileOutputStream stream = new FileOutputStream(exportFile);
227
                                    Writer out = new BufferedWriter(new OutputStreamWriter(
228
                                           stream, "UTF8"));
229

    
230
                                    stream.write(exportData);
231
                                    out.flush();
232
                                    stream.close();
233
                                }
234
    	                    }else if (data.getExportData() instanceof List<?>){
235
                                //TODO:This needs to be improved
236
    	                        List<byte[]> exportData = (List<byte[]>)data.getExportData();
237
                                    if(exportData != null){
238
                                        FileOutputStream stream = new FileOutputStream(exportFile);
239
                                        Writer out = new BufferedWriter(new OutputStreamWriter(
240
                                               stream, "UTF8"));
241

    
242
                                        stream.write(exportData.get(0));
243
                                        out.flush();
244
                                        stream.close();
245
                                }
246
    	                    }
247

    
248
    	                } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
249
                            Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
250
                            Set<String> keySet = resultMap.keySet();
251
                            SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
252
                            Calendar cal = Calendar.getInstance();
253
                            String fileEnding = ".zip";
254
                            if (configurator instanceof DwcaTaxExportConfigurator){
255
                            	DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator;
256

    
257
                            	File file = new File(dwcaConfig.getDestination().toURI());
258
                                FileOutputStream stream = new FileOutputStream(file);
259
                                ZipOutputStream zos = new ZipOutputStream(stream);
260
                                for (String key: keySet){
261
	                               	byte[] fileData = resultMap.get(key);
262
	                               	ZipEntry entry = new ZipEntry( key + fileEnding);
263
	    								zos.putNextEntry(entry);
264
	    								zos.write(fileData);
265
	    								zos.closeEntry();
266
                                }
267
                                zos.close();
268
                            }
269
                       	 } else{
270
    	                    logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
271
    	                }
272

    
273
	                } catch(Exception e){
274
	                    logger.error(e.getStackTrace());
275
	                }
276

    
277
	                showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
278

    
279

    
280
	            } catch (Exception e) {
281
	                MessagingUtils.errorDialog("Error exporting data",
282
	                        this,
283
	                        e.getMessage(),
284
	                        TaxeditorStorePlugin.PLUGIN_ID,
285
	                        e,
286
	                        true);
287
	            }
288
	            return Status.OK_STATUS;
289
	        }
290
	    };
291
	    return job;
292
	}
293
	/**
294
	 * @param jaxb
295
	 * @return
296
	 */
297
	private IIoConfigurator getConfigurator(TYPE type) {
298
		Assert.isNotNull(type, "Type should not be null");
299

    
300
		switch (type) {
301
		case Jaxb:
302
			return JaxbExportConfigurator.NewInstance(null, null);
303
		case Sdd:
304
			return SDDExportConfigurator.NewInstance(null, null, null);
305
		default:
306
			MessagingUtils.notImplementedMessage(this);
307
			throw new IllegalArgumentException("Export not supported yet");
308
		}
309
	}
310

    
311
	/**
312
	 * <p>
313
	 * JaxbConfigurator
314
	 * </p>
315
	 *
316
	 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
317
	 */
318
	public final JaxbExportConfigurator JaxbConfigurator() {
319
		return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
320
	}
321

    
322
	/**
323
	 * <p>
324
	 * SddConfigurator
325
	 * </p>
326
	 *
327
	 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
328
	 *         object.
329
	 */
330
	public final SDDExportConfigurator SddConfigurator() {
331
		return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
332
	}
333

    
334
    /**
335
     * @param configurator
336
     * @param urlString
337
     * @return
338
     */
339
    public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) {
340
        Assert.isNotNull(configurator, "Configuration may not be null");
341
        final Display display = Display.getDefault();
342

    
343
         Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
344
             @Override
345
             protected IStatus run(IProgressMonitor monitor) {
346
                 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
347
                 try {
348
                     IIOService ioService = CdmApplicationState.getIOService();
349
                     monitor.beginTask(
350
                             "Exporting database. This will take some time.", 100);
351
                     monitor.worked(10);
352
                     configurator.setProgressMonitor(CdmProgressMonitorAdapter
353
                             .CreateSubMonitor(monitor, 80));
354
                     ExportResult result = ioService.export(configurator);
355
                     ExportDataWrapper data = result.getExportData();
356
                     try{
357
                         if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
358
                             byte[] exportData = (byte[])data.getExportData();
359
                             if(exportData != null){
360
                                 File file = new File(urlString);
361
                                 FileOutputStream stream = new FileOutputStream(file);
362
                                 Writer out = new BufferedWriter(new OutputStreamWriter(
363
                             			stream, "UTF8"));
364

    
365
                             	stream.write(exportData);
366
                                out.flush();
367
                                stream.close();
368
                             }
369
                         } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
370
                             Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
371
                             Set<String> keySet = resultMap.keySet();
372
                             SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
373
                             Calendar cal = Calendar.getInstance();
374
                             String fileEnding = ".csv";
375

    
376
                             if (configurator.isCreateZipFile()){
377
                        		 File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip");
378
                                 FileOutputStream stream = new FileOutputStream(file);
379
                                 ZipOutputStream zos = new ZipOutputStream(stream);
380
                                 for (String key: keySet){
381
                                	byte[] fileData = resultMap.get(key);
382
                                	ZipEntry entry = new ZipEntry( key + fileEnding);
383
     								zos.putNextEntry(entry);
384
     								zos.write(fileData);
385
     								zos.closeEntry();
386
                                 }
387
                                 zos.close();
388
                        	 }else{
389
                        		 for (String key: keySet){
390
                        			 byte[] fileData = resultMap.get(key);
391
                        			 File file = new File(urlString+File.separator + key + fileEnding);
392
                                     FileOutputStream stream = new FileOutputStream(file);
393
                                     Writer out = new BufferedWriter(new OutputStreamWriter(
394
                                 			stream, "UTF8"));
395
                                     stream.write(fileData);
396
                                     stream.close();
397
                                 }
398
                        	 }
399
                        }else{
400
                             logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
401
                         }
402
                     } catch(Exception e){
403
                         logger.error(e.getStackTrace());
404
                     }
405
                     showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
406

    
407

    
408
                 } catch (Exception e) {
409
                     MessagingUtils.errorDialog("Error exporting data",
410
                             this,
411
                             e.getMessage(),
412
                             TaxeditorStorePlugin.PLUGIN_ID,
413
                             e,
414
                             true);
415
                 }
416

    
417
                 return Status.OK_STATUS;
418
             }
419
         };
420
         return job;
421
    }
422

    
423
    public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
424
        IIOService ioService = CdmApplicationState.getIOService();
425
        final UUID uuid = ioService.monitExportData(configurator);
426

    
427
        Display.getDefault().asyncExec(new Runnable() {
428
            @Override
429
            public void run() {
430
            	boolean isZip = false;
431
            	if (configurator instanceof CdmLightExportConfigurator){
432
                	isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
433
                }
434
                AbstractUtility.executeMoniteredExport("Export: " + configurator.getClass().getSimpleName(),
435
                        uuid,
436
                        1000,
437
                        true,
438
                        ExportManager.this,
439
                        null,
440
                        urlString,
441
                        isZip);
442
            }
443
        });
444

    
445
    }
446

    
447
	@Override
448
	public void postOperation(IRemotingProgressMonitor monitor) {
449
		 Display.getDefault().asyncExec(new Runnable() {
450

    
451
	            @Override
452
	            public void run() {
453
	                CdmStore.getContextManager().notifyContextRefresh();
454
	            }
455
	        });
456

    
457
	}
458

    
459
}
(2-2/3)