Throw exception for unknown protocols in case of carbon-unit error
[jalview.git] / src / jalview / io / FileParse.java
index f4f765c..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
@@ -128,6 +157,7 @@ public class FileParse
     else if (type.equals(AppletFormatAdapter.URL))
     {
       try {
+      try {
         checkURLSource(fileStr);
         if (suffixSeparator=='#')
           extractSuffix(fileStr); // URL lref is stored for later reference.
@@ -146,6 +176,12 @@ public class FileParse
           }
         }
       }
+      }
+      catch (Exception e)
+      {
+        errormessage = "CANNOT ACCESS DATA AT URL '"+fileStr+"' ("+e.getMessage()+")";
+        error=true;
+      }
     }
     else if (type.equals(AppletFormatAdapter.PASTE))
     {
@@ -168,9 +204,32 @@ public class FileParse
         error = true;
       }
     }
+    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);
+    }
     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
   {
@@ -221,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;
+  }
 }