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 << 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>();