JAL-674 change jalview.io.AlignFile to allow parsing to be deferred till after the...
authorJim Procter <j.procter@dundee.ac.uk>
Fri, 10 Oct 2014 15:17:01 +0000 (16:17 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Fri, 10 Oct 2014 15:17:01 +0000 (16:17 +0100)
src/jalview/io/AlignFile.java

index f73e250..2962cb2 100755 (executable)
@@ -64,6 +64,8 @@ public abstract class AlignFile extends FileParse
 
   boolean jvSuffix = true;
 
+  private boolean parseCalled;
+
   /**
    * Creates a new AlignFile object.
    */
@@ -85,16 +87,28 @@ public abstract class AlignFile extends FileParse
    */
   public AlignFile(String inFile, String type) throws IOException
   {
+    this(true, inFile, type);
+  }
+  
+  /**
+   * Constructor which (optionally delays) parsing of data from a file of some specified type.
+   * 
+   * @param parseImmediately
+   *          if false, need to call 'doParse()' to begin parsing data
+   * @param inFile
+   *          Filename to read from.
+   * @param type
+   *          What type of file to read from (File, URL)
+   * @throws IOException
+   */
+  public AlignFile(boolean parseImmediately, String inFile, String type) throws IOException
+  {
     super(inFile, type);
     initData();
-    parse();
-    // sets the index of each sequence in the alignment
-    for (int i = 0, c = seqs.size(); i < c; i++)
-    {
-      seqs.get(i).setIndex(i);
+    if (parseImmediately) {
+      doParse();
     }
   }
-
   /**
    * Attempt to read from the position where some other parsing process left
    * off.
@@ -104,8 +118,36 @@ public abstract class AlignFile extends FileParse
    */
   public AlignFile(FileParse source) throws IOException
   {
+    this(true,source);
+  }
+  /**
+   * Construct a new parser to read from the position where some other parsing process left
+   * 
+   * @param parseImmediately
+   *          if false, need to call 'doParse()' to begin parsing data
+   * @param source
+   */
+  public AlignFile(boolean parseImmediately, FileParse source) throws IOException
+  {
     super(source);
     initData();
+    if (parseImmediately) {
+      doParse();
+    }
+  }
+  /**
+   * called if parsing was delayed till after parser was constructed
+   * @throws IOException
+   */
+  public void doParse() throws IOException
+  {
+    if (parseCalled)
+    {
+      throw new IOException(
+              "Implementation error: Parser called twice for same data.\n"
+                      + "Need to call initData() again before parsing can be reattempted.");
+    }
+    parseCalled=true;
     parse();
     // sets the index of each sequence in the alignment
     for (int i = 0, c = seqs.size(); i < c; i++)
@@ -114,6 +156,7 @@ public abstract class AlignFile extends FileParse
     }
   }
 
+
   /**
    * Return the seqs Vector
    */
@@ -226,6 +269,7 @@ public abstract class AlignFile extends FileParse
   {
     seqs = new Vector();
     annotations = new Vector();
+    parseCalled=false;
   }
 
   /**