From b78a8a809f8ffbda3ca79e83d3df1c89064ef202 Mon Sep 17 00:00:00 2001 From: James Procter Date: Wed, 7 Jun 2023 20:59:59 +0100 Subject: [PATCH] JAL-4195 add exception handling for all image output ops - still need to refactor messaging to the UI --- src/jalview/bin/Commands.java | 9 +- src/jalview/bin/Jalview.java | 164 +++++++++++++++++++---------------- src/jalview/gui/AlignFrame.java | 59 ++++++++++--- src/jalview/gui/AlignmentPanel.java | 9 +- src/jalview/gui/AppJmol.java | 9 +- src/jalview/gui/Desktop.java | 7 +- src/jalview/gui/ImageExporter.java | 5 +- src/jalview/gui/PCAPanel.java | 7 +- src/jalview/gui/TreePanel.java | 5 ++ src/jalview/jbgui/GAlignFrame.java | 36 +++++--- 10 files changed, 199 insertions(+), 111 deletions(-) diff --git a/src/jalview/bin/Commands.java b/src/jalview/bin/Commands.java index b9c04f5..bcf231e 100644 --- a/src/jalview/bin/Commands.java +++ b/src/jalview/bin/Commands.java @@ -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: diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index e4f9ec6..c109836 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -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(); } } diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 77c0238..ab705c2 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -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); } diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index 7befa20..3dfb510 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -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 diff --git a/src/jalview/gui/AppJmol.java b/src/jalview/gui/AppJmol.java index b7bac37..1758b5b 100644 --- a/src/jalview/gui/AppJmol.java +++ b/src/jalview/gui/AppJmol.java @@ -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 diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 1fcc591..bfd700f 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -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); + } } /** diff --git a/src/jalview/gui/ImageExporter.java b/src/jalview/gui/ImageExporter.java index e18ca86..f337b39 100644 --- a/src/jalview/gui/ImageExporter.java +++ b/src/jalview/gui/ImageExporter.java @@ -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( diff --git a/src/jalview/gui/PCAPanel.java b/src/jalview/gui/PCAPanel.java index 26db8c3..211c370 100644 --- a/src/jalview/gui/PCAPanel.java +++ b/src/jalview/gui/PCAPanel.java @@ -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 diff --git a/src/jalview/gui/TreePanel.java b/src/jalview/gui/TreePanel.java index 4737235..5ccd68d 100755 --- a/src/jalview/gui/TreePanel.java +++ b/src/jalview/gui/TreePanel.java @@ -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); + } } /** diff --git a/src/jalview/jbgui/GAlignFrame.java b/src/jalview/jbgui/GAlignFrame.java index f6ab8c9..c0cdfee 100755 --- a/src/jalview/jbgui/GAlignFrame.java +++ b/src/jalview/jbgui/GAlignFrame.java @@ -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) { -- 1.7.10.2