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<Path, R>).</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() {