JAL-3063 wrappers with check for null getting optional Integer, Float,
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 21 Sep 2018 13:52:20 +0000 (14:52 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 21 Sep 2018 13:52:20 +0000 (14:52 +0100)
Boolean XML attributes

src/jalview/project/Jalview2XML.java

index c4ad897..3a9060e 100644 (file)
@@ -60,6 +60,7 @@ import jalview.gui.StructureViewerBase;
 import jalview.gui.TreePanel;
 import jalview.io.DataSourceType;
 import jalview.io.FileFormat;
+import jalview.io.NewickFile;
 import jalview.renderer.ResidueShaderI;
 import jalview.schemes.AnnotationColourGradient;
 import jalview.schemes.ColourSchemeI;
@@ -226,6 +227,45 @@ public class Jalview2XML
   private Map<RnaModel, String> rnaSessions = new HashMap<>();
 
   /**
+   * A helper method for safely using the value of an optional attribute that
+   * may be null if not present in the XML. Answers the boolean value, or false
+   * if null.
+   * 
+   * @param b
+   * @return
+   */
+  public static boolean safeBoolean(Boolean b)
+  {
+    return b == null ? false : b.booleanValue();
+  }
+
+  /**
+   * A helper method for safely using the value of an optional attribute that
+   * may be null if not present in the XML. Answers the integer value, or zero
+   * if null.
+   * 
+   * @param i
+   * @return
+   */
+  public static int safeInt(Integer i)
+  {
+    return i == null ? 0 : i.intValue();
+  }
+
+  /**
+   * A helper method for safely using the value of an optional attribute that
+   * may be null if not present in the XML. Answers the float value, or zero if
+   * null.
+   * 
+   * @param f
+   * @return
+   */
+  public static float safeFloat(Float f)
+  {
+    return f == null ? 0f : f.floatValue();
+  }
+
+  /**
    * create/return unique hash string for sq
    * 
    * @param sq
@@ -2732,8 +2772,8 @@ public class Jalview2XML
       if (!addedToSplitFrames.contains(af))
       {
         Viewport view = candidate.getKey();
-        Desktop.addInternalFrame(af, view.getTitle(), view.getWidth(),
-                view.getHeight());
+        Desktop.addInternalFrame(af, view.getTitle(),
+                safeInt(view.getWidth()), safeInt(view.getHeight()));
         af.setMenusForViewport();
         System.err.println("Failed to restore view " + view.getTitle()
                 + " to split frame");
@@ -3057,8 +3097,9 @@ public class Jalview2XML
         vi++;
       }
 
-      if (jseq.isViewreference() != null
-              && jseq.isViewreference().booleanValue())
+      if (safeBoolean(jseq.isViewreference()))
+      // if (jseq.isViewreference() != null
+      // && jseq.isViewreference().booleanValue())
       {
         referenceseqForView = tmpseqs.get(tmpseqs.size() - 1);
       }
@@ -3150,7 +3191,7 @@ public class Jalview2XML
             Feature feat = features.get(f);
             SequenceFeature sf = new SequenceFeature(feat.getType(),
                     feat.getDescription(), feat.getBegin(), feat.getEnd(),
-                    feat.getScore(), feat.getFeatureGroup());
+                    safeFloat(feat.getScore()), feat.getFeatureGroup());
             sf.setStatus(feat.getStatus());
 
             /*
@@ -3352,14 +3393,14 @@ public class Jalview2XML
           annotation.setId(null);
         }
 
-        // set visiblity for other annotation in this view
+        // set visibility for other annotation in this view
         String annotationId = annotation.getId();
         if (annotationId != null && annotationIds.containsKey(annotationId))
         {
           AlignmentAnnotation jda = annotationIds.get(annotationId);
           // in principle Visible should always be true for annotation displayed
           // in multiple views
-          if (annotation.isVisible() != null) // annotation.hasVisible())
+          if (annotation.isVisible() != null)
           {
             jda.visible = annotation.isVisible();
           }
@@ -3386,8 +3427,7 @@ public class Jalview2XML
               continue;
             }
 
-            float value = annElement.getValue() == null ? 0f
-                    : annElement.getValue().floatValue();
+            float value = safeFloat(annElement.getValue());
             anot[anpos] = new jalview.datamodel.Annotation(
                     annElement.getDisplayCharacter(),
                     annElement.getDescription(),
@@ -3399,16 +3439,7 @@ public class Jalview2XML
                                                     .getSecondaryStructure()
                                                     .charAt(0),
                     value);
-            // JBPNote: Consider verifying dataflow for IO of secondary
-            // structure annotation read from Stockholm files
-            // this was added to try to ensure that
-            // if (anot[ annElement.getPosition()].secondaryStructure>' ')
-            // {
-            // anot[ annElement.getPosition()].displayCharacter = "";
-            // }
-            final int colourValue = annElement.getColour() == null ? 0
-                    : annElement.getColour().intValue();
-            anot[anpos].colour = new java.awt.Color(colourValue);
+            anot[anpos].colour = new Color(safeInt(annElement.getColour()));
             if (firstColour == null)
             {
               firstColour = anot[anpos].colour;
@@ -3425,18 +3456,17 @@ public class Jalview2XML
           // }
           jaa = new jalview.datamodel.AlignmentAnnotation(
                   annotation.getLabel(), annotation.getDescription(), anot,
-                  llim, hlim, annotation.getGraphType());
+                  llim, hlim, safeInt(annotation.getGraphType()));
 
-          jaa.graphGroup = annotation.getGraphGroup();
+          jaa.graphGroup = safeInt(annotation.getGraphGroup());
           jaa._linecolour = firstColour;
           if (annotation.getThresholdLine() != null)
           {
             jaa.setThreshold(new jalview.datamodel.GraphLine(
-                    annotation.getThresholdLine().getValue(),
+                    safeFloat(annotation.getThresholdLine().getValue()),
                     annotation.getThresholdLine().getLabel(),
-                    new java.awt.Color(
-                            annotation.getThresholdLine().getColour())));
-
+                    new java.awt.Color(safeInt(
+                            annotation.getThresholdLine().getColour()))));
           }
           if (autoForView || annotation.isAutoCalculated())
           {
@@ -3490,7 +3520,7 @@ public class Jalview2XML
 
         if (annotation.getScore() != null)
         {
-          jaa.setScore(annotation.getScore());
+          jaa.setScore(annotation.getScore().doubleValue());
         }
         if (annotation.isVisible() != null)
         {
@@ -3507,8 +3537,7 @@ public class Jalview2XML
         {
           jaa.scaleColLabel = annotation.isScaleColLabels().booleanValue();
         }
-        if (/*annotation.hasAutoCalculated() && */annotation
-                .isAutoCalculated())
+        if (annotation.isAutoCalculated())
         {
           // newer files have an 'autoCalculated' flag and store calculation
           // state in viewport properties
@@ -3519,11 +3548,7 @@ public class Jalview2XML
         {
           jaa.graphHeight = annotation.getGraphHeight().intValue();
         }
-        // if (annotation.hasBelowAlignment())
-        // {
-        // schema specifies default for optional attribute
-          jaa.belowAlignment = annotation.isBelowAlignment();
-        // }
+        jaa.belowAlignment = annotation.isBelowAlignment();
         jaa.setCalcId(annotation.getCalcId());
         if (annotation.getProperty().size() > 0)
         {
@@ -3574,8 +3599,7 @@ public class Jalview2XML
                     jGroup.getColour());
           }
         }
-        int pidThreshold = jGroup.getPidThreshold() == null ? 0
-                : jGroup.getPidThreshold().intValue();
+        int pidThreshold = safeInt(jGroup.getPidThreshold());
 
         Vector<SequenceI> seqs = new Vector<>();
 
@@ -3596,40 +3620,24 @@ public class Jalview2XML
         }
 
         SequenceGroup sg = new SequenceGroup(seqs, jGroup.getName(), cs,
-                jGroup.isDisplayBoxes(), jGroup.isDisplayText(),
-                jGroup.isColourText(), jGroup.getStart(), jGroup.getEnd());
+                safeBoolean(jGroup.isDisplayBoxes()),
+                safeBoolean(jGroup.isDisplayText()),
+                safeBoolean(jGroup.isColourText()),
+                safeInt(jGroup.getStart()), safeInt(jGroup.getEnd()));
         sg.getGroupColourScheme().setThreshold(pidThreshold, true);
         sg.getGroupColourScheme()
-                .setConservationInc(jGroup.getConsThreshold() == null ? 0
-                        : jGroup.getConsThreshold().intValue());
-        sg.setOutlineColour(
-                new java.awt.Color(jGroup.getOutlineColour() == null ? 0
-                        : jGroup.getOutlineColour().intValue()));
-
-        sg.textColour = new java.awt.Color(jGroup.getTextCol1());
-        sg.textColour2 = new java.awt.Color(jGroup.getTextCol2());
-        sg.setShowNonconserved(
-                jGroup.isShowUnconserved() != null
-                        ? jGroup.isShowUnconserved().booleanValue()
-                        : false);
-        sg.thresholdTextColour = jGroup.getTextColThreshold();
+                .setConservationInc(safeInt(jGroup.getConsThreshold()));
+        sg.setOutlineColour(new Color(safeInt(jGroup.getOutlineColour())));
+
+        sg.textColour = new Color(safeInt(jGroup.getTextCol1()));
+        sg.textColour2 = new Color(safeInt(jGroup.getTextCol2()));
+        sg.setShowNonconserved(safeBoolean(jGroup.isShowUnconserved()));
+        sg.thresholdTextColour = safeInt(jGroup.getTextColThreshold());
         // attributes with a default in the schema are never null
-        // if (jGroup.hasShowConsensusHistogram())
-        // {
           sg.setShowConsensusHistogram(jGroup.isShowConsensusHistogram());
-        // }
-        // if (jGroup.hasShowSequenceLogo())
-        // {
           sg.setshowSequenceLogo(jGroup.isShowSequenceLogo());
-        // }
-        // if (jGroup.hasNormaliseSequenceLogo())
-        // {
           sg.setNormaliseSequenceLogo(jGroup.isNormaliseSequenceLogo());
-        // }
-        // if (jGroup.hasIgnoreGapsinConsensus())
-        // {
         sg.setIgnoreGapsConsensus(jGroup.isIgnoreGapsinConsensus());
-        // }
         if (jGroup.getConsThreshold() != null
                 && jGroup.getConsThreshold().intValue() != 0)
         {
@@ -3819,7 +3827,7 @@ public class Jalview2XML
            * add the structure to the Varna display (with session state copied
            * from the jar to a temporary file)
            */
-          boolean gapped = ss.isGapped();
+          boolean gapped = safeBoolean(ss.isGapped());
           String rnaTitle = ss.getTitle();
           String sessionState = ss.getViewerState();
           String tempStateFile = copyJarEntry(jprovider, sessionState,
@@ -3827,7 +3835,7 @@ public class Jalview2XML
           RnaModel rna = new RnaModel(rnaTitle, ann, seq, null, gapped);
           appVarna.addModelSession(rna, rnaTitle, tempStateFile);
         }
-        appVarna.setInitialSelection(viewer.getSelectedRna());
+        appVarna.setInitialSelection(safeInt(viewer.getSelectedRna()));
       }
     }
   }
@@ -3868,8 +3876,9 @@ public class Jalview2XML
      * viewer not found - make it
      */
     RnaViewerModel model = new RnaViewerModel(postLoadId, viewer.getTitle(),
-            viewer.getXpos(), viewer.getYpos(), viewer.getWidth(),
-            viewer.getHeight(), viewer.getDividerLocation());
+            safeInt(viewer.getXpos()), safeInt(viewer.getYpos()),
+            safeInt(viewer.getWidth()), safeInt(viewer.getHeight()),
+            safeInt(viewer.getDividerLocation()));
     AppVarna varna = new AppVarna(model, ap);
 
     return varna;
@@ -3898,10 +3907,10 @@ public class Jalview2XML
         TreePanel tp = (TreePanel) retrieveExistingObj(tree.getId());
         if (tp == null)
         {
-          tp = af.showNewickTree(
-                  new jalview.io.NewickFile(tree.getNewick()),
-                  tree.getTitle(), tree.getWidth(), tree.getHeight(),
-                  tree.getXpos(), tree.getYpos());
+          tp = af.showNewickTree(new NewickFile(tree.getNewick()),
+                  tree.getTitle(), safeInt(tree.getWidth()),
+                  safeInt(tree.getHeight()), safeInt(tree.getXpos()),
+                  safeInt(tree.getYpos()));
           if (tree.getId() != null)
           {
             // perhaps bind the tree id to something ?
@@ -3913,11 +3922,11 @@ public class Jalview2XML
           // TODO: should check if tp has been manipulated by user - if so its
           // settings shouldn't be modified
           tp.setTitle(tree.getTitle());
-          tp.setBounds(new Rectangle(tree.getXpos(), tree.getYpos(),
-                  tree.getWidth(), tree.getHeight()));
-          tp.setViewport(av); // af.viewport; // TODO: verify 'associate with all
-          // views'
-          // works still
+          tp.setBounds(new Rectangle(safeInt(tree.getXpos()),
+                  safeInt(tree.getYpos()), safeInt(tree.getWidth()),
+                  safeInt(tree.getHeight())));
+          tp.setViewport(av); // af.viewport;
+          // TODO: verify 'associate with all views' works still
           tp.getTreeCanvas().setViewport(av); // af.viewport;
           tp.getTreeCanvas().setAssociatedPanel(ap); // af.alignPanel;
 
@@ -3929,27 +3938,29 @@ public class Jalview2XML
           continue;
         }
 
-        tp.fitToWindow.setState(tree.isFitToWindow());
+        tp.fitToWindow.setState(safeBoolean(tree.isFitToWindow()));
         tp.fitToWindow_actionPerformed(null);
 
         if (tree.getFontName() != null)
         {
-          tp.setTreeFont(new java.awt.Font(tree.getFontName(),
-                  tree.getFontStyle(), tree.getFontSize()));
+          tp.setTreeFont(
+                  new Font(tree.getFontName(), safeInt(tree.getFontStyle()),
+                          safeInt(tree.getFontSize())));
         }
         else
         {
-          tp.setTreeFont(new java.awt.Font(view.getFontName(),
-                  view.getFontStyle(), tree.getFontSize()));
+          tp.setTreeFont(
+                  new Font(view.getFontName(), safeInt(view.getFontStyle()),
+                          safeInt(view.getFontSize())));
         }
 
-        tp.showPlaceholders(tree.isMarkUnlinked());
-        tp.showBootstrap(tree.isShowBootstrap());
-        tp.showDistances(tree.isShowDistances());
+        tp.showPlaceholders(safeBoolean(tree.isMarkUnlinked()));
+        tp.showBootstrap(safeBoolean(tree.isShowBootstrap()));
+        tp.showDistances(safeBoolean(tree.isShowDistances()));
 
-        tp.getTreeCanvas().setThreshold(tree.getThreshold());
+        tp.getTreeCanvas().setThreshold(safeFloat(tree.getThreshold()));
 
-        if (tree.isCurrentTree())
+        if (safeBoolean(tree.isCurrentTree()))
         {
           af.getViewport().setCurrentTree(tp.getTree());
         }
@@ -4003,10 +4014,10 @@ public class Jalview2XML
                     loadPDBFile(jprovider, pdbid.getId(), pdbid.getFile()));
             jpdb.setId(pdbid.getId());
 
-            int x = structureState.getXpos();
-            int y = structureState.getYpos();
-            int width = structureState.getWidth();
-            int height = structureState.getHeight();
+            int x = safeInt(structureState.getXpos());
+            int y = safeInt(structureState.getYpos());
+            int width = safeInt(structureState.getWidth());
+            int height = safeInt(structureState.getHeight());
 
             // Probably don't need to do this anymore...
             // Desktop.desktop.getComponentAt(x, y);
@@ -4569,17 +4580,17 @@ public class Jalview2XML
           String viewId, List<JvAnnotRow> autoAlan)
   {
     AlignFrame af = null;
-    af = new AlignFrame(al, view.getWidth(), view.getHeight(),
-            uniqueSeqSetId, viewId);
+    af = new AlignFrame(al, safeInt(view.getWidth()),
+            safeInt(view.getHeight()), uniqueSeqSetId, viewId);
 
     af.setFileName(file, FileFormat.Jalview);
 
     final AlignViewport viewport = af.getViewport();
     for (int i = 0; i < JSEQ.size(); i++)
     {
-      viewport.setSequenceColour(
-              viewport.getAlignment().getSequenceAt(i),
-              new java.awt.Color(JSEQ.get(i).getColour()));
+      int colour = safeInt(JSEQ.get(i).getColour());
+      viewport.setSequenceColour(viewport.getAlignment().getSequenceAt(i),
+              new Color(colour));
     }
 
     if (al.hasSeqrep())
@@ -4588,7 +4599,7 @@ public class Jalview2XML
       viewport.setDisplayReferenceSeq(true);
     }
 
-    viewport.setGatherViewsHere(view.isGatheredViews());
+    viewport.setGatherViewsHere(safeBoolean(view.isGatheredViews()));
 
     if (view.getSequenceSetId() != null)
     {
@@ -4640,49 +4651,48 @@ public class Jalview2XML
     }
     // recover view properties and display parameters
 
-    viewport.setShowAnnotation(view.isShowAnnotation());
-    viewport.setAbovePIDThreshold(view.isPidSelected());
-    final int pidThreshold = view.getPidThreshold() == null ? 0
-            : view.getPidThreshold().intValue();
+    viewport.setShowAnnotation(safeBoolean(view.isShowAnnotation()));
+    viewport.setAbovePIDThreshold(safeBoolean(view.isPidSelected()));
+    final int pidThreshold = safeInt(view.getPidThreshold());
     viewport.setThreshold(pidThreshold);
 
-    viewport.setColourText(view.isShowColourText());
+    viewport.setColourText(safeBoolean(view.isShowColourText()));
 
     viewport
-            .setConservationSelected(view.isConservationSelected());
-    viewport.setIncrement(view.getConsThreshold() == null ? 0
-            : view.getConsThreshold().intValue());
-    viewport.setShowJVSuffix(view.isShowFullId());
-    viewport.setRightAlignIds(view.isRightAlignIds());
-    viewport.setFont(new java.awt.Font(view.getFontName(),
-            view.getFontStyle(), view.getFontSize()), true);
+            .setConservationSelected(
+                    safeBoolean(view.isConservationSelected()));
+    viewport.setIncrement(safeInt(view.getConsThreshold()));
+    viewport.setShowJVSuffix(safeBoolean(view.isShowFullId()));
+    viewport.setRightAlignIds(safeBoolean(view.isRightAlignIds()));
+    viewport.setFont(new Font(view.getFontName(),
+            safeInt(view.getFontStyle()), safeInt(view.getFontSize())),
+            true);
     ViewStyleI vs = viewport.getViewStyle();
     vs.setScaleProteinAsCdna(view.isScaleProteinAsCdna());
     viewport.setViewStyle(vs);
     // TODO: allow custom charWidth/Heights to be restored by updating them
     // after setting font - which means set above to false
-    viewport.setRenderGaps(view.isRenderGaps());
-    viewport.setWrapAlignment(view.isWrapAlignment());
-    viewport.setShowAnnotation(view.isShowAnnotation());
+    viewport.setRenderGaps(safeBoolean(view.isRenderGaps()));
+    viewport.setWrapAlignment(safeBoolean(view.isWrapAlignment()));
+    viewport.setShowAnnotation(safeBoolean(view.isShowAnnotation()));
 
-    viewport.setShowBoxes(view.isShowBoxes());
+    viewport.setShowBoxes(safeBoolean(view.isShowBoxes()));
 
-    viewport.setShowText(view.isShowText());
+    viewport.setShowText(safeBoolean(view.isShowText()));
 
-    viewport.setTextColour(new java.awt.Color(view.getTextCol1()));
-    viewport.setTextColour2(new java.awt.Color(view.getTextCol2()));
-    viewport.setThresholdTextColour(view.getTextColThreshold());
-    viewport.setShowUnconserved(
-            view.isShowUnconserved() ? view.isShowUnconserved() : false);
-    viewport.getRanges().setStartRes(view.getStartRes());
+    viewport.setTextColour(new Color(safeInt(view.getTextCol1())));
+    viewport.setTextColour2(new Color(safeInt(view.getTextCol2())));
+    viewport.setThresholdTextColour(safeInt(view.getTextColThreshold()));
+    viewport.setShowUnconserved(view.isShowUnconserved());
+    viewport.getRanges().setStartRes(safeInt(view.getStartRes()));
 
     if (view.getViewName() != null)
     {
       viewport.setViewName(view.getViewName());
       af.setInitialTabVisible();
     }
-    af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
-            view.getHeight());
+    af.setBounds(safeInt(view.getXpos()), safeInt(view.getYpos()),
+            safeInt(view.getWidth()), safeInt(view.getHeight()));
     // startSeq set in af.alignPanel.updateLayout below
     af.alignPanel.updateLayout();
     ColourSchemeI cs = null;
@@ -4714,10 +4724,10 @@ public class Jalview2XML
             .setConsensus(viewport.getSequenceConsensusHash());
     viewport.setColourAppliesToAllGroups(false);
 
-    if (view.isConservationSelected() && cs != null)
+    if (safeBoolean(view.isConservationSelected()) && cs != null)
     {
       viewport.getResidueShading()
-              .setConservationInc(view.getConsThreshold());
+              .setConservationInc(safeInt(view.getConsThreshold()));
     }
 
     af.changeColour(cs);
@@ -4725,69 +4735,20 @@ public class Jalview2XML
     viewport.setColourAppliesToAllGroups(true);
 
     viewport
-            .setShowSequenceFeatures(view.isShowSequenceFeatures());
+            .setShowSequenceFeatures(
+                    safeBoolean(view.isShowSequenceFeatures()));
 
-    // if (view.hasCentreColumnLabels())
-    // {
     viewport.setCentreColumnLabels(view.isCentreColumnLabels());
-    // }
-    // if (view.hasIgnoreGapsinConsensus())
-    // {
     viewport.setIgnoreGapsConsensus(view.isIgnoreGapsinConsensus(), null);
-    // }
-    // if (view.hasFollowHighlight())
-    // {
-
     viewport.setFollowHighlight(view.isFollowHighlight());
-    // }
-    // if (view.hasFollowSelection())
-    // {
     viewport.followSelection = view.isFollowSelection();
-    // }
-    // if (view.hasShowConsensusHistogram())
-    // {
     viewport.setShowConsensusHistogram(view.isShowConsensusHistogram());
-    // }
-    // else
-    // {
-    // viewport.setShowConsensusHistogram(true);
-    // }
-    // if (view.hasShowSequenceLogo())
-    // {
     viewport.setShowSequenceLogo(view.isShowSequenceLogo());
-    // }
-    // else
-    // {
-    // viewport.setShowSequenceLogo(false);
-    // }
-    // if (view.hasNormaliseSequenceLogo())
-    // {
     viewport.setNormaliseSequenceLogo(view.isNormaliseSequenceLogo());
-    // }
-    if (view.isShowDbRefTooltip() != null)
-    {
-      viewport.setShowDBRefs(view.isShowDbRefTooltip());
-    }
-    if (view.isShowNPfeatureTooltip() != null)
-    {
-      viewport.setShowNPFeats(view.isShowNPfeatureTooltip());
-    }
-    // if (view.hasShowGroupConsensus())
-    // {
+    viewport.setShowDBRefs(safeBoolean(view.isShowDbRefTooltip()));
+    viewport.setShowNPFeats(safeBoolean(view.isShowNPfeatureTooltip()));
     viewport.setShowGroupConsensus(view.isShowGroupConsensus());
-    // }
-    // else
-    // {
-    // viewport.setShowGroupConsensus(false);
-    // }
-    // if (view.hasShowGroupConservation())
-    // {
     viewport.setShowGroupConservation(view.isShowGroupConservation());
-    // }
-    // else
-    // {
-    // viewport.setShowGroupConservation(false);
-    // }
 
     // recover feature settings
     if (jm.getFeatureSettings() != null)
@@ -4843,12 +4804,9 @@ public class Jalview2XML
           {
             noValueColour = maxColour;
           }
-          float min = setting.getMin() != null
-                  ? setting.getMin().floatValue()
-                  : 0f;
-          float max = setting.getMin() != null
-                  ? setting.getMax().floatValue()
-                  : 1f;
+          float min = safeFloat(safeFloat(setting.getMin()));
+          float max = setting.getMax() == null ? 1f
+                  : setting.getMax().floatValue();
           FeatureColourI gc = new FeatureColour(minColour, maxColour,
                   noValueColour, min, max);
           if (setting.getAttributeName().size() > 0)
@@ -4859,7 +4817,7 @@ public class Jalview2XML
           if (setting.getThreshold() != null)
           {
             gc.setThreshold(setting.getThreshold().floatValue());
-            int threshstate = setting.getThreshstate().intValue();
+            int threshstate = safeInt(setting.getThreshstate());
             // -1 = None, 0 = Below, 1 = Above threshold
             if (threshstate == 0)
             {
@@ -4897,7 +4855,7 @@ public class Jalview2XML
           featureOrder.put(featureType, new Float(
                   fs / jm.getFeatureSettings().getSetting().size()));
         }
-        if (setting.isDisplay())
+        if (safeBoolean(setting.isDisplay()))
         {
           fdi.setVisible(featureType);
         }
@@ -4920,9 +4878,9 @@ public class Jalview2XML
     {
       for (int c = 0; c < view.getHiddenColumns().size(); c++)
       {
-        viewport.hideColumns(view.getHiddenColumns().get(c).getStart(),
-                view.getHiddenColumns().get(c).getEnd() // +1
-        );
+        final HiddenColumns hc = view.getHiddenColumns().get(c);
+        viewport.hideColumns(safeInt(hc.getStart()),
+                safeInt(hc.getEnd()) /* +1 */);
       }
     }
     if (view.getCalcIdParam() != null)
@@ -4953,8 +4911,8 @@ public class Jalview2XML
     String complementaryViewId = view.getComplementId();
     if (complementaryViewId == null)
     {
-      Desktop.addInternalFrame(af, view.getTitle(), view.getWidth(),
-              view.getHeight());
+      Desktop.addInternalFrame(af, view.getTitle(),
+              safeInt(view.getWidth()), safeInt(view.getHeight()));
       // recompute any autoannotation
       af.alignPanel.updateAnnotation(false, true);
       reorderAutoannotation(af, al, autoAlan);
@@ -5029,34 +4987,36 @@ public class Jalview2XML
     }
     if (matchedAnnotation.getThreshold() == null)
     {
-      matchedAnnotation.setThreshold(new GraphLine(
-              viewAnnColour.getThreshold(), "Threshold", Color.black));
+      matchedAnnotation.setThreshold(
+              new GraphLine(safeFloat(viewAnnColour.getThreshold()),
+                      "Threshold", Color.black));
     }
 
     AnnotationColourGradient cs = null;
     if (viewAnnColour.getColourScheme().equals("None"))
     {
       cs = new AnnotationColourGradient(matchedAnnotation,
-              new Color(viewAnnColour.getMinColour()),
-              new Color(viewAnnColour.getMaxColour()),
-              viewAnnColour.getAboveThreshold());
+              new Color(safeInt(viewAnnColour.getMinColour())),
+              new Color(safeInt(viewAnnColour.getMaxColour())),
+              safeInt(viewAnnColour.getAboveThreshold()));
     }
     else if (viewAnnColour.getColourScheme().startsWith("ucs"))
     {
       cs = new AnnotationColourGradient(matchedAnnotation,
               getUserColourScheme(model, viewAnnColour.getColourScheme()),
-              viewAnnColour.getAboveThreshold());
+              safeInt(viewAnnColour.getAboveThreshold()));
     }
     else
     {
       cs = new AnnotationColourGradient(matchedAnnotation,
               ColourSchemeProperty.getColourScheme(al,
                       viewAnnColour.getColourScheme()),
-              viewAnnColour.getAboveThreshold());
+              safeInt(viewAnnColour.getAboveThreshold()));
     }
 
-    boolean perSequenceOnly = viewAnnColour.isPerSequence();
-    boolean useOriginalColours = viewAnnColour.isPredefinedColours();
+    boolean perSequenceOnly = safeBoolean(viewAnnColour.isPerSequence());
+    boolean useOriginalColours = safeBoolean(
+            viewAnnColour.isPredefinedColours());
     cs.setSeqAssociated(perSequenceOnly);
     cs.setPredefinedColours(useOriginalColours);
 
@@ -5073,7 +5033,7 @@ public class Jalview2XML
 
         AnnotationColourGradient groupScheme = new AnnotationColourGradient(
                 matchedAnnotation, sg.getColourScheme(),
-                viewAnnColour.getAboveThreshold());
+                safeInt(viewAnnColour.getAboveThreshold()));
         sg.setColourScheme(groupScheme);
         groupScheme.setSeqAssociated(perSequenceOnly);
         groupScheme.setPredefinedColours(useOriginalColours);
@@ -6130,8 +6090,8 @@ public class Jalview2XML
       }
   
       colour = new FeatureColour(mincol, maxcol, noValueColour,
-              colourModel.getMin(),
-              colourModel.getMax());
+              safeFloat(colourModel.getMin()),
+              safeFloat(colourModel.getMax()));
       final List<String> attributeName = colourModel.getAttributeName();
       String[] attributes = attributeName
               .toArray(new String[attributeName.size()]);