Throw exception for unknown protocols in case of carbon-unit error
[jalview.git] / src / jalview / io / FileParse.java
index 8a97e39..cd59a55 100755 (executable)
@@ -1,17 +1,17 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
- *
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
+ * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * 
  * This program 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 2
  * of the License, or (at your option) any later version.
- *
+ * 
  * This program 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 this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
@@ -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
@@ -175,7 +204,11 @@ public class FileParse
         error = true;
       }
     }
-    if (dataIn==null)
+    else {
+      errormessage = "PROBABLE IMPLEMENTATION ERROR : Datasource Type given as '"+(type!=null ? type : "null")+"'";
+      error=true;
+    }
+    if (dataIn==null || error)
     {
       // pass up the reason why we have no source to read from
       throw new IOException("Failed to read data from source:\n"+errormessage);
@@ -183,6 +216,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 +280,24 @@ public class FileParse
   public String getWarningMessage() {
     return warningMessage;
   }
+  public String getInFile()
+  {
+    if (inFile!=null)
+    {
+      return inFile.getAbsolutePath()+" ("+index+")";
+    }
+    else
+    {
+      return "From Paste + ("+index+")";
+    }
+  }
+  
+  public Reader getReader() throws IOException
+  {
+    if (dataIn!=null && dataIn.ready())
+    {
+      return dataIn;
+    }
+    return null;
+  }
 }