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() {

Reply via email to