import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureSettingsModelI;
+import jalview.bin.Cache;
import jalview.util.MessageManager;
import java.io.BufferedInputStream;
}
return error;
}
-
+
/**
- * Recognise the 2-byte magic header for gzip streams
+ * Recognise the 2-byte magic header indicating a gzipped stream
*
+ * see
* https://recalll.co/ask/v/topic/java-How-to-check-if-InputStream-is-Gzipped/555aadd62bd27354438b90f6
*
- * @param bytes - at least two bytes
- * @return
+ * @param input
+ * - input stream that supports mark and contains at least two bytes
+ *
+ * @return false if mark not supported or no magic header found
+ *
+ * @throws IOException
*/
- private static boolean isGzipStream(byte[] bytes) {
- int head = ((int) bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
- return (GZIPInputStream.GZIP_MAGIC == head);
+ public static boolean isGzipStream(InputStream input) throws IOException
+ {
+ if (!input.markSupported())
+ {
+ Cache.log.error(
+ "FileParse.izGzipStream: input stream must support mark/reset");
+ return false;
+ }
+ input.mark(4);
+
+ // get first 2 bytes or return false
+ byte[] bytes = new byte[2];
+ int read = input.read(bytes);
+ input.reset();
+ if (read != bytes.length)
+ {
+ return false;
+ }
+
+ int header = (bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
+ return (GZIPInputStream.GZIP_MAGIC == header);
}
/**
// NB: stackoverflow https://stackoverflow.com/questions/4818468/how-to-check-if-inputstream-is-gzipped
// could use a PushBackInputStream rather than a BufferedInputStream
-
- BufferedInputStream bufinput;
+
if (!input.markSupported()) {
- bufinput= new BufferedInputStream(input,16);
- input = bufinput;
+ input = new BufferedInputStream(input,16);
}
- input.mark(4);
- byte[] bytes=input.readNBytes(2);
- input.reset();
- if (bytes.length==2 && isGzipStream(bytes)) {
+ if (isGzipStream(input)) {
return getGzipReader(input);
}
// return a buffered reader for the stream.
*/
package jalview.io;
-import jalview.gui.JvOptionPane;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import java.io.BufferedInputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
import org.testng.AssertJUnit;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import jalview.bin.Cache;
+import jalview.gui.JvOptionPane;
+
/**
* @author jimp
*
@BeforeClass(alwaysRun = true)
public static void setUpBeforeClass() throws Exception
{
+ Cache.initLogger();
}
/**
public void testStarsInFasta1() throws IOException
{
String uri;
- FileParse fp = new FileParse(uri = STARS_FA_FILE1.getAbsoluteFile()
- .toString(), DataSourceType.FILE);
+ FileParse fp = new FileParse(
+ uri = STARS_FA_FILE1.getAbsoluteFile().toString(),
+ DataSourceType.FILE);
assertValidFormat(FileFormat.Fasta, uri, fp);
}
public void testStarsInFasta2() throws IOException
{
String uri;
- FileParse fp = new FileParse(uri = STARS_FA_FILE2.getAbsoluteFile()
- .toString(), DataSourceType.FILE);
+ FileParse fp = new FileParse(
+ uri = STARS_FA_FILE2.getAbsoluteFile().toString(),
+ DataSourceType.FILE);
assertValidFormat(FileFormat.Fasta, uri, fp);
}
public void testGzipIo() throws IOException
{
String uri;
- FileParse fp = new FileParse(uri = ALIGN_FILE.getAbsoluteFile().toURI()
- .toString(), DataSourceType.URL);
+ FileParse fp = new FileParse(
+ uri = ALIGN_FILE.getAbsoluteFile().toURI().toString(),
+ DataSourceType.URL);
assertValidFormat(FileFormat.Fasta, uri, fp);
}
public void testGziplocalFileIO() throws IOException
{
String filepath;
- FileParse fp = new FileParse(filepath = ALIGN_FILE.getAbsoluteFile()
- .toString(), DataSourceType.FILE);
+ FileParse fp = new FileParse(
+ filepath = ALIGN_FILE.getAbsoluteFile().toString(),
+ DataSourceType.FILE);
assertValidFormat(FileFormat.Fasta, filepath, fp);
}
@Test(groups = { "Functional" })
+ public void testIsGzipInputStream() throws IOException
+ {
+ InputStream is = new FileInputStream(ALIGN_FILE);
+
+ /*
+ * first try fails - FileInputStream does not support mark/reset
+ */
+ assertFalse(FileParse.isGzipStream(is));
+
+ /*
+ * wrap in a BufferedInputStream and try again
+ */
+ is = new BufferedInputStream(is, 16);
+ assertTrue(FileParse.isGzipStream(is));
+ }
+
+ @Test(groups = { "Functional" })
public void testNonGzipURLIO() throws IOException
{
String uri;
- FileParse fp = new FileParse(uri = NOTGZALIGN_FILE.getAbsoluteFile()
- .toURI().toString(), DataSourceType.URL);
+ FileParse fp = new FileParse(
+ uri = NOTGZALIGN_FILE.getAbsoluteFile().toURI().toString(),
+ DataSourceType.URL);
assertValidFormat(FileFormat.Fasta, uri, fp);
}
public void testNonGziplocalFileIO() throws IOException
{
String filepath;
- FileParse fp = new FileParse(filepath = NOTGZALIGN_FILE
- .getAbsoluteFile().toString(), DataSourceType.FILE);
+ FileParse fp = new FileParse(
+ filepath = NOTGZALIGN_FILE.getAbsoluteFile().toString(),
+ DataSourceType.FILE);
assertValidFormat(FileFormat.Fasta, filepath, fp);
}
}