JAL-1620 version bump and release notes
[jalview.git] / src / jalview / io / AlignFile.java
index 36dbdb6..661ebae 100755 (executable)
@@ -1,19 +1,22 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
+ * Copyright (C) 2014 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;
 
@@ -21,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;
@@ -47,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
@@ -60,11 +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();
   }
 
   /**
@@ -77,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.
@@ -96,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++)
@@ -106,6 +156,7 @@ public abstract class AlignFile extends FileParse
     }
   }
 
+
   /**
    * Return the seqs Vector
    */
@@ -189,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)
     {
@@ -219,6 +269,7 @@ public abstract class AlignFile extends FileParse
   {
     seqs = new Vector();
     annotations = new Vector();
+    parseCalled=false;
   }
 
   /**