JAL-1784 minimise data duplication, and report out of memory errors and other kinds...
[jalview.git] / src / jalview / io / HtmlFile.java
index 3dd937d..a4e9bf4 100644 (file)
 package jalview.io;
 
 import java.io.IOException;
-import java.util.List;
+import java.io.StringReader;
 
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 
-import jalview.api.AlignViewControllerGuiI;
+import jalview.api.ComplexAlignFile;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
 
-public class HtmlFile extends AlignFile
+public class HtmlFile extends AlignFile implements ComplexAlignFile
 {
   public static final String FILE_EXT = "html";
 
@@ -41,7 +43,9 @@ public class HtmlFile extends AlignFile
 
   private boolean showSeqFeatures;
 
-  private List<int[]> hiddenColumns;
+  private ColumnSelection columnSelection;
+
+  private SequenceI[] hiddenSequences;
 
   public HtmlFile()
   {
@@ -63,38 +67,38 @@ public class HtmlFile extends AlignFile
   {
     try
     {
-      StringBuilder htmlData = new StringBuilder();
-      String currentLine;
-      while ((currentLine = nextLine()) != null)
-      {
-        htmlData.append(currentLine);
+      Element content = null;
+      Document doc = null;
+      try {
+         StringBuilder htmlData = new StringBuilder();
+          String currentLine;
+          while ((currentLine = nextLine()) != null)
+          {
+            htmlData.append(currentLine);
+          }
+
+          doc = Jsoup.parse(htmlData.toString());
+      } catch (OutOfMemoryError oom) {
+         errormessage = "Not enough memory to process HTML document";
+         throw new IOException(errormessage);
       }
-
-      Document doc = Jsoup.parse(htmlData.toString());
-      Element content = doc.getElementById("seqData");
-      String alignmentJsonString = content.val();
-
-      JSONFile jsonFile = new JSONFile().parse(alignmentJsonString);
+      content = doc.getElementById("seqData");
+      
+      JSONFile jsonFile = new JSONFile().parse(new StringReader(content.val()));
       this.seqs = jsonFile.getSeqs();
       this.seqGroups = jsonFile.getSeqGroups();
       this.annotations = jsonFile.getAnnotations();
       this.showSeqFeatures = jsonFile.isShowSeqFeatures();
       this.colourScheme = jsonFile.getColourScheme();
-      this.hiddenColumns = jsonFile.getHiddenColumns();
+      this.hiddenSequences = jsonFile.getHiddenSequences();
+      this.columnSelection = jsonFile.getColumnSelection();
     } catch (Exception e)
     {
-      e.printStackTrace();
+      errormessage = "Failed to extract data from HTML document.";
+      throw new IOException("Unexpected exception whilst extracting JSon from HTML.",e);
     }
   }
 
-  public void applySettingsToAlignmentView(AlignViewControllerGuiI avc)
-  {
-    avc.setShowSeqFeatures(isShowSeqFeatures());
-    avc.changeColour(getColourScheme());
-    avc.setMenusForViewport();
-    avc.hideColumns(hiddenColumns);
-    avc.syncHiddenSequences();
-  }
 
   @Override
   public String print()
@@ -123,4 +127,24 @@ public class HtmlFile extends AlignFile
     this.colourScheme = colourScheme;
   }
 
+  public ColumnSelection getColumnSelection()
+  {
+    return columnSelection;
+  }
+
+  public void setColumnSelection(ColumnSelection columnSelection)
+  {
+    this.columnSelection = columnSelection;
+  }
+
+  public SequenceI[] getHiddenSequences()
+  {
+    return hiddenSequences;
+  }
+
+  public void setHiddenSequences(SequenceI[] hiddenSequences)
+  {
+    this.hiddenSequences = hiddenSequences;
+  }
+
 }