JAL-1896 fixed NPE for RNA Helice without equivalent annotation
[jalview.git] / src / jalview / io / JSONFile.java
index ce70ea5..3ac4aa7 100644 (file)
 
 package jalview.io;
 
+import jalview.api.AlignExportSettingI;
+import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.ComplexAlignFile;
 import jalview.api.FeatureRenderer;
 import jalview.api.FeaturesDisplayedI;
+import jalview.bin.BuildDetails;
 import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenSequences;
@@ -33,15 +37,15 @@ import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
-import jalview.json.binding.v1.AlignmentAnnotationPojo;
-import jalview.json.binding.v1.AlignmentPojo;
-import jalview.json.binding.v1.AlignmentPojo.JalviewBioJsColorSchemeMapper;
-import jalview.json.binding.v1.AnnotationPojo;
-import jalview.json.binding.v1.SequenceFeaturesPojo;
-import jalview.json.binding.v1.SequenceGrpPojo;
-import jalview.json.binding.v1.SequencePojo;
-import jalview.schemes.ColourSchemeI;
+import jalview.json.binding.biojson.v1.AlignmentAnnotationPojo;
+import jalview.json.binding.biojson.v1.AlignmentPojo;
+import jalview.json.binding.biojson.v1.AnnotationPojo;
+import jalview.json.binding.biojson.v1.ColourSchemeMapper;
+import jalview.json.binding.biojson.v1.SequenceFeaturesPojo;
+import jalview.json.binding.biojson.v1.SequenceGrpPojo;
+import jalview.json.binding.biojson.v1.SequencePojo;
 import jalview.schemes.ColourSchemeProperty;
+import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
 
 import java.awt.Color;
 import java.io.IOException;
@@ -58,11 +62,9 @@ import org.json.simple.parser.JSONParser;
 
 public class JSONFile extends AlignFile implements ComplexAlignFile
 {
-  private ColourSchemeI colourScheme;
+  private static String version = new BuildDetails().getVersion();
 
-  private String version = "2.9";
-
-  private String webstartUrl = "www.jalview.org/services/launchApp";
+  private String webstartUrl = "http://www.jalview.org/services/launchApp";
 
   private String application = "Jalview";
 
@@ -70,7 +72,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
 
   public static final String FILE_DESC = "JSON";
 
-  private String globalColorScheme;
+  private String globalColourScheme;
 
   private boolean showSeqFeatures;
 
@@ -109,6 +111,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     parse(getReader());
 
   }
+
   @Override
   public String print()
   {
@@ -116,6 +119,51 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     try
     {
       AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
+      AlignExportSettingI exportSettings = getExportSettings();
+
+      // if no export settings were supplied use the following with all values
+      // defaulting to true
+      if (exportSettings == null)
+      {
+        exportSettings = new AlignExportSettingI()
+        {
+          @Override
+          public boolean isExportHiddenSequences()
+          {
+            return true;
+          }
+
+          @Override
+          public boolean isExportHiddenColumns()
+          {
+            return true;
+          }
+
+          @Override
+          public boolean isExportGroups()
+          {
+            return true;
+          }
+
+          @Override
+          public boolean isExportFeatures()
+          {
+            return true;
+          }
+
+          @Override
+          public boolean isExportAnnotations()
+          {
+            return true;
+          }
+
+          @Override
+          public boolean isCancelled()
+          {
+            return false;
+          }
+        };
+      }
 
       int count = 0;
       for (SequenceI seq : seqs)
@@ -132,8 +180,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         jsonSeqPojo.setSeq(seq.getSequenceAsString());
         jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
       }
-
-      jsonAlignmentPojo.setGlobalColorScheme(globalColorScheme);
+      jsonAlignmentPojo.setGlobalColorScheme(globalColourScheme);
       jsonAlignmentPojo.getAppSettings().put("application", application);
       jsonAlignmentPojo.getAppSettings().put("version", version);
       jsonAlignmentPojo.getAppSettings().put("webStartUrl", webstartUrl);
@@ -144,35 +191,39 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
       if (hiddenSections != null)
       {
         if (hiddenSections[0] != null
-                && getExportSettings()
-                        .isExportHiddenColumns())
+                && exportSettings.isExportHiddenColumns())
         {
           jsonAlignmentPojo.getAppSettings().put("hiddenCols",
                   String.valueOf(hiddenSections[0]));
         }
         if (hiddenSections[1] != null
-                && getExportSettings()
-                        .isExportHiddenSequences())
+                && exportSettings.isExportHiddenSequences())
         {
           jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
                   String.valueOf(hiddenSections[1]));
         }
       }
 
-      if (getExportSettings().isExportAnnotations())
+      if (exportSettings.isExportAnnotations())
       {
         jsonAlignmentPojo
                 .setAlignAnnotation(annotationToJsonPojo(annotations));
       }
+      else
+      {
+        if (globalColourScheme.equalsIgnoreCase("RNA Helices"))
+        {
+          jsonAlignmentPojo.setGlobalColorScheme("None");
+        }
+      }
 
-      if (getExportSettings().isExportFeatures())
+      if (exportSettings.isExportFeatures())
       {
         jsonAlignmentPojo
                 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
       }
 
-      if (getExportSettings().isExportGroups()
-              && seqGroups != null
+      if (exportSettings.isExportGroups() && seqGroups != null
               && seqGroups.size() > 0)
       {
         for (SequenceGroup seqGrp : seqGroups)
@@ -190,7 +241,8 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
           seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
           for (SequenceI seq : seqGrp.getSequences())
           {
-            seqGrpPojo.getSeqsHash().add(String.valueOf(seq.hashCode()));
+            seqGrpPojo.getSequenceRefs()
+                    .add(String.valueOf(seq.hashCode()));
           }
           jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
         }
@@ -257,11 +309,10 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     return hiddenSections;
   }
 
-  public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
+  public List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
           List<SequenceI> seqs, FeatureRenderer fr)
   {
-    FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
-            .getFeaturesDisplayed();
+    displayedFeatures = (fr == null) ? null : fr.getFeaturesDisplayed();
     List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
     for (SequenceI seq : seqs)
     {
@@ -283,9 +334,9 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         {
           SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
                   String.valueOf(seq.hashCode()));
+
           String featureColour = (fr == null) ? null : jalview.util.Format
-                  .getHexString(fr
-                  .findFeatureColour(Color.white, seq,
+                  .getHexString(fr.findFeatureColour(Color.white, seq,
                           seq.findIndex(sf.getBegin())));
           jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
           jsonFeature.setXend(seq.findIndex(sf.getEnd()));
@@ -358,11 +409,10 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
 
       if (jvSettingsJsonObj != null)
       {
-        String jsColourScheme = (String) jvSettingsJsonObj
+        globalColourScheme = (String) jvSettingsJsonObj
                 .get("globalColorScheme");
         Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
                 "showSeqFeatures").toString());
-        setColourScheme(getJalviewColorScheme(jsColourScheme));
         setShowSeqFeatures(showFeatures);
         parseHiddenSeqRefsAsList(jvSettingsJsonObj);
         parseHiddenCols(jvSettingsJsonObj);
@@ -388,6 +438,8 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         seqs.add(seq);
         seqMap.put(seqUniqueId, seq);
       }
+
+
       parseFeatures(jsonSeqArray);
 
       for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter
@@ -409,12 +461,12 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         int startRes = Integer
                 .valueOf(seqGrpObj.get("startRes").toString());
         int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
-        JSONArray seqsHashArray = (JSONArray) seqGrpObj.get("seqsHash");
+        JSONArray sequenceRefs = (JSONArray) seqGrpObj.get("sequenceRefs");
 
         ArrayList<SequenceI> grpSeqs = new ArrayList<SequenceI>();
-        if (seqsHashArray.size() > 0)
+        if (sequenceRefs.size() > 0)
         {
-          Iterator<String> seqHashIter = seqsHashArray.iterator();
+          Iterator<String> seqHashIter = sequenceRefs.iterator();
           while (seqHashIter.hasNext())
           {
             String seqHash = seqHashIter.next();
@@ -425,9 +477,11 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
             }
           }
         }
-        ColourSchemeI scheme = getJalviewColorScheme(colourScheme);
-        SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, scheme,
-                displayBoxes, displayText, colourText, startRes, endRes);
+        SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, null,
+                displayBoxes, displayText, colourText,
+                startRes, endRes);
+        seqGrp.cs = ColourSchemeMapper.getJalviewColourScheme(colourScheme,
+                seqGrp);
         seqGrp.setShowNonconserved(showNonconserved);
         seqGrp.setDescription(description);
         this.seqGroups.add(seqGrp);
@@ -455,10 +509,12 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
                     .valueOf(annot.get("value").toString());
             String desc = annot.get("description") == null ? null : annot
                     .get("description").toString();
-
-            char ss = annot.get("secondaryStructure") == null ? ' '
-                    : annot.get("secondaryStructure").toString().charAt(0);
-            String displayChar = annot.get("displayCharacter").toString();
+            char ss = annot.get("secondaryStructure") == null
+                    || annot.get("secondaryStructure").toString()
+                            .equalsIgnoreCase("u0000") ? ' ' : annot
+                    .get("secondaryStructure").toString().charAt(0);
+            String displayChar = annot.get("displayCharacter") == null ? ""
+                    : annot.get("displayCharacter").toString();
 
             annotations[count] = new Annotation(displayChar, desc, ss, val);
           }
@@ -470,7 +526,6 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
                 .toString(), annotations);
         this.annotations.add(alignAnnot);
       }
-
     } catch (Exception e)
     {
       e.printStackTrace();
@@ -482,9 +537,11 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   {
     hiddenSeqRefs = new ArrayList<String>();
     String hiddenSeqs = (String) jvSettingsJson.get("hiddenSeqs");
-    if(hiddenSeqs != null && !hiddenSeqs.isEmpty()){
+    if (hiddenSeqs != null && !hiddenSeqs.isEmpty())
+    {
       String[] seqRefs = hiddenSeqs.split(";");
-      for(String seqRef : seqRefs){
+      for (String seqRef : seqRefs)
+      {
         hiddenSeqRefs.add(seqRef);
       }
     }
@@ -493,10 +550,12 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   public void parseHiddenCols(JSONObject jvSettingsJson)
   {
     String hiddenCols = (String) jvSettingsJson.get("hiddenCols");
-    if(hiddenCols != null && !hiddenCols.isEmpty()){
+    if (hiddenCols != null && !hiddenCols.isEmpty())
+    {
       columnSelection = new ColumnSelection();
       String[] rangeStrings = hiddenCols.split(";");
-      for(String rangeString : rangeStrings){
+      for (String rangeString : rangeStrings)
+      {
         String[] range = rangeString.split("-");
         columnSelection.hideColumns(Integer.valueOf(range[0]),
                 Integer.valueOf(range[1]));
@@ -509,6 +568,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   {
     if (jsonSeqFeatures != null)
     {
+      displayedFeatures = new FeaturesDisplayed();
       for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
               .hasNext();)
       {
@@ -540,46 +600,22 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         sequenceFeature.setBegin(seq.findPosition(begin.intValue()));
         sequenceFeature.setEnd(seq.findPosition(end.intValue()) - 1);
         seq.addSequenceFeature(sequenceFeature);
+        displayedFeatures.setVisible(type);
       }
     }
   }
 
-  public static ColourSchemeI getJalviewColorScheme(
-          String bioJsColourSchemeName)
-  {
-    ColourSchemeI jalviewColor = null;
-    for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
-            .values())
-    {
-      if (cs.getBioJsName().equalsIgnoreCase(bioJsColourSchemeName))
-      {
-        jalviewColor = cs.getJvColourScheme();
-        break;
-      }
-    }
-    return jalviewColor;
-  }
-
-  public String getGlobalColorScheme()
+  public String getGlobalColourScheme()
   {
-    return globalColorScheme;
+    return globalColourScheme;
   }
 
-  public void setGlobalColorScheme(String globalColorScheme)
+  public void setGlobalColorScheme(String globalColourScheme)
   {
-    this.globalColorScheme = globalColorScheme;
-  }
-
-  public ColourSchemeI getColourScheme()
-  {
-    return colourScheme;
-  }
-
-  public void setColourScheme(ColourSchemeI colourScheme)
-  {
-    this.colourScheme = colourScheme;
+    this.globalColourScheme = globalColourScheme;
   }
 
+  @Override
   public FeaturesDisplayedI getDisplayedFeatures()
   {
     return displayedFeatures;
@@ -590,50 +626,33 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     this.displayedFeatures = displayedFeatures;
   }
 
-  @Override
   public void configureForView(AlignmentViewPanel avpanel)
   {
     super.configureForView(avpanel);
-    if (isExporting())
-    {
-      setViewport(avpanel.getAlignViewport());
-      seqGroups = avpanel.getAlignment().getGroups();
-      setDisplayedFeatures(getViewport().getFeaturesDisplayed());
-      fr = avpanel.cloneFeatureRenderer();
+    AlignViewportI viewport = avpanel.getAlignViewport();
+    AlignmentI alignment = viewport.getAlignment();
+    AlignmentAnnotation[] annots = alignment.getAlignmentAnnotation();
 
-      for (SequenceI seq : getViewport().getAlignment().getSequences())
-      {
-        seqs.add(seq);
-      }
+    seqGroups = alignment.getGroups();
+    fr = avpanel.cloneFeatureRenderer();
 
-      // Add non auto calculated annotation to AlignFile
-      for (AlignmentAnnotation annot : getViewport().getAlignment()
-              .getAlignmentAnnotation())
+    // Add non auto calculated annotation to AlignFile
+    for (AlignmentAnnotation annot : annots)
+    {
+      if (annot != null && !annot.autoCalculated)
       {
-        if (annot != null && !annot.autoCalculated)
+        if (!annot.visible)
         {
-          if (annot.label.equals("PDB.CATempFactor"))
-          {
-            continue;
-          }
-          annotations.add(annot);
+          continue;
         }
+        annotations.add(annot);
       }
-
-      globalColorScheme = ColourSchemeProperty.getColourName(getViewport()
-              .getGlobalColourScheme());
-      setDisplayedFeatures(getViewport().getFeaturesDisplayed());
-      showSeqFeatures = getViewport().isShowSequenceFeatures();
     }
-  }
-
+    globalColourScheme = ColourSchemeProperty.getColourName(viewport
+            .getGlobalColourScheme());
+    setDisplayedFeatures(viewport.getFeaturesDisplayed());
+    showSeqFeatures = viewport.isShowSequenceFeatures();
 
-  public static String getJSONData(AlignmentViewPanel av)
-  {
-    JSONFile jsonFile = new JSONFile();
-    jsonFile.configureForView(av);
-    String jsonString = jsonFile.print();
-    return jsonString;
   }
 
   public boolean isShowSeqFeatures()
@@ -670,8 +689,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   {
     if (hiddenSequences == null || hiddenSequences.isEmpty())
     {
-      return new SequenceI[]
-      {};
+      return new SequenceI[] {};
     }
     synchronized (hiddenSequences)
     {