e8e7726b80e65c18447d5816cd848ec10c5888fd
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / io / ExportManager.java
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.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.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 *
61 * @author n.hoffmann
62 * @created Sep 11, 2009
63 */
64 public class ExportManager
65 extends AbstractIOManager<IExportConfigurator>
66 implements IPostMoniteredOperationEnabled {
67
68 private static final Logger logger = Logger.getLogger(ExportManager.class);
69 /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
70 public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm";
71
72 private final String successMessage = "The export was successful";
73
74 private ExportManager(ICdmRepository applicationConfiguration) {
75 super(applicationConfiguration);
76 }
77
78 public static ExportManager NewInstance(
79 ICdmRepository applicationConfiguration) {
80 return new ExportManager(applicationConfiguration);
81 }
82
83 @Override
84 protected Job createIOJob(final IExportConfigurator configurator) {
85
86 Assert.isNotNull(configurator, "Configuration may not be null");
87
88 final Display display = Display.getCurrent();
89
90 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) {
91 @Override
92 protected IStatus run(IProgressMonitor monitor) {
93 monitor.beginTask(
94 "Exporting database. This will take some time.", 100);
95 monitor.worked(10);
96
97 /** see ticket # 4456 and */
98 // display.asyncExec(new Runnable() {
99 //
100 // @Override
101 // public void run() {
102 //
103 // // terminate any open transactions
104 // IConversationEnabled activePart = (IConversationEnabled) StoreUtil
105 // .getActivePage().getActivePart();
106 // activePart.getConversationHolder().commit(false);
107 // }
108 // });
109
110 // monitor.worked(10);
111
112 CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<>();
113 configurator.setProgressMonitor(CdmProgressMonitorAdapter
114 .CreateSubMonitor(monitor, 80));
115 exporter.setCdmAppController(applicationConfiguration);
116 monitor.worked(10);
117
118 try {
119 exporter.invoke(configurator);
120 monitor.worked(60);
121 } catch (RuntimeException e) {
122 MessagingUtils.messageDialog("Error exporting data", this,
123 "An error occurred while"
124 + "exporting to destination '"
125 + configurator.getDestinationNameString()
126 + "'.\n"
127 + "Please check error log for details.", e);
128 }
129
130 display.asyncExec(()-> {
131 Object activePart = EventUtility.getActivePart();
132 if (activePart instanceof IConversationEnabled) {
133 // terminate any open transactions
134 IConversationEnabled conversationEnabled = (IConversationEnabled) activePart;
135 // restarting transaction and committing it to
136 // trigger
137 // change listener
138 // TODO verify correct behaviour
139
140 try{
141 conversationEnabled.getConversationHolder()
142 .startTransaction();
143
144 conversationEnabled.getConversationHolder()
145 .commit();
146 }catch(RuntimeException e){
147 MessagingUtils.messageDialog("Error starting conversation handling", this, "" +
148 "Conversation Error: "+ e);
149 }
150 }
151 });
152 monitor.worked(10);
153
154 return Status.OK_STATUS;
155 }
156 };
157
158 return job;
159 }
160
161 public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
162 Assert.isNotNull(configurator, "Configuration may not be null");
163
164 final Display display = Display.getCurrent();
165
166 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
167 @Override
168 protected IStatus run(IProgressMonitor monitor) {
169 SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
170 subMonitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
171 try {
172 IIOService ioService = CdmApplicationState.getIOService();
173 UUID uuid = ioService.monitExportData(configurator);
174 IRemotingProgressMonitor remotingMonitor;
175 List<IFeedbackGenerator> feedBackGeneratorList = new ArrayList<>();
176 try {
177 remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data",
178 uuid,
179 1000,
180 ExportManager.this,
181 feedBackGeneratorList,
182 subMonitor);
183
184 } catch (Exception ex) {
185 return new Status(IStatus.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
186 }
187
188 ExportResult result = (ExportResult)remotingMonitor.getResult();
189 ExportDataWrapper<?> data = result.getExportData();
190 try{
191 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
192 if (data.getExportData() instanceof byte[]){
193 byte[] exportData = (byte[])data.getExportData();
194 if(exportData != null){
195 FileOutputStream stream = new FileOutputStream(exportFile);
196 Writer out = new BufferedWriter(new OutputStreamWriter(
197 stream, "UTF8"));
198
199 stream.write(exportData);
200 out.flush();
201 stream.close();
202 }
203 }else if (data.getExportData() instanceof List<?>){
204 //TODO:This needs to be improved
205 @SuppressWarnings("unchecked")
206 List<byte[]> exportData = (List<byte[]>)data.getExportData();
207 if(exportData != null){
208 FileOutputStream stream = new FileOutputStream(exportFile);
209 Writer out = new BufferedWriter(new OutputStreamWriter(
210 stream, "UTF8"));
211
212 stream.write(exportData.get(0));
213 out.flush();
214 stream.close();
215 }
216 }
217
218 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
219 @SuppressWarnings("unchecked")
220 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
221 Set<String> keySet = resultMap.keySet();
222 String fileEnding = ".zip";
223 if (configurator instanceof DwcaTaxExportConfigurator){
224 DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator;
225
226 File file = new File(dwcaConfig.getDestination().toURI());
227 FileOutputStream stream = new FileOutputStream(file);
228 ZipOutputStream zos = new ZipOutputStream(stream);
229 for (String key: keySet){
230 byte[] fileData = resultMap.get(key);
231 ZipEntry entry = new ZipEntry( key + fileEnding);
232 zos.putNextEntry(entry);
233 zos.write(fileData);
234 zos.closeEntry();
235 }
236 zos.close();
237 }
238 } else{
239 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
240 }
241
242 } catch(Exception e){
243 logger.error(e.getStackTrace());
244 }
245
246 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
247
248
249 } catch (Exception e) {
250 MessagingUtils.errorDialog("Error exporting data",
251 this,
252 e.getMessage(),
253 TaxeditorStorePlugin.PLUGIN_ID,
254 e,
255 true);
256 }
257 return Status.OK_STATUS;
258 }
259 };
260 return job;
261 }
262
263 private IIoConfigurator getConfigurator(TYPE type) {
264 Assert.isNotNull(type, "Type should not be null");
265
266 switch (type) {
267 case Jaxb:
268 return JaxbExportConfigurator.NewInstance(null, null);
269 case Sdd:
270 return SDDExportConfigurator.NewInstance(null, null, null);
271 default:
272 MessagingUtils.notImplementedMessage(this);
273 throw new IllegalArgumentException("Export not supported yet");
274 }
275 }
276
277 public final JaxbExportConfigurator JaxbConfigurator() {
278 return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
279 }
280
281 public final SDDExportConfigurator SddConfigurator() {
282 return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
283 }
284
285 public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) {
286 Assert.isNotNull(configurator, "Configuration may not be null");
287 final Display display = Display.getDefault();
288
289 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
290 @Override
291 protected IStatus run(IProgressMonitor monitor) {
292 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
293 try {
294 IIOService ioService = CdmApplicationState.getIOService();
295 monitor.beginTask(
296 "Exporting database. This will take some time.", 100);
297 monitor.worked(10);
298 configurator.setProgressMonitor(CdmProgressMonitorAdapter
299 .CreateSubMonitor(monitor, 80));
300 ExportResult result = ioService.export(configurator);
301 ExportDataWrapper<?> data = result.getExportData();
302 try{
303 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
304 byte[] exportData = (byte[])data.getExportData();
305 if(exportData != null){
306 File file = new File(urlString);
307 FileOutputStream stream = new FileOutputStream(file);
308 Writer out = new BufferedWriter(new OutputStreamWriter(
309 stream, "UTF8"));
310
311 stream.write(exportData);
312 out.flush();
313 stream.close();
314 }
315 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
316 @SuppressWarnings("unchecked")
317 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
318 Set<String> keySet = resultMap.keySet();
319 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
320 Calendar cal = Calendar.getInstance();
321 String fileEnding = ".csv";
322
323 if (configurator.isCreateZipFile()){
324 File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip");
325 FileOutputStream stream = new FileOutputStream(file);
326 ZipOutputStream zos = new ZipOutputStream(stream);
327 for (String key: keySet){
328 byte[] fileData = resultMap.get(key);
329 ZipEntry entry = new ZipEntry( key + fileEnding);
330 zos.putNextEntry(entry);
331 zos.write(fileData);
332 zos.closeEntry();
333 }
334 zos.close();
335 }else{
336 for (String key: keySet){
337 byte[] fileData = resultMap.get(key);
338 File file = new File(urlString+File.separator + key + fileEnding);
339 FileOutputStream stream = new FileOutputStream(file);
340 Writer out = new BufferedWriter(new OutputStreamWriter(
341 stream, "UTF8"));
342 stream.write(fileData);
343 stream.close();
344 }
345 }
346 }else{
347 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
348 }
349 } catch(Exception e){
350 logger.error(e.getStackTrace());
351 }
352 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
353
354
355 } catch (Exception e) {
356 MessagingUtils.errorDialog("Error exporting data",
357 this,
358 e.getMessage(),
359 TaxeditorStorePlugin.PLUGIN_ID,
360 e,
361 true);
362 }
363
364 return Status.OK_STATUS;
365 }
366 };
367 return job;
368 }
369
370 public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
371 IIOService ioService = CdmApplicationState.getIOService();
372 final UUID uuid = ioService.monitExportData(configurator);
373
374 Display.getDefault().asyncExec(new Runnable() {
375 @Override
376 public void run() {
377 boolean isZip = false;
378 if (configurator instanceof CdmLightExportConfigurator){
379 isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
380 }
381 AbstractUtility.executeMoniteredExport(configurator.getUserFriendlyIOName() != null? configurator.getUserFriendlyIOName(): "Export",
382 uuid,
383 1000,
384 true,
385 ExportManager.this,
386 null,
387 urlString,
388 isZip);
389 }
390 });
391 }
392
393 @Override
394 public void postOperation(IRemotingProgressMonitor monitor) {
395 Display.getDefault().asyncExec(()-> {
396 CdmStore.getContextManager().notifyContextRefresh();
397 });
398 }
399 }