JAL-629 Now showing temp fac and secondary structure for File opened structures and...
[jalview.git] / src / jalview / io / AlignFile.java
index 6d6ab5c..b2cf262 100755 (executable)
  */
 package jalview.io;
 
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.util.MessageManager;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -34,13 +27,22 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Vector;
 
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.util.MessageManager;
+import jalview.util.StringUtils;
+
 /**
  * DOCUMENT ME!
  * 
  * @author $author$
  * @version $Revision$
  */
-public abstract class AlignFile extends FileParse implements AlignmentFileI
+public abstract class AlignFile extends FileParse
+        implements AlignmentFileReaderI, AlignmentFileWriterI
 {
   int noSeqs = 0;
 
@@ -65,15 +67,30 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
   /**
    * Properties to be added to generated alignment object
    */
-  protected Hashtable properties;
+  private Hashtable properties;
 
   long start;
 
   long end;
 
-  boolean jvSuffix = true;
+  /**
+   * true if parse() has been called
+   */
+  private boolean parseCalled = false;
 
-  private boolean parseCalled;
+  private boolean parseImmediately = true;
+
+  private boolean dataClosed = false;
+
+  private boolean doXferSettings = true;
+
+  /**
+   * @return if doParse() was called at construction time
+   */
+  protected boolean isParseImmediately()
+  {
+    return parseImmediately;
+  }
 
   /**
    * Creates a new AlignFile object.
@@ -86,6 +103,12 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
     initData();
   }
 
+  public AlignFile(SequenceI[] seqs)
+  {
+    this();
+    setSeqs(seqs);
+  }
+
   /**
    * Constructor which parses the data from a file of some specified type.
    * 
@@ -94,7 +117,7 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
    * @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);
@@ -112,10 +135,10 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
    *          What type of file to read from (File, URL)
    * @throws IOException
    */
-  public AlignFile(boolean parseImmediately, String dataObject,
-          DataSourceType sourceType)
-          throws IOException
+  public AlignFile(boolean parseImmediately, Object dataObject,
+          DataSourceType sourceType) throws IOException
   {
+    // BH allows File or String
     super(dataObject, sourceType);
     initData();
     if (parseImmediately)
@@ -131,6 +154,12 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
    * @param source
    * @throws IOException
    */
+  public AlignFile(FileParse source, boolean doXferSettings)
+          throws IOException
+  {
+    this(true, source, true, doXferSettings);
+  }
+
   public AlignFile(FileParse source) throws IOException
   {
     this(true, source);
@@ -147,11 +176,29 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
   public AlignFile(boolean parseImmediately, FileParse source)
           throws IOException
   {
+    this(parseImmediately, source, true);
+  }
+
+  public AlignFile(boolean parseImmediately, FileParse source,
+          boolean closeData) throws IOException
+  {
+    this(parseImmediately, source, closeData, true);
+  }
+
+  public AlignFile(boolean parseImmediately, FileParse source,
+          boolean closeData, boolean doXferSettings) 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;
+    this.doXferSettings = doXferSettings;
+
     if (parseImmediately)
     {
-      doParse();
+      doParse(closeData);
     }
   }
 
@@ -162,6 +209,11 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
    */
   public void doParse() throws IOException
   {
+    doParse(true);
+  }
+
+  public void doParse(boolean closeData) throws IOException
+  {
     if (parseCalled)
     {
       throw new IOException(
@@ -169,11 +221,11 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
                       + "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++)
+    parse(this.doXferSettings);
+    if (closeData && !dataClosed)
     {
-      seqs.get(i).setIndex(i);
+      dataIn.close();
+      dataClosed = true;
     }
   }
 
@@ -277,9 +329,8 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
   {
     if (key == null)
     {
-      throw new Error(
-              MessageManager
-                      .getString("error.implementation_error_cannot_have_null_alignment"));
+      throw new Error(MessageManager.getString(
+              "error.implementation_error_cannot_have_null_alignment"));
     }
     if (value == null)
     {
@@ -335,15 +386,15 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
   public abstract void parse() throws IOException;
 
   /**
-   * Print out in alignment file format the Sequences in the seqs Vector.
+   * This method is only overridden by JmolParser because of its use in
+   * StructureFile to parse annotations
+   * 
+   * @param doXferSettings
+   * @throws IOException
    */
-  @Override
-  public abstract String print();
-
-  @Override
-  public void addJVSuffix(boolean b)
+  public void parse(boolean doXferSettings) throws IOException
   {
-    jvSuffix = b;
+    parse();
   }
 
   /**
@@ -355,7 +406,7 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
   {
     Sequence seq = null;
     id = id.trim();
-    int space = id.indexOf(" ");
+    int space = StringUtils.indexOfFirstWhitespace(id);
     if (space > -1)
     {
       seq = new Sequence(id.substring(0, space), "");
@@ -378,14 +429,21 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
   }
 
   /**
-   * Creates the output id. Adds prefix Uniprot format source|id And suffix
-   * Jalview /start-end
+   * Creates the output id. Adds prefix Uniprot format source|id and optionally
+   * suffix Jalview /start-end
+   * 
+   * @param jvsuffix
    * 
    * @String id Id to be parsed
    */
+  String printId(SequenceI seq, boolean jvsuffix)
+  {
+    return seq.getDisplayId(jvsuffix);
+  }
+
   String printId(SequenceI seq)
   {
-    return seq.getDisplayId(jvSuffix);
+    return printId(seq, true);
   }
 
   /**
@@ -417,4 +475,18 @@ public abstract class AlignFile extends FileParse implements AlignmentFileI
     }
   }
 
+  protected void addSequence(SequenceI seq)
+  {
+    seqs.add(seq);
+  }
+
+  public void setDoXferSettings(boolean b)
+  {
+    doXferSettings = b;
+  }
+
+  public boolean getDoXferSettings()
+  {
+    return doXferSettings;
+  }
 }