JAL-722 updated from 2.11.2 develop branch - needs further work before release
[jalview.git] / src / jalview / io / AlignFile.java
index a603cca..48f65cf 100755 (executable)
  */
 package jalview.io;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Vector;
+
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Sequence;
@@ -27,13 +35,6 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.util.MessageManager;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Vector;
-
 /**
  * DOCUMENT ME!
  * 
@@ -66,13 +67,28 @@ public abstract class AlignFile extends FileParse
   /**
    * Properties to be added to generated alignment object
    */
-  private Hashtable properties;
+  private Map<String, String> properties;
 
   long start;
 
   long end;
 
-  private boolean parseCalled;
+  /**
+   * true if parse() has been called
+   */
+  private boolean parseCalled = false;
+
+  private boolean parseImmediately = true;
+
+  private boolean dataClosed = false;
+
+  /**
+   * @return if doParse() was called at construction time
+   */
+  protected boolean isParseImmediately()
+  {
+    return parseImmediately;
+  }
 
   /**
    * Creates a new AlignFile object.
@@ -99,7 +115,7 @@ public abstract class AlignFile extends FileParse
    * @param sourceType
    *          What type of file to read from (File, URL, Pasted String)
    */
-  public AlignFile(String dataObject, DataSourceType sourceType)
+  public AlignFile(Object dataObject, DataSourceType sourceType)
           throws IOException
   {
     this(true, dataObject, sourceType);
@@ -117,9 +133,10 @@ public abstract class AlignFile extends FileParse
    *          What type of file to read from (File, URL)
    * @throws IOException
    */
-  public AlignFile(boolean parseImmediately, String dataObject,
+  public AlignFile(boolean parseImmediately, Object dataObject,
           DataSourceType sourceType) throws IOException
   {
+    // BH allows File or String
     super(dataObject, sourceType);
     initData();
     if (parseImmediately)
@@ -151,11 +168,22 @@ public abstract class AlignFile extends FileParse
   public AlignFile(boolean parseImmediately, FileParse source)
           throws IOException
   {
+    this(parseImmediately, source, true);
+  }
+
+  public AlignFile(boolean parseImmediately, FileParse source,
+          boolean closeData) throws IOException
+  {
     super(source);
     initData();
+
+    // stash flag in case parse needs to know if it has to autoconfigure or was
+    // configured after construction
+    this.parseImmediately = parseImmediately;
+
     if (parseImmediately)
     {
-      doParse();
+      doParse(closeData);
     }
   }
 
@@ -166,6 +194,11 @@ public abstract class AlignFile extends FileParse
    */
   public void doParse() throws IOException
   {
+    doParse(true);
+  }
+
+  public void doParse(boolean closeData) throws IOException
+  {
     if (parseCalled)
     {
       throw new IOException(
@@ -174,10 +207,10 @@ public abstract class AlignFile extends FileParse
     }
     parseCalled = true;
     parse();
-    // sets the index of each sequence in the alignment
-    for (int i = 0, c = seqs.size(); i < c; i++)
+    if (closeData && !dataClosed)
     {
-      seqs.get(i).setIndex(i);
+      dataIn.close();
+      dataClosed = true;
     }
   }
 
@@ -256,13 +289,11 @@ public abstract class AlignFile extends FileParse
    */
   public void addProperties(AlignmentI al)
   {
-    if (properties != null && properties.size() > 0)
+    if (properties != null)
     {
-      Enumeration keys = properties.keys();
-      Enumeration vals = properties.elements();
-      while (keys.hasMoreElements())
+      for (Entry<String, String> prop : properties.entrySet())
       {
-        al.setProperty(keys.nextElement(), vals.nextElement());
+        al.setProperty(prop.getKey(), prop.getValue());
       }
     }
   }
@@ -277,12 +308,12 @@ public abstract class AlignFile extends FileParse
    * @param value
    *          - non-null value
    */
-  protected void setAlignmentProperty(Object key, Object value)
+  protected void setAlignmentProperty(String key, String value)
   {
     if (key == null)
     {
-      throw new Error(MessageManager.getString(
-              "error.implementation_error_cannot_have_null_alignment"));
+      throw new Error(
+              "Implementation error: Cannot have null alignment property key.");
     }
     if (value == null)
     {
@@ -290,12 +321,12 @@ public abstract class AlignFile extends FileParse
     }
     if (properties == null)
     {
-      properties = new Hashtable();
+      properties = new Hashtable<>();
     }
     properties.put(key, value);
   }
 
-  protected Object getAlignmentProperty(Object key)
+  protected String getAlignmentProperty(String key)
   {
     if (properties != null && key != null)
     {
@@ -309,9 +340,9 @@ public abstract class AlignFile extends FileParse
    */
   protected void initData()
   {
-    seqs = new Vector<SequenceI>();
-    annotations = new Vector<AlignmentAnnotation>();
-    seqGroups = new ArrayList<SequenceGroup>();
+    seqs = new Vector<>();
+    annotations = new Vector<>();
+    seqGroups = new ArrayList<>();
     parseCalled = false;
   }
 
@@ -324,7 +355,7 @@ public abstract class AlignFile extends FileParse
   @Override
   public void setSeqs(SequenceI[] s)
   {
-    seqs = new Vector<SequenceI>();
+    seqs = new Vector<>();
 
     for (int i = 0; i < s.length; i++)
     {
@@ -395,7 +426,7 @@ public abstract class AlignFile extends FileParse
   {
     if (newickStrings == null)
     {
-      newickStrings = new Vector<String[]>();
+      newickStrings = new Vector<>();
     }
     newickStrings.addElement(new String[] { treeName, newickString });
   }