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
package eu.etaxonomy.taxeditor.io;
10

    
11
import java.io.BufferedWriter;
12
import java.io.File;
13
import java.io.FileOutputStream;
14
import java.io.OutputStreamWriter;
15
import java.io.Writer;
16
import java.text.SimpleDateFormat;
17
import java.util.ArrayList;
18
import java.util.Calendar;
19
import java.util.List;
20
import java.util.Map;
21
import java.util.Set;
22
import java.util.UUID;
23
import java.util.zip.ZipEntry;
24
import java.util.zip.ZipOutputStream;
25

    
26
import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
27
import org.eclipse.core.runtime.Assert;
28
import org.eclipse.core.runtime.IProgressMonitor;
29
import org.eclipse.core.runtime.IStatus;
30
import org.eclipse.core.runtime.Status;
31
import org.eclipse.core.runtime.SubMonitor;
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.common.monitor.IRemotingProgressMonitor;
38
import eu.etaxonomy.cdm.io.cdmLight.CdmLightExportConfigurator;
39
import eu.etaxonomy.cdm.io.common.CdmDefaultExport;
40
import eu.etaxonomy.cdm.io.common.ExportDataWrapper;
41
import eu.etaxonomy.cdm.io.common.ExportResult;
42
import eu.etaxonomy.cdm.io.common.ExportResultType;
43
import eu.etaxonomy.cdm.io.common.IExportConfigurator;
44
import eu.etaxonomy.cdm.io.common.IIoConfigurator;
45
import eu.etaxonomy.cdm.io.dwca.out.DwcaTaxExportConfigurator;
46
import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
47
import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
48
import eu.etaxonomy.cdm.io.service.IIOService;
49
import eu.etaxonomy.taxeditor.event.EventUtility;
50
import eu.etaxonomy.taxeditor.model.AbstractUtility;
51
import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
52
import eu.etaxonomy.taxeditor.model.MessagingUtils;
53
import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
54
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
55
import eu.etaxonomy.taxeditor.store.CdmStore;
56
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
57

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

    
67
    private static final Logger logger = LogManager.getLogger(ExportManager.class);
68
    /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
69
	public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm";
70

    
71
	private final String successMessage = "The export was successful";
72

    
73
	private ExportManager(ICdmRepository applicationConfiguration) {
74
		super(applicationConfiguration);
75
	}
76

    
77
	public static ExportManager NewInstance(
78
			ICdmRepository applicationConfiguration) {
79
		return new ExportManager(applicationConfiguration);
80
	}
81

    
82
	@Override
83
	protected Job createIOJob(final IExportConfigurator configurator) {
84

    
85
		Assert.isNotNull(configurator, "Configuration may not be null");
86

    
87
		final Display display = Display.getCurrent();
88

    
89
		Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
90
			@Override
91
			protected IStatus run(IProgressMonitor monitor) {
92
				monitor.beginTask(
93
						"Exporting database. This will take some time.", 100);
94
				monitor.worked(10);
95

    
96
			    /** see ticket # 4456 and */
97
//				display.asyncExec(new Runnable() {
98
//
99
//					@Override
100
//					public void run() {
101
//
102
//					    // terminate any open transactions
103
//						IConversationEnabled activePart = (IConversationEnabled) StoreUtil
104
//								.getActivePage().getActivePart();
105
//						activePart.getConversationHolder().commit(false);
106
//					}
107
//				});
108

    
109
//				monitor.worked(10);
110

    
111
				CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<>();
112
				configurator.setProgressMonitor(CdmProgressMonitorAdapter
113
						.CreateSubMonitor(monitor, 80));
114
				exporter.setCdmAppController(applicationConfiguration);
115
				monitor.worked(10);
116

    
117
				try {
118
					exporter.invoke(configurator);
119
					monitor.worked(60);
120
				} catch (RuntimeException e) {
121
					MessagingUtils.messageDialog("Error exporting data", this,
122
							"An error occurred while"
123
									+ "exporting to destination '"
124
									+ configurator.getDestinationNameString()
125
									+ "'.\n"
126
									+ "Please check error log for details.", e);
127
				}
128

    
129
//				display.asyncExec(()-> {
130
//					Object activePart = EventUtility.getActivePart();
131
//					if (activePart instanceof IConversationEnabled) {
132
//						// terminate any open transactions
133
//						IConversationEnabled conversationEnabled = (IConversationEnabled) activePart;
134
//						// restarting transaction and committing it to
135
//						// trigger
136
//						// change listener
137
//						// TODO verify correct behaviour
138
//
139
//						try{
140
//							conversationEnabled.getConversationHolder()
141
//								.startTransaction();
142
//
143
//							conversationEnabled.getConversationHolder()
144
//								.commit();
145
//						}catch(RuntimeException e){
146
//							MessagingUtils.messageDialog("Error starting conversation handling", this, "" +
147
//									"Conversation Error: "+ e);
148
//						}
149
//					}
150
//				});
151
				monitor.worked(10);
152

    
153
				return Status.OK_STATUS;
154
			}
155
		};
156

    
157
		return job;
158
	}
159

    
160
	public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
161
	    Assert.isNotNull(configurator, "Configuration may not be null");
162

    
163
	    final Display display = Display.getCurrent();
164

    
165
	    Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
166
	        @Override
167
	        protected IStatus run(IProgressMonitor monitor) {
168
	            SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
169
	            subMonitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
170
	            try {
171
	                IIOService ioService = CdmApplicationState.getIOService();
172
	                UUID uuid = ioService.monitExportData(configurator);
173
	                IRemotingProgressMonitor remotingMonitor;
174
	                List<IFeedbackGenerator> feedBackGeneratorList = new ArrayList<>();
175
                    try {
176
                        remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data",
177
                                uuid,
178
                                1000,
179
                                ExportManager.this,
180
                                feedBackGeneratorList,
181
                                subMonitor);
182

    
183
                    } catch (Exception ex) {
184
                        return new Status(IStatus.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
185
                    }
186

    
187
	                ExportResult result = (ExportResult)remotingMonitor.getResult();
188
	                ExportDataWrapper<?> data = result.getExportData();
189
	                try{
190
    	                if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
191
    	                    if (data.getExportData() instanceof byte[]){
192
    	                        byte[] exportData = (byte[])data.getExportData();
193
    	                        if(exportData != null){
194
                                    FileOutputStream stream = new FileOutputStream(exportFile);
195
                                    Writer out = new BufferedWriter(new OutputStreamWriter(
196
                                           stream, "UTF8"));
197

    
198
                                    stream.write(exportData);
199
                                    out.flush();
200
                                    stream.close();
201
                                }
202
    	                    }else if (data.getExportData() instanceof List<?>){
203
                                //TODO:This needs to be improved
204
    	                        @SuppressWarnings("unchecked")
205
                                List<byte[]> exportData = (List<byte[]>)data.getExportData();
206
                                    if(exportData != null){
207
                                        FileOutputStream stream = new FileOutputStream(exportFile);
208
                                        Writer out = new BufferedWriter(new OutputStreamWriter(
209
                                               stream, "UTF8"));
210

    
211
                                        stream.write(exportData.get(0));
212
                                        out.flush();
213
                                        stream.close();
214
                                }
215
    	                    }
216

    
217
    	                } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
218
                            @SuppressWarnings("unchecked")
219
                            Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
220
                            Set<String> keySet = resultMap.keySet();
221
                            String fileEnding = ".zip";
222
                            if (configurator instanceof DwcaTaxExportConfigurator){
223
                            	DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator;
224

    
225
                            	File file = new File(dwcaConfig.getDestination().toURI());
226
                                FileOutputStream stream = new FileOutputStream(file);
227
                                ZipOutputStream zos = new ZipOutputStream(stream);
228
                                for (String key: keySet){
229
	                               	byte[] fileData = resultMap.get(key);
230
	                               	ZipEntry entry = new ZipEntry( key + fileEnding);
231
	    								zos.putNextEntry(entry);
232
	    								zos.write(fileData);
233
	    								zos.closeEntry();
234
                                }
235
                                zos.close();
236
                            }
237
                       	 } else{
238
    	                    logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
239
    	                }
240

    
241
	                } catch(Exception e){
242
	                    logger.error(e.getStackTrace());
243
	                }
244

    
245
	                showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
246

    
247

    
248
	            } catch (Exception e) {
249
	                MessagingUtils.errorDialog("Error exporting data",
250
	                        this,
251
	                        e.getMessage(),
252
	                        TaxeditorStorePlugin.PLUGIN_ID,
253
	                        e,
254
	                        true);
255
	            }
256
	            return Status.OK_STATUS;
257
	        }
258
	    };
259
	    return job;
260
	}
261

    
262
	private IIoConfigurator getConfigurator(TYPE type) {
263
		Assert.isNotNull(type, "Type should not be null");
264

    
265
		switch (type) {
266
		case Jaxb:
267
			return JaxbExportConfigurator.NewInstance(null, null);
268
		case Sdd:
269
			return SDDExportConfigurator.NewInstance(null, null, null);
270
		default:
271
			MessagingUtils.notImplementedMessage(this);
272
			throw new IllegalArgumentException("Export not supported yet");
273
		}
274
	}
275

    
276
	public final JaxbExportConfigurator JaxbConfigurator() {
277
		return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
278
	}
279

    
280
	public final SDDExportConfigurator SddConfigurator() {
281
		return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
282
	}
283

    
284
    public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) {
285
        Assert.isNotNull(configurator, "Configuration may not be null");
286
        final Display display = Display.getDefault();
287

    
288
         Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
289
             @Override
290
             protected IStatus run(IProgressMonitor monitor) {
291
                 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
292
                 try {
293
                     IIOService ioService = CdmApplicationState.getIOService();
294
                     monitor.beginTask(
295
                             "Exporting database. This will take some time.", 100);
296
                     monitor.worked(10);
297
                     configurator.setProgressMonitor(CdmProgressMonitorAdapter
298
                             .CreateSubMonitor(monitor, 80));
299
                     ExportResult result = ioService.export(configurator);
300
                     ExportDataWrapper<?> data = result.getExportData();
301
                     try{
302
                         if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
303
                             byte[] exportData = (byte[])data.getExportData();
304
                             if(exportData != null){
305
                                 File file = new File(urlString);
306
                                 FileOutputStream stream = new FileOutputStream(file);
307
                                 Writer out = new BufferedWriter(new OutputStreamWriter(
308
                             			stream, "UTF8"));
309

    
310
                             	stream.write(exportData);
311
                                out.flush();
312
                                stream.close();
313
                             }
314
                         } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
315
                             @SuppressWarnings("unchecked")
316
                            Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
317
                             Set<String> keySet = resultMap.keySet();
318
                             SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
319
                             Calendar cal = Calendar.getInstance();
320
                             String fileEnding = ".csv";
321

    
322
                             if (configurator.isCreateZipFile()){
323
                        		 File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip");
324
                                 FileOutputStream stream = new FileOutputStream(file);
325
                                 ZipOutputStream zos = new ZipOutputStream(stream);
326
                                 for (String key: keySet){
327
                                	byte[] fileData = resultMap.get(key);
328
                                	ZipEntry entry = new ZipEntry( key + fileEnding);
329
     								zos.putNextEntry(entry);
330
     								zos.write(fileData);
331
     								zos.closeEntry();
332
                                 }
333
                                 zos.close();
334
                        	 }else{
335
                        		 for (String key: keySet){
336
                        			 byte[] fileData = resultMap.get(key);
337
                        			 File file = new File(urlString+File.separator + key + fileEnding);
338
                                     FileOutputStream stream = new FileOutputStream(file);
339
                                     Writer out = new BufferedWriter(new OutputStreamWriter(
340
                                 			stream, "UTF8"));
341
                                     stream.write(fileData);
342
                                     stream.close();
343
                                 }
344
                        	 }
345
                        }else{
346
                             logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
347
                         }
348
                     } catch(Exception e){
349
                         logger.error(e.getStackTrace());
350
                     }
351
                     showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
352

    
353

    
354
                 } catch (Exception e) {
355
                     MessagingUtils.errorDialog("Error exporting data",
356
                             this,
357
                             e.getMessage(),
358
                             TaxeditorStorePlugin.PLUGIN_ID,
359
                             e,
360
                             true);
361
                 }
362

    
363
                 return Status.OK_STATUS;
364
             }
365
         };
366
         return job;
367
    }
368

    
369
    public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
370
        IIOService ioService = CdmApplicationState.getIOService();
371
        final UUID uuid = ioService.monitExportData(configurator);
372

    
373
        Display.getDefault().asyncExec(new Runnable() {
374
            @Override
375
            public void run() {
376
            	boolean isZip = false;
377
            	if (configurator instanceof CdmLightExportConfigurator){
378
                	isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
379
                }
380
                AbstractUtility.executeMoniteredExport(configurator.getUserFriendlyIOName() != null? configurator.getUserFriendlyIOName(): "Export",
381
                        uuid,
382
                        1000,
383
                        true,
384
                        ExportManager.this,
385
                        null,
386
                        urlString,
387
                        isZip);
388
            }
389
        });
390
    }
391

    
392
	@Override
393
	public void postOperation(IRemotingProgressMonitor monitor) {
394
		 Display.getDefault().asyncExec(()-> {
395
                CdmStore.getContextManager().notifyContextRefresh();
396
        });
397
	}
398
}
(2-2/3)