Author: bodewig
Date: Fri Feb 28 16:05:02 2014
New Revision: 1572978

URL: http://svn.apache.org/r1572978
Log:
add delta filter to 7z

Added:
    
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java
   (with props)
Modified:
    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/sevenz/SevenZMethod.java
    
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethodConfiguration.java
    
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java
    
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFileTest.java

Modified: commons/proper/compress/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1572978&r1=1572977&r2=1572978&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/changes/changes.xml (original)
+++ commons/proper/compress/trunk/src/changes/changes.xml Fri Feb 28 16:05:02 
2014
@@ -97,6 +97,9 @@ The <action> type attribute can be add,u
         SevenZArchiveEntry "knows" which method(s) have been used to
         write it to the archive.
       </action>
+      <action type="add" date="2014-02-28">
+        The 7z package now supports the delta filter as method.
+      </action>
     </release>
     <release version="1.7" date="2014-01-20"
              description="Release 1.7">

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=1572978&r1=1572977&r2=1572978&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
 Fri Feb 28 16:05:02 2014
@@ -57,6 +57,7 @@ class Coders {
             put(SevenZMethod.BCJ_ARM_FILTER, new BCJDecoder(new ARMOptions()));
             put(SevenZMethod.BCJ_ARM_THUMB_FILTER, new BCJDecoder(new 
ARMThumbOptions()));
             put(SevenZMethod.BCJ_SPARC_FILTER, new BCJDecoder(new 
SPARCOptions()));
+            put(SevenZMethod.DELTA_FILTER, new DeltaDecoder());
         }};
 
     static CoderBase findByMethod(SevenZMethod method) {

Added: 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java?rev=1572978&view=auto
==============================================================================
--- 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java
 (added)
+++ 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java
 Fri Feb 28 16:05:02 2014
@@ -0,0 +1,65 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.commons.compress.archivers.sevenz;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import org.tukaani.xz.DeltaOptions;
+import org.tukaani.xz.FinishableWrapperOutputStream;
+import org.tukaani.xz.UnsupportedOptionsException;
+
+class DeltaDecoder extends CoderBase {
+    DeltaDecoder() {
+        super(Number.class);
+    }
+
+    @Override
+    InputStream decode(final InputStream in, final Coder coder, byte[] 
password) throws IOException {
+        return new DeltaOptions(getOptionsFromCoder(coder)).getInputStream(in);
+    }
+
+    @Override
+    OutputStream encode(final OutputStream out, final Object options) throws 
IOException {
+        int distance = numberOptionOrDefault(options, 1);
+        try {
+            return new DeltaOptions(distance).getOutputStream(new 
FinishableWrapperOutputStream(out));
+        } catch (UnsupportedOptionsException ex) {
+            throw new IOException(ex.getMessage());
+        }
+    }
+
+    @Override
+    byte[] getOptionsAsProperties(Object options) {
+        return new byte[] {
+            (byte) (numberOptionOrDefault(options, 1) - 1)
+        };
+    }
+
+    @Override
+    Object getOptionsFromCoder(Coder coder, InputStream in) {
+        return getOptionsFromCoder(coder);
+    }
+
+    private int getOptionsFromCoder(Coder coder) {
+        if (coder.properties == null || coder.properties.length == 0) {
+            return 1;
+        }
+        return (0xff & coder.properties[0]) + 1;
+    }
+}

Propchange: 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethod.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethod.java?rev=1572978&r1=1572977&r2=1572978&view=diff
==============================================================================
--- 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethod.java
 (original)
+++ 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethod.java
 Fri Feb 28 16:05:02 2014
@@ -78,7 +78,12 @@ public enum SevenZMethod {
      * BCJ Sparc platform.
      * @since 1.8
      */
-    BCJ_SPARC_FILTER(new byte[] { 0x03, 0x03, 0x08, 0x05 });
+    BCJ_SPARC_FILTER(new byte[] { 0x03, 0x03, 0x08, 0x05 }),
+    /**
+     * Delta filter.
+     * @since 1.8
+     */
+    DELTA_FILTER(new byte[] { 0x03 });
 
     private final byte[] id;
 

Modified: 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethodConfiguration.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethodConfiguration.java?rev=1572978&r1=1572977&r2=1572978&view=diff
==============================================================================
--- 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethodConfiguration.java
 (original)
+++ 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZMethodConfiguration.java
 Fri Feb 28 16:05:02 2014
@@ -29,6 +29,7 @@ package org.apache.commons.compress.arch
  * <tr><td>DEFLATE</td><td>Number</td><td>Compression Level - an number 
between 1 and 9</td></tr>
  * <tr><td>LZMA2</td><td>Number</td><td>Dictionary Size - a number between 
4096 and 768 MiB (768 &lt;&lt; 20)</td></tr>
  * <tr><td>LZMA2</td><td>org.tukaani.xz.LZMA2Options</td><td>Whole set of 
LZMA2 options.</td></tr>
+ * <tr><td>DELTA_FILTER</td><td>Number</td><td>Delta Distance - a number 
between 1 and 256</td></tr>
  * </table>
  *
  * @Immutable

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=1572978&r1=1572977&r2=1572978&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
 Fri Feb 28 16:05:02 2014
@@ -129,6 +129,32 @@ public class SevenZFileTest extends Abst
         }
     }
 
+    public void testReadingBackDeltaDistance() throws Exception {
+        File output = new File(dir, "delta-distance.7z");
+        SevenZOutputFile outArchive = new SevenZOutputFile(output);
+        try {
+            outArchive.setContentMethods(Arrays.asList(new 
SevenZMethodConfiguration(SevenZMethod.DELTA_FILTER, 32),
+                                                       new 
SevenZMethodConfiguration(SevenZMethod.LZMA2)));
+            SevenZArchiveEntry entry = new SevenZArchiveEntry();
+            entry.setName("foo.txt");
+            outArchive.putArchiveEntry(entry);
+            outArchive.write(new byte[] { 'A' });
+            outArchive.closeArchiveEntry();
+        } finally {
+            outArchive.close();
+        }
+
+        SevenZFile archive = new SevenZFile(output);
+        try {
+            SevenZArchiveEntry entry = archive.getNextEntry();
+            SevenZMethodConfiguration m = 
entry.getContentMethods().iterator().next();
+            assertEquals(SevenZMethod.DELTA_FILTER, m.getMethod());
+            assertEquals(32, m.getOptions());
+        } finally {
+            archive.close();
+        }
+    }
+
     private void test7zUnarchive(File f, SevenZMethod m, byte[] password) 
throws Exception {
         SevenZFile sevenZFile = new SevenZFile(f, password);
         try {

Modified: 
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFileTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFileTest.java?rev=1572978&r1=1572977&r2=1572978&view=diff
==============================================================================
--- 
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFileTest.java
 (original)
+++ 
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFileTest.java
 Fri Feb 28 16:05:02 2014
@@ -260,6 +260,10 @@ public class SevenZOutputFileTest extend
     }
     */
 
+    public void testDeltaRoundtrip() throws Exception {
+        testFilterRoundTrip(new 
SevenZMethodConfiguration(SevenZMethod.DELTA_FILTER));
+    }
+
     public void testStackOfContentCompressions() throws Exception {
         output = new File(dir, "multiple-methods.7z");
         ArrayList<SevenZMethodConfiguration> methods = new 
ArrayList<SevenZMethodConfiguration>();


Reply via email to