JAL-1759 merge from develop
[jalview.git] / src / jalview / io / JSONFile.java
index f977b04..b079a3c 100644 (file)
 
 package jalview.io;
 
-import java.awt.Color;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-
+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.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenSequences;
@@ -54,6 +45,20 @@ import jalview.json.binding.v1.SequenceGrpPojo;
 import jalview.json.binding.v1.SequencePojo;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
+import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
+
+import java.awt.Color;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
 
 public class JSONFile extends AlignFile implements ComplexAlignFile
 {
@@ -87,6 +92,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
 
   private ArrayList<SequenceI> hiddenSequences;
 
+
   public JSONFile()
   {
     super();
@@ -105,16 +111,9 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   @Override
   public void parse() throws IOException
   {
-    StringBuilder jsonStringBuilder = new StringBuilder();
-    String currentLine;
-    while ((currentLine = nextLine()) != null)
-    {
-      jsonStringBuilder.append(currentLine);
-    }
-    parse(jsonStringBuilder.toString());
+    parse(getReader());
 
   }
-
   @Override
   public String print()
   {
@@ -122,14 +121,44 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     try
     {
       AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
-      if (getViewport() != null)
+      AlignExportSettingI exportSettings = getExportSettings();
+
+      // if no export settings were supplied use the following with all values
+      // defaulting to true
+      if (exportSettings == null)
       {
-        globalColorScheme = ColourSchemeProperty
-                .getColourName(getViewport()
-                .getGlobalColourScheme());
-        setDisplayedFeatures(getViewport().getFeaturesDisplayed());
-        showSeqFeatures = getViewport().isShowSequenceFeatures();
-        fr = getViewport().getFeatureRenderer();
+        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;
+          }
+        };
       }
 
       int count = 0;
@@ -159,14 +188,14 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
       if (hiddenSections != null)
       {
         if (hiddenSections[0] != null
-                && getViewport().getExportSettings()
+                && exportSettings
                         .isExportHiddenColumns())
         {
           jsonAlignmentPojo.getAppSettings().put("hiddenCols",
                   String.valueOf(hiddenSections[0]));
         }
         if (hiddenSections[1] != null
-                && getViewport().getExportSettings()
+                && exportSettings
                         .isExportHiddenSequences())
         {
           jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
@@ -174,19 +203,19 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         }
       }
 
-      if (getViewport().getExportSettings().isExportAnnotations())
+      if (exportSettings.isExportAnnotations())
       {
         jsonAlignmentPojo
                 .setAlignAnnotation(annotationToJsonPojo(annotations));
       }
 
-      if (getViewport().getExportSettings().isExportFeatures())
+      if (exportSettings.isExportFeatures())
       {
         jsonAlignmentPojo
                 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
       }
 
-      if (getViewport().getExportSettings().isExportGroups()
+      if (exportSettings.isExportGroups()
               && seqGroups != null
               && seqGroups.size() > 0)
       {
@@ -272,10 +301,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
+    displayedFeatures = (fr == null) ? null : fr
             .getFeaturesDisplayed();
     List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
     for (SequenceI seq : seqs)
@@ -298,6 +327,7 @@ 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,
@@ -354,7 +384,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   }
 
   @SuppressWarnings("unchecked")
-  public JSONFile parse(String jsonAlignmentString)
+  public JSONFile parse(Reader jsonAlignmentString)
   {
     try
     {
@@ -440,8 +470,9 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
             }
           }
         }
-        ColourSchemeI scheme = getJalviewColorScheme(colourScheme);
-        SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, scheme,
+        ColourSchemeI grpColourScheme = getJalviewColorScheme(colourScheme);
+        SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName,
+                grpColourScheme,
                 displayBoxes, displayText, colourText, startRes, endRes);
         seqGrp.setShowNonconserved(showNonconserved);
         seqGrp.setDescription(description);
@@ -524,6 +555,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   {
     if (jsonSeqFeatures != null)
     {
+      displayedFeatures = new FeaturesDisplayed();
       for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
               .hasNext();)
       {
@@ -555,6 +587,7 @@ 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);
       }
     }
   }
@@ -595,6 +628,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     this.colourScheme = colourScheme;
   }
 
+  @Override
   public FeaturesDisplayedI getDisplayedFeatures()
   {
     return displayedFeatures;
@@ -606,33 +640,33 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   }
 
 
-  public static String getJSONData(AlignViewportI av)
+  public void configureForView(AlignmentViewPanel avpanel)
   {
-    JSONFile jsonFile = new JSONFile();
-    jsonFile.setViewport(av);
-    jsonFile.seqGroups = av.getAlignment().getGroups();
-    jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
+    super.configureForView(avpanel);
+    AlignViewportI viewport = avpanel.getAlignViewport();
+    AlignmentI alignment = viewport.getAlignment();
+    AlignmentAnnotation[] annots = alignment.getAlignmentAnnotation();
+
+    seqGroups = alignment.getGroups();
+    fr = avpanel.cloneFeatureRenderer();
 
-    for (SequenceI seq : av.getAlignment().getSequences())
-    {
-      jsonFile.seqs.add(seq);
-    }
-  
     // Add non auto calculated annotation to AlignFile
-    for (AlignmentAnnotation annot : av.getAlignment()
-            .getAlignmentAnnotation())
+    for (AlignmentAnnotation annot : annots)
     {
       if (annot != null && !annot.autoCalculated)
       {
-        if (annot.label.equals("PDB.CATempFactor"))
+        if (!annot.visible)
         {
           continue;
         }
-        jsonFile.annotations.add(annot);
+        annotations.add(annot);
       }
     }
-    String jsonString = jsonFile.print();
-    return jsonString;
+    globalColorScheme = ColourSchemeProperty.getColourName(viewport
+            .getGlobalColourScheme());
+    setDisplayedFeatures(viewport.getFeaturesDisplayed());
+    showSeqFeatures = viewport.isShowSequenceFeatures();
+
   }
 
   public boolean isShowSeqFeatures()