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;
import jalview.api.FeatureSettingsModelI;
import jalview.util.MessageManager;
import jalview.util.Platform;
-import jalview.ws.dbsources.Pfam;
-import jalview.ws.dbsources.Rfam;
/**
* implements a random access wrapper around a particular datasource, for
protected static final String TAB = "\t";
- private static final String GZ_EXT = ".gz";
-
/**
* text specifying source of data. usually filename or url.
*/
}
if (!error)
{
- if (fileStr.toLowerCase().endsWith(GZ_EXT))
+ if (fileStr.toLowerCase().endsWith(".gz"))
{
try
{
- dataIn = tryAsGzipSource(new FileInputStream(fileStr));
+ dataIn = getGzipReader(new FileInputStream(fileStr));
dataName = fileStr;
return error;
} catch (Exception x)
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(
return inData;
}
- private boolean checkURLSource(String fileStr)
+ /**
+ * 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.
+ * <p>
+ * If the response status includes
+ *
+ * <pre>
+ * Content-Type : application/x-gzip
+ * </pre>
+ *
+ * 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 (isGzipped(fileStr))
+ InputStream inputStream = conn.getInputStream();
+ if (isgzipped)
{
try
{
- InputStream inputStream = url.openStream();
- dataIn = tryAsGzipSource(inputStream);
- dataName = fileStr;
- return false;
- } catch (Exception ex)
- {
- e = ex;
- }
- }
-
- try
- {
- dataIn = new BufferedReader(new InputStreamReader(url.openStream()));
- } catch (IOException q)
- {
- if (e != null)
+ dataIn = getGzipReader(inputStream);
+ dataName = urlStr;
+ } catch (Exception e1)
{
throw new IOException(MessageManager
.getString("exception.failed_to_resolve_gzip_stream"), e);
}
- throw q;
+ return;
}
- // record URL as name of datasource.
- dataName = fileStr;
- return false;
- }
- /**
- * Answers true if the filename (or URL) has a format which Jalview recognises
- * as denoting gzipped content.
- * <p>
- * Currently this means having a ".gz" extension, or ending in "/gzipped" or
- * "?gz=1" (used to retrieve gzipped from Pfam and Rfam respectively).
- *
- * @param filename
- * @return
- */
- protected static boolean isGzipped(String filename)
- {
- if (filename == null)
- {
- return false;
- }
- String lower = filename.toLowerCase();
- return lower.endsWith(GZ_EXT) || lower.endsWith(Pfam.GZIPPED)
- || lower.endsWith(Rfam.GZIPPED);
+ dataIn = new BufferedReader(new InputStreamReader(inputStream));
+ dataName = urlStr;
+ return;
}
/**
+++ /dev/null
-package jalview.io;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-import org.testng.annotations.Test;
-
-public class FileParseTest
-{
- @Test(groups = "Functional")
- public void setIsGzipped()
- {
- assertFalse(FileParse.isGzipped(null));
- assertFalse(FileParse.isGzipped("foobar"));
- assertFalse(FileParse.isGzipped(".gz.foobar"));
-
- assertTrue(FileParse.isGzipped("abc.gz"));
- assertTrue(FileParse.isGzipped("abc.GZ"));
- assertTrue(FileParse.isGzipped(".gz"));
- assertFalse(FileParse.isGzipped("abc/gz"));
- assertFalse(FileParse.isGzipped("gz"));
-
- assertTrue(FileParse.isGzipped("http:/xy.com/abc/gzipped"));
- assertTrue(FileParse.isGzipped("abc/gzipped"));
- assertTrue(FileParse.isGzipped("abc/GZIPPED"));
- assertTrue(FileParse.isGzipped("/gzipped"));
- assertFalse(FileParse.isGzipped("gzipped"));
-
- assertTrue(FileParse.isGzipped("http:/xy.com/abc?gz=1"));
- assertTrue(FileParse.isGzipped("http:/xy.com/abc?GZ=1"));
- // currently only recognised if the last token on the URL
- assertFalse(FileParse.isGzipped("http:/xy.com/abc?gz=1&content-type=text/xml"));
- }
-}