This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
The following commit(s) were added to refs/heads/master by this push: new 8690f549b Deprecate ChecksumCalculatingInputStream in favor of java.util.zip.CheckedInputStream 8690f549b is described below commit 8690f549beb52ab49bf8bf778f2c4da9670346b4 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Thu Dec 28 10:30:22 2023 -0500 Deprecate ChecksumCalculatingInputStream in favor of java.util.zip.CheckedInputStream --- src/changes/changes.xml | 1 + .../lz4/FramedLZ4CompressorInputStream.java | 4 +- .../utils/ChecksumCalculatingInputStream.java | 64 ++++++---------------- .../utils/ChecksumCalculatingInputStreamTest.java | 57 ++++++++++++++++++- 4 files changed, 75 insertions(+), 51 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index e4f490ef6..c5fc299c8 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -61,6 +61,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="fix" dev="ggregory" due-to="Gary Gregory">Reuse Arrays.equals(byte[], byte[]) and deprecate ArchiveUtils.isEqual(byte[], byte[]).</action> <action type="fix" dev="ggregory" due-to="alumi, Gary Gregory">Add a null-check for the class loader of OsgiUtils #451.</action> <action type="fix" dev="ggregory" due-to="alumi, Gary Gregory">Add a null-check in Pack200.newInstance(String, String).</action> + <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate ChecksumCalculatingInputStream in favor of java.util.zip.CheckedInputStream.</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory">Bump commons-lang3 from 3.13.0 to 3.14.0.</action> <action type="update" dev="ggregory" due-to="Dependabot">Bump com.github.marschall:memoryfilesystem from 2.6.1 to 2.7.0 #444.</action> 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 387bddc6b..dc93a04c7 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 @@ -21,11 +21,11 @@ package org.apache.commons.compress.compressors.lz4; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; +import java.util.zip.CheckedInputStream; 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.IOUtils; import org.apache.commons.compress.utils.InputStreamStatistics; import org.apache.commons.io.input.CountingInputStream; @@ -210,7 +210,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream implem } InputStream capped = new BoundedInputStream(inputStream, realLen); if (expectBlockChecksum) { - capped = new ChecksumCalculatingInputStream(blockHash, capped); + capped = new CheckedInputStream(capped, blockHash); } if (uncompressed) { inUncompressed = true; diff --git a/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java b/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java index 71834c73f..3d7bf3369 100644 --- a/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java +++ b/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java @@ -16,10 +16,9 @@ */ package org.apache.commons.compress.utils; -import java.io.FilterInputStream; -import java.io.IOException; import java.io.InputStream; import java.util.Objects; +import java.util.zip.CheckedInputStream; import java.util.zip.Checksum; /** @@ -27,62 +26,33 @@ import java.util.zip.Checksum; * * @NotThreadSafe * @since 1.14 + * @deprecated Use {@link CheckedInputStream}. */ -public class ChecksumCalculatingInputStream extends FilterInputStream { - private final Checksum checksum; +@Deprecated +public class ChecksumCalculatingInputStream extends CheckedInputStream { + /** + * Constructs a new instance. + * + * @param checksum The checksum to update + * @param inputStream The input stream to read. + * @deprecated Use {@link CheckedInputStream#CheckedInputStream(InputStream, Checksum)}. + */ + @Deprecated + @SuppressWarnings("resource") public ChecksumCalculatingInputStream(final Checksum checksum, final InputStream inputStream) { - super(Objects.requireNonNull(inputStream, "inputStream")); - this.checksum = Objects.requireNonNull(checksum, "checksum"); + super(Objects.requireNonNull(inputStream, "inputStream"), Objects.requireNonNull(checksum, "checksum")); } /** * Returns the calculated checksum. * * @return the calculated checksum. + * @deprecated Use {@link CheckedInputStream#getChecksum()} and {@link Checksum#getValue()}. */ + @Deprecated public long getValue() { - return checksum.getValue(); - } - - /** - * Reads a single byte from the stream - * - * @throws IOException if the underlying stream throws or the stream is exhausted and the Checksum doesn't match the expected value - */ - @Override - public int read() throws IOException { - final int data = in.read(); - if (data >= 0) { - checksum.update(data); - } - return data; - } - - /** - * Reads from the stream into a byte array. - * - * @throws IOException if the underlying stream throws or the stream is exhausted and the Checksum doesn't match the expected value - */ - @Override - public int read(final byte[] b, final int off, final int len) throws IOException { - if (len == 0) { - return 0; - } - final int readCount = in.read(b, off, len); - if (readCount >= 0) { - checksum.update(b, off, readCount); - } - return readCount; - } - - @Override - public long skip(final long n) throws IOException { - // Can't really skip, we have to hash everything to verify the checksum - if (read() >= 0) { - return 1; - } - return 0; + return getChecksum().getValue(); } } diff --git a/src/test/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStreamTest.java b/src/test/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStreamTest.java index 6463b1e4d..28d3d04a2 100644 --- a/src/test/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStreamTest.java @@ -25,6 +25,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.zip.Adler32; import java.util.zip.CRC32; +import java.util.zip.CheckedInputStream; import org.junit.jupiter.api.Test; @@ -63,6 +64,19 @@ public class ChecksumCalculatingInputStreamTest { } } + @Test + public void testReadTakingByteArraySanityCheck() throws IOException { + final Adler32 adler32 = new Adler32(); + final byte[] byteArray = new byte[6]; + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); + try (CheckedInputStream checksumCalculatingInputStream = new CheckedInputStream(byteArrayInputStream, adler32)) { + final int readResult = checksumCalculatingInputStream.read(byteArray); + assertEquals(6, readResult); + assertEquals(0, byteArrayInputStream.available()); + assertEquals(393217L, checksumCalculatingInputStream.getChecksum().getValue()); + } + } + @Test public void testReadTakingNoArguments() throws IOException { final Adler32 adler32 = new Adler32(); @@ -79,6 +93,22 @@ public class ChecksumCalculatingInputStreamTest { } } + @Test + public void testReadTakingNoArgumentsSanityCheck() throws IOException { + final Adler32 adler32 = new Adler32(); + final byte[] byteArray = new byte[6]; + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); + final CheckedInputStream checksumCalculatingInputStream = new CheckedInputStream(byteArrayInputStream, adler32); + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(checksumCalculatingInputStream)) { + final int inputStreamReadResult = bufferedInputStream.read(byteArray, 0, 1); + final int checkSumCalculationReadResult = checksumCalculatingInputStream.read(); + assertNotEquals(checkSumCalculationReadResult, inputStreamReadResult); + assertEquals(-1, checkSumCalculationReadResult); + assertEquals(0, byteArrayInputStream.available()); + assertEquals(393217L, checksumCalculatingInputStream.getChecksum().getValue()); + } + } + @Test public void testSkipReturningPositive() throws IOException { final Adler32 adler32 = new Adler32(); @@ -86,8 +116,20 @@ public class ChecksumCalculatingInputStreamTest { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); try (ChecksumCalculatingInputStream checksumCalculatingInputStream = new ChecksumCalculatingInputStream(adler32, byteArrayInputStream)) { final long skipResult = checksumCalculatingInputStream.skip((byte) 0); - assertEquals(1L, skipResult); - assertEquals(65537L, checksumCalculatingInputStream.getValue()); + assertEquals(0, skipResult); + assertEquals(1, checksumCalculatingInputStream.getValue()); + } + } + + @Test + public void testSkipReturningPositiveSanityCheck() throws IOException { + final Adler32 adler32 = new Adler32(); + final byte[] byteArray = new byte[6]; + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); + try (CheckedInputStream checksumCalculatingInputStream = new CheckedInputStream(byteArrayInputStream, adler32)) { + final long skipResult = checksumCalculatingInputStream.skip((byte) 0); + assertEquals(0, skipResult); + assertEquals(1, checksumCalculatingInputStream.getChecksum().getValue()); } } @@ -102,4 +144,15 @@ public class ChecksumCalculatingInputStreamTest { } } + @Test + public void testSkipReturningZeroSanityCheck() throws IOException { + final Adler32 adler32 = new Adler32(); + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(ByteUtils.EMPTY_BYTE_ARRAY); + try (CheckedInputStream checksumCalculatingInputStream = new CheckedInputStream(byteArrayInputStream, adler32)) { + final long skipResult = checksumCalculatingInputStream.skip(60L); + assertEquals(0L, skipResult); + assertEquals(1L, checksumCalculatingInputStream.getChecksum().getValue()); + } + } + }