JAL-1683 replace year/version strings with tokens in source
[jalview.git] / src / jalview / io / AlignFile.java
index d24913e..e902ccf 100755 (executable)
@@ -1,19 +1,21 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
  *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
- * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.io;
@@ -22,6 +24,7 @@ import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
+import jalview.util.MessageManager;
 
 import java.io.IOException;
 import java.util.Enumeration;
@@ -48,7 +51,7 @@ public abstract class AlignFile extends FileParse
   /**
    * annotation to be added to generated alignment object
    */
-  protected Vector annotations;
+  protected Vector<AlignmentAnnotation> annotations;
 
   /**
    * Properties to be added to generated alignment object
@@ -61,13 +64,17 @@ public abstract class AlignFile extends FileParse
 
   boolean jvSuffix = true;
 
+  private boolean parseCalled;
+
   /**
    * Creates a new AlignFile object.
    */
   public AlignFile()
   {
-         // Shouldn't we init data structures (JBPNote: not sure - initData is for initialising the structures used for reading from a datasource, and the bare constructor hasn't got any datasource)
-         initData();
+    // Shouldn't we init data structures (JBPNote: not sure - initData is for
+    // initialising the structures used for reading from a datasource, and the
+    // bare constructor hasn't got any datasource)
+    initData();
   }
 
   /**
@@ -80,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.
@@ -99,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++)
@@ -109,6 +156,7 @@ public abstract class AlignFile extends FileParse
     }
   }
 
+
   /**
    * Return the seqs Vector
    */
@@ -192,8 +240,7 @@ public abstract class AlignFile extends FileParse
   {
     if (key == null)
     {
-      throw new Error(
-              "Implementation error: Cannot have null alignment property key.");
+      throw new Error(MessageManager.getString("error.implementation_error_cannot_have_null_alignment"));
     }
     if (value == null)
     {
@@ -222,6 +269,7 @@ public abstract class AlignFile extends FileParse
   {
     seqs = new Vector();
     annotations = new Vector();
+    parseCalled=false;
   }
 
   /**