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 d428a080 [IO-829] Don't decode and reencode characters in a 
potentially different charset in 
AbstractOrigin.CharSequenceOrigin.getReader(Charset)
d428a080 is described below

commit d428a080db16298ad1daa63a205e7c4f0c5bd932
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Thu Dec 28 08:23:33 2023 -0500

    [IO-829] Don't decode and reencode characters in a potentially different
    charset in AbstractOrigin.CharSequenceOrigin.getReader(Charset)
    
    - Add unit test
    - Javadoc
    - Use API internally
---
 src/changes/changes.xml                                |  1 +
 .../org/apache/commons/io/build/AbstractOrigin.java    | 16 ++++++++++++++--
 .../commons/io/build/CharSequenceOriginTest.java       | 18 +++++++++++++++++-
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 76f0c630..2cf58617 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -83,6 +83,7 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="fix" issue="IO-828" due-to="Gary 
Gregory">Deprecate CountingInputStream.getMaxLength() in favor of 
getMaxCount()).</action>
       <action dev="ggregory" type="fix" issue="IO-818" due-to="Gary 
Gregory">NullInputStream breaks InputStream's read method contract.</action>
       <action dev="ggregory" type="fix"                due-to="Elliotte Rusty 
Harold">Javadoc shouldn't reference 1.x behavior #539.</action>
+      <action dev="ggregory" type="fix" issue="IO-829" due-to="Elliotte Rusty 
Harold, Gary Gregory">Don't decode and reencode characters in a potentially 
different charset in 
AbstractOrigin.CharSequenceOrigin.getReader(Charset).</action>
       <!-- Add -->
       <action dev="ggregory" type="add"                due-to="Gary 
Gregory">Add and use PathUtils.getFileName(Path, Function&lt;Path, 
R&gt;).</action>
       <action dev="ggregory" type="add"                due-to="Gary 
Gregory">Add and use PathUtils.getFileNameString().</action>
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 479a54d5..ddf1936d 100644
--- a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java
+++ b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java
@@ -115,6 +115,12 @@ public abstract class AbstractOrigin<T, B extends 
AbstractOrigin<T, B>> extends
             return origin.toString().getBytes(Charset.defaultCharset());
         }
 
+        /**
+         * {@inheritDoc}
+         * <p>
+         * In this case, the {@code charset} parameter is ignored, since a 
{@link CharSequence} does not need a {@link Charset} to be read.
+         * </p>
+         */
         @Override
         public CharSequence getCharSequence(final Charset charset) {
             // No conversion
@@ -127,9 +133,15 @@ public abstract class AbstractOrigin<T, B extends 
AbstractOrigin<T, B>> extends
             return 
CharSequenceInputStream.builder().setCharSequence(getCharSequence(Charset.defaultCharset())).get();
         }
 
+        /**
+         * {@inheritDoc}
+         * <p>
+         * In this case, the {@code charset} parameter is ignored, since a 
{@link CharSequence} does not need a {@link Charset} to be read.
+         * </p>
+         */
         @Override
-        public Reader getReader(final Charset charset) throws IOException {
-            return new CharSequenceReader(origin);
+        public Reader getReader(final Charset ignore) throws IOException {
+            return new CharSequenceReader(get());
         }
 
         @Override
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 f506047e..d1361b32 100644
--- a/src/test/java/org/apache/commons/io/build/CharSequenceOriginTest.java
+++ b/src/test/java/org/apache/commons/io/build/CharSequenceOriginTest.java
@@ -16,10 +16,13 @@
  */
 package org.apache.commons.io.build;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.io.IOUtils;
@@ -36,10 +39,14 @@ public class CharSequenceOriginTest extends 
AbstractOriginTest<CharSequence, Cha
 
     @BeforeEach
     public void beforeEach() throws FileNotFoundException, IOException {
-        setOriginRo(new 
CharSequenceOrigin(IOUtils.resourceToString(FILE_RES_RO, 
StandardCharsets.UTF_8)));
+        setOriginRo(new CharSequenceOrigin(getFixtureStringFromFile()));
         setOriginRw(new CharSequenceOrigin("World"));
     }
 
+    private String getFixtureStringFromFile() throws IOException {
+        return IOUtils.resourceToString(FILE_RES_RO, StandardCharsets.UTF_8);
+    }
+
     @Override
     @Test
     public void testGetFile() {
@@ -61,6 +68,15 @@ public class CharSequenceOriginTest extends 
AbstractOriginTest<CharSequence, Cha
         assertThrows(UnsupportedOperationException.class, super::testGetPath);
     }
 
+    @Test
+    public void testGetReaderIgnoreCharset() throws IOException {
+        // The CharSequenceOrigin ignores the given Charset.
+        try (final Reader reader = 
getOriginRo().getReader(StandardCharsets.UTF_16LE)) {
+            assertNotNull(reader);
+            assertEquals(getFixtureStringFromFile(), IOUtils.toString(reader));
+        }
+    }
+
     @Override
     @Test
     public void testGetWriter() {

Reply via email to