Project

General

Profile

Download (12.2 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.util.List;
18
import java.util.Map;
19
import java.util.Set;
20

    
21
import org.apache.log4j.Logger;
22
import org.eclipse.core.runtime.Assert;
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.core.runtime.IStatus;
25
import org.eclipse.core.runtime.Status;
26
import org.eclipse.core.runtime.jobs.Job;
27
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.ui.IWorkbenchPart;
29
import org.eclipse.ui.PlatformUI;
30

    
31
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
32
import eu.etaxonomy.cdm.api.application.ICdmRepository;
33
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
34
import eu.etaxonomy.cdm.io.common.CdmDefaultExport;
35
import eu.etaxonomy.cdm.io.common.ExportDataWrapper;
36
import eu.etaxonomy.cdm.io.common.ExportResult;
37
import eu.etaxonomy.cdm.io.common.ExportResultType;
38
import eu.etaxonomy.cdm.io.common.IExportConfigurator;
39
import eu.etaxonomy.cdm.io.common.IIoConfigurator;
40

    
41
import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
42
import eu.etaxonomy.cdm.io.outputmodel.OutputModelConfigurator;
43
import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
44
import eu.etaxonomy.cdm.io.service.IIOService;
45
import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
46
import eu.etaxonomy.taxeditor.model.MessagingUtils;
47
import eu.etaxonomy.taxeditor.store.StoreUtil;
48
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
49

    
50
/**
51
 * <p>
52
 * ExportHandler class.
53
 * </p>
54
 *
55
 * @author n.hoffmann
56
 * @created Sep 11, 2009
57
 * @version 1.0
58
 */
59
public class ExportManager extends AbstractIOManager<IExportConfigurator> {
60

    
61
    private static final Logger logger = Logger.getLogger(ExportManager.class);
62

    
63
	/**
64
	 *
65
	 * @param applicationConfiguration
66
	 */
67
	private ExportManager(ICdmRepository applicationConfiguration) {
68
		super(applicationConfiguration);
69
	}
70

    
71
	/**
72
	 * <p>
73
	 * NewInstance
74
	 * </p>
75
	 *
76
	 * @param applicationConfiguration
77
	 *            a
78
	 *            {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
79
	 *            object.
80
	 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
81
	 */
82
	public static ExportManager NewInstance(
83
			ICdmRepository applicationConfiguration) {
84
		return new ExportManager(applicationConfiguration);
85
	}
86

    
87
	/**
88
	 * <p>
89
	 * createIOJob
90
	 * </p>
91
	 *
92
	 * @param configurator
93
	 *            a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
94
	 *            object.
95
	 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
96
	 */
97
	@Override
98
	protected Job createIOJob(final IExportConfigurator configurator) {
99

    
100
		Assert.isNotNull(configurator, "Configuration may not be null");
101

    
102
		final Display display = Display.getCurrent();
103

    
104
		Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
105
			@Override
106
			protected IStatus run(IProgressMonitor monitor) {
107
				monitor.beginTask(
108
						"Exporting database. This will take some time.", 100);
109
				monitor.worked(10);
110

    
111
			    /** see ticket # 4456 and */
112
//				display.asyncExec(new Runnable() {
113
//
114
//					@Override
115
//					public void run() {
116
//
117
//					    // terminate any open transactions
118
//						IConversationEnabled activePart = (IConversationEnabled) StoreUtil
119
//								.getActivePage().getActivePart();
120
//						activePart.getConversationHolder().commit(false);
121
//					}
122
//				});
123

    
124
//				monitor.worked(10);
125

    
126
				CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<IExportConfigurator>();
127
				configurator.setProgressMonitor(CdmProgressMonitorAdapter
128
						.CreateSubMonitor(monitor, 80));
129
				exporter.setCdmAppController(applicationConfiguration);
130
				monitor.worked(10);
131

    
132
				try {
133
					exporter.invoke(configurator);
134
					monitor.worked(60);
135
				} catch (RuntimeException e) {
136
					MessagingUtils.messageDialog("Error exporting data", this,
137
							"An error occured while"
138
									+ "exporting to destination '"
139
									+ configurator.getDestinationNameString()
140
									+ "'.\n"
141
									+ "Please check error log for details.", e);
142
				}
143

    
144
				display.asyncExec(new Runnable() {
145

    
146
					@Override
147
					public void run() {
148
						IWorkbenchPart activePart = StoreUtil.getActivePage()
149
								.getActivePart();
150
						if (activePart instanceof IConversationEnabled) {
151
							// terminate any open transactions
152
							IConversationEnabled conversationEnabled = (IConversationEnabled) activePart;
153
							// restarting transaction and committing it to
154
							// trigger
155
							// change listener
156
							// TODO verify correct behaviour
157

    
158
							try{
159
								conversationEnabled.getConversationHolder()
160
									.startTransaction();
161

    
162
								conversationEnabled.getConversationHolder()
163
									.commit();
164
							}catch(RuntimeException e){
165
								MessagingUtils.messageDialog("Error starting conversation handling", this, "" +
166
										"Conversation Error: "+ e);
167
							}
168
						}
169
					}
170
				});
171
				monitor.worked(10);
172

    
173
				return Status.OK_STATUS;
174
			}
175
		};
176

    
177
		return job;
178
	}
179

    
180
	public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
181
	    Assert.isNotNull(configurator, "Configuration may not be null");
182

    
183
	    final Display display = Display.getCurrent();
184

    
185
	    Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
186
	        @Override
187
	        protected IStatus run(IProgressMonitor monitor) {
188
	            monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
189
	            try {
190
	                IIOService ioService = CdmApplicationState.getIOService();
191

    
192
	                ExportResult result = ioService.export(configurator);
193
	                ExportDataWrapper data = result.getExportData();
194
	                try{
195
    	                if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY)){
196
    	                    byte[] exportData = (byte[])data.getExportData();
197
        	                if(exportData != null){
198
        	                    FileOutputStream stream = new FileOutputStream(exportFile);
199
                                stream.write(exportData);
200
                                stream.close();
201
                            }
202
//    	                } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
203
//    	                    Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
204
//    	                    Set<String> keySet = resultMap.keySet();
205
//    	                    for (String key: keySet){
206
//    	                        byte[] fileData = resultMap.get(key);
207
//    	                        File file = new File(urlString)
208
//    	                        FileOutputStream stream = new FileOutputStream(key);
209
//                                stream.write(fileData);
210
//                                stream.close();
211
//    	                    }
212

    
213
    	                }else{
214
    	                    logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
215
    	                }
216
	                } catch(Exception e){
217
	                    logger.error(e.getStackTrace());
218
	                }
219

    
220
	                showResult(configurator.getClass().getSimpleName(), display, result); 
221

    
222

    
223
	            } catch (Exception e) {
224
	                MessagingUtils.errorDialog("Error exporting data",
225
	                        this,
226
	                        e.getMessage(),
227
	                        TaxeditorStorePlugin.PLUGIN_ID,
228
	                        e,
229
	                        true);
230
	            }
231
	            return Status.OK_STATUS;
232
	        }
233
	    };
234
	    return job;
235
	}
236
	/**
237
	 * @param jaxb
238
	 * @return
239
	 */
240
	private IIoConfigurator getConfigurator(TYPE type) {
241
		Assert.isNotNull(type, "Type should not be null");
242

    
243
		switch (type) {
244
		case Jaxb:
245
			return JaxbExportConfigurator.NewInstance(null, null);
246
		case Sdd:
247
			return SDDExportConfigurator.NewInstance(null, null, null);
248
		default:
249
			MessagingUtils.notImplementedMessage(this);
250
			throw new IllegalArgumentException("Export not supported yet");
251
		}
252
	}
253

    
254
	/**
255
	 * <p>
256
	 * JaxbConfigurator
257
	 * </p>
258
	 *
259
	 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
260
	 */
261
	public final JaxbExportConfigurator JaxbConfigurator() {
262
		return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
263
	}
264

    
265
	/**
266
	 * <p>
267
	 * SddConfigurator
268
	 * </p>
269
	 *
270
	 * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
271
	 *         object.
272
	 */
273
	public final SDDExportConfigurator SddConfigurator() {
274
		return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
275
	}
276

    
277
    /**
278
     * @param configurator
279
     * @param urlString
280
     * @return
281
     */
282
    public Job createIOServiceJob(OutputModelConfigurator configurator, String urlString) {
283
        Assert.isNotNull(configurator, "Configuration may not be null");
284
        final Display display = Display.getDefault();
285
        
286
         Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
287
             @Override
288
             protected IStatus run(IProgressMonitor monitor) {
289
                 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
290
                 try {
291
                     IIOService ioService = CdmApplicationState.getIOService();
292

    
293
                     ExportResult result = ioService.export(configurator);
294
                     ExportDataWrapper data = result.getExportData();
295
                     try{
296
                         if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY)){
297
                             byte[] exportData = (byte[])data.getExportData();
298
                             if(exportData != null){
299
                                 File file = new File(urlString);
300
                                 FileOutputStream stream = new FileOutputStream(file);
301
                                 Writer out = new BufferedWriter(new OutputStreamWriter(
302
                             			stream, "UTF8"));
303

    
304
                             	stream.write(exportData);
305
                                out.flush();
306
                                stream.close();
307
                             }
308
                         } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
309
                             Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
310
                             Set<String> keySet = resultMap.keySet();
311
                             for (String key: keySet){
312
                                 byte[] fileData = resultMap.get(key);
313
                                 String fileEnding ="";
314
                                 if (configurator instanceof OutputModelConfigurator){
315
                                     fileEnding  = ".csv";
316
                                 }
317
                                 File file = new File(urlString+File.separator + key + fileEnding);
318
                                 FileOutputStream stream = new FileOutputStream(file);
319
                                 Writer out = new BufferedWriter(new OutputStreamWriter(
320
                             			stream, "UTF8"));
321
                                 stream.write(fileData);
322
                                 stream.close();
323
                             }
324

    
325
                         }else{
326
                             logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
327
                         }
328
                     } catch(Exception e){
329
                         logger.error(e.getStackTrace());
330
                     }
331
                     showResult(configurator.getClass().getSimpleName(), display, result);
332

    
333

    
334
                 } catch (Exception e) {
335
                     MessagingUtils.errorDialog("Error exporting data",
336
                             this,
337
                             e.getMessage(),
338
                             TaxeditorStorePlugin.PLUGIN_ID,
339
                             e,
340
                             true);
341
                 }
342

    
343
                 return Status.OK_STATUS;
344
             }
345
         };
346
         return job;
347
    }
348

    
349

    
350

    
351
}
(2-2/3)