Project

General

Profile

Download (17.5 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.IStatus;
29
import org.eclipse.core.runtime.jobs.Job;
30
import org.eclipse.swt.widgets.Display;
31

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

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

    
68
	private final String successMessage = "The export was successfull";
69

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

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

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

    
110
		Assert.isNotNull(configurator, "Configuration may not be null");
111

    
112
		final Display display = Display.getCurrent();
113

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

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

    
134
//				monitor.worked(10);
135

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

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

    
154
				display.asyncExec(new Runnable() {
155

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

    
167
							try{
168
								conversationEnabled.getConversationHolder()
169
									.startTransaction();
170

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

    
182
				return Status.OK_STATUS;
183
			}
184
		};
185

    
186
		return job;
187
	}
188

    
189
	public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
190
	    Assert.isNotNull(configurator, "Configuration may not be null");
191

    
192
	    final Display display = Display.getCurrent();
193

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

    
211
                    } catch (Exception ex) {
212
                        return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
213
                    }
214

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

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

    
238
                                        stream.write(exportData.get(0));
239
                                        out.flush();
240
                                        stream.close();
241
                                }
242
    	                    }
243

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

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

    
269
	                } catch(Exception e){
270
	                    logger.error(e.getStackTrace());
271
	                }
272

    
273
	                showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
274

    
275

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

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

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

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

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

    
339
         Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
340
             @Override
341
             protected IStatus run(IProgressMonitor monitor) {
342
                 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
343
                 try {
344
                     IIOService ioService = CdmApplicationState.getIOService();
345

    
346
                     ExportResult result = ioService.export(configurator);
347
                     ExportDataWrapper data = result.getExportData();
348
                     try{
349
                         if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
350
                             byte[] exportData = (byte[])data.getExportData();
351
                             if(exportData != null){
352
                                 File file = new File(urlString);
353
                                 FileOutputStream stream = new FileOutputStream(file);
354
                                 Writer out = new BufferedWriter(new OutputStreamWriter(
355
                             			stream, "UTF8"));
356

    
357
                             	stream.write(exportData);
358
                                out.flush();
359
                                stream.close();
360
                             }
361
                         } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
362
                             Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
363
                             Set<String> keySet = resultMap.keySet();
364
                             SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
365
                             Calendar cal = Calendar.getInstance();
366
                             String fileEnding = ".csv";
367

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

    
399

    
400
                 } catch (Exception e) {
401
                     MessagingUtils.errorDialog("Error exporting data",
402
                             this,
403
                             e.getMessage(),
404
                             TaxeditorStorePlugin.PLUGIN_ID,
405
                             e,
406
                             true);
407
                 }
408

    
409
                 return Status.OK_STATUS;
410
             }
411
         };
412
         return job;
413
    }
414

    
415
    public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
416
        IIOService ioService = CdmApplicationState.getIOService();
417
        final UUID uuid = ioService.monitExportData(configurator);
418

    
419
        Display.getDefault().asyncExec(new Runnable() {
420
            @Override
421
            public void run() {
422
            	boolean isZip = false;
423
            	if (configurator instanceof CdmLightExportConfigurator){
424
                	isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
425
                }
426
                AbstractUtility.executeMoniteredExport("Export: " + configurator.getClass().getSimpleName(),
427
                        uuid,
428
                        1000,
429
                        true,
430
                        ExportManager.this,
431
                        null,
432
                        urlString,
433
                        isZip);
434
            }
435
        });
436

    
437
    }
438

    
439
	@Override
440
	public void postOperation(IRemotingProgressMonitor monitor) {
441
		 Display.getDefault().asyncExec(new Runnable() {
442

    
443
	            @Override
444
	            public void run() {
445
	                CdmStore.getContextManager().notifyContextRefresh();
446
	            }
447
	        });
448

    
449
	}
450

    
451
}
(2-2/3)