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-io.git
The following commit(s) were added to refs/heads/master by this push: new 6a710422 Add AbstractOrigin.getByteArray(long, int). 6a710422 is described below commit 6a7104223ef3b4f43e62ac3de0bb6126ed522964 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Thu May 25 17:55:06 2023 -0400 Add AbstractOrigin.getByteArray(long, int). --- src/changes/changes.xml | 3 +++ .../apache/commons/io/build/AbstractOrigin.java | 22 ++++++++++++++++++++++ .../commons/io/build/AbstractOriginTest.java | 19 ++++++++++++++++++- .../commons/io/build/ByteArrayOriginTest.java | 8 ++++++-- .../commons/io/build/CharSequenceOriginTest.java | 9 +++++++-- .../commons/io/build/InputStreamOriginTest.java | 6 ++++-- .../commons/io/build/OutputStreamOriginTest.java | 21 +++++++++++++++++++++ .../apache/commons/io/build/ReaderOriginTest.java | 6 ++++-- .../commons/io/build/WriterStreamOriginTest.java | 21 +++++++++++++++++++++ 9 files changed, 106 insertions(+), 9 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 7fcaccea..08dd417f 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -71,6 +71,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="add" due-to="Gary Gregory"> Add some missing conversions to AbstractOrigin subclasses. </action> + <action dev="ggregory" type="add" due-to="Gary Gregory"> + Add AbstractOrigin.getByteArray(long, int). + </action> <!-- UPDATE --> <action dev="ggregory" type="update" due-to="Gary Gregory, Dependabot"> Bump commons-parent from 57 to 58. diff --git a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java index f2acd8a3..7e79c360 100644 --- a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java +++ b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java @@ -32,6 +32,7 @@ import java.nio.file.Files; import java.nio.file.OpenOption; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; import java.util.Objects; import org.apache.commons.io.IOUtils; @@ -381,6 +382,27 @@ public abstract class AbstractOrigin<T, B extends AbstractOrigin<T, B>> extends return Files.readAllBytes(getPath()); } + /** + * Gets this origin as a byte array, if possible. + * + * @param from the initial index of the range to be copied, inclusive. + * @param length How many bytes to copy. + * @return this origin as a byte array, if possible. + * @throws IOException if an I/O error occurs. + * @throws UnsupportedOperationException if the origin cannot be converted to a Path. + * @since 2.13.0 + */ + public byte[] getByteArray(final long from, final int length) throws IOException { + final byte[] bytes = getByteArray(); + final int start = (int) from; + // We include a separate check for int overflow. + if (start < 0 || length < 0 || start + length < 0 || start + length > bytes.length) { + throw new IllegalArgumentException("Couldn't read array (start: " + start + ", length: " + length + + ", data length: " + bytes.length + ")."); + } + return Arrays.copyOfRange(bytes, start, start + length); + } + /** * Gets this origin as a byte array, if possible. * diff --git a/src/test/java/org/apache/commons/io/build/AbstractOriginTest.java b/src/test/java/org/apache/commons/io/build/AbstractOriginTest.java index c9412fcb..cc60644e 100644 --- a/src/test/java/org/apache/commons/io/build/AbstractOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/AbstractOriginTest.java @@ -16,6 +16,7 @@ */ package org.apache.commons.io.build; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import java.io.IOException; @@ -36,7 +37,8 @@ import org.junit.jupiter.api.Test; */ public abstract class AbstractOriginTest<T, B extends AbstractOrigin<T, B>> { - protected static final String FILE_NAME_RO = "src/test/resources/org/apache/commons/io/test-file-20byteslength.bin"; + protected static final String FILE_RES_RO = "/org/apache/commons/io/test-file-20byteslength.bin"; + protected static final String FILE_NAME_RO = "src/test/resources" + FILE_RES_RO; protected static final String FILE_NAME_RW = "target/" + AbstractOriginTest.class.getSimpleName() + ".txt"; protected AbstractOrigin<T, B> originRo; @@ -63,6 +65,21 @@ public abstract class AbstractOriginTest<T, B extends AbstractOrigin<T, B>> { assertNotNull(getOriginRo().getByteArray()); } + @Test + public void testGetByteArrayAt_0_0() throws IOException { + assertArrayEquals(new byte[] {}, getOriginRo().getByteArray(0, 0)); + } + + @Test + public void testGetByteArrayAt_0_1() throws IOException { + assertArrayEquals(new byte[] { '1' }, getOriginRo().getByteArray(0, 1)); + } + + @Test + public void testGetByteArrayAt_1_1() throws IOException { + assertArrayEquals(new byte[] { '2' }, getOriginRo().getByteArray(1, 1)); + } + @Test public void testGetCharSequence() throws IOException { assertNotNull(getOriginRo().getCharSequence(Charset.defaultCharset())); diff --git a/src/test/java/org/apache/commons/io/build/ByteArrayOriginTest.java b/src/test/java/org/apache/commons/io/build/ByteArrayOriginTest.java index 6a432d56..9653d8b6 100644 --- a/src/test/java/org/apache/commons/io/build/ByteArrayOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/ByteArrayOriginTest.java @@ -18,6 +18,10 @@ package org.apache.commons.io.build; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -30,8 +34,8 @@ import org.junit.jupiter.api.Test; public class ByteArrayOriginTest extends AbstractOriginTest<byte[], ByteArrayOrigin> { @BeforeEach - public void beforeEach() { - setOriginRo(new ByteArrayOrigin(new byte[] { 0 })); + public void beforeEach() throws IOException { + setOriginRo(new ByteArrayOrigin(Files.readAllBytes(Paths.get(FILE_NAME_RO)))); setOriginRw(new ByteArrayOrigin(new byte[] { 1 })); } diff --git a/src/test/java/org/apache/commons/io/build/CharSequenceOriginTest.java b/src/test/java/org/apache/commons/io/build/CharSequenceOriginTest.java index ae6315ca..f506047e 100644 --- a/src/test/java/org/apache/commons/io/build/CharSequenceOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/CharSequenceOriginTest.java @@ -18,6 +18,11 @@ package org.apache.commons.io.build; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; import org.apache.commons.io.build.AbstractOrigin.CharSequenceOrigin; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -30,8 +35,8 @@ import org.junit.jupiter.api.Test; public class CharSequenceOriginTest extends AbstractOriginTest<CharSequence, CharSequenceOrigin> { @BeforeEach - public void beforeEach() { - setOriginRo(new CharSequenceOrigin("Hello")); + public void beforeEach() throws FileNotFoundException, IOException { + setOriginRo(new CharSequenceOrigin(IOUtils.resourceToString(FILE_RES_RO, StandardCharsets.UTF_8))); setOriginRw(new CharSequenceOrigin("World")); } diff --git a/src/test/java/org/apache/commons/io/build/InputStreamOriginTest.java b/src/test/java/org/apache/commons/io/build/InputStreamOriginTest.java index 7228b7b1..2d2f1b3a 100644 --- a/src/test/java/org/apache/commons/io/build/InputStreamOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/InputStreamOriginTest.java @@ -18,6 +18,8 @@ package org.apache.commons.io.build; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.InputStream; import org.apache.commons.io.build.AbstractOrigin.InputStreamOrigin; @@ -34,8 +36,8 @@ public class InputStreamOriginTest extends AbstractOriginTest<InputStream, Input @SuppressWarnings("resource") @BeforeEach - public void beforeEach() { - setOriginRo(new InputStreamOrigin(CharSequenceInputStream.builder().setCharSequence("Hello").get())); + public void beforeEach() throws FileNotFoundException { + setOriginRo(new InputStreamOrigin(new FileInputStream(FILE_NAME_RO))); setOriginRw(new InputStreamOrigin(CharSequenceInputStream.builder().setCharSequence("World").get())); } diff --git a/src/test/java/org/apache/commons/io/build/OutputStreamOriginTest.java b/src/test/java/org/apache/commons/io/build/OutputStreamOriginTest.java index 1a77fd48..231fc3c6 100644 --- a/src/test/java/org/apache/commons/io/build/OutputStreamOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/OutputStreamOriginTest.java @@ -46,6 +46,27 @@ public class OutputStreamOriginTest extends AbstractOriginTest<OutputStream, Out assertThrows(UnsupportedOperationException.class, super::testGetByteArray); } + @Override + @Test + public void testGetByteArrayAt_0_0() { + // Cannot convert a OutputStream to a byte[]. + assertThrows(UnsupportedOperationException.class, super::testGetByteArrayAt_0_0); + } + + @Override + @Test + public void testGetByteArrayAt_0_1() { + // Cannot convert a OutputStream to a byte[]. + assertThrows(UnsupportedOperationException.class, super::testGetByteArrayAt_0_1); + } + + @Override + @Test + public void testGetByteArrayAt_1_1() { + // Cannot convert a OutputStream to a byte[]. + assertThrows(UnsupportedOperationException.class, super::testGetByteArrayAt_1_1); + } + @Override @Test public void testGetCharSequence() { diff --git a/src/test/java/org/apache/commons/io/build/ReaderOriginTest.java b/src/test/java/org/apache/commons/io/build/ReaderOriginTest.java index 10af055b..d63cb86a 100644 --- a/src/test/java/org/apache/commons/io/build/ReaderOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/ReaderOriginTest.java @@ -18,6 +18,8 @@ package org.apache.commons.io.build; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.Reader; import org.apache.commons.io.build.AbstractOrigin.ReaderOrigin; @@ -34,8 +36,8 @@ public class ReaderOriginTest extends AbstractOriginTest<Reader, ReaderOrigin> { @SuppressWarnings("resource") @BeforeEach - public void beforeEach() { - setOriginRo(new ReaderOrigin(new CharSequenceReader("Hello"))); + public void beforeEach() throws FileNotFoundException { + setOriginRo(new ReaderOrigin(new FileReader(FILE_NAME_RO))); setOriginRw(new ReaderOrigin(new CharSequenceReader("World"))); } diff --git a/src/test/java/org/apache/commons/io/build/WriterStreamOriginTest.java b/src/test/java/org/apache/commons/io/build/WriterStreamOriginTest.java index 1037f922..36e703dc 100644 --- a/src/test/java/org/apache/commons/io/build/WriterStreamOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/WriterStreamOriginTest.java @@ -45,6 +45,27 @@ public class WriterStreamOriginTest extends AbstractOriginTest<Writer, WriterOri assertThrows(UnsupportedOperationException.class, super::testGetByteArray); } + @Override + @Test + public void testGetByteArrayAt_0_0() { + // Cannot convert a OutputStream to a byte[]. + assertThrows(UnsupportedOperationException.class, super::testGetByteArrayAt_0_0); + } + + @Override + @Test + public void testGetByteArrayAt_0_1() { + // Cannot convert a OutputStream to a byte[]. + assertThrows(UnsupportedOperationException.class, super::testGetByteArrayAt_0_1); + } + + @Override + @Test + public void testGetByteArrayAt_1_1() { + // Cannot convert a OutputStream to a byte[]. + assertThrows(UnsupportedOperationException.class, super::testGetByteArrayAt_1_1); + } + @Override @Test public void testGetCharSequence() {