Skip to content

Commit

Permalink
Add GZip support (adapted from SCIFIO)
Browse files Browse the repository at this point in the history
  • Loading branch information
gab1one committed Oct 24, 2017
1 parent 2d88f6c commit 31eaa29
Show file tree
Hide file tree
Showing 4 changed files with 234 additions and 0 deletions.
69 changes: 69 additions & 0 deletions src/main/java/org/scijava/io/location/gzip/GZipHandle.java
Original file line number Diff line number Diff line change
@@ -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<GZipLocation> {

@Override
public Class<GZipLocation> 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;
// }

}
21 changes: 21 additions & 0 deletions src/main/java/org/scijava/io/location/gzip/GZipLocation.java
Original file line number Diff line number Diff line change
@@ -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 <code>gzip</code>
* compressed.
*
* @author Gabriel Einsdorf
* @see GZipHandle
*/
public class GZipLocation extends AbstractHigherOrderLocation {

public GZipLocation(Location location) {
super(location);
}

}
81 changes: 81 additions & 0 deletions src/test/java/org/scijava/io/GZipHandleTest.java
Original file line number Diff line number Diff line change
@@ -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<? extends DataHandle<?>> 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 <L extends Location> void checkWrites(DataHandle<L> handle)
throws IOException
{
// NB Handle is read only
}
@Override
protected void setup() {
checkLength = false;
}
}
63 changes: 63 additions & 0 deletions src/test/java/org/scijava/io/GZipLocationTest.java
Original file line number Diff line number Diff line change
@@ -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);
}

}

0 comments on commit 31eaa29

Please sign in to comment.