JAL-1784 refactor parse method to directly parse FileParser input reader stream.
[jalview.git] / src / jalview / io / JSONFile.java
index 5e2139e..bbbc122 100644 (file)
 
 package jalview.io;
 
-import jalview.api.AlignViewControllerGuiI;
 import jalview.api.AlignViewportI;
+import jalview.api.ComplexAlignFile;
 import jalview.api.FeatureRenderer;
 import jalview.api.FeaturesDisplayedI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
+import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenSequences;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
@@ -44,6 +45,7 @@ import jalview.schemes.ColourSchemeProperty;
 
 import java.awt.Color;
 import java.io.IOException;
+import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -54,7 +56,7 @@ import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 
-public class JSONFile extends AlignFile
+public class JSONFile extends AlignFile implements ComplexAlignFile
 {
   private ColourSchemeI colourScheme;
 
@@ -78,7 +80,13 @@ public class JSONFile extends AlignFile
 
   private FeatureRenderer fr;
 
-  private JSONExportSettings jsonExportSettings;
+  private List<int[]> hiddenColumns;
+
+  private ColumnSelection columnSelection;
+
+  private List<String> hiddenSeqRefs;
+
+  private ArrayList<SequenceI> hiddenSequences;
 
   public JSONFile()
   {
@@ -98,13 +106,7 @@ public class JSONFile extends AlignFile
   @Override
   public void parse() throws IOException
   {
-    StringBuilder jsonStringBuilder = new StringBuilder();
-    String currentLine;
-    while ((currentLine = nextLine()) != null)
-    {
-      jsonStringBuilder.append(currentLine);
-    }
-    parse(jsonStringBuilder.toString());
+    parse(getReader());
 
   }
 
@@ -114,15 +116,6 @@ public class JSONFile extends AlignFile
     String jsonOutput = null;
     try
     {
-      if (getJsonExportSettings() == null)
-      {
-        jsonExportSettings = new JSONExportSettings();
-        jsonExportSettings.setExportAnnotations(true);
-        jsonExportSettings.setExportGroups(true);
-        jsonExportSettings.setExportJalviewSettings(true);
-        jsonExportSettings.setExportSequenceFeatures(true);
-      }
-
       AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
       if (getViewport() != null)
       {
@@ -141,7 +134,7 @@ public class JSONFile extends AlignFile
         name.append(seq.getName()).append("/").append(seq.getStart())
                 .append("-").append(seq.getEnd());
         SequencePojo jsonSeqPojo = new SequencePojo();
-        jsonSeqPojo.setId(seq.getName() + "_" + seq.hashCode());
+        jsonSeqPojo.setId(String.valueOf(seq.hashCode()));
         jsonSeqPojo.setOrder(++count);
         jsonSeqPojo.setEnd(seq.getEnd());
         jsonSeqPojo.setStart(seq.getStart());
@@ -150,38 +143,46 @@ public class JSONFile extends AlignFile
         jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
       }
 
-      if (jsonExportSettings.isExportJalviewSettings())
+      jsonAlignmentPojo.setGlobalColorScheme(globalColorScheme);
+      jsonAlignmentPojo.getAppSettings().put("application", application);
+      jsonAlignmentPojo.getAppSettings().put("version", version);
+      jsonAlignmentPojo.getAppSettings().put("webStartUrl", webstartUrl);
+      jsonAlignmentPojo.getAppSettings().put("showSeqFeatures",
+              String.valueOf(showSeqFeatures));
+
+      String[] hiddenSections = getHiddenSections();
+      if (hiddenSections != null)
       {
-        jsonAlignmentPojo.setGlobalColorScheme(globalColorScheme);
-        jsonAlignmentPojo.getAppSettings().put("application", application);
-        jsonAlignmentPojo.getAppSettings().put("version", version);
-        jsonAlignmentPojo.getAppSettings().put("webStartUrl", webstartUrl);
-        jsonAlignmentPojo.getAppSettings().put("showSeqFeatures",
-                String.valueOf(showSeqFeatures));
-
-        String[] hiddenSections = exportHiddenSections();
-        if (hiddenSections != null)
+        if (hiddenSections[0] != null
+                && getViewport().getExportSettings()
+                        .isExportHiddenColumns())
         {
           jsonAlignmentPojo.getAppSettings().put("hiddenCols",
                   String.valueOf(hiddenSections[0]));
+        }
+        if (hiddenSections[1] != null
+                && getViewport().getExportSettings()
+                        .isExportHiddenSequences())
+        {
           jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
                   String.valueOf(hiddenSections[1]));
         }
       }
 
-      if (jsonExportSettings.isExportAnnotations())
+      if (getViewport().getExportSettings().isExportAnnotations())
       {
         jsonAlignmentPojo
                 .setAlignAnnotation(annotationToJsonPojo(annotations));
       }
 
-      if (jsonExportSettings.isExportSequenceFeatures())
+      if (getViewport().getExportSettings().isExportFeatures())
       {
         jsonAlignmentPojo
                 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
       }
 
-      if (jsonExportSettings.isExportGroups() && seqGroups != null
+      if (getViewport().getExportSettings().isExportGroups()
+              && seqGroups != null
               && seqGroups.size() > 0)
       {
         for (SequenceGroup seqGrp : seqGroups)
@@ -199,8 +200,7 @@ public class JSONFile extends AlignFile
           seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
           for (SequenceI seq : seqGrp.getSequences())
           {
-            seqGrpPojo.getSeqsHash().add(
-                    seq.getName() + "_" + seq.hashCode());
+            seqGrpPojo.getSeqsHash().add(String.valueOf(seq.hashCode()));
           }
           jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
         }
@@ -217,7 +217,7 @@ public class JSONFile extends AlignFile
     return jsonOutput;
   }
 
-  public String[] exportHiddenSections()
+  public String[] getHiddenSections()
   {
     String[] hiddenSections = new String[2];
     if (getViewport() == null)
@@ -225,11 +225,9 @@ public class JSONFile extends AlignFile
       return null;
     }
 
-    System.out.println("--- Hidden Sections ---");
     // hidden column business
     if (getViewport().hasHiddenColumns())
     {
-      System.out.print("Hidden Cols : ");
       List<int[]> hiddenCols = getViewport().getColumnSelection()
               .getHiddenColumns();
       StringBuilder hiddenColsBuilder = new StringBuilder();
@@ -241,19 +239,17 @@ public class JSONFile extends AlignFile
 
       hiddenColsBuilder.deleteCharAt(0);
       hiddenSections[0] = hiddenColsBuilder.toString();
-      System.out.println(hiddenSections[0]);
     }
 
     // hidden rows/seqs business
     HiddenSequences hiddenSeqsObj = getViewport().getAlignment()
             .getHiddenSequences();
-    if (hiddenSeqsObj == null)
+    if (hiddenSeqsObj == null || hiddenSeqsObj.hiddenSequences == null)
     {
       return hiddenSections;
     }
 
     SequenceI[] hiddenSeqs = hiddenSeqsObj.hiddenSequences;
-    System.out.print("Hidden Seqs : ");
     StringBuilder hiddenSeqsBuilder = new StringBuilder();
     for (SequenceI hiddenSeq : hiddenSeqs)
     {
@@ -267,7 +263,7 @@ public class JSONFile extends AlignFile
       hiddenSeqsBuilder.deleteCharAt(0);
     }
     hiddenSections[1] = hiddenSeqsBuilder.toString();
-    System.out.println(hiddenSections[1]);
+
     return hiddenSections;
   }
 
@@ -283,6 +279,8 @@ public class JSONFile extends AlignFile
       SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
               : seq.getDatasetSequence().getSequenceFeatures();
 
+      seqFeatures = (seqFeatures == null) ? seq.getSequenceFeatures()
+              : seqFeatures;
       if (seqFeatures == null)
       {
         continue;
@@ -294,7 +292,7 @@ public class JSONFile extends AlignFile
                 && displayedFeatures.isVisible(sf.getType()))
         {
           SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
-                  seq.getName() + "_" + seq.hashCode());
+                  String.valueOf(seq.hashCode()));
           String featureColour = (fr == null) ? null : jalview.util.Format
                   .getHexString(fr
                   .findFeatureColour(Color.white, seq,
@@ -351,7 +349,7 @@ public class JSONFile extends AlignFile
   }
 
   @SuppressWarnings("unchecked")
-  public JSONFile parse(String jsonAlignmentString)
+  public JSONFile parse(Reader jsonAlignmentString)
   {
     try
     {
@@ -376,8 +374,11 @@ public class JSONFile extends AlignFile
                 "showSeqFeatures").toString());
         setColourScheme(getJalviewColorScheme(jsColourScheme));
         setShowSeqFeatures(showFeatures);
+        parseHiddenSeqRefsAsList(jvSettingsJsonObj);
+        parseHiddenCols(jvSettingsJsonObj);
       }
 
+      hiddenSequences = new ArrayList<SequenceI>();
       seqMap = new Hashtable<String, Sequence>();
       for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
               .hasNext();)
@@ -390,6 +391,10 @@ public class JSONFile extends AlignFile
         int end = Integer.valueOf(sequence.get("end").toString());
         Sequence seq = new Sequence(sequenceName, sequcenceString, start,
                 end);
+        if (hiddenSeqRefs != null && hiddenSeqRefs.contains(seqUniqueId))
+        {
+          hiddenSequences.add(seq);
+        }
         seqs.add(seq);
         seqMap.put(seqUniqueId, seq);
       }
@@ -483,6 +488,31 @@ public class JSONFile extends AlignFile
     return this;
   }
 
+  public void parseHiddenSeqRefsAsList(JSONObject jvSettingsJson)
+  {
+    hiddenSeqRefs = new ArrayList<String>();
+    String hiddenSeqs = (String) jvSettingsJson.get("hiddenSeqs");
+    if(hiddenSeqs != null && !hiddenSeqs.isEmpty()){
+      String[] seqRefs = hiddenSeqs.split(";");
+      for(String seqRef : seqRefs){
+        hiddenSeqRefs.add(seqRef);
+      }
+    }
+  }
+
+  public void parseHiddenCols(JSONObject jvSettingsJson)
+  {
+    String hiddenCols = (String) jvSettingsJson.get("hiddenCols");
+    if(hiddenCols != null && !hiddenCols.isEmpty()){
+      columnSelection = new ColumnSelection();
+      String[] rangeStrings = hiddenCols.split(";");
+      for(String rangeString : rangeStrings){
+        String[] range = rangeString.split("-");
+        columnSelection.hideColumns(Integer.valueOf(range[0]),
+                Integer.valueOf(range[1]));
+      }
+    }
+  }
 
   @SuppressWarnings("unchecked")
   private void parseFeatures(JSONArray jsonSeqFeatures)
@@ -500,9 +530,6 @@ public class JSONFile extends AlignFile
         String descripiton = (String) jsonFeature.get("description");
         String seqRef = (String) jsonFeature.get("sequenceRef");
         Float score = Float.valueOf(jsonFeature.get("score").toString());
-        // Hashtable otherDetails = (Hashtable) jsonFeature
-        // .get("otherDetails");
-        // sequenceFeature.otherDetails = otherDetails;
 
         Sequence seq = seqMap.get(seqRef);
         SequenceFeature sequenceFeature = new SequenceFeature();
@@ -543,13 +570,6 @@ public class JSONFile extends AlignFile
     return jalviewColor;
   }
 
-  public void applySettingsToAlignFrame(AlignViewControllerGuiI af)
-  {
-    af.setShowSeqFeatures(isShowSeqFeatures());
-    af.changeColour(getColourScheme());
-    af.setMenusForViewport();
-  }
-
   public String getGlobalColorScheme()
   {
     return globalColorScheme;
@@ -580,15 +600,6 @@ public class JSONFile extends AlignFile
     this.displayedFeatures = displayedFeatures;
   }
 
-  public JSONExportSettings getJsonExportSettings()
-  {
-    return jsonExportSettings;
-  }
-
-  public void setJsonExportSettings(JSONExportSettings jsonExportSettings)
-  {
-    this.jsonExportSettings = jsonExportSettings;
-  }
 
   public static String getJSONData(AlignViewportI av)
   {
@@ -634,6 +645,39 @@ public class JSONFile extends AlignFile
     return annotations;
   }
 
+  public List<int[]> getHiddenColumns()
+  {
+    return hiddenColumns;
+  }
+
+  public ColumnSelection getColumnSelection()
+  {
+    return columnSelection;
+  }
+
+  public void setColumnSelection(ColumnSelection columnSelection)
+  {
+    this.columnSelection = columnSelection;
+  }
+
+  public SequenceI[] getHiddenSequences()
+  {
+    if (hiddenSequences == null || hiddenSequences.isEmpty())
+    {
+      return new SequenceI[]
+      {};
+    }
+    synchronized (hiddenSequences)
+    {
+      return hiddenSequences.toArray(new SequenceI[hiddenSequences.size()]);
+    }
+  }
+
+  public void setHiddenSequences(ArrayList<SequenceI> hiddenSequences)
+  {
+    this.hiddenSequences = hiddenSequences;
+  }
+
   public class JSONExportSettings
   {
     private boolean exportSequence;