typo
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / model / AbstractUtility.java
index b39a7f7abdac888b8c95d223a50bad9ddc9616de..85c65e7c81230e4ad37d331d6a342be54edc156e 100644 (file)
@@ -39,6 +39,7 @@ import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.e4.ui.di.UISynchronize;
@@ -58,6 +59,7 @@ import org.eclipse.ui.progress.IProgressConstants;
 
 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
 import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
+import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
 import eu.etaxonomy.cdm.io.common.ExportDataWrapper;
 import eu.etaxonomy.cdm.io.common.ExportResult;
@@ -69,7 +71,6 @@ import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
 import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
-import eu.etaxonomy.taxeditor.operation.RemotingCdmHandler;
 import eu.etaxonomy.taxeditor.operation.e4.RemotingCdmHandlerE4;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
@@ -86,7 +87,7 @@ import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
  */
 public abstract class AbstractUtility {
 
-    private static final Logger logger = Logger.getLogger(AbstractUtility.class);
+    protected static final Logger logger = Logger.getLogger(AbstractUtility.class);
 
     /** Constant <code>statusLineManager</code> */
     protected static IStatusLineManager statusLineManager;
@@ -161,7 +162,7 @@ public abstract class AbstractUtility {
             job.setUser(true);
             job.schedule();
         } catch (Exception e) {
-            MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occured while executing " + operation.getLabel(), e);
+            MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occurred while executing " + operation.getLabel(), e);
         }
 
         return Status.OK_STATUS;
@@ -171,11 +172,7 @@ public abstract class AbstractUtility {
         return executeOperation_internal(operation, handler, sync);
     }
 
-    public static IStatus executeOperation(final AbstractOperation operation, final RemotingCdmHandler handler, UISynchronize sync) {
-        return executeOperation_internal(operation, handler, sync);
-    }
-
-    private static IStatus executeOperation_internal(final AbstractOperation operation, final Object handler,
+    private static IStatus executeOperation_internal(final AbstractOperation operation, final RemotingCdmHandlerE4 handler,
             UISynchronize sync) {
         if (getOperationHistory() == null) {
             throw new IllegalArgumentException(
@@ -195,12 +192,7 @@ public abstract class AbstractUtility {
                     operation.addContext(IOperationHistory.GLOBAL_UNDO_CONTEXT);
                     status = operation.execute(monitor,
                             uiInfoAdapter);
-                    if(handler instanceof RemotingCdmHandler) {
-                        ((RemotingCdmHandler) handler).postOperation(status);
-                    }
-                    else if(handler instanceof RemotingCdmHandlerE4) {
-                        ((RemotingCdmHandlerE4) handler).postOperation(status);
-                    }
+                    handler.postOperation(status);
                 } catch (ExecutionException e) {
                     MessagingUtils.operationDialog(AbstractUtility.class, e, TaxeditorStorePlugin.PLUGIN_ID, operationlabel, null);
                 } finally {
@@ -217,7 +209,7 @@ public abstract class AbstractUtility {
             job.setUser(true);
             sync.syncExec(()->job.schedule());
         } catch (Exception e) {
-            MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occured while executing " + operation.getLabel(), e);
+            MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occurred while executing " + operation.getLabel(), e);
         }
 
         return Status.OK_STATUS;
@@ -250,6 +242,9 @@ public abstract class AbstractUtility {
             if(firstRemotingMonitor == null) {
                 throw new IllegalStateException("Remoting progress monitor is null");
             }
+            if (firstRemotingMonitor.isDone()){
+                createExportResult(label, urlString, createZip, firstRemotingMonitor);
+            }
 
             Job job = new Job(label) {
 
@@ -257,7 +252,8 @@ public abstract class AbstractUtility {
                 @Override
                 public IStatus run(IProgressMonitor monitor) {
                     // run the monitor until the operation is finished
-                       monitor.beginTask("Start", 100);
+                    SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
+                    //subMonitor.beginTask("Start", 100);
                     IRemotingProgressMonitor remotingMonitor;
                     try {
                         remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor(label,
@@ -265,100 +261,17 @@ public abstract class AbstractUtility {
                                 pollInterval,
                                 postOp,
                                 feedbackGenerator,
-                                monitor);
+                                subMonitor);
                     } catch (Exception ex) {
                         return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
                     }
-                    final StringBuilder reportSb = new StringBuilder();
-                    if (remotingMonitor.getResult() instanceof ExportResult){
-                       ExportResult result = (ExportResult)remotingMonitor.getResult();
-
-                           reportSb.append(result.createReport());
-
-                           if(!StringUtils.isBlank(reportSb.toString())) {
-                               Display.getDefault().asyncExec(new Runnable() {
-                                   @Override
-                                   public void run() {
-                                       // display reports with possibility to save
-                                       ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
-                                       dialog.setTitle(label + " Report");
-                                       dialog.setReportText(reportSb.toString());
-                                       dialog.open();
-                                   }
-                               });
-                           }
-
-                           if (urlString != null){
-                                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);
-                                            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)){
-                                        Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
-                                        Set<String> keySet = resultMap.keySet();
-                                        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
-                                        Calendar cal = Calendar.getInstance();
-                                        String fileEnding = ".csv";
-
-                                        if (createZip){
-                                                File file = new File(urlString+File.separator +  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{
-                                               if(result.getExportType().equals(ExportType.DWCA)){
-
-                                               File file = new File(urlString);
-                                               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);
-                                                        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());
-                                }
-                           }
-                    }
+
+                    createExportResult(label, urlString, createZip, remotingMonitor);
                     return Status.OK_STATUS;
                 }
 
+
+
                 @Override
                 protected void canceling() {
                     CdmStore.getCurrentApplicationConfiguration().getProgressMonitorService().cancel(uuid);
@@ -374,7 +287,7 @@ public abstract class AbstractUtility {
         } catch (Exception e) {
             MessagingUtils.errorDialog("Error executing operation",
                     AbstractUtility.class,
-                    "An error occured while executing " + label,
+                    "An error occurred while executing " + label,
                     TaxeditorStorePlugin.PLUGIN_ID,
                     e,
                     true);
@@ -681,7 +594,8 @@ public abstract class AbstractUtility {
             final int pollInterval,
             final boolean cancelable,
             final IPostMoniteredOperationEnabled postOp,
-            final IFeedbackGenerator feedbackGenerator) {
+            final IFeedbackGenerator feedbackGenerator,
+            final boolean showResult) {
 
        try{
                // get the remoting monitor the first time to make sure that the
@@ -691,6 +605,10 @@ public abstract class AbstractUtility {
             if(firstRemotingMonitor == null) {
                 throw new IllegalStateException("Remoting progress monitor is null");
             }
+            if (firstRemotingMonitor.isDone()){
+                createResult(label, showResult, firstRemotingMonitor);
+                return Status.OK_STATUS;
+            }
 
             Job job = new Job(label) {
 
@@ -698,7 +616,9 @@ public abstract class AbstractUtility {
                 @Override
                 public IStatus run(IProgressMonitor monitor) {
                     // run the monitor until the operation is finished
-                       monitor.beginTask("Start", 100);
+                    SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
+                   // subMonitor.beginTask("Start", 100);
+
                     IRemotingProgressMonitor remotingMonitor;
                     try {
                         remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor(label,
@@ -706,30 +626,21 @@ public abstract class AbstractUtility {
                                 pollInterval,
                                 postOp,
                                 feedbackGenerator,
-                                monitor);
+                                subMonitor);
                     } catch (Exception ex) {
                         return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
                     }
-                    final StringBuilder reportSb = new StringBuilder();
+
+
                     // collect reports
 //                         for(String report : remotingMonitor.getResult()) {
-                        reportSb.append(((ExportResult)remotingMonitor.getResult()).createReport());
-//                         }
-                    if(!StringUtils.isBlank(reportSb.toString())) {
-                        Display.getDefault().asyncExec(new Runnable() {
-                            @Override
-                            public void run() {
-                                // display reports with possibility to save
-                                ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
-                                dialog.setTitle(label + " Report");
-                                dialog.setReportText(reportSb.toString());
-                                dialog.open();
-                            }
-                        });
-                    }
+                    createResult(label, showResult, remotingMonitor);
+
                     return Status.OK_STATUS;
                 }
 
+
+
                 @Override
                 protected void canceling() {
                     CdmStore.getCurrentApplicationConfiguration().getProgressMonitorService().cancel(uuid);
@@ -737,7 +648,6 @@ public abstract class AbstractUtility {
             };
 
             // configure the job
-            job.setProperty(IProgressConstants.KEEP_PROPERTY, true);
             job.setUser(true);
             // schedule job
             job.schedule();
@@ -745,7 +655,7 @@ public abstract class AbstractUtility {
         } catch (Exception e) {
             MessagingUtils.errorDialog("Error executing operation",
                     AbstractUtility.class,
-                    "An error occured while executing " + label,
+                    "An error occurred while executing " + label,
                     TaxeditorStorePlugin.PLUGIN_ID,
                     e,
                     true);
@@ -754,4 +664,124 @@ public abstract class AbstractUtility {
         return Status.OK_STATUS;
         }
 
+
+    private static void createResult(final String label, final boolean showResult,
+            IRemotingProgressMonitor remotingMonitor) {
+        final StringBuilder reportSb = new StringBuilder();
+        if (remotingMonitor.getResult() instanceof ExportResult) {
+            reportSb.append(((ExportResult)remotingMonitor.getResult()).createReport());
+        }else if (remotingMonitor.getResult() instanceof UpdateResult){
+            if (((UpdateResult)remotingMonitor.getResult()).isOk()){
+                reportSb.append("Update successful. \n"+"Updated Objects: " + ((UpdateResult)remotingMonitor.getResult()).getUpdatedObjects().size());
+            }
+            if (!((UpdateResult)remotingMonitor.getResult()).getExceptions().isEmpty()){
+                reportSb.append(((UpdateResult)remotingMonitor.getResult()).getExceptions().toString());
+            }
+        }
+//          }
+        if(showResult && !StringUtils.isBlank(reportSb.toString()) && reportSb.length() != 0) {
+            Display.getDefault().asyncExec(new Runnable() {
+                @Override
+                public void run() {
+                    // display reports with possibility to save
+                    ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+                    dialog.setTitle(label + " Report");
+                    dialog.setReportText(reportSb.toString());
+                    dialog.open();
+                }
+            });
+        }
+    }
+
+    private static void createExportResult(final String label, String urlString, boolean createZip,
+            IRemotingProgressMonitor remotingMonitor) {
+
+        final StringBuilder reportSb = new StringBuilder();
+        if (remotingMonitor.getResult() instanceof ExportResult){
+            ExportResult result = (ExportResult)remotingMonitor.getResult();
+
+            reportSb.append(result.createReport());
+
+            if(!StringUtils.isBlank(reportSb.toString())) {
+                Display.getDefault().asyncExec(new Runnable() {
+                    @Override
+                    public void run() {
+                        // display reports with possibility to save
+                        ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+                        dialog.setTitle(label + " Report");
+                        dialog.setReportText(reportSb.toString());
+                        dialog.open();
+                    }
+                });
+            }
+
+            if (urlString != null){
+                 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);
+                             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)){
+                         Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
+                         Set<String> keySet = resultMap.keySet();
+                         SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
+                         Calendar cal = Calendar.getInstance();
+                         String fileEnding = ".csv";
+
+                         if (createZip){
+                             File file = new File(urlString+File.separator +  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{
+                            if(result.getExportType().equals(ExportType.DWCA)){
+
+                                File file = new File(urlString);
+                                FileOutputStream stream = new FileOutputStream(file);
+                                ZipOutputStream zos = new ZipOutputStream(stream);
+                                for (String key: keySet){
+                                    byte[] fileData = resultMap.get(key);
+                                    ZipEntry entry = new ZipEntry( key);
+                                        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);
+                                     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());
+                 }
+            }
+        }
+    }
 }