Author: bodewig Date: Sun Jun 9 13:34:26 2013 New Revision: 1491216 URL: http://svn.apache.org/r1491216 Log: Add LZMA support to 7z - I don't think this adds support for compressed headers
Added: commons/proper/compress/branches/LZMA/src/test/resources/bla.7z (with props) Modified: commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java commons/proper/compress/branches/LZMA/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java Modified: commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java URL: http://svn.apache.org/viewvc/commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java?rev=1491216&r1=1491215&r2=1491216&view=diff ============================================================================== --- commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java (original) +++ commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java Sun Jun 9 13:34:26 2013 @@ -31,6 +31,7 @@ import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec; import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream; +import org.tukaani.xz.LZMAInputStream; import org.tukaani.xz.LZMA2InputStream; class Coders { @@ -47,6 +48,7 @@ class Coders { static CoderId[] coderTable = new CoderId[] { new CoderId(new byte[] { (byte)0x00 }, new CopyDecoder()), + new CoderId(new byte[] { (byte)0x03, (byte)0x01, (byte)0x01 }, new LZMADecoder()), new CoderId(new byte[] { (byte)0x21 }, new LZMA2Decoder()), // FIXME: gives corrupt output //new CoderId(new byte[] { (byte)0x04, (byte)0x01, (byte)0x08 }, new DeflateDecoder()), @@ -98,6 +100,22 @@ class Coders { } } + static class LZMADecoder extends CoderBase { + @Override + InputStream decode(final InputStream in, final Coder coder, + String password) throws IOException { + byte propsByte = coder.properties[0]; + long dictSize = coder.properties[1]; + for (int i = 1; i < 4; i++) { + dictSize |= (coder.properties[i + 1] << (8 * i)); + } + if (dictSize > LZMAInputStream.DICT_SIZE_MAX) { + throw new IOException("Dictionary larger than 4GiB maximum size"); + } + return new LZMAInputStream(in, -1, propsByte, (int) dictSize); + } + } + // static class DeflateDecoder extends CoderBase { // @Override // InputStream decode(final InputStream in, final Coder coder, final String password) Modified: commons/proper/compress/branches/LZMA/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java URL: http://svn.apache.org/viewvc/commons/proper/compress/branches/LZMA/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java?rev=1491216&r1=1491215&r2=1491216&view=diff ============================================================================== --- commons/proper/compress/branches/LZMA/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java (original) +++ commons/proper/compress/branches/LZMA/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java Sun Jun 9 13:34:26 2013 @@ -20,6 +20,9 @@ package org.apache.commons.compress.arch import org.apache.commons.compress.AbstractTestCase; public class SevenZFileTest extends AbstractTestCase { + private static String TEST2_CONTENT = "<?xml version = '1.0'?>\r\n<!DOCTYPE" + + " connections>\r\n<meinxml>\r\n\t<leer />\r\n</meinxml>\n"; + public void testAllEmptyFilesArchive() throws Exception { SevenZFile archive = new SevenZFile(getFile("7z-empty-mhc-off.7z")); try { @@ -37,6 +40,27 @@ public class SevenZFileTest extends Abst checkHelloWorld("7z-hello-mhc-off-lzma2.7z"); } + public void test7zUnarchive() throws Exception { + SevenZFile sevenZFile = new SevenZFile(getFile("bla.7z")); + try { + SevenZArchiveEntry entry = sevenZFile.getNextEntry(); + assertEquals("test1.xml", entry.getName()); + entry = sevenZFile.getNextEntry(); + assertEquals("test2.xml", entry.getName()); + byte[] contents = new byte[(int)entry.getSize()]; + int off = 0; + while ((off < contents.length)) { + int bytesRead = sevenZFile.read(contents, off, contents.length - off); + assert(bytesRead >= 0); + off += bytesRead; + } + assertEquals(TEST2_CONTENT, new String(contents, "UTF-8")); + assertNull(sevenZFile.getNextEntry()); + } finally { + sevenZFile.close(); + } + } + private void checkHelloWorld(final String filename) throws Exception { SevenZFile sevenZFile = new SevenZFile(getFile(filename)); try { Added: commons/proper/compress/branches/LZMA/src/test/resources/bla.7z URL: http://svn.apache.org/viewvc/commons/proper/compress/branches/LZMA/src/test/resources/bla.7z?rev=1491216&view=auto ============================================================================== Binary file - no diff available. Propchange: commons/proper/compress/branches/LZMA/src/test/resources/bla.7z ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream