Author: mturk Date: Thu Aug 18 06:47:08 2011 New Revision: 1159060 URL: http://svn.apache.org/viewvc?rev=1159060&view=rev Log: Add bzip2 filter streams
Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/DeflateStream.java (with props) commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/InflateStream.java (with props) commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2DeflateStream.java (with props) commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2InflateStream.java (with props) Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Reader.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Stream.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Writer.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcStream.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketStream.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Deflater.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Inflater.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Deflater.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Impl.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Inflater.java commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java Thu Aug 18 06:47:08 2011 @@ -188,9 +188,11 @@ public final class Memory { if (size < 1L) throw new InvalidArgumentException(); + if (!(ptr instanceof HeapPointer)) + throw new RuntimeException(); long p = realloc0(ptr.POINTER, size); if (p == 0L) - throw new OutOfMemoryError("Memory re-allocation failed"); + throw new OutOfMemoryError(); ptr.POINTER = p; ptr.PLENGTH = size; } Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Reader.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Reader.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Reader.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Reader.java Thu Aug 18 06:47:08 2011 @@ -245,44 +245,4 @@ public interface Reader public int read(ByteBuffer buffer) throws IOException; - /** - * Reads at most {@code count} bytes from the current position in this - * stream and stores them in the {@code ByteBuffer} {@code buffer} - * starting at {@code offset}. - * Blocks until {@code count} bytes have been read, the end of the stream - * is reached or an exception is thrown. - * <p> - * {@code ByteBuffer} must be allocated using {@code allocatedirect()} - * or obtained from {@link DirectByteBuffer}. - * </p> - * - * @param buffer - * The {@code ByteBuffer} in which to store the bytes read from - * this stream. - * @param offset - * The initial position in {@code buffer} to store the bytes read - * from this stream. - * @param count - * The maximum number of bytes to store in {@code buffer}. - * - * @return The number of bytes actually read or {@code -1} if the end of - * the stream has been reached. - * - * @throws IndexOutOfBoundsException - * If {@code offset < 0} or {@code count < 0}, or if - * {@code offset + count} is greater than the size of - * {@code buffer}. - * @throws ClosedDescriptorException - * If this stream is closed. - * @throws OperationWouldBlockException - * If the stream is in nonblocking mode and the operation - * would block. - * @throws TimeoutException - * If read operation times out. - * @throws IOException - * If some other I/O error occurs. - */ - public int read(ByteBuffer buffer, int offset, int count) - throws IndexOutOfBoundsException, IOException; - } Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Stream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Stream.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Stream.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Stream.java Thu Aug 18 06:47:08 2011 @@ -202,15 +202,6 @@ public abstract class Stream } @Override - public final int read(ByteBuffer buffer) - throws IOException - { - if (!canRead()) - throw new OperationNotSupportedException(); - return read(buffer, buffer.position(), buffer.remaining()); - } - - @Override public final int write(byte[] buffer) throws IOException { @@ -241,13 +232,4 @@ public abstract class Stream return write(pointer.address() + off, count); } - @Override - public final int write(ByteBuffer buffer) - throws IOException - { - if (!canWrite()) - throw new OperationNotSupportedException(); - return write(buffer, buffer.position(), buffer.remaining()); - } - } Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Writer.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Writer.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Writer.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Writer.java Thu Aug 18 06:47:08 2011 @@ -215,41 +215,6 @@ public interface Writer extends Syncable throws IOException; /** - * Writes {@code count} bytes from the {@code ByteBuffer} {@code buffer} - * to this stream, starting at the current stream position and - * using {@code offset} as the first position within {@code buffer} - * to get bytes. - * <p> - * {@code ByteBuffer} must be allocated using {@code allocatedirect()} - * or obtained from {@link DirectByteBuffer}. - * </p> - * - * @param buffer - * The {@code ByteBuffer} to write to this stream. - * @param offset - * The index of the first byte in {@code buffer} to write. - * @param count - * The number of bytes from {@code buffer} to write. - * @return The number of bytes actually written. - * - * @throws IndexOutOfBoundsException - * If {@code offset < 0} or {@code count < 0}, or if - * {@code offset + count} is greater than the size of - * {@code buffer}. - * @throws ClosedDescriptorException - * If this stream is closed. - * @throws OperationWouldBlockException - * If the stream is in nonblocking mode and the operation - * would block. - * @throws TimeoutException - * If write operation times out. - * @throws IOException - * If some other I/O error occurs. - */ - public int write(ByteBuffer buffer, int offset, int count) - throws IndexOutOfBoundsException, IOException; - - /** * Writes {@code count} arrays from the array of byte arrays {@code array} * to this stream, starting at the current stream pointer and using * {@code offset} as the first position within {@code array} to get bytes. Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcStream.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcStream.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcStream.java Thu Aug 18 06:47:08 2011 @@ -223,12 +223,12 @@ class IpcStream extends Stream } @Override - public int read(ByteBuffer buffer, int offset, int count) + public int read(ByteBuffer buffer) throws IndexOutOfBoundsException, IOException { if (closed()) throw new ClosedDescriptorException(); - return read3(nd, buffer, offset, count); + return read3(nd, buffer, buffer.position(), buffer.remaining()); } // === Writer methods @@ -261,12 +261,12 @@ class IpcStream extends Stream } @Override - public int write(ByteBuffer buffer, int offset, int count) + public int write(ByteBuffer buffer) throws IndexOutOfBoundsException, IOException { if (closed()) throw new ClosedDescriptorException(); - return write3(nd, buffer, offset, count); + return write3(nd, buffer, buffer.position(), buffer.remaining()); } @Override Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketStream.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketStream.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketStream.java Thu Aug 18 06:47:08 2011 @@ -223,12 +223,12 @@ class SocketStream extends Stream } @Override - public int read(ByteBuffer buffer, int offset, int count) + public int read(ByteBuffer buffer) throws IndexOutOfBoundsException, IOException { if (closed()) throw new ClosedDescriptorException(); - return read3(nd, buffer, offset, count); + return read3(nd, buffer, buffer.position(), buffer.remaining()); } // === Writer methods @@ -261,12 +261,12 @@ class SocketStream extends Stream } @Override - public int write(ByteBuffer buffer, int offset, int count) + public int write(ByteBuffer buffer) throws IndexOutOfBoundsException, IOException { if (closed()) throw new ClosedDescriptorException(); - return write3(nd, buffer, offset, count); + return write3(nd, buffer, buffer.position(), buffer.remaining()); } @Override Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/DeflateStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/DeflateStream.java?rev=1159060&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/DeflateStream.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/DeflateStream.java Thu Aug 18 06:47:08 2011 @@ -0,0 +1,98 @@ +/* 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.runtime.util; + +import java.io.Closeable; +import java.io.IOException; +import org.apache.commons.runtime.io.FilterStream; +import org.apache.commons.runtime.io.Stream; +import org.apache.commons.runtime.io.OperationNotSupportedException; + +/** + * General purpose compression stream class. + * + * @author Mladen Turk + * @since Runtime 1.0 + */ +public abstract class DeflateStream extends FilterStream +{ + + /** + * Compressor to be used. + */ + protected Deflater def; + + /** + * Creates a new compressor stream. + */ + protected DeflateStream(Stream s, Deflater def) + { + super(s); + this.def = def; + } + + /** + * Releases all memory associated with this compressor stream. + * <p> + * Any unused input or output is discarded. While this method is + * used by {@code finalize()}, it can be called explicitly in order to + * free native resources before the next GC cycle. + * After {@code close()} was called other methods will typically throw + * an {@code IllegalStateException}. + * </p> + * @see java.io.Closeable#close() + * @throws IOException if an I/O error occurs. + */ + @Override + public void close() + throws IOException + { + try { + def.close(); + } + finally { + // This will call stream.close() + super.close(); + } + } + + @Override + public boolean canSeek() + { + return false; + } + + @Override + public long skip(long count) + throws IOException + { + throw new OperationNotSupportedException(); + } + + @Override + public boolean closed() + { + return stream.closed(); + } + + @Override + public boolean valid() + { + return stream.valid(); + } + +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/DeflateStream.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Deflater.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Deflater.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Deflater.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Deflater.java Thu Aug 18 06:47:08 2011 @@ -19,6 +19,7 @@ package org.apache.commons.runtime.util; import java.io.Closeable; import java.io.IOException; import java.nio.ByteBuffer; +import org.apache.commons.runtime.io.Stream; import org.apache.commons.runtime.InvalidArgumentException; import org.apache.commons.runtime.InvalidDataException; import org.apache.commons.runtime.InvalidRangeException; @@ -218,6 +219,16 @@ public abstract class Deflater implement } /** + * Fill the internal buffer from the given stream. + * The method reads from the stream {@code s} up to + * the internal buffer size. + * + * @param the strem to use. + */ + public abstract void setInput(Stream s) + throws IOException; + + /** * Returns the total number of bytes of input consumed by * the {@code Deflater}. * @@ -235,22 +246,26 @@ public abstract class Deflater implement /** * Compressees the data (previously passed to {@code setInput}) - * into the internal buffer. + * using the internal buffer and writes them to the given stream. * A return value of {@code 0} indicates that {@code needsInput()} should * be called in order to determine if more input data is required. * <p> * This method is used with inflate streams and uses internal buffer * for holding the temporary compressed data. * </p> + * + * @param s the stream to use. * @return the actual number of bytes of compressed data + * * @throws InvalidDataException if the provided data was invalid * @throws OutOfMemoryError if the memory allocation failed * @throws NullPointerException if the inflater does not have internal * buffer. */ - public abstract int deflate() + public abstract int deflate(Stream s) throws InvalidDataException, - OutOfMemoryError; + OutOfMemoryError, + IOException; /** * Compressees the data (previously passed to {@code setInput}) @@ -377,6 +392,6 @@ public abstract class Deflater implement throw new InvalidArgumentException(); return deflate(b.address(), len); } - + } Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/InflateStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/InflateStream.java?rev=1159060&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/InflateStream.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/InflateStream.java Thu Aug 18 06:47:08 2011 @@ -0,0 +1,98 @@ +/* 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.runtime.util; + +import java.io.Closeable; +import java.io.IOException; +import org.apache.commons.runtime.io.FilterStream; +import org.apache.commons.runtime.io.Stream; +import org.apache.commons.runtime.io.OperationNotSupportedException; + +/** + * General purpose decompression stream class. + * + * @author Mladen Turk + * @since Runtime 1.0 + */ +public abstract class InflateStream extends FilterStream +{ + + /** + * Decompressor to be used. + */ + protected Inflater inf; + + /** + * Creates a new decompressor. + */ + protected InflateStream(Stream s, Inflater inf) + { + super(s); + this.inf = inf; + } + + /** + * Releases all memory associated with this decompressor stream. + * <p> + * Any unused input or output is discarded. While this method is + * used by {@code finalize()}, it can be called explicitly in order to + * free native resources before the next GC cycle. + * After {@code close()} was called other methods will typically throw + * an {@code IllegalStateException}. + * </p> + * @see java.io.Closeable#close() + * @throws IOException if an I/O error occurs. + */ + @Override + public void close() + throws IOException + { + try { + inf.close(); + } + finally { + // This will call stream.close() + super.close(); + } + } + + @Override + public boolean canSeek() + { + return false; + } + + @Override + public long skip(long count) + throws IOException + { + throw new OperationNotSupportedException(); + } + + @Override + public boolean closed() + { + return stream.closed(); + } + + @Override + public boolean valid() + { + return stream.valid(); + } + +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/InflateStream.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Inflater.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Inflater.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Inflater.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Inflater.java Thu Aug 18 06:47:08 2011 @@ -19,6 +19,7 @@ package org.apache.commons.runtime.util; import java.io.Closeable; import java.io.IOException; import java.nio.ByteBuffer; +import org.apache.commons.runtime.io.Stream; import org.apache.commons.runtime.InvalidArgumentException; import org.apache.commons.runtime.InvalidDataException; import org.apache.commons.runtime.InvalidRangeException; @@ -193,6 +194,17 @@ public abstract class Inflater implement } /** + * Fill the internal buffer from the given stream. + * The method reads from the stream {@code s} up to + * the internal buffer size. + * + * @param the strem to use. + */ + public abstract void setInput(Stream s) + throws IOException; + + + /** * Returns total number of bytes of input read by the {@code Inflater}. * * @return the total number of bytes read. @@ -207,8 +219,8 @@ public abstract class Inflater implement public abstract long getTotalOut(); /** - * Uncompresses bytes from current input and stores them in - * the internal buffer. + * Uncompresses bytes from current input using the internall buffer + * and writes them to the given stream. * A return value of {@code 0} indicates that {@code needsInput()} should * be called in order to determine if more input data is required. * <p> @@ -216,6 +228,7 @@ public abstract class Inflater implement * for holding the temporary uncompressed data. * </p> * + * @param s the stream to use. * @return the actual number of bytes of uncompressed data * * @throws InvalidDataException if the provided data was invalid @@ -223,9 +236,10 @@ public abstract class Inflater implement * @throws NullPointerException if the inflater does not have internal * buffer. */ - public abstract int inflate() + public abstract int inflate(Stream s) throws InvalidDataException, - OutOfMemoryError; + OutOfMemoryError, + IOException; /** * Uncompresses up to {@code len} bytes from current input and stores @@ -372,6 +386,7 @@ public abstract class Inflater implement throw new InvalidArgumentException(); return inflate(b.address(), len); } - + } + Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2DeflateStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2DeflateStream.java?rev=1159060&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2DeflateStream.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2DeflateStream.java Thu Aug 18 06:47:08 2011 @@ -0,0 +1,170 @@ +/* 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.runtime.util.bzip2; + +import java.io.Closeable; +import java.io.IOException; +import java.nio.ByteBuffer; +import org.apache.commons.runtime.InvalidArgumentException; +import org.apache.commons.runtime.InvalidDataException; +import org.apache.commons.runtime.InvalidRangeException; +import org.apache.commons.runtime.OperationNotPermittedException; +import org.apache.commons.runtime.OverflowException; +import org.apache.commons.runtime.Pointer; +import org.apache.commons.runtime.Limits; +import org.apache.commons.runtime.io.Stream; +import org.apache.commons.runtime.io.FilterStream; +import org.apache.commons.runtime.io.OperationNotSupportedException; +import org.apache.commons.runtime.util.Deflater; +import org.apache.commons.runtime.util.DeflateStream; + +/** + * Bzip2 compressor stream. + * + * @author Mladen Turk + * @since Runtime 1.0 + */ +public final class Bzip2DeflateStream extends DeflateStream +{ + + /** + * Creates a new Bzip2 compressor stream. + */ + public Bzip2DeflateStream(Stream s) + { + this(s, new Bzip2Deflater(9, Bzip2Impl.DEFAULT_WORK_FACTOR, Limits.PAGESIZE)); + } + + /** + * Creates a new Bzip2 decompressor stream with the specified + * decompressor. + */ + public Bzip2DeflateStream(Stream s, Deflater def) + { + super(s, def); + } + + @Override + public boolean canRead() + { + return true; + } + + @Override + public boolean canWrite() + { + return true; + } + + @Override + public boolean eof() + throws IOException + { + return def.finished(); + } + + @Override + public int read() + throws IOException + { + throw new OperationNotSupportedException(); + } + + @Override + public int read(byte[] buffer, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + def.setInput(stream); + return def.deflate(buffer, offset, count); + } + + @Override + public int read(long address, int count) + throws NullPointerException, IndexOutOfBoundsException, IOException + { + def.setInput(stream); + return def.deflate(address, count); + } + + @Override + public int read(ByteBuffer buffer) + throws IndexOutOfBoundsException, IOException + { + def.setInput(stream); + return def.deflate(buffer); + } + + // === Writer methods + + @Override + public int write(int b) + throws IOException + { + throw new OperationNotSupportedException(); + } + + @Override + public int write(byte[] buffer, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + def.setInput(buffer, offset, count); + return def.deflate(stream); + } + + @Override + public int write(long address, int count) + throws IndexOutOfBoundsException, IOException + { + def.setInput(address, count); + return def.deflate(stream); + } + + @Override + public int write(ByteBuffer buffer) + throws IndexOutOfBoundsException, IOException + { + def.setInput(buffer); + return def.deflate(stream); + } + + @Override + public long write(byte[][] array, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + // Simulate vector write for now + long w = 0; + for (int i = 0; i < count; i++) { + def.setInput(array[offset + i]); + w += def.deflate(stream); + } + return w; + } + + @Override + public long write(ByteBuffer[] array, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + // Simulate vector write for now + long w = 0; + for (int i = 0; i < count; i++) { + def.setInput(array[offset + i]); + w += def.deflate(stream); + } + return w; + } + +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2DeflateStream.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Deflater.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Deflater.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Deflater.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Deflater.java Thu Aug 18 06:47:08 2011 @@ -25,6 +25,7 @@ import org.apache.commons.runtime.Invali import org.apache.commons.runtime.OperationNotPermittedException; import org.apache.commons.runtime.OverflowException; import org.apache.commons.runtime.Pointer; +import org.apache.commons.runtime.io.Stream; import org.apache.commons.runtime.util.Deflater; /** @@ -37,6 +38,7 @@ public class Bzip2Deflater extends Defla { private long handle; + private long buffer; private int bufferSize; private static native int deflate0(long stream) @@ -103,6 +105,8 @@ public class Bzip2Deflater extends Defla throw new OutOfMemoryError(); } this.bufferSize = bufferSize; + if (bufferSize > 0) + buffer = handle + Bzip2Impl.SIZEOF_BZ_STREAM; } @Override @@ -168,6 +172,21 @@ public class Bzip2Deflater extends Defla } @Override + public synchronized void setInput(Stream s) + throws IOException + { + if (handle == 0L) + throw new IllegalStateException(); + if (buffer == 0L) + throw new NullPointerException(); + if (Bzip2Impl.needsInput(handle)) { + int len = s.read(buffer, bufferSize); + if (len > 0) + Bzip2Impl.setInput3(handle, len); + } + } + + @Override public synchronized long getTotalIn() { if (handle == 0L) @@ -204,15 +223,19 @@ public class Bzip2Deflater extends Defla } @Override - public int deflate() + public int deflate(Stream s) throws InvalidDataException, - OutOfMemoryError + OutOfMemoryError, + IOException { - if (bufferSize == 0) + if (buffer == 0L) throw new NullPointerException(); if (handle == 0L) throw new IllegalStateException(); - return deflate0(handle); + int n = deflate0(handle); + if (n > 0) + n = s.write(buffer, n); + return n; } @Override Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Impl.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Impl.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Impl.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Impl.java Thu Aug 18 06:47:08 2011 @@ -58,7 +58,7 @@ final class Bzip2Impl public static native int setInput0(long handle, byte[] buf, int off, int len); public static native int setInput1(long handle, ByteBuffer buf, int off, int len); public static native int setInput2(long handle, long buf, int len); - public static native void setInput3(long handle); + public static native void setInput3(long handle, int len); public static native int getAvailIn(long handle); public static native long getAvailOut(long handle); Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2InflateStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2InflateStream.java?rev=1159060&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2InflateStream.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2InflateStream.java Thu Aug 18 06:47:08 2011 @@ -0,0 +1,170 @@ +/* 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.runtime.util.bzip2; + +import java.io.Closeable; +import java.io.IOException; +import java.nio.ByteBuffer; +import org.apache.commons.runtime.InvalidArgumentException; +import org.apache.commons.runtime.InvalidDataException; +import org.apache.commons.runtime.InvalidRangeException; +import org.apache.commons.runtime.OperationNotPermittedException; +import org.apache.commons.runtime.OverflowException; +import org.apache.commons.runtime.Pointer; +import org.apache.commons.runtime.Limits; +import org.apache.commons.runtime.io.Stream; +import org.apache.commons.runtime.io.FilterStream; +import org.apache.commons.runtime.io.OperationNotSupportedException; +import org.apache.commons.runtime.util.Inflater; +import org.apache.commons.runtime.util.InflateStream; + +/** + * Bzip2 decompressor stream. + * + * @author Mladen Turk + * @since Runtime 1.0 + */ +public final class Bzip2InflateStream extends InflateStream +{ + + /** + * Creates a new Bzip2 decompressor stream. + */ + public Bzip2InflateStream(Stream s) + { + this(s, new Bzip2Inflater(false, Limits.PAGESIZE)); + } + + /** + * Creates a new Bzip2 decompressor stream with the specified + * decompressor. + */ + public Bzip2InflateStream(Stream s, Inflater inf) + { + super(s, inf); + } + + @Override + public boolean canRead() + { + return true; + } + + @Override + public boolean canWrite() + { + return true; + } + + @Override + public boolean eof() + throws IOException + { + return inf.finished(); + } + + @Override + public int read() + throws IOException + { + throw new OperationNotSupportedException(); + } + + @Override + public int read(byte[] buffer, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + inf.setInput(stream); + return inf.inflate(buffer, offset, count); + } + + @Override + public int read(long address, int count) + throws NullPointerException, IndexOutOfBoundsException, IOException + { + inf.setInput(stream); + return inf.inflate(address, count); + } + + @Override + public int read(ByteBuffer buffer) + throws IndexOutOfBoundsException, IOException + { + inf.setInput(stream); + return inf.inflate(buffer); + } + + // === Writer methods + + @Override + public int write(int b) + throws IOException + { + throw new OperationNotSupportedException(); + } + + @Override + public int write(byte[] buffer, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + inf.setInput(buffer, offset, count); + return inf.inflate(stream); + } + + @Override + public int write(long address, int count) + throws IndexOutOfBoundsException, IOException + { + inf.setInput(address, count); + return inf.inflate(stream); + } + + @Override + public int write(ByteBuffer buffer) + throws IndexOutOfBoundsException, IOException + { + inf.setInput(buffer); + return inf.inflate(stream); + } + + @Override + public long write(byte[][] array, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + // Simulate vector write for now + long w = 0; + for (int i = 0; i < count; i++) { + inf.setInput(array[offset + i]); + w += inf.inflate(stream); + } + return w; + } + + @Override + public long write(ByteBuffer[] array, int offset, int count) + throws IndexOutOfBoundsException, IOException + { + // Simulate vector write for now + long w = 0; + for (int i = 0; i < count; i++) { + inf.setInput(array[offset + i]); + w += inf.inflate(stream); + } + return w; + } + +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2InflateStream.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Inflater.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Inflater.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Inflater.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/bzip2/Bzip2Inflater.java Thu Aug 18 06:47:08 2011 @@ -25,6 +25,7 @@ import org.apache.commons.runtime.Invali import org.apache.commons.runtime.OperationNotPermittedException; import org.apache.commons.runtime.OverflowException; import org.apache.commons.runtime.Pointer; +import org.apache.commons.runtime.io.Stream; import org.apache.commons.runtime.util.Inflater; /** @@ -37,6 +38,7 @@ public final class Bzip2Inflater extends { private long handle; + private long buffer; private int bufferSize; private static native int inflate0(long stream) @@ -93,6 +95,8 @@ public final class Bzip2Inflater extends throw new OutOfMemoryError(); } this.bufferSize = bufferSize; + if (bufferSize > 0) + buffer = handle + Bzip2Impl.SIZEOF_BZ_STREAM; } @Override @@ -160,6 +164,21 @@ public final class Bzip2Inflater extends } @Override + public void setInput(Stream s) + throws IOException + { + if (handle == 0L) + throw new IllegalStateException(); + if (buffer == 0L) + throw new NullPointerException(); + if (Bzip2Impl.needsInput(handle)) { + int len = s.read(buffer, bufferSize); + if (len > 0) + Bzip2Impl.setInput3(handle, len); + } + } + + @Override public synchronized long getTotalIn() { if (handle == 0L) @@ -176,15 +195,22 @@ public final class Bzip2Inflater extends } @Override - public int inflate() + public int inflate(Stream s) throws InvalidDataException, - OutOfMemoryError + OutOfMemoryError, + IOException { - if (bufferSize == 0) + if (buffer == 0L) throw new NullPointerException(); if (handle == 0L) throw new IllegalStateException(); - return inflate0(handle); + int n = 0; + int i; + do { + if ((i = inflate0(handle)) > 0) + n += s.write(buffer, i); + } while (i == bufferSize); + return n; } @Override Modified: commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c Thu Aug 18 06:47:08 2011 @@ -338,14 +338,18 @@ ACR_BZIP2_EXPORT(jint, Bzip2Impl, setInp return rc; } -ACR_BZIP2_EXPORT(void, Bzip2Impl, setInput3)(JNI_STDARGS, jlong stream) +ACR_BZIP2_EXPORT(void, Bzip2Impl, setInput3)(JNI_STDARGS, jlong stream, + jint len) { acr_bzstream *s = J2P(stream, acr_bzstream *); ACR_MFREE(s->next_array); /* Use internal buffer */ s->bz.next_in = ACR_BZBUFF(s); - s->bz.avail_in = s->blen; + if (len < 0) + s->bz.avail_in = s->blen; + else + s->bz.avail_in = len; } ACR_BZIP2_EXPORT(jlong, Bzip2Impl, getTotalIn)(JNI_STDARGS, jlong stream) Modified: commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java?rev=1159060&r1=1159059&r2=1159060&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java (original) +++ commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java Thu Aug 18 06:47:08 2011 @@ -76,4 +76,28 @@ public class TestBzip2 extends Assert bz.close(); } + @Test(groups = { "core" }) + public void bzInflater() + throws Exception + { + byte[] cd = loremIpsum.getBytes(); + byte[] dd = new byte[500]; + byte[] dc = new byte[50]; + + int sc = Bzip2.buffToBuffCompress(cd, 0, dd, 0, cd.length, 9, 30); + + Bzip2Inflater bz = new Bzip2Inflater(); + bz.setInput(dd); + + int i = 0; + int n; + do { + if ((n = bz.inflate(dc)) > 0) + i += n; + } while (n == dc.length); + assertTrue(bz.finished()); + assertEquals(i, loremIpsum.length()); + bz.close(); + } + }