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.
*/
public File inFile = null;
+
/**
* a viewport associated with the current file operation. May be null. May
* move to different object.
{
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)
{
{
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(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.
+ * <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 (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;
}
/**
{
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 }));
}
}
}
{
// 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);
{
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 }));
}
/**
}
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"));
}
}