JAL-1641 Further refactoring of JSON export option, introduction of Viewport to the...
[jalview.git] / src / jalview / io / JSONFile.java
index 26ffb7c..fcedb2b 100644 (file)
@@ -1,5 +1,7 @@
 package jalview.io;
 
+import jalview.api.AlignViewportI;
+import jalview.api.FeatureRenderer;
 import jalview.api.FeaturesDisplayedI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
@@ -8,7 +10,6 @@ import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
-import jalview.gui.Desktop;
 import jalview.json.binding.v1.AlignmentAnnotationPojo;
 import jalview.json.binding.v1.AlignmentPojo;
 import jalview.json.binding.v1.AnnotationPojo;
@@ -19,8 +20,8 @@ import jalview.json.binding.v1.SequenceGrpPojo;
 import jalview.json.binding.v1.SequencePojo;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
-import jalview.viewmodel.AlignmentViewport;
 
+import java.awt.Color;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Hashtable;
@@ -34,13 +35,13 @@ import org.json.simple.parser.JSONParser;
 
 public class JSONFile extends AlignFile
 {
-  private static ColourSchemeI colourScheme;
+  private ColourSchemeI colourScheme;
 
-  private static boolean seqFeaturesEnabled;
+  // private static boolean seqFeaturesEnabled;
 
   private String jalviewVersion;
 
-  private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp";
+  private String webStartLaunchServletUrl;
 
   public static final String FILE_EXT = "json";
 
@@ -54,9 +55,11 @@ public class JSONFile extends AlignFile
 
   private FeaturesDisplayedI displayedFeatures;
 
-  private AlignmentViewport av;
+  // private AlignViewportI viewport;
 
-  private jalview.api.FeatureRenderer fr;
+  private FeatureRenderer fr;
+
+  private JSONExportSettings jsonExportSettings;
 
   public JSONFile()
   {
@@ -91,24 +94,25 @@ public class JSONFile extends AlignFile
   {
     try
     {
-      JSONExportSettings exportSettings = new JSONExportSettings();
-      exportSettings.setExportAnnotations(true);
-      exportSettings.setExportGroups(true);
-      exportSettings.setExportJalviewSettings(true);
-      exportSettings.setExportSequenceFeatures(true);
+      if (getJsonExportSettings() == null)
+      {
+        jsonExportSettings = new JSONExportSettings();
+        jsonExportSettings.setExportAnnotations(true);
+        jsonExportSettings.setExportGroups(true);
+        jsonExportSettings.setExportJalviewSettings(true);
+        jsonExportSettings.setExportSequenceFeatures(true);
+      }
 
       AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
-      if (Desktop.getCurrentAlignFrame() != null)
+      if (getViewport() != null)
       {
-        globalColorScheme = ColourSchemeProperty.getColourName(Desktop
-                .getCurrentAlignFrame().getViewport()
+        globalColorScheme = ColourSchemeProperty
+                .getColourName(getViewport()
                 .getGlobalColourScheme());
-        this.av = Desktop.getCurrentAlignFrame().getCurrentView();
-        this.fr = Desktop.getCurrentAlignFrame().alignPanel
-                .cloneFeatureRenderer();
-        displayedFeatures = av.getFeaturesDisplayed();
-        showSeqFeatures = Desktop.getCurrentAlignFrame().showSeqFeatures
-                .isSelected();
+        setDisplayedFeatures(getViewport().getFeaturesDisplayed());
+        showSeqFeatures = getViewport().isShowSequenceFeatures();
+        fr = getViewport().getFeatureRenderer();
+        // setSeqFeaturesEnabled(viewport.isShowSequenceFeatures());
       }
 
       int count = 0;
@@ -127,8 +131,13 @@ public class JSONFile extends AlignFile
         jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
       }
 
-      if (exportSettings.isExportJalviewSettings())
+      if (jsonExportSettings.isExportJalviewSettings())
       {
+        jalviewVersion = jalview.bin.Cache.getProperty("VERSION");
+        webStartLaunchServletUrl = jalview.bin.Cache.getDefault(
+                "www.jalview.org", "http://www.jalview.org")
+                + "/services/launchApp";
+
         JalviewSettingsPojo jvSettings = new JalviewSettingsPojo();
         jvSettings.setGlobalColorScheme(globalColorScheme);
         jvSettings.setJalviewVersion(jalviewVersion);
@@ -137,21 +146,21 @@ public class JSONFile extends AlignFile
         jsonAlignmentPojo.setJalviewSettings(jvSettings);
       }
 
-      if (exportSettings.isExportAnnotations())
+      if (jsonExportSettings.isExportAnnotations())
       {
         jsonAlignmentPojo
                 .setAlignAnnotation(annotationToJsonPojo(annotations));
       }
 
-      if (exportSettings.isExportSequenceFeatures())
+      if (jsonExportSettings.isExportSequenceFeatures())
       {
-        jsonAlignmentPojo.setSeqFeatures(sequenceFeatureToJsonPojo(seqs,
-                displayedFeatures));
+        jsonAlignmentPojo
+                .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
       }
 
-      if (exportSettings.isExportGroups() && seqGroups.size() > 0)
+      if (jsonExportSettings.isExportGroups() && seqGroups != null
+              && seqGroups.size() > 0)
       {
-        ArrayList<SequenceGrpPojo> sequenceGroupsPojo = new ArrayList<SequenceGrpPojo>();
         for (SequenceGroup seqGrp : seqGroups)
         {
           SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo();
@@ -186,24 +195,33 @@ public class JSONFile extends AlignFile
   }
 
   public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
-          List<SequenceI> seqs, FeaturesDisplayedI displayedFeatures)
+          List<SequenceI> seqs, FeatureRenderer fr)
   {
+    FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
+            .getFeaturesDisplayed();
     List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
     for (SequenceI seq : seqs)
     {
       SequenceI dataSetSequence = seq.getDatasetSequence();
       SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
               : seq.getDatasetSequence().getSequenceFeatures();
+
+      if (seqFeatures == null)
+      {
+        continue;
+      }
+
       for (SequenceFeature sf : seqFeatures)
       {
         if (displayedFeatures != null
                 && displayedFeatures.isVisible(sf.getType()))
         {
-          // String fillColor = ((fr != null) ? jalview.util.Format
-          // .getHexString(fr.findFeatureColour(Color.white, seq,
-          // seq.findIndex(sf.getBegin()))) : null);
           SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
                   seq.getName() + "_" + seq.hashCode());
+          String featureColour = (fr == null) ? null : jalview.util.Format
+                  .getHexString(fr
+                  .findFeatureColour(Color.white, seq,
+                          seq.findIndex(sf.getBegin())));
           jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
           jsonFeature.setXend(seq.findIndex(sf.getEnd()));
           jsonFeature.setType(sf.getType());
@@ -211,7 +229,7 @@ public class JSONFile extends AlignFile
           jsonFeature.setLinks(sf.links);
           jsonFeature.setOtherDetails(sf.otherDetails);
           jsonFeature.setScore(sf.getScore());
-          // jsonFeature.setFillColor(fillColor);
+          jsonFeature.setFillColor(featureColour);
           jsonFeature.setFeatureGroup(sf.getFeatureGroup());
           sequenceFeaturesPojo.add(jsonFeature);
         }
@@ -224,6 +242,10 @@ public class JSONFile extends AlignFile
           Vector<AlignmentAnnotation> annotations)
   {
     List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<AlignmentAnnotationPojo>();
+    if (annotations == null)
+    {
+      return jsonAnnotations;
+    }
     for (AlignmentAnnotation annot : annotations)
     {
       AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
@@ -251,7 +273,8 @@ public class JSONFile extends AlignFile
     return jsonAnnotations;
   }
 
-  public void parse(String jsonAlignmentString)
+  @SuppressWarnings("unchecked")
+  public JSONFile parse(String jsonAlignmentString)
   {
     try
     {
@@ -275,12 +298,11 @@ public class JSONFile extends AlignFile
         Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
                 "showSeqFeatures").toString());
         setColourScheme(getJalviewColorScheme(jsColourScheme));
-        JSONFile.setSeqFeaturesEnabled(showFeatures);
-        // Desktop.setCurrentSeqFeaturesVisible(showFeatures);
+        // JSONFile.setSeqFeaturesEnabled(showFeatures);
+        setShowSeqFeatures(showFeatures);
       }
 
       seqMap = new Hashtable<String, Sequence>();
-      // Desktop.setCurrentGlobalColourScheme(cs);
       for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
               .hasNext();)
       {
@@ -382,22 +404,22 @@ public class JSONFile extends AlignFile
     {
       e.printStackTrace();
     }
+    return this;
   }
 
 
+  @SuppressWarnings("unchecked")
   private void parseFeatures(JSONArray jsonSeqFeatures)
   {
     if (jsonSeqFeatures != null)
     {
-      for (@SuppressWarnings("unchecked")
-      Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
+      for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
               .hasNext();)
       {
         JSONObject jsonFeature = seqFeatureItr.next();
         Long begin = (Long) jsonFeature.get("xStart");
         Long end = (Long) jsonFeature.get("xEnd");
         String type = (String) jsonFeature.get("type");
-        String color = (String) jsonFeature.get("fillColor");
         String featureGrp = (String) jsonFeature.get("featureGroup");
         String descripiton = (String) jsonFeature.get("description");
         String seqRef = (String) jsonFeature.get("sequenceRef");
@@ -429,7 +451,8 @@ public class JSONFile extends AlignFile
     }
   }
 
-  private ColourSchemeI getJalviewColorScheme(String bioJsColourSchemeName)
+  public static ColourSchemeI getJalviewColorScheme(
+          String bioJsColourSchemeName)
   {
     ColourSchemeI jalviewColor = null;
     for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
@@ -446,7 +469,7 @@ public class JSONFile extends AlignFile
 
   public void LoadAlignmentFeatures(AlignFrame af)
   {
-    af.setShowSeqFeatures(JSONFile.isSeqFeaturesEnabled());
+    af.setShowSeqFeatures(isShowSeqFeatures());
     af.changeColour(getColourScheme());
     af.setMenusForViewport();
   }
@@ -461,24 +484,73 @@ public class JSONFile extends AlignFile
     this.globalColorScheme = globalColorScheme;
   }
 
-  public static ColourSchemeI getColourScheme()
+  public ColourSchemeI getColourScheme()
   {
     return colourScheme;
   }
 
-  public static void setColourScheme(ColourSchemeI colourScheme)
+  public void setColourScheme(ColourSchemeI colourScheme)
+  {
+    this.colourScheme = colourScheme;
+  }
+
+  public FeaturesDisplayedI getDisplayedFeatures()
   {
-    JSONFile.colourScheme = colourScheme;
+    return displayedFeatures;
+  }
+
+  public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
+  {
+    this.displayedFeatures = displayedFeatures;
+  }
+
+  public JSONExportSettings getJsonExportSettings()
+  {
+    return jsonExportSettings;
+  }
+
+  public void setJsonExportSettings(JSONExportSettings jsonExportSettings)
+  {
+    this.jsonExportSettings = jsonExportSettings;
+  }
+
+  public static String getJSONData(AlignViewportI av)
+  {
+    JSONFile jsonFile = new JSONFile();
+    jsonFile.setViewport(av);
+    jsonFile.seqGroups = av.getAlignment().getGroups();
+    jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
+
+    for (SequenceI seq : av.getAlignment().getSequences())
+    {
+      jsonFile.seqs.add(seq);
+    }
+  
+    // Add non auto calculated annotation to AlignFile
+    for (AlignmentAnnotation annot : av.getAlignment()
+            .getAlignmentAnnotation())
+    {
+      if (annot != null && !annot.autoCalculated)
+      {
+        if (annot.label.equals("PDB.CATempFactor"))
+        {
+          continue;
+        }
+        jsonFile.annotations.add(annot);
+      }
+    }
+    String jsonString = jsonFile.print();
+    return jsonString;
   }
 
-  public static boolean isSeqFeaturesEnabled()
+  public boolean isShowSeqFeatures()
   {
-    return seqFeaturesEnabled;
+    return showSeqFeatures;
   }
 
-  public static void setSeqFeaturesEnabled(boolean seqFeaturesEnabled)
+  public void setShowSeqFeatures(boolean showSeqFeatures)
   {
-    JSONFile.seqFeaturesEnabled = seqFeaturesEnabled;
+    this.showSeqFeatures = showSeqFeatures;
   }
 
   public class JSONExportSettings