On 23 December 2014 at 14:32, Kristian Rosenvold
<[email protected]> wrote:
> Thanks for the comments, fixed in r1647582.
>
> Is there such a thing as a "commons" IntelliJ code style file ?

Best asked in a new thread.

> Kristian
>
>
> 2014-12-23 11:46 GMT+01:00 sebb <[email protected]>:
>> On 22 December 2014 at 15:24,  <[email protected]> wrote:
>>> Author: krosenvold
>>> Date: Mon Dec 22 15:24:02 2014
>>> New Revision: 1647329
>>>
>>> URL: http://svn.apache.org/r1647329
>>> Log:
>>> COMPRESS-296 Parallel compression. Added StreamCompressor and 
>>> ScatterZipOutputStream.
>>>
>>> StreamCompressor is an extract of the deflation algorithm from 
>>> ZipArchiveOutputStream, which unfortunately
>>> was too conflated with writing a file in a particular structure. Using the 
>>> actual zip file format as an
>>> intermediate format for scatter-streams turned out to be fairly 
>>> inefficient. ScatterZipOuputStream
>>> is 2-3x faster than using a zip file as intermediate format.
>>>
>>> It would be possibly to refactor ZipArchiveOutputStream to use 
>>> StreamCompressor, but there would
>>> be a slight break in backward compatibility regarding the protected 
>>> writeOut method, which
>>> is moved to the streamCompressor class.
>>>
>>> Added:
>>>     
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
>>>     
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/StreamCompressor.java
>>>     
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStreamTest.java
>>>     
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/StreamCompressorTest.java
>>> Modified:
>>>     
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
>>>     
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
>>>
>>> Added: 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
>>> URL: 
>>> http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java?rev=1647329&view=auto
>>> ==============================================================================
>>> --- 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
>>>  (added)
>>> +++ 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
>>>  Mon Dec 22 15:24:02 2014
>>> @@ -0,0 +1,174 @@
>>> +/*
>>> + *  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.zip;
>>> +
>>> +
>>> +import org.apache.commons.compress.utils.BoundedInputStream;
>>> +
>>> +import java.io.*;
>>> +import java.util.*;
>>
>> Don't use wildcard imports (except possibly static ones)
>>
>>> +import java.util.concurrent.ConcurrentLinkedQueue;
>>> +import java.util.zip.Deflater;
>>> +
>>> +/**
>>> + * A zip output stream that is optimized for multi-threaded scatter/gather 
>>> construction of zip files.
>>> + * <p/>
>>> + * The internal data format of the entries used by this class are entirely 
>>> private to this class
>>> + * and are not part of any public api whatsoever.
>>> + * <p/>
>>> + * It is possible to extend this class to support different kinds of 
>>> backing storage, the default
>>> + * implementation only supports file-based backing.
>>> + * <p/>
>>> + * Thread safety: This class supports multiple threads. But the "writeTo" 
>>> method must be called
>>> + * by the thread that originally created the ZipArchiveEntry.
>>> + *
>>> + * @since 1.10
>>> + */
>>> +public abstract class ScatterZipOutputStream  {
>>> +    private final Queue<CompressedEntry> items = new 
>>> ConcurrentLinkedQueue<CompressedEntry>();
>>> +
>>> +    private static class CompressedEntry {
>>> +        final ZipArchiveEntry entry;
>>> +        final long crc;
>>> +        final long compressedSize;
>>> +        final int method;
>>> +        final long size;
>>> +
>>> +        public CompressedEntry(ZipArchiveEntry entry, long crc, long 
>>> compressedSize, int method, long size) {
>>> +            this.entry = entry;
>>> +            this.crc = crc;
>>> +            this.compressedSize = compressedSize;
>>> +            this.method = method;
>>> +            this.size = size;
>>> +        }
>>> +
>>> +        public ZipArchiveEntry transferToArchiveEntry(){
>>> +            entry.setCompressedSize(compressedSize);
>>> +            entry.setSize(size);
>>> +            entry.setCrc(crc);
>>> +            entry.setMethod(method);
>>> +            return entry;
>>> +        }
>>> +    }
>>> +
>>> +    /**
>>> +     * Add an archive entry to this scatter stream.
>>> +     *
>>> +     * @param zipArchiveEntry The entry to write
>>> +     * @param payload         The content to write for the entry
>>> +     * @param method          The compression method
>>> +     * @throws IOException    If writing fails
>>> +     */
>>> +    public void addArchiveEntry(ZipArchiveEntry zipArchiveEntry, 
>>> InputStream payload, int method) throws IOException {
>>> +        StreamCompressor sc = getStreamCompressor();
>>> +        sc.deflate(payload, method);
>>> +        payload.close();
>>> +        items.add(new CompressedEntry(zipArchiveEntry, sc.getCrc32(), 
>>> sc.getBytesWritten(), method, sc.getBytesRead()));
>>> +    }
>>> +
>>> +    /**
>>> +     * Write the contents of this scatter stream to a target archive.
>>> +     *
>>> +     * @param target The archive to receive the contents of this 
>>> #ScatterZipOutputStream
>>> +     * @throws IOException If writing fails
>>> +     */
>>> +    public void writeTo(ZipArchiveOutputStream target) throws IOException {
>>> +        closeBackingStorage();
>>> +        InputStream data = getInputStream();
>>> +        for (CompressedEntry compressedEntry : items) {
>>> +            final BoundedInputStream rawStream = new 
>>> BoundedInputStream(data, compressedEntry.compressedSize);
>>> +            
>>> target.addRawArchiveEntry(compressedEntry.transferToArchiveEntry(), 
>>> rawStream);
>>> +            rawStream.close();
>>> +        }
>>> +        data.close();
>>> +    }
>>> +
>>> +    /**
>>> +     * Returns a stream compressor that can be used to compress the data.
>>> +     * <p/>
>>> +     * This method is expected to return the same instance every time.
>>> +     *
>>> +     * @return The stream compressor
>>> +     * @throws FileNotFoundException
>>> +     */
>>> +    protected abstract StreamCompressor getStreamCompressor() throws 
>>> FileNotFoundException;
>>> +
>>> +    /**
>>> +     * An input stream that contains the scattered payload
>>> +     *
>>> +     * @return An InputStream, should be closed by the caller of this 
>>> method.
>>> +     * @throws IOException when something fails
>>> +     */
>>> +    protected abstract InputStream getInputStream() throws IOException;
>>> +
>>> +
>>> +    /**
>>> +     * Closes whatever storage is backing this scatter stream
>>> +     */
>>> +    protected abstract void closeBackingStorage() throws IOException;
>>> +
>>> +    /**
>>> +     * Create a ScatterZipOutputStream with default compression level that 
>>> is backed by a file
>>> +     *
>>> +     * @param file The file to offload compressed data into.
>>> +     * @return A  ScatterZipOutputStream that is ready for use.
>>> +     * @throws FileNotFoundException
>>> +     */
>>> +    public static ScatterZipOutputStream fileBased(File file) throws 
>>> FileNotFoundException {
>>> +        return fileBased(file, Deflater.DEFAULT_COMPRESSION);
>>> +    }
>>> +
>>> +    /**
>>> +     * Create a ScatterZipOutputStream that is backed by a file
>>> +     *
>>> +     * @param file             The file to offload compressed data into.
>>> +     * @param compressionLevel The compression level to use, @see #Deflater
>>> +     * @return A  ScatterZipOutputStream that is ready for use.
>>> +     * @throws FileNotFoundException
>>> +     */
>>> +    public static ScatterZipOutputStream fileBased(File file, int 
>>> compressionLevel) throws FileNotFoundException {
>>> +        return new FileScatterOutputStream(file, compressionLevel);
>>> +    }
>>> +
>>> +    private static class FileScatterOutputStream extends 
>>> ScatterZipOutputStream {
>>> +        final File target;
>>> +        private StreamCompressor streamDeflater;
>>> +        final FileOutputStream os;
>>> +
>>> +        FileScatterOutputStream(File target, int compressionLevel) throws 
>>> FileNotFoundException {
>>> +            this.target = target;
>>> +            os = new FileOutputStream(target);
>>> +            streamDeflater = StreamCompressor.create(compressionLevel, os);
>>> +        }
>>> +
>>> +        @Override
>>> +        protected StreamCompressor getStreamCompressor() throws 
>>> FileNotFoundException {
>>> +            return streamDeflater;
>>> +        }
>>> +
>>> +        @Override
>>> +        protected InputStream getInputStream() throws IOException {
>>> +            return new FileInputStream(target);
>>> +        }
>>> +
>>> +        @SuppressWarnings("ResultOfMethodCallIgnored")
>>> +        public void closeBackingStorage() throws IOException {
>>> +            os.close();
>>> +        }
>>> +    }
>>> +}
>>>
>>> Added: 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/StreamCompressor.java
>>> URL: 
>>> http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/StreamCompressor.java?rev=1647329&view=auto
>>> ==============================================================================
>>> --- 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/StreamCompressor.java
>>>  (added)
>>> +++ 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/StreamCompressor.java
>>>  Mon Dec 22 15:24:02 2014
>>> @@ -0,0 +1,226 @@
>>> +/*
>>> + *  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.zip;
>>> +
>>> +import java.io.DataOutput;
>>> +import java.io.IOException;
>>> +import java.io.InputStream;
>>> +import java.io.OutputStream;
>>> +import java.util.zip.CRC32;
>>> +import java.util.zip.Deflater;
>>> +
>>> +/**
>>> + * Encapsulates a Deflater and crc calculator, handling multiple types of 
>>> output streams.
>>> + * Currently #ZipEntry.DEFLATED and #ZipEntry.STORED are the only 
>>> supported compression methods.
>>> + *
>>> + * @since 1.10
>>> + */
>>> +public abstract class StreamCompressor {
>>> +
>>> +    /*
>>> +     * Apparently Deflater.setInput gets slowed down a lot on Sun JVMs
>>> +     * when it gets handed a really big buffer.  See
>>> +     * https://issues.apache.org/bugzilla/show_bug.cgi?id=45396
>>> +     *
>>> +     * Using a buffer size of 8 kB proved to be a good compromise
>>> +     */
>>> +    private static final int DEFLATER_BLOCK_SIZE = 8192;
>>> +
>>> +    private final Deflater def;
>>> +
>>> +    private final CRC32 crc = new CRC32();
>>> +
>>> +    int writtenToOutputStream = 0;
>>> +    int sourcePayloadLength = 0;
>>> +    long actualCrc;
>>> +
>>> +    private final int bufferSize = 4096;
>>> +    private final byte[] outputBuffer = new byte[bufferSize];
>>> +    private final byte[] readerBuf = new byte[bufferSize];
>>> +
>>> +    protected StreamCompressor(Deflater deflater) {
>>> +        this.def = deflater;
>>> +    }
>>> +
>>> +    /**
>>> +     * Create a stream compressor with the given compression level.
>>> +     *
>>> +     * @param compressionLevel The #Deflater compression level
>>> +     * @param os The #OutputStream stream to receive output
>>> +     * @return A stream compressor
>>> +     */
>>> +    public static StreamCompressor create(int compressionLevel, 
>>> OutputStream os) {
>>> +        final Deflater deflater = new Deflater(compressionLevel, true);
>>> +        return new OutputStreamCompressor(deflater, os);
>>> +    }
>>> +
>>> +    /**
>>> +     * Create a stream compressor with the default compression level.
>>> +     *
>>> +     * @param os The #OutputStream stream to receive output
>>> +     * @return A stream compressor
>>> +     */
>>> +    public static StreamCompressor create( OutputStream os) {
>>> +        return create(Deflater.DEFAULT_COMPRESSION, os);
>>> +    }
>>> +
>>> +    /**
>>> +     * Create a stream compressor with the given compression level.
>>> +     *
>>> +     * @param compressionLevel The #Deflater compression level
>>> +     * @param os The #DataOutput to receive output
>>> +     * @return A stream compressor
>>> +     */
>>> +    public static StreamCompressor create(int compressionLevel, DataOutput 
>>> os) {
>>> +        final Deflater deflater = new Deflater(compressionLevel, true);
>>> +        return new DataOutputCompressor(deflater, os);
>>> +    }
>>> +
>>> +    /**
>>> +     * The crc32 of the last deflated file
>>> +     * @return the crc32
>>> +     */
>>> +
>>> +    public long getCrc32() {
>>> +        return actualCrc;
>>> +    }
>>> +
>>> +    /**
>>> +     * Return the number of bytes read from the source stream
>>> +     * @return The number of bytes read, never negative
>>> +     */
>>> +    public int getBytesRead() {
>>> +        return sourcePayloadLength;
>>> +    }
>>> +
>>> +    /**
>>> +     * The number of bytes written to the output
>>> +     * @return The number of bytes, never negative
>>> +     */
>>> +    public int getBytesWritten() {
>>> +        return writtenToOutputStream;
>>> +    }
>>> +
>>> +    /**
>>> +     * Deflate the given source using the supplied compression method
>>> +     * @param source The source to compress
>>> +     * @param method The #ZipArchiveEntry compression method
>>> +     * @throws IOException When failures happen
>>> +     */
>>> +
>>> +    public void deflate(InputStream source, int method) throws IOException 
>>> {
>>> +        reset();
>>> +        int length;
>>> +
>>> +        while(( length = source.read(readerBuf, 0, readerBuf.length)) >= 
>>> 0){
>>> +            crc.update(readerBuf, 0, length);
>>> +            if (method == ZipArchiveEntry.DEFLATED) {
>>> +                writeDeflated(readerBuf, 0, length);
>>> +            } else {
>>> +                writeOut(readerBuf, 0, length);
>>> +                writtenToOutputStream += length;
>>> +            }
>>> +            sourcePayloadLength += length;
>>> +        }
>>> +        if (method == ZipArchiveEntry.DEFLATED) {
>>> +            flushDeflater();
>>> +        }
>>> +        actualCrc = crc.getValue();
>>> +
>>> +
>>> +    }
>>> +
>>> +    private void reset(){
>>> +        crc.reset();
>>> +        def.reset();
>>> +        sourcePayloadLength = 0;
>>> +        writtenToOutputStream = 0;
>>> +    }
>>> +
>>> +    private void flushDeflater() throws IOException {
>>> +        def.finish();
>>> +        while (!def.finished()) {
>>> +            deflate();
>>> +        }
>>> +    }
>>> +
>>> +    private void writeDeflated(byte[]b, int offset, int length)
>>> +            throws IOException {
>>> +        if (length > 0 && !def.finished()) {
>>> +            if (length <= DEFLATER_BLOCK_SIZE) {
>>> +                def.setInput(b, offset, length);
>>> +                deflateUntilInputIsNeeded();
>>> +            } else {
>>> +                final int fullblocks = length / DEFLATER_BLOCK_SIZE;
>>> +                for (int i = 0; i < fullblocks; i++) {
>>> +                    def.setInput(b, offset + i * DEFLATER_BLOCK_SIZE,
>>> +                            DEFLATER_BLOCK_SIZE);
>>> +                    deflateUntilInputIsNeeded();
>>> +                }
>>> +                final int done = fullblocks * DEFLATER_BLOCK_SIZE;
>>> +                if (done < length) {
>>> +                    def.setInput(b, offset + done, length - done);
>>> +                    deflateUntilInputIsNeeded();
>>> +                }
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    private void deflateUntilInputIsNeeded() throws IOException {
>>> +        while (!def.needsInput()) {
>>> +            deflate();
>>> +        }
>>> +    }
>>> +
>>> +    private void deflate() throws IOException {
>>> +        int len = def.deflate(outputBuffer, 0, outputBuffer.length);
>>> +        if (len > 0) {
>>> +            writeOut(outputBuffer, 0, len);
>>> +            writtenToOutputStream += len;
>>> +        }
>>> +    }
>>> +
>>> +    protected abstract void writeOut(byte[] data, int offset, int length) 
>>> throws IOException ;
>>> +
>>> +    private static final class OutputStreamCompressor extends 
>>> StreamCompressor {
>>> +        private final OutputStream os;
>>> +
>>> +        public OutputStreamCompressor(Deflater deflater, OutputStream os) {
>>> +            super(deflater);
>>> +            this.os = os;
>>> +        }
>>> +
>>> +        protected final void writeOut(byte[] data, int offset, int length)
>>> +                throws IOException {
>>> +                os.write(data, offset, length);
>>> +        }
>>> +    }
>>> +
>>> +    private static final class DataOutputCompressor extends 
>>> StreamCompressor {
>>> +        private final DataOutput raf;
>>> +        public DataOutputCompressor(Deflater deflater, DataOutput raf) {
>>> +            super(deflater);
>>> +            this.raf = raf;
>>> +        }
>>> +
>>> +        protected final void writeOut(byte[] data, int offset, int length)
>>> +                throws IOException {
>>> +            raf.write(data, offset, length);
>>> +        }
>>> +    }
>>> +}
>>>
>>> Modified: 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
>>> URL: 
>>> http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java?rev=1647329&r1=1647328&r2=1647329&view=diff
>>> ==============================================================================
>>> --- 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
>>>  (original)
>>> +++ 
>>> commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
>>>  Mon Dec 22 15:24:02 2014
>>> @@ -505,24 +505,6 @@ public class ZipArchiveOutputStream exte
>>>      }
>>>
>>>      /**
>>> -     * Make a copy of this stream with all its settings, but point to a 
>>> new file.
>>> -     * Used for scatter/gather operations to make several streams from a 
>>> user-supplied master.
>>> -     *
>>> -     * @param newFile The file to use for the copy of this stream
>>> -     * @return A copy of this stream
>>> -     */
>>> -    public ZipArchiveOutputStream cloneWith(File newFile) throws 
>>> IOException {
>>> -        ZipArchiveOutputStream zos = new ZipArchiveOutputStream(newFile);
>>> -        zos.setCreateUnicodeExtraFields(createUnicodeExtraFields);
>>> -        zos.setMethod(method);
>>> -        zos.setEncoding(encoding);
>>> -        zos.setFallbackToUTF8(fallbackToUTF8);
>>> -        zos.setUseLanguageEncodingFlag(useUTF8Flag);
>>> -        zos.setUseZip64(zip64Mode);
>>> -        return zos;
>>> -    }
>>> -
>>> -    /**
>>>       * Ensures all bytes sent to the deflater are written to the stream.
>>>       */
>>>      private void flushDeflater() throws IOException {
>>>
>>> Modified: 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
>>> URL: 
>>> http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java?rev=1647329&r1=1647328&r2=1647329&view=diff
>>> ==============================================================================
>>> --- 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
>>>  (original)
>>> +++ 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
>>>  Mon Dec 22 15:24:02 2014
>>> @@ -293,19 +293,6 @@ public final class ZipTestCase extends A
>>>          }
>>>      };
>>>
>>> -
>>> -    public void testCloneZipOutputStream( ) throws IOException {
>>> -        File tempDir = createTempDir();
>>> -        File fred = new File(tempDir, "fred");
>>> -        ZipArchiveOutputStream zipArchiveOutputStream = new 
>>> ZipArchiveOutputStream(fred);
>>> -        File frank = new File(tempDir, "frank");
>>> -        ZipArchiveOutputStream actual = 
>>> zipArchiveOutputStream.cloneWith(frank);
>>> -        zipArchiveOutputStream.close();
>>> -        actual.close();
>>> -        assertTrue( fred.exists());
>>> -        assertTrue( frank.exists());
>>> -    }
>>> -
>>>      public void testCopyRawEntriesFromFile
>>>              ()
>>>              throws IOException {
>>>
>>> Added: 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStreamTest.java
>>> URL: 
>>> http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStreamTest.java?rev=1647329&view=auto
>>> ==============================================================================
>>> --- 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStreamTest.java
>>>  (added)
>>> +++ 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStreamTest.java
>>>  Mon Dec 22 15:24:02 2014
>>> @@ -0,0 +1,58 @@
>>> +/*
>>> + *  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.zip;
>>> +
>>> +import org.apache.commons.compress.utils.IOUtils;
>>> +import org.junit.Test;
>>> +
>>> +import java.io.ByteArrayInputStream;
>>> +import java.io.File;
>>> +
>>> +import static org.junit.Assert.assertArrayEquals;
>>> +import static org.junit.Assert.assertEquals;
>>> +
>>> +public class ScatterZipOutputStreamTest {
>>> +
>>> +    @Test
>>> +    public void putArchiveEntry() throws Exception {
>>> +        File scatteFile = File.createTempFile("scattertest", ".notzip");
>>> +        ScatterZipOutputStream scatterZipOutputStream = 
>>> ScatterZipOutputStream.fileBased(scatteFile);
>>> +        final byte[] B_PAYLOAD = "RBBBBBBS".getBytes();
>>> +        final byte[] A_PAYLOAD = "XAAY".getBytes();
>>> +
>>> +        ZipArchiveEntry zab = new ZipArchiveEntry("b.txt");
>>> +        scatterZipOutputStream.addArchiveEntry(zab, new 
>>> ByteArrayInputStream(B_PAYLOAD), ZipArchiveEntry.DEFLATED);
>>> +
>>> +        ZipArchiveEntry zae = new ZipArchiveEntry("a.txt");
>>> +        scatterZipOutputStream.addArchiveEntry(zae, new 
>>> ByteArrayInputStream(A_PAYLOAD), ZipArchiveEntry.DEFLATED);
>>> +
>>> +        File target = File.createTempFile("scattertest", ".zip");
>>> +        ZipArchiveOutputStream outputStream = new 
>>> ZipArchiveOutputStream(target);
>>> +        scatterZipOutputStream.writeTo( outputStream);
>>> +        outputStream.close();
>>> +
>>> +        ZipFile zf = new ZipFile(target);
>>> +        final ZipArchiveEntry b_entry = 
>>> zf.getEntries("b.txt").iterator().next();
>>> +        assertEquals(8, b_entry.getSize());
>>> +        assertArrayEquals(B_PAYLOAD, 
>>> IOUtils.toByteArray(zf.getInputStream(b_entry)));
>>> +
>>> +        final ZipArchiveEntry a_entry = 
>>> zf.getEntries("a.txt").iterator().next();
>>> +        assertEquals(4, a_entry.getSize());
>>> +        assertArrayEquals(A_PAYLOAD, 
>>> IOUtils.toByteArray(zf.getInputStream(a_entry)));
>>> +    }
>>> +}
>>> \ No newline at end of file
>>>
>>> Added: 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/StreamCompressorTest.java
>>> URL: 
>>> http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/StreamCompressorTest.java?rev=1647329&view=auto
>>> ==============================================================================
>>> --- 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/StreamCompressorTest.java
>>>  (added)
>>> +++ 
>>> commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/StreamCompressorTest.java
>>>  Mon Dec 22 15:24:02 2014
>>> @@ -0,0 +1,58 @@
>>> +/*
>>> + *  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.zip;
>>> +
>>> +import org.junit.Test;
>>> +
>>> +import java.io.ByteArrayInputStream;
>>> +import java.io.ByteArrayOutputStream;
>>> +import java.util.zip.ZipEntry;
>>> +
>>> +import static org.junit.Assert.assertArrayEquals;
>>> +import static org.junit.Assert.assertEquals;
>>> +
>>> +public class StreamCompressorTest {
>>> +
>>> +    @Test
>>> +    public void storedEntries() throws Exception {
>>> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
>>> +        StreamCompressor sc = StreamCompressor.create( baos);
>>> +        sc.deflate(new ByteArrayInputStream("A".getBytes()), 
>>> ZipEntry.STORED);
>>> +        sc.deflate(new ByteArrayInputStream("BAD".getBytes()), 
>>> ZipEntry.STORED);
>>> +        assertEquals(3, sc.getBytesRead());
>>> +        assertEquals(3, sc.getBytesWritten());
>>> +        assertEquals(344750961, sc.getCrc32());
>>> +        sc.deflate(new ByteArrayInputStream("CAFE".getBytes()), 
>>> ZipEntry.STORED);
>>> +        assertEquals("ABADCAFE", baos.toString());
>>> +   }
>>> +
>>> +    @Test
>>> +    public void deflatedEntries() throws Exception {
>>> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
>>> +        StreamCompressor sc = StreamCompressor.create( baos);
>>> +        sc.deflate(new ByteArrayInputStream("AAAAAABBBBBB".getBytes()), 
>>> ZipEntry.DEFLATED);
>>> +        assertEquals(12, sc.getBytesRead());
>>> +        assertEquals(8, sc.getBytesWritten());
>>> +        assertEquals(3299542, sc.getCrc32());
>>> +
>>> +        final byte[] actuals = baos.toByteArray();
>>> +        byte[] expected = new byte[]{115,116,4,1,39,48,0,0};
>>> +        // Note that this test really asserts stuff about the java 
>>> Deflater, which might be a little bit brittle
>>> +        assertArrayEquals(expected, actuals);
>>> +    }
>>> +}
>>> \ No newline at end of file
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to