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 fe6d3c934 Add CloseShieldInputStream.systemIn(InputStream) fe6d3c934 is described below commit fe6d3c934d69e55ec720c6b0f0876cb6a3dce54b Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Fri Jul 5 11:40:39 2024 -0400 Add CloseShieldInputStream.systemIn(InputStream) --- src/changes/changes.xml | 1 + .../commons/io/input/CloseShieldInputStream.java | 11 +++++++++ .../io/input/CloseShieldInputStreamTest.java | 27 ++++++++++++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 34101750a..5e1b6fe8c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -51,6 +51,7 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="add" due-to="Gary Gregory">Add IOIterator.adapt(Iterable).</action> <action dev="ggregory" type="add" issue="IO-831" due-to="Elliotte Rusty Harold, Thach Le, Gary Gregory">Add getInputStream() for 'https' and 'http' in URIOrigin #630.</action> <action dev="ggregory" type="add" due-to="Gary Gregory">Add IOSupplier.getUnchecked().</action> + <action dev="ggregory" type="add" due-to="Gary Gregory">Add CloseShieldInputStream.systemIn(InputStream).</action> <!-- FIX --> <action dev="ggregory" type="fix" due-to="Gary Gregory">Add missing unit tests.</action> <action dev="ggregory" type="fix" due-to="Gary Gregory">FileUtils.lastModifiedFileTime(File) calls Objects.requireNonNull() on the wrong object.</action> diff --git a/src/main/java/org/apache/commons/io/input/CloseShieldInputStream.java b/src/main/java/org/apache/commons/io/input/CloseShieldInputStream.java index 03521d90e..8ca2e16dd 100644 --- a/src/main/java/org/apache/commons/io/input/CloseShieldInputStream.java +++ b/src/main/java/org/apache/commons/io/input/CloseShieldInputStream.java @@ -30,6 +30,17 @@ import java.io.InputStream; */ public class CloseShieldInputStream extends ProxyInputStream { + /** + * Constructs a proxy that only shields {@code System.in} from being closed. + * + * @param inputStream the input stream to wrap + * @return the created proxy + * @since 2.17.0 + */ + public static InputStream systemIn(final InputStream inputStream) { + return inputStream == System.in ? wrap(inputStream) : inputStream; + } + /** * Constructs a proxy that shields the given input stream from being closed. * diff --git a/src/test/java/org/apache/commons/io/input/CloseShieldInputStreamTest.java b/src/test/java/org/apache/commons/io/input/CloseShieldInputStreamTest.java index a839242cf..7fdc7e9bd 100644 --- a/src/test/java/org/apache/commons/io/input/CloseShieldInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/CloseShieldInputStreamTest.java @@ -18,6 +18,7 @@ package org.apache.commons.io.input; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -33,7 +34,7 @@ public class CloseShieldInputStreamTest { private byte[] data; - private InputStream original; + private InputStream byteArrayInputStream; private InputStream shielded; @@ -42,22 +43,40 @@ public class CloseShieldInputStreamTest { @BeforeEach public void setUp() { data = new byte[] { 'x', 'y', 'z' }; - original = new ByteArrayInputStream(data) { + byteArrayInputStream = new ByteArrayInputStream(data) { @Override public void close() { closed = true; } }; - shielded = CloseShieldInputStream.wrap(original); closed = false; } @Test public void testClose() throws IOException { + shielded = CloseShieldInputStream.wrap(byteArrayInputStream); shielded.close(); assertFalse(closed, "closed"); assertEquals(-1, shielded.read(), "read()"); - assertEquals(data[0], original.read(), "read()"); + assertEquals(data[0], byteArrayInputStream.read(), "read()"); + } + + @Test + public void testSystemInOnSystemInNo() throws IOException { + shielded = CloseShieldInputStream.systemIn(byteArrayInputStream); + shielded.close(); + assertTrue(closed, "closed"); + assertEquals(data[0], shielded.read(), "read()"); + assertEquals(data[1], byteArrayInputStream.read(), "read()"); + } + + @Test + public void testSystemInOnSystemInYes() throws IOException { + shielded = CloseShieldInputStream.systemIn(System.in); + shielded.close(); + assertFalse(closed, "closed"); + assertEquals(-1, shielded.read(), "read()"); + assertEquals(data[0], byteArrayInputStream.read(), "read()"); } }