ref #6619: add the possibility to ignore methods of the configurator in the configura...
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / io / ExportManager.java
index 88093316ea251254506b3a3adc20a50bbe85c87c..9918b79a74697a47a82a5e3be7ef4419ac71c923 100644 (file)
@@ -1,72 +1,93 @@
-// $Id$
 /**
  * Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy 
+ * European Distributed Institute of Taxonomy
  * http://www.e-taxonomy.eu
- * 
+ *
  * 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.File;
+import java.io.FileOutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.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.jobs.Job;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
 
-import eu.etaxonomy.cdm.api.application.CdmApplicationController;
+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.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.common.IoResultBase;
 import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
+import eu.etaxonomy.cdm.io.outputmodel.OutputModelConfigurator;
 import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
+import eu.etaxonomy.cdm.io.service.IIOService;
 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
+import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
+import eu.etaxonomy.taxeditor.ui.dialog.ReportTextDialog;
 
 /**
  * <p>
  * ExportHandler class.
  * </p>
- * 
+ *
  * @author n.hoffmann
  * @created Sep 11, 2009
  * @version 1.0
  */
 public class ExportManager extends AbstractIOManager<IExportConfigurator> {
 
+    private static final Logger logger = Logger.getLogger(ExportManager.class);
+
        /**
-        * 
-        * @param applicationController
+        *
+        * @param applicationConfiguration
         */
-       private ExportManager(CdmApplicationController applicationController) {
-               super(applicationController);
+       private ExportManager(ICdmRepository applicationConfiguration) {
+               super(applicationConfiguration);
        }
 
        /**
         * <p>
         * NewInstance
         * </p>
-        * 
-        * @param applicationController
+        *
+        * @param applicationConfiguration
         *            a
         *            {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
         *            object.
         * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
         */
        public static ExportManager NewInstance(
-                       CdmApplicationController applicationController) {
-               return new ExportManager(applicationController);
+                       ICdmRepository applicationConfiguration) {
+               return new ExportManager(applicationConfiguration);
        }
 
        /**
         * <p>
         * createIOJob
         * </p>
-        * 
+        *
         * @param configurator
         *            a {@link eu.etaxonomy.cdm.io.common.IExportConfigurator}
         *            object.
@@ -86,30 +107,32 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
                                                "Exporting database. This will take some time.", 100);
                                monitor.worked(10);
 
-                               display.asyncExec(new Runnable() {
+                           /** 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);
+//                                     }
+//                             });
 
-                                       @Override
-                                       public void run() {
-                                               // terminate any open transactions
-                                               IConversationEnabled activePart = (IConversationEnabled) StoreUtil
-                                                               .getActivePage().getActivePart();
-                                               activePart.getConversationHolder().commit(false);
-                                       }
-                               });
-
-                               monitor.worked(10);
+//                             monitor.worked(10);
 
                                CdmDefaultExport<IExportConfigurator> exporter = new CdmDefaultExport<IExportConfigurator>();
                                configurator.setProgressMonitor(CdmProgressMonitorAdapter
                                                .CreateSubMonitor(monitor, 80));
-                               exporter.setCdmAppController(applicationController);
+                               exporter.setCdmAppController(applicationConfiguration);
                                monitor.worked(10);
 
                                try {
                                        exporter.invoke(configurator);
                                        monitor.worked(60);
                                } catch (RuntimeException e) {
-                                       StoreUtil.errorDialog("Error exporting data", this,
+                                       MessagingUtils.messageDialog("Error exporting data", this,
                                                        "An error occured while"
                                                                        + "exporting to destination '"
                                                                        + configurator.getDestinationNameString()
@@ -121,14 +144,27 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
 
                                        @Override
                                        public void run() {
-                                               // terminate any open transactions
-                                               IConversationEnabled activePart = (IConversationEnabled) StoreUtil
-                                                               .getActivePage().getActivePart();
-                                               // restarting transaction and committing it to trigger
-                                               // change listener
-                                               // TODO verify correct behaviour
-                                               activePart.getConversationHolder().startTransaction();
-                                               activePart.getConversationHolder().commit();
+                                               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);
@@ -140,6 +176,62 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
                return job;
        }
 
+       public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
+           Assert.isNotNull(configurator, "Configuration may not be null");
+
+          // 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);
+                   try {
+                       IIOService ioService = CdmApplicationState.getIOService();
+
+                       ExportResult result = ioService.export(configurator);
+                       ExportDataWrapper data = result.getExportData();
+                       try{
+                       if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY)){
+                           byte[] exportData = (byte[])data.getExportData();
+                               if(exportData != null){
+                                   FileOutputStream stream = new FileOutputStream(exportFile);
+                                stream.write(exportData);
+                                stream.close();
+                            }
+//                     } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
+//                         Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
+//                         Set<String> keySet = resultMap.keySet();
+//                         for (String key: keySet){
+//                             byte[] fileData = resultMap.get(key);
+//                             File file = new File(urlString)
+//                             FileOutputStream stream = new FileOutputStream(key);
+//                                stream.write(fileData);
+//                                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());
+                       }
+
+
+
+
+                   } catch (Exception e) {
+                       MessagingUtils.errorDialog("Error exporting data",
+                               this,
+                               e.getMessage(),
+                               TaxeditorStorePlugin.PLUGIN_ID,
+                               e,
+                               true);
+                   }
+                   return Status.OK_STATUS;
+               }
+           };
+           return job;
+       }
        /**
         * @param jaxb
         * @return
@@ -153,7 +245,7 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
                case Sdd:
                        return SDDExportConfigurator.NewInstance(null, null, null);
                default:
-                       StoreUtil.notImplementedMessage(this);
+                       MessagingUtils.notImplementedMessage(this);
                        throw new IllegalArgumentException("Export not supported yet");
                }
        }
@@ -162,7 +254,7 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
         * <p>
         * JaxbConfigurator
         * </p>
-        * 
+        *
         * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator} object.
         */
        public final JaxbExportConfigurator JaxbConfigurator() {
@@ -173,7 +265,7 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
         * <p>
         * SddConfigurator
         * </p>
-        * 
+        *
         * @return a {@link eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator}
         *         object.
         */
@@ -181,4 +273,106 @@ public class ExportManager extends AbstractIOManager<IExportConfigurator> {
                return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
        }
 
+    /**
+     * @param configurator
+     * @param urlString
+     * @return
+     */
+    public Job createIOServiceJob(OutputModelConfigurator configurator, String urlString) {
+        Assert.isNotNull(configurator, "Configuration may not be null");
+
+        // 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);
+                 try {
+                     IIOService ioService = CdmApplicationState.getIOService();
+
+                     ExportResult result = ioService.export(configurator);
+                     ExportDataWrapper data = result.getExportData();
+                     try{
+                         if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY)){
+                             byte[] exportData = (byte[])data.getExportData();
+                             if(exportData != null){
+                                 File file = new File(urlString);
+                                 FileOutputStream stream = new FileOutputStream(file);
+                                 stream.write(exportData);
+                                 stream.close();
+                             }
+                         } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
+                             Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
+                             Set<String> keySet = resultMap.keySet();
+                             for (String key: keySet){
+                                 byte[] fileData = resultMap.get(key);
+                                 String fileEnding ="";
+                                 if (configurator instanceof OutputModelConfigurator){
+                                     fileEnding  = ".csv";
+                                 }
+                                 File file = new File(urlString+File.separator + key + fileEnding);
+                                 FileOutputStream stream = new FileOutputStream(file);
+                                 stream.write(fileData);
+                                 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());
+                     }
+                     final StringBuilder reportText = new StringBuilder();
+                     if(result!=null){
+                         List<IoResultBase.Error> reports = result.getErrors();
+                         reportText.append("Errors:\\r");
+                         for (IoResultBase.Error bs : reports) {
+                             reportText.append(bs.getMessage() + " - " +bs.getException().getStackTrace());
+                         }
+                         List<String> warnings = result.getWarnings();
+                         reportText.append("Warnings:\\r");
+                         for (String bs : warnings) {
+                             reportText.append(bs);
+                         }
+                         List<IoResultBase.Error> exceptions = result.getExceptions();
+                         reportText.append("Exceptions:\\r");
+                         for (IoResultBase.Error bs : exceptions) {
+                             reportText.append(bs.getMessage() + " - " +bs.getException().getStackTrace());
+                         }
+
+
+                     }
+                     final Display display = Display.getDefault();
+                     display.asyncExec(new Runnable() {
+
+                         @Override
+                         public void run() {
+                             // display reports with possibility to save
+                             ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+                             dialog.setTitle(configurator.getClass().getSimpleName()+" Report");
+                             dialog.setReportText(reportText.toString());
+                             dialog.open();
+                             CdmStore.getContextManager().notifyContextRefresh();
+                         }
+                     });
+
+
+
+                 } catch (Exception e) {
+                     MessagingUtils.errorDialog("Error exporting data",
+                             this,
+                             e.getMessage(),
+                             TaxeditorStorePlugin.PLUGIN_ID,
+                             e,
+                             true);
+                 }
+
+                 return Status.OK_STATUS;
+             }
+         };
+         return job;
+    }
+
+
+
 }