JAL-4195 add exception handling for all image output ops - still need to refactor...
authorJames Procter <j.procter@dundee.ac.uk>
Wed, 7 Jun 2023 19:59:59 +0000 (20:59 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Wed, 7 Jun 2023 19:59:59 +0000 (20:59 +0100)
src/jalview/bin/Commands.java
src/jalview/bin/Jalview.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/AppJmol.java
src/jalview/gui/Desktop.java
src/jalview/gui/ImageExporter.java
src/jalview/gui/PCAPanel.java
src/jalview/gui/TreePanel.java
src/jalview/jbgui/GAlignFrame.java

index b9c04f5..bcf231e 100644 (file)
@@ -629,8 +629,15 @@ public class Commands
               if (sview instanceof AppJmol)
               {
                 AppJmol jmol = (AppJmol) sview;
-                jmol.makePDBImage(structureImageFile, imageType, renderer,
+                try { 
+                  jmol.makePDBImage(structureImageFile, imageType, renderer,
                         userBis);
+                }
+                catch (ImageOutputException ioexc)
+                {
+                  Console.warn("Unexpected error whilst exporting image to "+structureImageFile,ioexc);
+                }
+
               }
               break;
             default:
index e4f9ec6..c109836 100755 (executable)
@@ -91,6 +91,7 @@ import jalview.io.FileLoader;
 import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.NewickFile;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.io.gff.SequenceOntologyFactory;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
@@ -1019,100 +1020,109 @@ public class Jalview
         String imageName = "unnamed.png";
         while (aparser.getSize() > 1)
         {
-          String outputFormat = aparser.nextValue();
-          file = aparser.nextValue();
-
-          if (outputFormat.equalsIgnoreCase("png"))
-          {
-            af.createPNG(new File(file));
-            imageName = (new File(file)).getName();
-            System.out.println("Creating PNG image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("svg"))
-          {
-            File imageFile = new File(file);
-            imageName = imageFile.getName();
-            af.createSVG(imageFile);
-            System.out.println("Creating SVG image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("html"))
+          try
           {
-            File imageFile = new File(file);
-            imageName = imageFile.getName();
-            HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
-            htmlSVG.exportHTML(file);
+            String outputFormat = aparser.nextValue();
+            file = aparser.nextValue();
 
-            System.out.println("Creating HTML image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("biojsmsa"))
-          {
-            if (file == null)
+            if (outputFormat.equalsIgnoreCase("png"))
             {
-              System.err.println("The output html file must not be null");
-              return;
+              System.out.println("Creating PNG image: " + file);
+              af.createPNG(new File(file));
+              imageName = (new File(file)).getName();
+              continue;
             }
-            try
+            else if (outputFormat.equalsIgnoreCase("svg"))
             {
-              BioJsHTMLOutput.refreshVersionInfo(
-                      BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
-            } catch (URISyntaxException e)
+              System.out.println("Creating SVG image: " + file);
+              File imageFile = new File(file);
+              imageName = imageFile.getName();
+              af.createSVG(imageFile);
+              continue;
+            }
+            else if (outputFormat.equalsIgnoreCase("html"))
             {
-              e.printStackTrace();
+              File imageFile = new File(file);
+              imageName = imageFile.getName();
+              HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
+
+              System.out.println("Creating HTML image: " + file);
+              htmlSVG.exportHTML(file);
+              continue;
             }
-            BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
-            bjs.exportHTML(file);
-            System.out
-                    .println("Creating BioJS MSA Viwer HTML file: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("imgMap"))
-          {
-            af.createImageMap(new File(file), imageName);
-            System.out.println("Creating image map: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("eps"))
-          {
-            File outputFile = new File(file);
-            System.out.println(
-                    "Creating EPS file: " + outputFile.getAbsolutePath());
-            af.createEPS(outputFile);
-            continue;
-          }
-          FileFormatI outFormat = null;
-          try
-          {
-            outFormat = FileFormats.getInstance().forName(outputFormat);
-          } catch (Exception formatP)
-          {
-            System.out.println("Couldn't parse " + outFormat
-                    + " as a valid Jalview format string.");
-          }
-          if (outFormat != null)
-          {
-            if (!outFormat.isWritable())
+            else if (outputFormat.equalsIgnoreCase("biojsmsa"))
+            {
+              if (file == null)
+              {
+                System.err.println("The output html file must not be null");
+                return;
+              }
+              try
+              {
+                BioJsHTMLOutput.refreshVersionInfo(
+                        BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
+              } catch (URISyntaxException e)
+              {
+                e.printStackTrace();
+              }
+              BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
+              System.out.println(
+                      "Creating BioJS MSA Viwer HTML file: " + file);
+              bjs.exportHTML(file);
+              continue;
+            }
+            else if (outputFormat.equalsIgnoreCase("imgMap"))
+            {
+              System.out.println("Creating image map: " + file);
+              af.createImageMap(new File(file), imageName);
+              continue;
+            }
+            else if (outputFormat.equalsIgnoreCase("eps"))
             {
+              File outputFile = new File(file);
               System.out.println(
-                      "This version of Jalview does not support alignment export as "
-                              + outputFormat);
+                      "Creating EPS file: " + outputFile.getAbsolutePath());
+              af.createEPS(outputFile);
+              continue;
+            }
+
+            FileFormatI outFormat = null;
+            try
+            {
+              outFormat = FileFormats.getInstance().forName(outputFormat);
+            } catch (Exception formatP)
+            {
+              System.out.println("Couldn't parse " + outFormat
+                      + " as a valid Jalview format string.");
             }
-            else
+            if (outFormat != null)
             {
-              af.saveAlignment(file, outFormat);
-              if (af.isSaveAlignmentSuccessful())
+              if (!outFormat.isWritable())
               {
-                System.out.println("Written alignment in "
-                        + outFormat.getName() + " format to " + file);
+                System.out.println(
+                        "This version of Jalview does not support alignment export as "
+                                + outputFormat);
               }
               else
               {
-                System.out.println("Error writing file " + file + " in "
-                        + outFormat.getName() + " format!!");
+                af.saveAlignment(file, outFormat);
+                if (af.isSaveAlignmentSuccessful())
+                {
+                  System.out.println("Written alignment in "
+                          + outFormat.getName() + " format to " + file);
+                }
+                else
+                {
+                  System.out.println("Error writing file " + file + " in "
+                          + outFormat.getName() + " format!!");
+                }
               }
             }
+          } catch (ImageOutputException ioexc)
+          {
+            System.out.println(
+                    "Unexpected error whilst exporting image to " + file);
+            ioexc.printStackTrace();
           }
 
         }
index 77c0238..ab705c2 100644 (file)
@@ -140,6 +140,7 @@ import jalview.io.JnetAnnotationMaker;
 import jalview.io.NewickFile;
 import jalview.io.ScoreMatrixFile;
 import jalview.io.TCoffeeScoreFile;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.io.vcf.VCFLoader;
 import jalview.jbgui.GAlignFrame;
 import jalview.project.Jalview2XML;
@@ -1455,34 +1456,74 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   protected void htmlMenuItem_actionPerformed(ActionEvent e)
   {
     HtmlSvgOutput htmlSVG = new HtmlSvgOutput(alignPanel);
-    htmlSVG.exportHTML(null);
+    try {
+      htmlSVG.exportHTML(null);
+    } catch (ImageOutputException x) {
+      // report problem to console and raise dialog
+    }
   }
 
   @Override
   public void bioJSMenuItem_actionPerformed(ActionEvent e)
   {
     BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel);
+    try {
     bjs.exportHTML(null);
+  } catch (ImageOutputException x) {
+    // report problem to console and raise dialog
+  }
   }
 
   public void createImageMap(File file, String image)
   {
+    try {
     alignPanel.makePNGImageMap(file, image);
+    } catch (ImageOutputException x) {
+      // report problem to console and raise dialog
+    }
   }
 
+  @Override
+  public void createPNG_actionPerformed(ActionEvent e) {
+    try{
+      createPNG(null);
+    } catch (ImageOutputException ioex)
+    {
+      // raise dialog, and report via console
+    }
+  }
+  @Override
+  public void createEPS_actionPerformed(ActionEvent e) {
+    try{
+      createEPS(null);
+    } catch (ImageOutputException ioex)
+    {
+      // raise dialog, and report via console
+    }
+    
+  }
+  @Override
+  public void createSVG_actionPerformed(ActionEvent e) {
+    try{
+      createSVG(null);
+    } catch (ImageOutputException ioex)
+    {
+      // raise dialog, and report via console
+    }
+    
+  }
   /**
    * Creates a PNG image of the alignment and writes it to the given file. If
    * the file is null, the user is prompted to choose a file.
    * 
    * @param f
    */
-  @Override
-  public void createPNG(File f)
+  public void createPNG(File f) throws ImageOutputException
   {
     createPNG(f, null, BitmapImageSizing.nullBitmapImageSizing());
   }
 
-  public void createPNG(File f, String renderer, BitmapImageSizing userBis)
+  public void createPNG(File f, String renderer, BitmapImageSizing userBis) throws ImageOutputException
   {
     alignPanel.makeAlignmentImage(TYPE.PNG, f, renderer, userBis);
   }
@@ -1493,13 +1534,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    * 
    * @param f
    */
-  @Override
-  public void createEPS(File f)
+  public void createEPS(File f)  throws ImageOutputException
   {
     createEPS(f, null);
   }
 
-  public void createEPS(File f, String renderer)
+  public void createEPS(File f, String renderer) throws ImageOutputException
   {
     alignPanel.makeAlignmentImage(TYPE.EPS, f, renderer);
   }
@@ -1510,13 +1550,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    * 
    * @param f
    */
-  @Override
-  public void createSVG(File f)
+  public void createSVG(File f)  throws ImageOutputException
   {
     createSVG(f, null);
   }
 
-  public void createSVG(File f, String renderer)
+  public void createSVG(File f, String renderer) throws ImageOutputException
   {
     alignPanel.makeAlignmentImage(TYPE.SVG, f, renderer);
   }
index 7befa20..3dfb510 100644 (file)
@@ -58,6 +58,7 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.gui.ImageExporter.ImageWriterI;
 import jalview.io.HTMLOutput;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.jbgui.GAlignmentPanel;
 import jalview.math.AlignmentDimension;
 import jalview.schemes.ResidueProperties;
@@ -1174,7 +1175,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     return (w > 0 ? w : calculateIdWidth().width);
   }
 
-  void makeAlignmentImage(ImageMaker.TYPE type, File file, String renderer)
+  void makeAlignmentImage(ImageMaker.TYPE type, File file, String renderer) throws ImageOutputException
   {
     makeAlignmentImage(type, file, renderer,
             BitmapImageSizing.nullBitmapImageSizing());
@@ -1190,7 +1191,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @param bitmapscale
    */
   void makeAlignmentImage(ImageMaker.TYPE type, File file, String renderer,
-          BitmapImageSizing userBis)
+          BitmapImageSizing userBis) throws ImageOutputException
   {
     final int borderBottomOffset = 5;
 
@@ -1265,7 +1266,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
   }
 
-  public void makePNGImageMap(File imgMapFile, String imageName)
+  public void makePNGImageMap(File imgMapFile, String imageName) throws ImageOutputException
   {
     // /////ONLY WORKS WITH NON WRAPPED ALIGNMENTS
     // ////////////////////////////////////////////
@@ -1390,7 +1391,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
       } catch (Exception ex)
       {
-        ex.printStackTrace();
+        throw new ImageOutputException("couldn't write ImageMap due to unexpected error",ex);
       }
     } // /////////END OF IMAGE MAP
 
index b7bac37..1758b5b 100644 (file)
@@ -46,6 +46,7 @@ import jalview.datamodel.StructureViewerModel;
 import jalview.datamodel.StructureViewerModel.StructureData;
 import jalview.gui.ImageExporter.ImageWriterI;
 import jalview.gui.StructureViewer.ViewerType;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.structure.StructureCommand;
 import jalview.structures.models.AAStructureBindingModel;
 import jalview.util.BrowserLauncher;
@@ -426,12 +427,16 @@ public class AppJmol extends StructureViewerBase
   @Override
   public void makePDBImage(ImageMaker.TYPE type)
   {
+    try {
     makePDBImage(null, type, null,
             BitmapImageSizing.nullBitmapImageSizing());
+    } catch (ImageOutputException ioex) {
+      Console.error("Unexpected error whilst writing "+type.toString(),ioex);
+    }
   }
 
   public void makePDBImage(File file, ImageMaker.TYPE type, String renderer,
-          BitmapImageSizing userBis)
+          BitmapImageSizing userBis) throws ImageOutputException
   {
     int width = getWidth();
     int height = getHeight();
@@ -469,7 +474,9 @@ public class AppJmol extends StructureViewerBase
             .toLowerCase(Locale.ROOT);
     ImageExporter exporter = new ImageExporter(writer,
             getProgressIndicator(), type, getTitle());
+    
     exporter.doExport(file, this, width, height, view, renderer, userBis);
+    
   }
 
   @Override
index 1fcc591..bfd700f 100644 (file)
@@ -121,6 +121,7 @@ import jalview.io.FormatAdapter;
 import jalview.io.IdentifyFile;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.jbgui.GSplitFrame;
 import jalview.jbgui.GStructureViewer;
 import jalview.project.Jalview2XML;
@@ -3131,7 +3132,11 @@ public class Desktop extends jalview.jbgui.GDesktop
     String title = "View of desktop";
     ImageExporter exporter = new ImageExporter(writer, null, TYPE.EPS,
             title);
-    exporter.doExport(of, this, width, height, title);
+    try {
+      exporter.doExport(of, this, width, height, title);
+    } catch (ImageOutputException ioex) {
+      jalview.bin.Console.error("Unexpected error whilst writing Jalview desktop snapshot as EPS",ioex);
+    }
   }
 
   /**
index e18ca86..f337b39 100644 (file)
@@ -29,6 +29,7 @@ import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.util.ImageMaker;
 import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
@@ -103,14 +104,14 @@ public class ImageExporter
    *          what the image is of e.g. Tree, Alignment
    */
   public void doExport(File file, Component parent, int width, int height,
-          String imageSource)
+          String imageSource) throws ImageOutputException
   {
     doExport(file, parent, width, height, imageSource, null,
             BitmapImageSizing.nullBitmapImageSizing());
   }
 
   public void doExport(File file, Component parent, int width, int height,
-          String imageSource, String renderer, BitmapImageSizing userBis)
+          String imageSource, String renderer, BitmapImageSizing userBis) throws ImageOutputException
   {
     final long messageId = System.currentTimeMillis();
     setStatus(
index 26db8c3..211c370 100644 (file)
@@ -49,6 +49,7 @@ import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceI;
 import jalview.gui.ImageExporter.ImageWriterI;
 import jalview.gui.JalviewColourChooser.ColourChooserListener;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.jbgui.GPCAPanel;
 import jalview.math.RotatableMatrix.Axis;
 import jalview.util.ImageMaker;
@@ -438,7 +439,11 @@ public class PCAPanel extends GPCAPanel
     };
     String pca = MessageManager.getString("label.pca");
     ImageExporter exporter = new ImageExporter(writer, null, type, pca);
-    exporter.doExport(null, this, width, height, pca);
+    try {
+      exporter.doExport(null, this, width, height, pca);
+    } catch (ImageOutputException ioex) {
+      Console.error("Unexpected error whilst writing "+type.toString(),ioex);
+    }
   }
 
   @Override
index 4737235..5ccd68d 100755 (executable)
@@ -69,6 +69,7 @@ import jalview.gui.ImageExporter.ImageWriterI;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
 import jalview.io.NewickFile;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.jbgui.GTreePanel;
 import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
@@ -757,8 +758,12 @@ public class TreePanel extends GTreePanel
     String tree = MessageManager.getString("label.tree");
     ImageExporter exporter = new ImageExporter(writer, null, imageFormat,
             tree);
+    try {
     exporter.doExport(null, this, width, height,
             tree.toLowerCase(Locale.ROOT));
+    } catch (ImageOutputException ioex) {
+      Console.error("Unexpected error whilst writing "+imageFormat.toString(),ioex);
+    }
   }
 
   /**
index f6ab8c9..c0cdfee 100755 (executable)
@@ -57,6 +57,7 @@ import jalview.bin.Cache;
 import jalview.gui.JvSwingUtils;
 import jalview.gui.Preferences;
 import jalview.io.FileFormats;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.schemes.ResidueColourScheme;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
@@ -1081,7 +1082,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        createPNG(null);
+        createPNG_actionPerformed(e);
       }
     });
     createPNG.setActionCommand(
@@ -1113,7 +1114,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        createEPS(null);
+        createEPS_actionPerformed(e);
       }
     });
 
@@ -1123,7 +1124,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        createSVG(null);
+        createSVG_actionPerformed(e);
       }
     });
 
@@ -1975,6 +1976,24 @@ public class GAlignFrame extends JInternalFrame
     // selectMenu.add(listenToViewSelections);
   }
 
+  protected void createPNG_actionPerformed(ActionEvent object)
+  {
+    // TODO Auto-generated method stub
+    
+  }
+
+  protected void createEPS_actionPerformed(ActionEvent object)
+  {
+    // TODO Auto-generated method stub
+    
+  }
+
+  protected void createSVG_actionPerformed(ActionEvent object)
+  {
+    // TODO Auto-generated method stub
+    
+  }
+
   protected void copyHighlightedColumns_actionPerformed(
           ActionEvent actionEvent)
   {
@@ -2468,9 +2487,6 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
-  public void createPNG(java.io.File f)
-  {
-  }
 
   protected void font_actionPerformed(ActionEvent e)
   {
@@ -2485,14 +2501,6 @@ public class GAlignFrame extends JInternalFrame
 
   }
 
-  public void createEPS(java.io.File f)
-  {
-  }
-
-  public void createSVG(java.io.File f)
-  {
-
-  }
 
   protected void loadTreeMenuItem_actionPerformed(ActionEvent e)
   {