| @@ -23,7 +23,6 @@ import java.util.Collections; | |||||
| import java.util.HashSet; | import java.util.HashSet; | ||||
| import java.util.LinkedHashSet; | import java.util.LinkedHashSet; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.Optional; | |||||
| import java.util.Set; | import java.util.Set; | ||||
| import java.util.stream.Stream; | import java.util.stream.Stream; | ||||
| @@ -20,6 +20,7 @@ package org.apache.tools.ant.util; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.io.Reader; | import java.io.Reader; | ||||
| import java.nio.charset.Charset; | |||||
| /** | /** | ||||
| * Adapts a <code>Reader</code> as an <code>InputStream</code>. | * Adapts a <code>Reader</code> as an <code>InputStream</code>. | ||||
| @@ -64,6 +65,22 @@ public class ReaderInputStream extends InputStream { | |||||
| this.encoding = encoding; | this.encoding = encoding; | ||||
| } | } | ||||
| /** | |||||
| * Construct a <code>ReaderInputStream</code> | |||||
| * for the specified <code>Reader</code>, | |||||
| * with the specified encoding. | |||||
| * | |||||
| * @param reader non-null <code>Reader</code>. | |||||
| * @param charset non-null <code>Charset</code> charset. | |||||
| */ | |||||
| public ReaderInputStream(Reader reader, Charset charset) { | |||||
| this(reader); | |||||
| if (charset == null) { | |||||
| throw new IllegalArgumentException("encoding must not be null"); | |||||
| } | |||||
| this.encoding = charset.name(); | |||||
| } | |||||
| /** | /** | ||||
| * Reads from the <code>Reader</code>, returning the same value. | * Reads from the <code>Reader</code>, returning the same value. | ||||
| * | * | ||||
| @@ -105,8 +122,7 @@ public class ReaderInputStream extends InputStream { | |||||
| * @exception IOException if an error occurs | * @exception IOException if an error occurs | ||||
| */ | */ | ||||
| @Override | @Override | ||||
| public synchronized int read(byte[] b, int off, int len) | |||||
| throws IOException { | |||||
| public synchronized int read(byte[] b, int off, int len) throws IOException { | |||||
| if (in == null) { | if (in == null) { | ||||
| throw new IOException("Stream Closed"); | throw new IOException("Stream Closed"); | ||||
| } | } | ||||
| @@ -24,15 +24,17 @@ import java.io.FileInputStream; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStreamReader; | import java.io.InputStreamReader; | ||||
| import java.io.PrintStream; | import java.io.PrintStream; | ||||
| import java.nio.charset.Charset; | |||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
| import org.apache.tools.ant.DefaultLogger; | import org.apache.tools.ant.DefaultLogger; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| import org.junit.After; | |||||
| import org.junit.Before; | import org.junit.Before; | ||||
| import org.junit.Rule; | |||||
| import org.junit.Test; | import org.junit.Test; | ||||
| import org.junit.rules.TemporaryFolder; | |||||
| import static org.apache.tools.ant.util.FileUtils.readFully; | |||||
| import static org.junit.Assert.assertEquals; | import static org.junit.Assert.assertEquals; | ||||
| /** | /** | ||||
| @@ -40,12 +42,13 @@ import static org.junit.Assert.assertEquals; | |||||
| */ | */ | ||||
| public class EchoTest { | public class EchoTest { | ||||
| @Rule | |||||
| public TemporaryFolder folder = new TemporaryFolder(); | |||||
| private EchoTestLogger logger; | private EchoTestLogger logger; | ||||
| private Echo echo; | private Echo echo; | ||||
| private File removeThis; | |||||
| @Before | @Before | ||||
| public void setUp() { | public void setUp() { | ||||
| Project p = new Project(); | Project p = new Project(); | ||||
| @@ -56,13 +59,6 @@ public class EchoTest { | |||||
| echo.setProject(p); | echo.setProject(p); | ||||
| } | } | ||||
| @After | |||||
| public void tearDown() { | |||||
| if (removeThis != null && removeThis.exists() && !removeThis.delete()) { | |||||
| removeThis.deleteOnExit(); | |||||
| } | |||||
| } | |||||
| @Test | @Test | ||||
| public void testLogBlankEcho() { | public void testLogBlankEcho() { | ||||
| echo.setTaskName("testLogBlankEcho"); | echo.setTaskName("testLogBlankEcho"); | ||||
| @@ -72,14 +68,17 @@ public class EchoTest { | |||||
| @Test | @Test | ||||
| public void testLogUTF8Echo() throws IOException { | public void testLogUTF8Echo() throws IOException { | ||||
| File removeThis = folder.newFile("abc.txt"); | |||||
| Charset cs = StandardCharsets.UTF_8; | |||||
| String msg = "\u00e4\u00a9"; | |||||
| echo.setTaskName("testLogUTF8Echo"); | echo.setTaskName("testLogUTF8Echo"); | ||||
| echo.setMessage("\u00e4\u00a9"); | |||||
| removeThis = new File("abc.txt"); | |||||
| echo.setMessage(msg); | |||||
| echo.setFile(removeThis); | echo.setFile(removeThis); | ||||
| echo.setEncoding("UTF-8"); | |||||
| echo.setEncoding(cs.name()); | |||||
| echo.execute(); | echo.execute(); | ||||
| String x = FileUtils.readFully(new InputStreamReader(new FileInputStream(removeThis), StandardCharsets.UTF_8)); | |||||
| assertEquals(x, "\u00e4\u00a9"); | |||||
| assertEquals(msg, readFully(new InputStreamReader(new FileInputStream(removeThis), cs))); | |||||
| } | } | ||||
| private class EchoTestLogger extends DefaultLogger { | private class EchoTestLogger extends DefaultLogger { | ||||
| @@ -89,40 +89,32 @@ public class ReaderInputStreamTest { | |||||
| @Test | @Test | ||||
| public void testIso88591ToUtf8() throws Exception { | public void testIso88591ToUtf8() throws Exception { | ||||
| InputStreamReader fin = null; | |||||
| ReaderInputStream r = null; | |||||
| FileInputStream utf8 = null; | |||||
| try { | |||||
| fin = new InputStreamReader(new FileInputStream(new File(ROOT, | |||||
| "src/tests/antunit/taskdefs/exec/input/iso8859-1")), "ISO8859_1"); | |||||
| r = new ReaderInputStream(fin, "UTF8"); | |||||
| ByteArrayOutputStream actualOS = new ByteArrayOutputStream(); | |||||
| ByteArrayOutputStream actualOS = new ByteArrayOutputStream(); | |||||
| try (ReaderInputStream r = new ReaderInputStream(new InputStreamReader(new FileInputStream(new File(ROOT, | |||||
| "src/tests/antunit/taskdefs/exec/input/iso8859-1")), StandardCharsets.ISO_8859_1), | |||||
| StandardCharsets.UTF_8)) { | |||||
| int b = r.read(); | int b = r.read(); | ||||
| while (b > -1) { | while (b > -1) { | ||||
| actualOS.write((byte) b); | actualOS.write((byte) b); | ||||
| b = r.read(); | b = r.read(); | ||||
| } | } | ||||
| } | |||||
| utf8 = new FileInputStream(new File(ROOT, | |||||
| "src/tests/antunit/taskdefs/exec/expected/utf-8")); | |||||
| ByteArrayOutputStream expectedOS = new ByteArrayOutputStream(); | |||||
| b = utf8.read(); | |||||
| ByteArrayOutputStream expectedOS = new ByteArrayOutputStream(); | |||||
| try (FileInputStream utf8 = new FileInputStream(new File(ROOT, | |||||
| "src/tests/antunit/taskdefs/exec/expected/utf-8"))) { | |||||
| int b = utf8.read(); | |||||
| while (b > -1) { | while (b > -1) { | ||||
| expectedOS.write((byte) b); | expectedOS.write((byte) b); | ||||
| b = utf8.read(); | b = utf8.read(); | ||||
| } | } | ||||
| } | |||||
| byte[] expected = expectedOS.toByteArray(); | |||||
| byte[] actual = actualOS.toByteArray(); | |||||
| assertEquals("length", expected.length, actual.length); | |||||
| for (int i = 0; i < actual.length; i++) { | |||||
| assertEquals("byte " + i, expected[i], actual[i]); | |||||
| } | |||||
| } finally { | |||||
| FileUtils.close(fin); | |||||
| FileUtils.close(r); | |||||
| FileUtils.close(utf8); | |||||
| byte[] expected = expectedOS.toByteArray(); | |||||
| byte[] actual = actualOS.toByteArray(); | |||||
| assertEquals("length", expected.length, actual.length); | |||||
| for (int i = 0; i < actual.length; i++) { | |||||
| assertEquals("byte " + i, expected[i], actual[i]); | |||||
| } | } | ||||
| } | } | ||||