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()");
     }
 
 }

Reply via email to