Implement uncompressing of BZip2 compressed entries in ZipArchiveInputStream
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
index f9d240b..2f7894a 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
@@ -33,6 +33,7 @@
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
+import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import static org.apache.commons.compress.archivers.zip.ZipConstants.DWORD;
@@ -312,6 +313,8 @@
current.entry.getGeneralPurposeBit().getSlidingDictionarySize(),
current.entry.getGeneralPurposeBit().getNumberOfShannonFanoTrees(),
new BoundedInputStream(in, current.entry.getCompressedSize()));
+ } else if (current.entry.getMethod() == ZipMethod.BZIP2.getCode()) {
+ current.in = new BZip2CompressorInputStream(new BoundedInputStream(in, current.entry.getCompressedSize()));
}
}
@@ -413,7 +416,8 @@
} else if (current.entry.getMethod() == ZipArchiveOutputStream.DEFLATED) {
read = readDeflated(buffer, offset, length);
} else if (current.entry.getMethod() == ZipMethod.UNSHRINKING.getCode()
- || current.entry.getMethod() == ZipMethod.IMPLODING.getCode()) {
+ || current.entry.getMethod() == ZipMethod.IMPLODING.getCode()
+ || current.entry.getMethod() == ZipMethod.BZIP2.getCode()) {
read = current.in.read(buffer, offset, length);
} else {
throw new UnsupportedZipFeatureException(ZipMethod.getMethodByCode(current.entry.getMethod()),
diff --git a/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java
index 1120a37..1a9bb5d 100644
--- a/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java
@@ -26,6 +26,7 @@
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
+import java.util.Arrays;
import java.io.IOException;
import org.apache.commons.compress.utils.IOUtils;
@@ -169,4 +170,19 @@
in.close();
}
}
+
+ @Test
+ public void testUnzipBZip2CompressedEntry() throws Exception {
+ ZipArchiveInputStream in = new ZipArchiveInputStream(new FileInputStream(getFile("bzip2-zip.zip")));
+
+ try {
+ ZipArchiveEntry ze = in.getNextZipEntry();
+ assertEquals(42, ze.getSize());
+ byte[] expected = new byte[42];
+ Arrays.fill(expected , (byte)'a');
+ assertArrayEquals(expected, IOUtils.toByteArray(in));
+ } finally {
+ in.close();
+ }
+ }
}