diff --git a/src/main/java/org/scijava/io/handle/GZipHandle.java b/src/main/java/org/scijava/io/handle/GZipHandle.java new file mode 100644 index 000000000..9dac5868c --- /dev/null +++ b/src/main/java/org/scijava/io/handle/GZipHandle.java @@ -0,0 +1,68 @@ +/* + * #%L + * SCIFIO library for reading and converting scientific file formats. + * %% + * Copyright (C) 2011 - 2016 Board of Regents of the University of + * Wisconsin-Madison + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ + +package org.scijava.io.handle; + +import java.io.IOException; +import java.util.zip.GZIPInputStream; + +import org.scijava.io.location.AbstractCompressedHandle; +import org.scijava.io.location.GZipLocation; +import org.scijava.plugin.Plugin; + +/** + * StreamHandle implementation for reading from gzip-compressed files or byte + * arrays. Instances of GZipHandle are read-only. + * + * @author Melissa Linkert + * @author Gabriel Einsdorf + */ +@Plugin(type = DataHandle.class) +public class GZipHandle extends AbstractCompressedHandle { + + @Override + public Class getType() { + return GZipLocation.class; + } + + @Override + protected void initInputStream() throws IOException { + inputStream = new GZIPInputStream(new DataHandleInputStream<>(raw())); + } + +// @Override +// public boolean isConstructable(final String file) throws IOException { +// final byte[] b = new byte[2]; +// s.read(b); +// s.close(); +// return Bytes.toInt(b, true) == GZIPInputStream.GZIP_MAGIC; +// } + +} diff --git a/src/main/java/org/scijava/io/location/GZipLocation.java b/src/main/java/org/scijava/io/location/GZipLocation.java new file mode 100644 index 000000000..41a465480 --- /dev/null +++ b/src/main/java/org/scijava/io/location/GZipLocation.java @@ -0,0 +1,20 @@ + +package org.scijava.io.location; + +import org.scijava.io.handle.DataHandle; +import org.scijava.io.handle.GZipHandle; + +/** + * {@link Location} backed by a {@link DataHandle} that is gzip + * compressed. + * + * @author Gabriel Einsdorf + * @see GZipHandle + */ +public class GZipLocation extends AbstractHigherOrderLocation { + + public GZipLocation(Location location) { + super(location); + } + +} diff --git a/src/test/java/org/scijava/io/handle/GZipHandleTest.java b/src/test/java/org/scijava/io/handle/GZipHandleTest.java new file mode 100644 index 000000000..9575960ad --- /dev/null +++ b/src/test/java/org/scijava/io/handle/GZipHandleTest.java @@ -0,0 +1,87 @@ +/* + * #%L + * SciJava Common shared library for SciJava software. + * %% + * Copyright (C) 2009 - 2017 Board of Regents of the University of + * Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck + * Institute of Molecular Cell Biology and Genetics. + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ + +package org.scijava.io.handle; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.zip.GZIPOutputStream; + +import org.junit.Ignore; +import org.junit.Test; +import org.scijava.io.location.FileLocation; +import org.scijava.io.location.GZipLocation; +import org.scijava.io.location.Location; + +/** + * Tests {@link GZipHandle}. + * + * @author Gabriel Einsdorf + */ +public class GZipHandleTest extends DataHandleTest { + + @Override + public Class> getExpectedHandleType() { + return GZipHandle.class; + } + + @Override + public Location createLocation() throws IOException { + // create and populate a temp file + final File tmpFile = File.createTempFile("FileHandleTest", + "test-file.gzip"); + tmpFile.deleteOnExit(); + + try (GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream( + tmpFile))) + { + populateData(out); + } + + return new GZipLocation(new FileLocation(tmpFile)); + } + + @Test + @Override + public void testWriting() throws IOException { + // no Op + } + + @Override + @Test + public void testReading() throws IOException { + try (final DataHandle handle = createHandle()) { + checkBasicReadMethods(handle, false); + checkEndiannessReading(handle); + } + } +} diff --git a/src/test/java/org/scijava/io/location/GZipLocationTest.java b/src/test/java/org/scijava/io/location/GZipLocationTest.java new file mode 100644 index 000000000..fe8862131 --- /dev/null +++ b/src/test/java/org/scijava/io/location/GZipLocationTest.java @@ -0,0 +1,63 @@ +/* + * #%L + * SciJava Common shared library for SciJava software. + * %% + * Copyright (C) 2009 - 2017 Board of Regents of the University of + * Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck + * Institute of Molecular Cell Biology and Genetics. + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ + +package org.scijava.io.location; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.junit.Test; +import org.scijava.io.location.FileLocation; +import org.scijava.io.location.Location; + +/** + * Tests {@link GZipLocation}. + * + * @author Gabriel Einsdorf + */ +public class GZipLocationTest { + + /** + * Tests {@link GZipLocation#GZipLocation(Location)}. + * + * @throws IOException + */ + @Test + public void testFile() throws IOException { + final String path = "/not/actually/a/real-file"; + final FileLocation loc = new FileLocation(path); + GZipLocation zLoc = new GZipLocation(loc); + + assertEquals(zLoc.getBaseLocation(), loc); + } + +}