FileParse object can be re-used to read different files concatenated together
[jalview.git] / src / jalview / io / FileParse.java
index 8a97e39..4c69ce0 100755 (executable)
@@ -27,6 +27,7 @@ import java.net.*;
 public class FileParse
 {
   public File inFile=null;
+  public int index = 1; // sequence counter for FileParse object created from same data source
   protected char suffixSeparator = '#';
   /**
    * '#' separated string tagged on to end of filename 
@@ -46,6 +47,34 @@ public class FileParse
   {
   }
   /**
+   * Create a new FileParse instance reading from the same datasource starting at the current position.
+   * WARNING! Subsequent reads from either object will affect the read position of the other, but not
+   * the error state.
+   * 
+   * @param from
+   */
+  public FileParse(FileParse from) throws IOException
+  {
+    if (from==null)
+    {
+      throw new Error("Implementation error. Null FileParse in copy constructor");
+    }
+    if (from==this)
+      return;
+    index = ++from.index;
+    inFile = from.inFile;
+    suffixSeparator = from.suffixSeparator;
+    suffix = from.suffix;
+    errormessage = from.errormessage; // inherit potential error messages
+    error = false; // reset any error condition.
+    type = from.type;
+    dataIn = from.dataIn;
+    if (dataIn!=null)
+    {
+      mark();
+    }
+  }
+  /**
    * Attempt to open a file as a datasource.
    * Sets error and errormessage if fileStr was invalid.
    * @param fileStr
@@ -183,6 +212,20 @@ public class FileParse
     error=false;
     dataIn.mark(READAHEAD_LIMIT);
   }
+  /**
+   * mark the current position in the source as start
+   * for the purposes of it being analysed by IdentifyFile().identify
+   * @throws IOException
+   */
+  public void mark() throws IOException
+  {
+    if (dataIn!=null)
+    {
+      dataIn.mark(READAHEAD_LIMIT);
+    } else {
+      throw new IOException("Unitialised Source Stream");
+    }
+  }
   public String nextLine()
       throws IOException
   {
@@ -233,4 +276,15 @@ public class FileParse
   public String getWarningMessage() {
     return warningMessage;
   }
+  public String getInFile()
+  {
+    if (inFile!=null)
+    {
+      return inFile.getAbsolutePath()+" ("+index+")";
+    }
+    else
+    {
+      return "From Paste + ("+index+")";
+    }
+  }
 }