Project

General

Profile

Download (16.9 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.ByteArrayOutputStream;
14
import java.io.File;
15
import java.io.FileOutputStream;
16
import java.io.IOException;
17
import java.io.OutputStreamWriter;
18
import java.io.Writer;
19
import java.text.SimpleDateFormat;
20
import java.util.ArrayList;
21
import java.util.Calendar;
22
import java.util.List;
23
import java.util.Map;
24
import java.util.Set;
25
import java.util.UUID;
26
import java.util.zip.ZipEntry;
27
import java.util.zip.ZipOutputStream;
28

    
29
import org.apache.log4j.Logger;
30
import org.eclipse.core.runtime.Assert;
31
import org.eclipse.core.runtime.IProgressMonitor;
32
import org.eclipse.core.runtime.IStatus;
33
import org.eclipse.core.runtime.Status;
34
import org.eclipse.core.runtime.jobs.Job;
35
import org.eclipse.swt.widgets.Display;
36
import org.eclipse.ui.IWorkbenchPart;
37
import org.eclipse.ui.PlatformUI;
38

    
39
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
40
import eu.etaxonomy.cdm.api.application.ICdmRepository;
41
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
42
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
43
import eu.etaxonomy.cdm.io.common.CdmDefaultExport;
44
import eu.etaxonomy.cdm.io.common.ExportDataWrapper;
45
import eu.etaxonomy.cdm.io.common.ExportResult;
46
import eu.etaxonomy.cdm.io.common.ExportResultType;
47
import eu.etaxonomy.cdm.io.common.IExportConfigurator;
48
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
49
import eu.etaxonomy.cdm.io.common.IIoConfigurator;
50
import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
51
import eu.etaxonomy.cdm.io.dwca.out.DwcaTaxExportConfigurator;
52
import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
53
import eu.etaxonomy.cdm.io.cdmLight.CdmLightExportConfigurator;
54
import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
55
import eu.etaxonomy.cdm.io.service.IIOService;
56
import eu.etaxonomy.taxeditor.model.AbstractUtility;
57
import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
58
import eu.etaxonomy.taxeditor.model.MessagingUtils;
59

    
60
import eu.etaxonomy.taxeditor.operation.FeedbackGenerator;
61
import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
62
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
63
import eu.etaxonomy.taxeditor.store.CdmStore;
64
import eu.etaxonomy.taxeditor.store.StoreUtil;
65
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
66

    
67
/**
68
 * <p>
69
 * ExportHandler class.
70
 * </p>
71
 *
72
 * @author n.hoffmann
73
 * @created Sep 11, 2009
74
 * @version 1.0
75
 */
76
public class ExportManager extends AbstractIOManager<IExportConfigurator> implements IPostMoniteredOperationEnabled {
77
	
78
	private final String successMessage = "The export was successfull";
79

    
80
    private static final Logger logger = Logger.getLogger(ExportManager.class);
81
    /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
82
	public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm";
83
	/**
84
	 *
85
	 * @param applicationConfiguration
86
	 */
87
	private ExportManager(ICdmRepository applicationConfiguration) {
88
		super(applicationConfiguration);
89
	}
90

    
91
	/**
92
	 * <p>
93
	 * NewInstance
94
	 * </p>
95
	 *
96
	 * @param applicationConfiguration
97
	 *            a
98
	 *            {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
99
	 *            object.
100
	 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
101
	 */
102
	public static ExportManager NewInstance(
103
			ICdmRepository applicationConfiguration) {
104
		return new ExportManager(applicationConfiguration);
105
	}
106

    
107
	/**
108
	 * <p>
109
	 * createIOJob
110
	 * </p>
111
	 *
112
	 * @param configurator
113
	 *            a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
114
	 *            object.
115
	 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
116
	 */
117
	@Override
118
	protected Job createIOJob(final IExportConfigurator configurator) {
119

    
120
		Assert.isNotNull(configurator, "Configuration may not be null");
121

    
122
		final Display display = Display.getCurrent();
123

    
124
		Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
125
			@Override
126
			protected IStatus run(IProgressMonitor monitor) {
127
				monitor.beginTask(
128
						"Exporting database. This will take some time.", 100);
129
				monitor.worked(10);
130

    
131
			    /** see ticket # 4456 and */
132
//				display.asyncExec(new Runnable() {
133
//
134
//					@Override
135
//					public void run() {
136
//
137
//					    // terminate any open transactions
138
//						IConversationEnabled activePart = (IConversationEnabled) StoreUtil
139
//								.getActivePage().getActivePart();
140
//						activePart.getConversationHolder().commit(false);
141
//					}
142
//				});
143

    
144
//				monitor.worked(10);
145

    
146
				CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<IExportConfigurator>();
147
				configurator.setProgressMonitor(CdmProgressMonitorAdapter
148
						.CreateSubMonitor(monitor, 80));
149
				exporter.setCdmAppController(applicationConfiguration);
150
				monitor.worked(10);
151

    
152
				try {
153
					exporter.invoke(configurator);
154
					monitor.worked(60);
155
				} catch (RuntimeException e) {
156
					MessagingUtils.messageDialog("Error exporting data", this,
157
							"An error occured while"
158
									+ "exporting to destination '"
159
									+ configurator.getDestinationNameString()
160
									+ "'.\n"
161
									+ "Please check error log for details.", e);
162
				}
163

    
164
				display.asyncExec(new Runnable() {
165

    
166
					@Override
167
					public void run() {
168
						IWorkbenchPart activePart = StoreUtil.getActivePage()
169
								.getActivePart();
170
						if (activePart instanceof IConversationEnabled) {
171
							// terminate any open transactions
172
							IConversationEnabled conversationEnabled = (IConversationEnabled) activePart;
173
							// restarting transaction and committing it to
174
							// trigger
175
							// change listener
176
							// TODO verify correct behaviour
177

    
178
							try{
179
								conversationEnabled.getConversationHolder()
180
									.startTransaction();
181

    
182
								conversationEnabled.getConversationHolder()
183
									.commit();
184
							}catch(RuntimeException e){
185
								MessagingUtils.messageDialog("Error starting conversation handling", this, "" +
186
										"Conversation Error: "+ e);
187
							}
188
						}
189
					}
190
				});
191
				monitor.worked(10);
192

    
193
				return Status.OK_STATUS;
194
			}
195
		};
196

    
197
		return job;
198
	}
199

    
200
	public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
201
	    Assert.isNotNull(configurator, "Configuration may not be null");
202

    
203
	    final Display display = Display.getCurrent();
204

    
205
	    Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
206
	        @Override
207
	        protected IStatus run(IProgressMonitor monitor) {
208
	            monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
209
	            try {
210
	                IIOService ioService = CdmApplicationState.getIOService();
211
	                UUID uuid = ioService.monitExportData(configurator);
212
	                IRemotingProgressMonitor remotingMonitor;
213
	                List<IFeedbackGenerator> feedBackGeneratorList = new ArrayList<IFeedbackGenerator>();
214
                    try {
215
                        remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data",
216
                                uuid,
217
                                1000,
218
                                ExportManager.this,
219
                                feedBackGeneratorList,
220
                                monitor);
221
                       
222
                    } catch (Exception ex) {
223
                        return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
224
                    }
225
	                
226
	                ExportResult result = (ExportResult)remotingMonitor.getResult();
227
	                ExportDataWrapper data = result.getExportData();
228
	                try{
229
    	                if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY)){
230
    	                    byte[] exportData = (byte[])data.getExportData();
231
        	                if(exportData != null){
232
        	                    FileOutputStream stream = new FileOutputStream(exportFile);
233
                                stream.write(exportData);
234
                                stream.close();
235
        	                } 
236
    	                } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
237
                            Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
238
                            Set<String> keySet = resultMap.keySet();
239
                            SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
240
                            Calendar cal = Calendar.getInstance();
241
                            String fileEnding = ".zip";
242
                            if (configurator instanceof DwcaTaxExportConfigurator){
243
                            	DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator;
244
                            
245
                            	File file = new File(dwcaConfig.getDestination().toURI());                              
246
                                FileOutputStream stream = new FileOutputStream(file);
247
                                ZipOutputStream zos = new ZipOutputStream(stream);
248
                                for (String key: keySet){
249
	                               	byte[] fileData = resultMap.get(key);
250
	                               	ZipEntry entry = new ZipEntry( key + fileEnding); 
251
	    								zos.putNextEntry(entry);
252
	    								zos.write(fileData);
253
	    								zos.closeEntry();
254
                                }
255
                                zos.close();
256
                            }
257
                       	 } else{
258
    	                    logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
259
    	                }
260
        	                
261
	                } catch(Exception e){
262
	                    logger.error(e.getStackTrace());
263
	                }
264

    
265
	                showResult(configurator.getClass().getSimpleName(), display, result, successMessage); 
266

    
267

    
268
	            } catch (Exception e) {
269
	                MessagingUtils.errorDialog("Error exporting data",
270
	                        this,
271
	                        e.getMessage(),
272
	                        TaxeditorStorePlugin.PLUGIN_ID,
273
	                        e,
274
	                        true);
275
	            }
276
	            return Status.OK_STATUS;
277
	        }
278
	    };
279
	    return job;
280
	}
281
	/**
282
	 * @param jaxb
283
	 * @return
284
	 */
285
	private IIoConfigurator getConfigurator(TYPE type) {
286
		Assert.isNotNull(type, "Type should not be null");
287

    
288
		switch (type) {
289
		case Jaxb:
290
			return JaxbExportConfigurator.NewInstance(null, null);
291
		case Sdd:
292
			return SDDExportConfigurator.NewInstance(null, null, null);
293
		default:
294
			MessagingUtils.notImplementedMessage(this);
295
			throw new IllegalArgumentException("Export not supported yet");
296
		}
297
	}
298

    
299
	/**
300
	 * <p>
301
	 * JaxbConfigurator
302
	 * </p>
303
	 *
304
	 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
305
	 */
306
	public final JaxbExportConfigurator JaxbConfigurator() {
307
		return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
308
	}
309

    
310
	/**
311
	 * <p>
312
	 * SddConfigurator
313
	 * </p>
314
	 *
315
	 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
316
	 *         object.
317
	 */
318
	public final SDDExportConfigurator SddConfigurator() {
319
		return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
320
	}
321

    
322
    /**
323
     * @param configurator
324
     * @param urlString
325
     * @return
326
     */
327
    public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) {
328
        Assert.isNotNull(configurator, "Configuration may not be null");
329
        final Display display = Display.getDefault();
330
        
331
         Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
332
             @Override
333
             protected IStatus run(IProgressMonitor monitor) {
334
                 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
335
                 try {
336
                     IIOService ioService = CdmApplicationState.getIOService();
337

    
338
                     ExportResult result = ioService.export(configurator);
339
                     ExportDataWrapper data = result.getExportData();
340
                     try{
341
                         if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY)){
342
                             byte[] exportData = (byte[])data.getExportData();
343
                             if(exportData != null){
344
                                 File file = new File(urlString);
345
                                 FileOutputStream stream = new FileOutputStream(file);
346
                                 Writer out = new BufferedWriter(new OutputStreamWriter(
347
                             			stream, "UTF8"));
348

    
349
                             	stream.write(exportData);
350
                                out.flush();
351
                                stream.close();
352
                             }
353
                         } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
354
                             Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
355
                             Set<String> keySet = resultMap.keySet();
356
                             SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
357
                             Calendar cal = Calendar.getInstance();
358
                             String fileEnding = ".csv";
359
                             
360
                             if (configurator.isCreateZipFile()){      
361
                        		 File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip");                              
362
                                 FileOutputStream stream = new FileOutputStream(file);
363
                                 ZipOutputStream zos = new ZipOutputStream(stream);
364
                                 for (String key: keySet){
365
                                	byte[] fileData = resultMap.get(key);
366
                                	ZipEntry entry = new ZipEntry( key + fileEnding); 
367
     								zos.putNextEntry(entry);
368
     								zos.write(fileData);
369
     								zos.closeEntry();
370
                                 }
371
                                 zos.close();
372
                        	 }else{
373
                        		 for (String key: keySet){
374
                        			 byte[] fileData = resultMap.get(key);
375
                        			 File file = new File(urlString+File.separator + key + fileEnding);
376
                                     FileOutputStream stream = new FileOutputStream(file);
377
                                     Writer out = new BufferedWriter(new OutputStreamWriter(
378
                                 			stream, "UTF8"));
379
                                     stream.write(fileData);
380
                                     stream.close();
381
                                 }
382
                        	 }
383
                        }else{
384
                             logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
385
                         }
386
                     } catch(Exception e){
387
                         logger.error(e.getStackTrace());
388
                     }
389
                     showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
390

    
391

    
392
                 } catch (Exception e) {
393
                     MessagingUtils.errorDialog("Error exporting data",
394
                             this,
395
                             e.getMessage(),
396
                             TaxeditorStorePlugin.PLUGIN_ID,
397
                             e,
398
                             true);
399
                 }
400

    
401
                 return Status.OK_STATUS;
402
             }
403
         };
404
         return job;
405
    }
406

    
407
    public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
408
        IIOService ioService = CdmApplicationState.getIOService();
409
        final UUID uuid = ioService.monitExportData(configurator);
410
        
411
        Display.getDefault().asyncExec(new Runnable() {
412
            @Override
413
            public void run() {
414
            	boolean isZip = false;
415
            	if (configurator instanceof CdmLightExportConfigurator){
416
                	isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
417
                }
418
                AbstractUtility.executeMoniteredExport("Export: " + configurator.getClass().getSimpleName(),
419
                        uuid,
420
                        1000,
421
                        true,
422
                        ExportManager.this,
423
                        null,
424
                        urlString,
425
                        isZip);
426
            }
427
        });
428

    
429
    }
430

    
431
	@Override
432
	public void postOperation(IRemotingProgressMonitor monitor) {
433
		 Display.getDefault().asyncExec(new Runnable() {
434

    
435
	            @Override
436
	            public void run() {
437
	                CdmStore.getContextManager().notifyContextRefresh();
438
	            }
439
	        });
440
		
441
	}
442

    
443
}
(2-2/3)