X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/blobdiff_plain/e6fcf4e891b6d74430c9a8eea772656153fc04f9..ab08477fbd194f09997ef79a59b803b08be20bb1:/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/ExportManager.java diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/ExportManager.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/ExportManager.java index 2c659e804..00308aff9 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/ExportManager.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/io/ExportManager.java @@ -6,189 +6,166 @@ * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ - package eu.etaxonomy.taxeditor.io; +import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; - +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IWorkbenchPart; import eu.etaxonomy.cdm.api.application.CdmApplicationState; import eu.etaxonomy.cdm.api.application.ICdmRepository; -import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; -import eu.etaxonomy.cdm.io.common.CdmDefaultExport; +import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor; +import eu.etaxonomy.cdm.io.cdmLight.CdmLightExportConfigurator; +import eu.etaxonomy.cdm.io.coldp.ColDpExportConfigurator; +import eu.etaxonomy.cdm.io.common.ExportDataWrapper; import eu.etaxonomy.cdm.io.common.ExportResult; +import eu.etaxonomy.cdm.io.common.ExportResultType; import eu.etaxonomy.cdm.io.common.IExportConfigurator; import eu.etaxonomy.cdm.io.common.IIoConfigurator; +import eu.etaxonomy.cdm.io.dwca.out.DwcaTaxExportConfigurator; import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator; import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator; import eu.etaxonomy.cdm.io.service.IIOService; +import eu.etaxonomy.cdm.io.wfo.out.WfoBackboneExportConfigurator; +import eu.etaxonomy.taxeditor.model.AbstractUtility; import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter; import eu.etaxonomy.taxeditor.model.MessagingUtils; -import eu.etaxonomy.taxeditor.store.StoreUtil; +import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator; +import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled; +import eu.etaxonomy.taxeditor.store.CdmStore; import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin; /** - *

- * ExportHandler class. - *

- * * @author n.hoffmann * @created Sep 11, 2009 - * @version 1.0 */ -public class ExportManager extends AbstractIOManager { +public class ExportManager + extends AbstractIOManager + implements IPostMoniteredOperationEnabled { + + private static final Logger logger = LogManager.getLogger(); + + /** Constant DATE_FORMAT_NOW="yyyyMMddHHmm" */ + public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm"; + + private final String successMessage = "The export was successful"; - /** - * - * @param applicationConfiguration - */ private ExportManager(ICdmRepository applicationConfiguration) { super(applicationConfiguration); } - /** - *

- * NewInstance - *

- * - * @param applicationConfiguration - * a - * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController} - * object. - * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object. - */ public static ExportManager NewInstance( ICdmRepository applicationConfiguration) { return new ExportManager(applicationConfiguration); } - /** - *

- * createIOJob - *

- * - * @param configurator - * a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator} - * object. - * @return a {@link org.eclipse.core.runtime.jobs.Job} object. - */ - @Override - protected Job createIOJob(final IExportConfigurator configurator) { - - Assert.isNotNull(configurator, "Configuration may not be null"); - - final Display display = Display.getCurrent(); - - Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { - @Override - protected IStatus run(IProgressMonitor monitor) { - monitor.beginTask( - "Exporting database. This will take some time.", 100); - monitor.worked(10); - - /** see ticket # 4456 and */ -// display.asyncExec(new Runnable() { -// -// @Override -// public void run() { -// -// // terminate any open transactions -// IConversationEnabled activePart = (IConversationEnabled) StoreUtil -// .getActivePage().getActivePart(); -// activePart.getConversationHolder().commit(false); -// } -// }); - -// monitor.worked(10); - - CdmDefaultExport exporter = new CdmDefaultExport(); - configurator.setProgressMonitor(CdmProgressMonitorAdapter - .CreateSubMonitor(monitor, 80)); - exporter.setCdmAppController(applicationConfiguration); - monitor.worked(10); - - try { - exporter.invoke(configurator); - monitor.worked(60); - } catch (RuntimeException e) { - MessagingUtils.messageDialog("Error exporting data", this, - "An error occured while" - + "exporting to destination '" - + configurator.getDestinationNameString() - + "'.\n" - + "Please check error log for details.", e); - } - - display.asyncExec(new Runnable() { - - @Override - public void run() { - IWorkbenchPart activePart = StoreUtil.getActivePage() - .getActivePart(); - if (activePart instanceof IConversationEnabled) { - // terminate any open transactions - IConversationEnabled conversationEnabled = (IConversationEnabled) activePart; - // restarting transaction and committing it to - // trigger - // change listener - // TODO verify correct behaviour - - try{ - conversationEnabled.getConversationHolder() - .startTransaction(); - - conversationEnabled.getConversationHolder() - .commit(); - }catch(RuntimeException e){ - MessagingUtils.messageDialog("Error starting conversation handling", this, "" + - "Conversation Error: "+ e); - } - } - } - }); - monitor.worked(10); - - return Status.OK_STATUS; - } - }; - - return job; - } - public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) { Assert.isNotNull(configurator, "Configuration may not be null"); - // final Display display = Display.getCurrent(); + final Display display = Display.getCurrent(); Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$ @Override protected IStatus run(IProgressMonitor monitor) { - monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN); + SubMonitor subMonitor = SubMonitor.convert(monitor, 100); + subMonitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN); try { IIOService ioService = CdmApplicationState.getIOService(); - - ExportResult result = ioService.export(configurator); - ExportDataWrapper data = result.getExportData(); + UUID uuid = ioService.monitExportData(configurator); + IRemotingProgressMonitor remotingMonitor; + List feedBackGeneratorList = new ArrayList<>(); + try { + remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data", + uuid, + 1000, + ExportManager.this, + feedBackGeneratorList, + subMonitor); + + } catch (Exception ex) { + return new Status(IStatus.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex); + } + + ExportResult result = (ExportResult)remotingMonitor.getResult(); + ExportDataWrapper data = result.getExportData(); try{ - byte[] exportData = (byte[])data.getExportData(); - if(exportData != null){ - FileOutputStream stream = new FileOutputStream(exportFile); - stream.write(exportData); - stream.close(); - } + if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){ + if (data.getExportData() instanceof byte[]){ + byte[] exportData = (byte[])data.getExportData(); + if(exportData != null){ + FileOutputStream stream = new FileOutputStream(exportFile); + Writer out = new BufferedWriter(new OutputStreamWriter( + stream, "UTF8")); + + stream.write(exportData); + out.flush(); + stream.close(); + } + }else if (data.getExportData() instanceof List){ + //TODO:This needs to be improved + @SuppressWarnings("unchecked") + List exportData = (List)data.getExportData(); + if(exportData != null){ + FileOutputStream stream = new FileOutputStream(exportFile); + Writer out = new BufferedWriter(new OutputStreamWriter( + stream, "UTF8")); + + stream.write(exportData.get(0)); + out.flush(); + stream.close(); + } + } + + } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){ + @SuppressWarnings("unchecked") + Map resultMap = (Map)data.getExportData(); + Set keySet = resultMap.keySet(); + String fileEnding = ".zip"; + if (configurator instanceof DwcaTaxExportConfigurator){ + DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator; + + File file = new File(dwcaConfig.getDestination().toURI()); + FileOutputStream stream = new FileOutputStream(file); + ZipOutputStream zos = new ZipOutputStream(stream); + for (String key: keySet){ + byte[] fileData = resultMap.get(key); + ZipEntry entry = new ZipEntry( key + fileEnding); + zos.putNextEntry(entry); + zos.write(fileData); + zos.closeEntry(); + } + zos.close(); + } + } else{ + logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString()); + } + } catch(Exception e){ logger.error(e.getStackTrace()); } - + showResult(configurator.getClass().getSimpleName(), display, result, successMessage); } catch (Exception e) { @@ -204,10 +181,7 @@ public class ExportManager extends AbstractIOManager { }; return job; } - /** - * @param jaxb - * @return - */ + private IIoConfigurator getConfigurator(TYPE type) { Assert.isNotNull(type, "Type should not be null"); @@ -222,29 +196,144 @@ public class ExportManager extends AbstractIOManager { } } - /** - *

- * JaxbConfigurator - *

- * - * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object. - */ public final JaxbExportConfigurator JaxbConfigurator() { return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb); } - /** - *

- * SddConfigurator - *

- * - * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator} - * object. - */ public final SDDExportConfigurator SddConfigurator() { return (SDDExportConfigurator) getConfigurator(TYPE.Sdd); } + public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) { + Assert.isNotNull(configurator, "Configuration may not be null"); + final Display display = Display.getDefault(); + + Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$ + @Override + protected IStatus run(IProgressMonitor monitor) { + monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN); + try { + IIOService ioService = CdmApplicationState.getIOService(); + monitor.beginTask( + "Exporting database. This will take some time.", 100); + monitor.worked(10); + configurator.setProgressMonitor(CdmProgressMonitorAdapter + .CreateSubMonitor(monitor, 80)); + ExportResult result = ioService.export(configurator); + ExportDataWrapper data = result.getExportData(); + try{ + if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){ + byte[] exportData = (byte[])data.getExportData(); + if(exportData != null){ + File file = new File(urlString); + FileOutputStream stream = new FileOutputStream(file); + Writer out = new BufferedWriter(new OutputStreamWriter( + stream, "UTF8")); + + stream.write(exportData); + out.flush(); + stream.close(); + } + } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){ + @SuppressWarnings("unchecked") + Map resultMap = (Map)data.getExportData(); + Set keySet = resultMap.keySet(); + SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); + Calendar cal = Calendar.getInstance(); + String fileEnding = ".csv"; + + if (configurator.isCreateZipFile()){ + File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip"); + FileOutputStream stream = new FileOutputStream(file); + ZipOutputStream zos = new ZipOutputStream(stream); + for (String key: keySet){ + byte[] fileData = resultMap.get(key); + ZipEntry entry = new ZipEntry( key + fileEnding); + zos.putNextEntry(entry); + zos.write(fileData); + zos.closeEntry(); + } + zos.close(); + }else{ + for (String key: keySet){ + byte[] fileData = resultMap.get(key); + File file = new File(urlString+File.separator + key + fileEnding); + FileOutputStream stream = new FileOutputStream(file); + Writer out = new BufferedWriter(new OutputStreamWriter( + stream, "UTF8")); + stream.write(fileData); + out.flush(); + stream.close(); + + } + } + }else{ + logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString()); + } + } catch(Exception e){ + logger.error(e.getStackTrace()); + } + showResult(configurator.getClass().getSimpleName(), display, result, successMessage); + + + } catch (Exception e) { + MessagingUtils.errorDialog("Error exporting data", + this, + e.getMessage(), + TaxeditorStorePlugin.PLUGIN_ID, + e, + true); + } + + return Status.OK_STATUS; + } + }; + return job; + } + + public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) { + IIOService ioService = CdmApplicationState.getIOService(); + final UUID uuid = ioService.monitExportData(configurator); + + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + boolean isZip = false; + String urlAddition = ""; + if (configurator instanceof CdmLightExportConfigurator + || configurator instanceof ColDpExportConfigurator + || configurator instanceof WfoBackboneExportConfigurator){ + + if (configurator instanceof CdmLightExportConfigurator) { + isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile(); + }else if (configurator instanceof ColDpExportConfigurator){ + isZip = ((ColDpExportConfigurator)configurator).isCreateZipFile(); + }else if (configurator instanceof WfoBackboneExportConfigurator){ + isZip = ((WfoBackboneExportConfigurator)configurator).isCreateZipFile(); + if (isZip) { + SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); + Calendar cal = Calendar.getInstance(); + urlAddition = File.separator + ((WfoBackboneExportConfigurator)configurator).getFamilyStr() + "_WFO_" + sdf.format(cal.getTime()); + } + } + } + AbstractUtility.executeMoniteredExport( + configurator.getUserFriendlyIOName() != null? configurator.getUserFriendlyIOName(): "Export", + uuid, + 1000, + true, + ExportManager.this, + null, + urlString+urlAddition, + isZip); + } + }); + } - -} + @Override + public void postOperation(IRemotingProgressMonitor monitor) { + Display.getDefault().asyncExec(()-> { + CdmStore.getContextManager().notifyContextRefresh(); + }); + } +} \ No newline at end of file