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/09/22 15:09:29 UTC

svn commit: r1525353 - in /commons/proper/compress/trunk: ./ src/changes/ src/main/java/org/apache/commons/compress/archivers/sevenz/ src/main/java/org/apache/commons/compress/archivers/tar/ src/main/java/org/apache/commons/compress/archivers/zip/ src/...

Author: bodewig
Date: Sun Sep 22 13:09:29 2013
New Revision: 1525353

URL: http://svn.apache.org/r1525353
Log:
XZ for Java 1.4 has been released, merge the LZMA branch.

Added:
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/lzma/
      - copied from r1525352, commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/compressors/lzma/
    commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/LZMATestCase.java
      - copied unchanged from r1525352, commons/proper/compress/branches/LZMA/src/test/java/org/apache/commons/compress/compressors/LZMATestCase.java
    commons/proper/compress/trunk/src/test/resources/bla.7z
      - copied unchanged from r1525352, commons/proper/compress/branches/LZMA/src/test/resources/bla.7z
    commons/proper/compress/trunk/src/test/resources/bla.tar.lzma
      - copied unchanged from r1525352, commons/proper/compress/branches/LZMA/src/test/resources/bla.tar.lzma
Modified:
    commons/proper/compress/trunk/   (props changed)
    commons/proper/compress/trunk/pom.xml
    commons/proper/compress/trunk/src/changes/changes.xml
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/   (props changed)
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/   (props changed)
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
    commons/proper/compress/trunk/src/site/xdoc/examples.xml
    commons/proper/compress/trunk/src/site/xdoc/index.xml
    commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java

Propchange: commons/proper/compress/trunk/
------------------------------------------------------------------------------
  Merged /commons/proper/compress/branches/LZMA:r1491183-1525352

Modified: commons/proper/compress/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/pom.xml?rev=1525353&r1=1525352&r2=1525353&view=diff
==============================================================================
--- commons/proper/compress/trunk/pom.xml (original)
+++ commons/proper/compress/trunk/pom.xml Sun Sep 22 13:09:29 2013
@@ -60,7 +60,7 @@ These include: bzip2, gzip, pack200, xz 
     <dependency>
       <groupId>org.tukaani</groupId>
       <artifactId>xz</artifactId>
-      <version>1.3</version>
+      <version>1.4</version>
     </dependency>
   </dependencies>
 

Modified: commons/proper/compress/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1525353&r1=1525352&r2=1525353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/changes/changes.xml (original)
+++ commons/proper/compress/trunk/src/changes/changes.xml Sun Sep 22 13:09:29 2013
@@ -51,8 +51,7 @@ The <action> type attribute can be add,u
       </action>
       <action type="add" date="2013-05-07" issue="COMPRESS-54"
               due-to="Damjan Jovanovic">
-        Added read-only support for 7z archives that don't use
-        LZMA compression.
+        Added support for 7z archives.
       </action>
       <action type="add" date="2013-05-19" issue="COMPRESS-226"
               due-to="Damjan Jovanovic">

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java?rev=1525353&r1=1525352&r2=1525353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java Sun Sep 22 13:09:29 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)

Propchange: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/
------------------------------------------------------------------------------
  Merged /commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/archivers/tar:r1491183-1525352

Propchange: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/
------------------------------------------------------------------------------
  Merged /commons/proper/compress/branches/LZMA/src/main/java/org/apache/commons/compress/archivers/zip:r1491183-1525352

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java?rev=1525353&r1=1525352&r2=1525353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java Sun Sep 22 13:09:29 2013
@@ -26,6 +26,7 @@ import org.apache.commons.compress.compr
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
 import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
+import org.apache.commons.compress.compressors.lzma.LZMACompressorInputStream;
 import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
 import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream;
 import org.apache.commons.compress.compressors.xz.XZUtils;
@@ -83,6 +84,12 @@ public class CompressorStreamFactory {
      */
     public static final String XZ = "xz";
 
+    /**
+     * Constant used to identify the LZMA compression method.
+     * @since 1.6
+     */
+    public static final String LZMA = "lzma";
+
     private boolean decompressConcatenated = false;
 
     /**
@@ -156,7 +163,7 @@ public class CompressorStreamFactory {
     /**
      * Create a compressor input stream from a compressor name and an input stream.
      * 
-     * @param name of the compressor, i.e. "gz", "bzip2", "xz", or "pack200"
+     * @param name of the compressor, i.e. "gz", "bzip2", "xz", "lzma", or "pack200"
      * @param in the input stream
      * @return compressor input stream
      * @throws CompressorException if the compressor name is not known
@@ -183,6 +190,10 @@ public class CompressorStreamFactory {
                 return new XZCompressorInputStream(in);
             }
 
+            if (LZMA.equalsIgnoreCase(name)) {
+                return new LZMACompressorInputStream(in);
+            }
+
             if (PACK200.equalsIgnoreCase(name)) {
                 return new Pack200CompressorInputStream(in);
             }

Modified: commons/proper/compress/trunk/src/site/xdoc/examples.xml
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/site/xdoc/examples.xml?rev=1525353&r1=1525352&r2=1525353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/site/xdoc/examples.xml (original)
+++ commons/proper/compress/trunk/src/site/xdoc/examples.xml Sun Sep 22 13:09:29 2013
@@ -31,11 +31,13 @@
         collect multiple entries inside a single (potentially
         compressed) archive are archiver formats.</p>
 
-        <p>The compressor formats supported are gzip, bzip2, xz and
+        <p>The compressor formats supported are gzip, bzip2, xz, lzma and
         Pack200, the archiver formats are ar, cpio, tar and zip as
         well as dump, 7z and arj for which we currently only support
         reading.  Pack200 is a special case as it can only compress
         JAR files.</p>
+
+        <p>We currently only provide read support for lzma as well.</p>
       </subsection>
 
       <subsection name="Common Notes">
@@ -76,6 +78,10 @@ CompressorInputStream input = new Compre
     .createCompressorInputStream(originalInput);
 ]]></source>
 
+        <p>Note that there is no way to detect the lzma format so only
+        the two-arg version of
+        <code>createCompressorInputStream</code> can be used.</p>
+
       </subsection>
 
       <subsection name="Unsupported Features">
@@ -425,6 +431,30 @@ xzIn.close();
 ]]></source>
       </subsection>
 
+      <subsection name="lzma">
+
+        <p>The implementation of this package is provided by the
+          public domain <a href="http://tukaani.org/xz/java.html">XZ
+          for Java</a> library.</p>
+
+        <p>Uncompressing a given lzma compressed file (you would
+          certainly add exception handling and make sure all streams
+          get closed properly):</p>
+<source><![CDATA[
+FileInputStream fin = new FileInputStream("archive.tar.lzma");
+BufferedInputStream in = new BufferedInputStream(fin);
+FileOutputStream out = new FileOutputStream("archive.tar");
+LZMACompressorInputStream lzmaIn = new LZMACompressorInputStream(in);
+final byte[] buffer = new byte[buffersize];
+int n = 0;
+while (-1 != (n = xzIn.read(buffer))) {
+    out.write(buffer, 0, n);
+}
+out.close();
+lzmaIn.close();
+]]></source>
+      </subsection>
+
       <subsection name="7z">
 
         <p>Note that Commons Compress currently only supports

Modified: commons/proper/compress/trunk/src/site/xdoc/index.xml
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/site/xdoc/index.xml?rev=1525353&r1=1525352&r2=1525353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/site/xdoc/index.xml (original)
+++ commons/proper/compress/trunk/src/site/xdoc/index.xml Sun Sep 22 13:09:29 2013
@@ -27,7 +27,7 @@
             <p>
                 The Apache Commons Compress library defines an API for
                 working with ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200,
-                bzip2, 7z and arj files.
+                bzip2, 7z, arj and lzma files.
             </p>
             <p>
                 The code in this component has many origins:
@@ -64,13 +64,14 @@
             by <code>ArchiveEntry</code> instances which in turn
             usually correspond to single files or directories.</p>
 
-          <p>Currently the bzip2, Pack200, XZ and gzip formats are
+          <p>Currently the bzip2, Pack200, XZ, gzip and lzma formats are
             supported as compressors where gzip support is mostly provided by
             the <code>java.util.zip</code> package and Pack200 support
             by the <code>java.util.jar</code> package of the Java
-            class library.  XZ support is provided by the public
+            class library.  XZ and lzma support is provided by the public
             domain <a href="http://tukaani.org/xz/java.html">XZ for
-            Java</a> library.</p>
+            Java</a> library.  As of Commons Compress 1.6 support for
+            the lzma formats is read-only.</p>
 
           <p>The ar, arj, cpio, dump, tar, 7z and zip formats are supported as
             archivers where the <a href="zip.html">zip</a>

Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java?rev=1525353&r1=1525352&r2=1525353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java (original)
+++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java Sun Sep 22 13:09:29 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 {