You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2013/06/09 15:34:26 UTC

svn commit: r1491216 - in /commons/proper/compress/branches/LZMA/src: main/java/org/apache/commons/compress/archivers/sevenz/Coders.java test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java test/resources/bla.7z

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