X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FFileParse.java;h=167314eee2dae90118035a57b15feb649e5729e0;hb=9e338a58713e1f3a451aa34c5e6c488bdd6d8cab;hp=dc0418fb04d6cae7571d730d65864baeca4ded64;hpb=ee198b3ca3687f18a2ee186f4e7c7330f4ea30f0;p=jalview.git diff --git a/src/jalview/io/FileParse.java b/src/jalview/io/FileParse.java index dc0418f..167314e 100755 --- a/src/jalview/io/FileParse.java +++ b/src/jalview/io/FileParse.java @@ -35,16 +35,22 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.zip.GZIPInputStream; + /** * implements a random access wrapper around a particular datasource, for * passing to identifyFile and AlignFile objects. */ public class FileParse { + protected static final String SPACE = " "; + + protected static final String TAB = "\t"; + /** * text specifying source of data. usually filename or url. */ @@ -52,6 +58,7 @@ public class FileParse public File inFile = null; + /** * a viewport associated with the current file operation. May be null. May * move to different object. @@ -125,9 +132,8 @@ public class FileParse { if (from == null) { - throw new Error( - MessageManager - .getString("error.implementation_error_null_fileparse")); + throw new Error(MessageManager + .getString("error.implementation_error_null_fileparse")); } if (from == this) { @@ -183,7 +189,7 @@ public class FileParse { try { - dataIn = tryAsGzipSource(new FileInputStream(fileStr)); + dataIn = getGzipReader(new FileInputStream(fileStr)); dataName = fileStr; return error; } catch (Exception x) @@ -201,57 +207,78 @@ public class FileParse return error; } - private BufferedReader tryAsGzipSource(InputStream inputStream) + /** + * Returns a {@code BufferedReader} which wraps the input stream with a + * GZIPInputStream. Throws a {@code ZipException} if a GZIP format error + * occurs or the compression method used is unsupported. + * + * @param inputStream + * @return + * @throws Exception + */ + private BufferedReader getGzipReader(InputStream inputStream) throws Exception { - BufferedReader inData = new BufferedReader(new InputStreamReader( - new GZIPInputStream(inputStream))); + BufferedReader inData = new BufferedReader( + new InputStreamReader(new GZIPInputStream(inputStream))); inData.mark(2048); inData.read(); inData.reset(); return inData; } - private boolean checkURLSource(String fileStr) throws IOException, - MalformedURLException + /** + * Tries to read from the given URL. If successful, saves a reader to the + * response in field {@code dataIn}, otherwise (on exception, or HTTP response + * status not 200), throws an exception. + *

+ * If the response status includes + * + *

+   * Content-Type : application/x-gzip
+   * 
+ * + * then tries to read as gzipped content. + * + * @param urlStr + * @throws IOException + * @throws MalformedURLException + */ + private void checkURLSource(String urlStr) + throws IOException, MalformedURLException { errormessage = "URL NOT FOUND"; - URL url = new URL(fileStr); - // - // GZIPInputStream code borrowed from Aquaria (soon to be open sourced) via - // Kenny Sabir + URL url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + int rc = conn.getResponseCode(); + if (rc != HttpURLConnection.HTTP_OK) + { + throw new IOException( + "Response status from " + urlStr + " was " + rc); + } + String encoding = conn.getContentEncoding(); + String contentType = conn.getContentType(); + boolean isgzipped = "application/x-gzip".equalsIgnoreCase(contentType) + || "gzip".equals(encoding); Exception e = null; - if (fileStr.toLowerCase().endsWith(".gz")) + InputStream inputStream = conn.getInputStream(); + if (isgzipped) { try { - InputStream inputStream = url.openStream(); - dataIn = tryAsGzipSource(inputStream); - dataName = fileStr; - return false; - } catch (Exception ex) + dataIn = getGzipReader(inputStream); + dataName = urlStr; + } catch (Exception e1) { - e = ex; + throw new IOException(MessageManager + .getString("exception.failed_to_resolve_gzip_stream"), e); } + return; } - try - { - dataIn = new BufferedReader(new InputStreamReader(url.openStream())); - } catch (IOException q) - { - if (e != null) - { - throw new IOException( - MessageManager - .getString("exception.failed_to_resolve_gzip_stream"), - e); - } - throw q; - } - // record URL as name of datasource. - dataName = fileStr; - return false; + dataIn = new BufferedReader(new InputStreamReader(inputStream)); + dataName = urlStr; + return; } /** @@ -326,15 +353,15 @@ public class FileParse { throw new IOException(MessageManager.formatMessage( "exception.problem_opening_file_also_tried", - new String[] { inFile.getName(), suffixLess, - errormessage })); + new String[] + { inFile.getName(), suffixLess, errormessage })); } } else { throw new IOException(MessageManager.formatMessage( - "exception.problem_opening_file", - new String[] { inFile.getName(), errormessage })); + "exception.problem_opening_file", new String[] + { inFile.getName(), errormessage })); } } } @@ -414,8 +441,8 @@ public class FileParse { // pass up the reason why we have no source to read from throw new IOException(MessageManager.formatMessage( - "exception.failed_to_read_data_from_source", - new String[] { errormessage })); + "exception.failed_to_read_data_from_source", new String[] + { errormessage })); } error = false; dataIn.mark(READAHEAD_LIMIT); @@ -446,9 +473,9 @@ public class FileParse { return dataIn.readLine(); } - throw new IOException(MessageManager.formatMessage( - "exception.invalid_source_stream", - new String[] { errormessage })); + throw new IOException(MessageManager + .formatMessage("exception.invalid_source_stream", new String[] + { errormessage })); } /** @@ -501,9 +528,8 @@ public class FileParse } else { - throw new IOException( - MessageManager - .getString("error.implementation_error_reset_called_for_invalid_source")); + throw new IOException(MessageManager.getString( + "error.implementation_error_reset_called_for_invalid_source")); } }