COMPRESS-445 make most CompressorInputs implement InputStatistics the sole exception is pack200 which is kind of special anyway
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/eee4d197 Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/eee4d197 Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/eee4d197 Branch: refs/heads/master Commit: eee4d197d25ad99614cb63445ea71557d6a75c43 Parents: a5103a8 Author: Stefan Bodewig <bode...@apache.org> Authored: Sun Apr 29 12:09:50 2018 +0200 Committer: Stefan Bodewig <bode...@apache.org> Committed: Sun Apr 29 12:09:50 2018 +0200 ---------------------------------------------------------------------- src/changes/changes.xml | 2 +- .../compressors/CompressorInputStream.java | 16 ++++++++++++ .../brotli/BrotliCompressorInputStream.java | 18 +++++++++++--- .../bzip2/BZip2CompressorInputStream.java | 8 ------ .../deflate/DeflateCompressorInputStream.java | 17 +++++++++++-- .../Deflate64CompressorInputStream.java | 8 ------ .../gzip/GzipCompressorInputStream.java | 26 ++++++++++++++++---- .../lz4/FramedLZ4CompressorInputStream.java | 17 ++++++++++--- .../AbstractLZ77CompressorInputStream.java | 17 ++++++++++--- .../lzma/LZMACompressorInputStream.java | 19 +++++++++++--- .../compressors/lzw/LZWInputStream.java | 8 ------ .../FramedSnappyCompressorInputStream.java | 20 +++++++++++++-- .../compressors/xz/XZCompressorInputStream.java | 22 ++++++++++++++--- .../zstandard/ZstdCompressorInputStream.java | 15 +++++++++-- 14 files changed, 161 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b2a65e8..7341f10 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -62,7 +62,7 @@ The <action> type attribute can be add,update,fix,remove. </action> <action issue="COMPRESS-445" type="update" date="2018-04-22" due-to="Andreas Beeker"> - The streams returned by ZipFile and some other decompressing + The streams returned by ZipFile and most other decompressing streams now provide information about the number of compressed and uncompressed bytes read so far. This may be used to detect a ZipBomb if the compression ratio exceeds a certain http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java index 8f30860..67de705 100644 --- a/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java @@ -77,4 +77,20 @@ public abstract class CompressorInputStream extends InputStream { public long getBytesRead() { return bytesRead; } + + /** + * Returns the amount of raw or compressed bytes read by the stream. + * + * <p>This implementation invokes {@link #getBytesRead}.</p> + * + * <p>Provides half of {@link + * org.apache.commons.compress.utils.InputStreamStatistics} + * without forcing subclasses to implement the other half.</p> + * + * @return the amount of decompressed bytes returned by the stream + * @since 1.17 + */ + public long getUncompressedCount() { + return getBytesRead(); + } } http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java index 5bb104b..5674cb2 100644 --- a/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java @@ -21,7 +21,10 @@ import java.io.IOException; import java.io.InputStream; import org.apache.commons.compress.compressors.CompressorInputStream; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; +import org.brotli.dec.BrotliInputStream; /** * {@link CompressorInputStream} implementation to decode Brotli encoded stream. @@ -29,12 +32,14 @@ import org.apache.commons.compress.utils.IOUtils; * * @since 1.14 */ -public class BrotliCompressorInputStream extends CompressorInputStream { +public class BrotliCompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { - private final org.brotli.dec.BrotliInputStream decIS; + private final CountingInputStream countingStream; + private final BrotliInputStream decIS; public BrotliCompressorInputStream(final InputStream in) throws IOException { - this.decIS = new org.brotli.dec.BrotliInputStream(in); + decIS = new BrotliInputStream(countingStream = new CountingInputStream(in)); } @Override @@ -91,4 +96,11 @@ public class BrotliCompressorInputStream extends CompressorInputStream { decIS.reset(); } + /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return countingStream.getBytesRead(); + } } http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java index 54457cf..97f6982 100644 --- a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java @@ -190,14 +190,6 @@ public class BZip2CompressorInputStream extends CompressorInputStream return bin.getBytesRead(); } - /** - * @since 1.17 - */ - @Override - public long getUncompressedCount() { - return getBytesRead(); - } - private void makeMaps() { final boolean[] inUse = this.data.inUse; final byte[] seqToUnseq = this.data.seqToUnseq; http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java index 789336e..0e07284 100644 --- a/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java @@ -24,19 +24,24 @@ import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import org.apache.commons.compress.compressors.CompressorInputStream; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * Deflate decompressor. * @since 1.9 */ -public class DeflateCompressorInputStream extends CompressorInputStream { +public class DeflateCompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { + private static final int MAGIC_1 = 0x78; private static final int MAGIC_2a = 0x01; private static final int MAGIC_2b = 0x5e; private static final int MAGIC_2c = 0x9c; private static final int MAGIC_2d = 0xda; + private final CountingInputStream countingStream; private final InputStream in; private final Inflater inflater; @@ -61,7 +66,7 @@ public class DeflateCompressorInputStream extends CompressorInputStream { public DeflateCompressorInputStream(final InputStream inputStream, final DeflateParameters parameters) { inflater = new Inflater(!parameters.withZlibHeader()); - in = new InflaterInputStream(inputStream, inflater); + in = new InflaterInputStream(countingStream = new CountingInputStream(inputStream), inflater); } /** {@inheritDoc} */ @@ -103,6 +108,14 @@ public class DeflateCompressorInputStream extends CompressorInputStream { } /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return countingStream.getBytesRead(); + } + + /** * Checks if the signature matches what is expected for a zlib / deflated file * with the zlib header. * http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java index a0efd35..883647b 100644 --- a/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java @@ -110,14 +110,6 @@ public class Deflate64CompressorInputStream extends CompressorInputStream implem return compressedBytesRead; } - /** - * @since 1.17 - */ - @Override - public long getUncompressedCount() { - return getBytesRead(); - } - private void closeDecoder() { closeQuietly(decoder); decoder = null; http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java index a63e4ea..9e05f8b 100644 --- a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java @@ -33,7 +33,9 @@ import java.util.zip.CRC32; import org.apache.commons.compress.compressors.CompressorInputStream; import org.apache.commons.compress.utils.ByteUtils; import org.apache.commons.compress.utils.CharsetNames; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * Input stream that decompresses .gz files. @@ -71,7 +73,9 @@ import org.apache.commons.compress.utils.IOUtils; * * @see "https://tools.ietf.org/html/rfc1952" */ -public class GzipCompressorInputStream extends CompressorInputStream { +public class GzipCompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { + // Header flags // private static final int FTEXT = 0x01; // Uninteresting for us private static final int FHCRC = 0x02; @@ -80,7 +84,10 @@ public class GzipCompressorInputStream extends CompressorInputStream { private static final int FCOMMENT = 0x10; private static final int FRESERVED = 0xE0; - // Compressed input stream, possibly wrapped in a BufferedInputStream + private final CountingInputStream countingStream; + + // Compressed input stream, possibly wrapped in a + // BufferedInputStream, always wrapped in countingStream above private final InputStream in; // True if decompressing multi member streams. @@ -147,12 +154,13 @@ public class GzipCompressorInputStream extends CompressorInputStream { public GzipCompressorInputStream(final InputStream inputStream, final boolean decompressConcatenated) throws IOException { + countingStream = new CountingInputStream(inputStream); // Mark support is strictly needed for concatenated files only, // but it's simpler if it is always available. - if (inputStream.markSupported()) { - in = inputStream; + if (countingStream.markSupported()) { + in = countingStream; } else { - in = new BufferedInputStream(inputStream); + in = new BufferedInputStream(countingStream); } this.decompressConcatenated = decompressConcatenated; @@ -386,4 +394,12 @@ public class GzipCompressorInputStream extends CompressorInputStream { this.in.close(); } } + + /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return countingStream.getBytesRead(); + } } http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java index 050deeb..c4c4f49 100644 --- a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java @@ -26,7 +26,9 @@ import org.apache.commons.compress.compressors.CompressorInputStream; import org.apache.commons.compress.utils.BoundedInputStream; import org.apache.commons.compress.utils.ByteUtils; import org.apache.commons.compress.utils.ChecksumCalculatingInputStream; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * CompressorInputStream for the LZ4 frame format. @@ -37,7 +39,8 @@ import org.apache.commons.compress.utils.IOUtils; * @since 1.14 * @NotThreadSafe */ -public class FramedLZ4CompressorInputStream extends CompressorInputStream { +public class FramedLZ4CompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { // used by FramedLZ4CompressorOutputStream as well static final byte[] LZ4_SIGNATURE = new byte[] { //NOSONAR @@ -67,7 +70,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream { } }; - private final InputStream in; + private final CountingInputStream in; private final boolean decompressConcatenated; private boolean expectBlockChecksum; @@ -109,7 +112,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream { * @throws IOException if reading fails */ public FramedLZ4CompressorInputStream(InputStream in, boolean decompressConcatenated) throws IOException { - this.in = in; + this.in = new CountingInputStream(in); this.decompressConcatenated = decompressConcatenated; init(true); } @@ -154,6 +157,14 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream { return r; } + /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return in.getBytesRead(); + } + private void init(boolean firstFrame) throws IOException { if (readSignature(firstFrame)) { readFrameDescriptor(); http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java index 13e5331..8a1371a 100644 --- a/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java @@ -24,7 +24,9 @@ import java.util.Arrays; import org.apache.commons.compress.compressors.CompressorInputStream; import org.apache.commons.compress.utils.ByteUtils; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * Encapsulates code common to LZ77 decompressors. @@ -72,7 +74,8 @@ import org.apache.commons.compress.utils.IOUtils; * * @since 1.14 */ -public abstract class AbstractLZ77CompressorInputStream extends CompressorInputStream { +public abstract class AbstractLZ77CompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { /** Size of the window - must be bigger than the biggest offset expected. */ private final int windowSize; @@ -94,7 +97,7 @@ public abstract class AbstractLZ77CompressorInputStream extends CompressorInputS private int readIndex; /** The underlying stream to read compressed data from */ - private final InputStream in; + private final CountingInputStream in; /** Number of bytes still to be read from the current literal or back-reference. */ private long bytesRemaining; @@ -129,7 +132,7 @@ public abstract class AbstractLZ77CompressorInputStream extends CompressorInputS * @throws IOException if reading fails */ public AbstractLZ77CompressorInputStream(final InputStream is, int windowSize) throws IOException { - this.in = is; + this.in = new CountingInputStream(is); this.windowSize = windowSize; buf = new byte[3 * windowSize]; writeIndex = readIndex = 0; @@ -187,6 +190,14 @@ public abstract class AbstractLZ77CompressorInputStream extends CompressorInputS } /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return in.getBytesRead(); + } + + /** * Used by subclasses to signal the next block contains the given * amount of literal data. * @param length the length of the block http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java index 13cc5a2..794e3a5 100644 --- a/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java @@ -25,13 +25,18 @@ import org.apache.commons.compress.MemoryLimitException; import org.tukaani.xz.LZMAInputStream; import org.apache.commons.compress.compressors.CompressorInputStream; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * LZMA decompressor. * @since 1.6 */ -public class LZMACompressorInputStream extends CompressorInputStream { +public class LZMACompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { + + private final CountingInputStream countingStream; private final InputStream in; /** @@ -48,7 +53,7 @@ public class LZMACompressorInputStream extends CompressorInputStream { */ public LZMACompressorInputStream(final InputStream inputStream) throws IOException { - in = new LZMAInputStream(inputStream, -1); + in = new LZMAInputStream(countingStream = new CountingInputStream(inputStream), -1); } /** @@ -71,7 +76,7 @@ public class LZMACompressorInputStream extends CompressorInputStream { public LZMACompressorInputStream(final InputStream inputStream, int memoryLimitInKb) throws IOException { try { - in = new LZMAInputStream(inputStream, memoryLimitInKb); + in = new LZMAInputStream(countingStream = new CountingInputStream(inputStream), memoryLimitInKb); } catch (org.tukaani.xz.MemoryLimitException e) { //convert to commons-compress exception throw new MemoryLimitException(e.getMemoryNeeded(), e.getMemoryLimit(), e); @@ -113,6 +118,14 @@ public class LZMACompressorInputStream extends CompressorInputStream { } /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return countingStream.getBytesRead(); + } + + /** * Checks if the signature matches what is expected for an lzma file. * * @param signature http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java index 9cdf680..a5e512c 100644 --- a/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java @@ -97,14 +97,6 @@ public abstract class LZWInputStream extends CompressorInputStream implements In } /** - * @since 1.17 - */ - @Override - public long getUncompressedCount() { - return getBytesRead(); - } - - /** * Read the next code and expand it. * @return the expanded next code * @throws IOException on error http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java index 56f9294..12974ab 100644 --- a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java @@ -26,7 +26,9 @@ import java.util.Arrays; import org.apache.commons.compress.compressors.CompressorInputStream; import org.apache.commons.compress.utils.BoundedInputStream; import org.apache.commons.compress.utils.ByteUtils; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * CompressorInputStream for the framing Snappy format. @@ -36,7 +38,8 @@ import org.apache.commons.compress.utils.IOUtils; * @see <a href="https://github.com/google/snappy/blob/master/framing_format.txt">Snappy framing format description</a> * @since 1.7 */ -public class FramedSnappyCompressorInputStream extends CompressorInputStream { +public class FramedSnappyCompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { /** * package private for tests only. @@ -58,6 +61,9 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream { 's', 'N', 'a', 'P', 'p', 'Y' }; + private long unreadBytes; + private final CountingInputStream countingStream; + /** The underlying stream to read compressed data from */ private final PushbackInputStream in; @@ -120,7 +126,8 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream { final int blockSize, final FramedSnappyDialect dialect) throws IOException { - this.in = new PushbackInputStream(in, 1); + countingStream = new CountingInputStream(in); + this.in = new PushbackInputStream(countingStream, 1); this.blockSize = blockSize; this.dialect = dialect; if (dialect.hasStreamIdentifier()) { @@ -171,6 +178,14 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream { } /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return countingStream.getBytesRead() - unreadBytes; + } + + /** * Read from the current chunk into the given array. * * @return -1 if there is no current chunk or the number of bytes @@ -213,6 +228,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream { endReached = true; } else if (type == STREAM_IDENTIFIER_TYPE) { in.unread(type); + unreadBytes++; pushedBackBytes(1); readStreamIdentifier(); readNextBlock(); http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java index 74460cb..20d67a1 100644 --- a/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java @@ -21,19 +21,24 @@ package org.apache.commons.compress.compressors.xz; import java.io.IOException; import java.io.InputStream; -import org.apache.commons.compress.MemoryLimitException; import org.tukaani.xz.XZ; import org.tukaani.xz.SingleXZInputStream; import org.tukaani.xz.XZInputStream; +import org.apache.commons.compress.MemoryLimitException; import org.apache.commons.compress.compressors.CompressorInputStream; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * XZ decompressor. * @since 1.4 */ -public class XZCompressorInputStream extends CompressorInputStream { +public class XZCompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { + + private final CountingInputStream countingStream; private final InputStream in; /** @@ -123,10 +128,11 @@ public class XZCompressorInputStream extends CompressorInputStream { public XZCompressorInputStream(InputStream inputStream, boolean decompressConcatenated, final int memoryLimitInKb) throws IOException { + countingStream = new CountingInputStream(inputStream); if (decompressConcatenated) { - in = new XZInputStream(inputStream, memoryLimitInKb); + in = new XZInputStream(countingStream, memoryLimitInKb); } else { - in = new SingleXZInputStream(inputStream, memoryLimitInKb); + in = new SingleXZInputStream(countingStream, memoryLimitInKb); } } @@ -172,4 +178,12 @@ public class XZCompressorInputStream extends CompressorInputStream { public void close() throws IOException { in.close(); } + + /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return countingStream.getBytesRead(); + } } http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java index 01db0ba..7a47f10 100644 --- a/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java @@ -23,7 +23,9 @@ import java.io.InputStream; import com.github.luben.zstd.ZstdInputStream; import org.apache.commons.compress.compressors.CompressorInputStream; +import org.apache.commons.compress.utils.CountingInputStream; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.InputStreamStatistics; /** * {@link CompressorInputStream} implementation to decode Zstandard encoded stream. @@ -31,12 +33,14 @@ import org.apache.commons.compress.utils.IOUtils; * * @since 1.16 */ -public class ZstdCompressorInputStream extends CompressorInputStream { +public class ZstdCompressorInputStream extends CompressorInputStream + implements InputStreamStatistics { + private final CountingInputStream countingStream; private final ZstdInputStream decIS; public ZstdCompressorInputStream(final InputStream in) throws IOException { - this.decIS = new ZstdInputStream(in); + this.decIS = new ZstdInputStream(countingStream = new CountingInputStream(in)); } @Override @@ -93,4 +97,11 @@ public class ZstdCompressorInputStream extends CompressorInputStream { decIS.reset(); } + /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return countingStream.getBytesRead(); + } }