JAL-4217 wrap imageExport CLI method's call to imageExport in a separate thread and...
authorJames Procter <j.procter@dundee.ac.uk>
Thu, 6 Jul 2023 15:00:03 +0000 (16:00 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Thu, 6 Jul 2023 15:00:03 +0000 (16:00 +0100)
src/jalview/gui/AppJmol.java
src/jalview/gui/ImageExporter.java

index a14fabb..930a750 100644 (file)
@@ -32,6 +32,12 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
 
 import javax.swing.JPanel;
 import javax.swing.JSplitPane;
@@ -475,13 +481,13 @@ public class AppJmol extends StructureViewerBase
             .toLowerCase(Locale.ROOT);
     final ImageExporter exporter = new ImageExporter(writer,
             getProgressIndicator(), type, getTitle());
-    // hack to pass back and throw to caller
+    
     final Throwable[] exceptions = new Throwable[1];
     exceptions[0] = null;
     final AppJmol us = this;
     try
     {
-      SwingUtilities.invokeAndWait(new Runnable()
+      Thread runner = Executors.defaultThreadFactory().newThread(new Runnable()
       {
         @Override
         public void run()
@@ -496,13 +502,11 @@ public class AppJmol extends StructureViewerBase
           }
         }
       });
-    } catch (InvocationTargetException e)
+      do { Thread.sleep(25); } while (runner.isAlive());
+    } catch (Throwable e)
     {
       throw new ImageOutputException(
               "Unexpected error when generating image", e);
-    } catch (InterruptedException e)
-    {
-      Console.debug("Interrupted whilst waiting for image export", e);
     }
     if (exceptions[0] != null)
     {
index f337b39..4ea30d9 100644 (file)
@@ -124,6 +124,11 @@ public class ImageExporter
      */
     if (file == null && !Jalview.isHeadlessMode())
     {
+      if (Desktop.instance.isInBatchMode())
+      {
+        // defensive error report - we could wait for user input.. I  guess ?
+        throw(new ImageOutputException("Need an output file to render to when exporting images in batch mode!"));
+      }
       JalviewFileChooser chooser = imageType.getFileChooser();
       chooser.setFileView(new JalviewFileView());
       MessageManager.formatMessage("label.create_image_of",