diff --git a/src/main/java/org/scijava/io/location/gzip/GZipHandle.java b/src/main/java/org/scijava/io/location/gzip/GZipHandle.java new file mode 100644 index 000000000..062f2c52a --- /dev/null +++ b/src/main/java/org/scijava/io/location/gzip/GZipHandle.java @@ -0,0 +1,69 @@ +/* + * #%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.location.gzip; + +import java.io.IOException; +import java.util.zip.GZIPInputStream; + +import org.scijava.io.DataHandle; +import org.scijava.io.DataHandleInputStream; +import org.scijava.io.location.AbstractCompressedHandle; +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/gzip/GZipLocation.java b/src/main/java/org/scijava/io/location/gzip/GZipLocation.java new file mode 100644 index 000000000..b89640846 --- /dev/null +++ b/src/main/java/org/scijava/io/location/gzip/GZipLocation.java @@ -0,0 +1,21 @@ + +package org.scijava.io.location.gzip; + +import org.scijava.io.DataHandle; +import org.scijava.io.Location; +import org.scijava.io.location.AbstractHigherOrderLocation; + +/** + * {@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/GZipHandleTest.java b/src/test/java/org/scijava/io/GZipHandleTest.java new file mode 100644 index 000000000..6c18d56cb --- /dev/null +++ b/src/test/java/org/scijava/io/GZipHandleTest.java @@ -0,0 +1,81 @@ +/* + * #%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; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.zip.GZIPOutputStream; + +import org.scijava.io.location.file.FileLocation; +import org.scijava.io.location.gzip.GZipHandle; +import org.scijava.io.location.gzip.GZipLocation; + +/** + * 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)); + } + + @Override + protected void checkWrites(DataHandle handle) + throws IOException + { + // NB Handle is read only + } + @Override + protected void setup() { + checkLength = false; + } +} diff --git a/src/test/java/org/scijava/io/GZipLocationTest.java b/src/test/java/org/scijava/io/GZipLocationTest.java new file mode 100644 index 000000000..a10a2cad5 --- /dev/null +++ b/src/test/java/org/scijava/io/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; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.junit.Test; +import org.scijava.io.location.file.FileLocation; +import org.scijava.io.location.gzip.GZipLocation; + +/** + * 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); + } + +}