StringResource default encoding becomes UTF-8 changing ResourceUtils to use the String's encoding when copying from a String Bug Report 54606 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1452118 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -18,6 +18,8 @@ Changes that could break older environments: | |||||
| * Removing the Perforce Ant tasks replaced by tasks supplied by Perforce Inc. | * Removing the Perforce Ant tasks replaced by tasks supplied by Perforce Inc. | ||||
| * Setting the default encoding of StringResource to UTF-8 instead of null | |||||
| Fixed bugs: | Fixed bugs: | ||||
| ----------- | ----------- | ||||
| @@ -81,6 +83,10 @@ Fixed bugs: | |||||
| sizes differed by more than 2 GB. | sizes differed by more than 2 GB. | ||||
| Bugzilla Report 54623 | Bugzilla Report 54623 | ||||
| * Unable to encode properly into UTF-8 when the system property file.encoding is | |||||
| set to ANSI_X3.4-1968. | |||||
| Bugzilla Report 54606 | |||||
| Other changes: | Other changes: | ||||
| -------------- | -------------- | ||||
| @@ -124,6 +130,10 @@ Other changes: | |||||
| * add the possibility to suppress stdout in the sshexec task. | * add the possibility to suppress stdout in the sshexec task. | ||||
| Bugzilla Report 50270. | Bugzilla Report 50270. | ||||
| * add an encoding attribute to the contains selector. | |||||
| This will be useful to use the contains selector if the encoding of the VM is different from the encoding | |||||
| of the files being selected. | |||||
| Changes from Ant 1.8.3 TO Ant 1.8.4 | Changes from Ant 1.8.3 TO Ant 1.8.4 | ||||
| =================================== | =================================== | ||||
| @@ -133,6 +133,16 @@ | |||||
| </td> | </td> | ||||
| <td valign="top" align="center">No</td> | <td valign="top" align="center">No</td> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td valign="top">encoding</td> | |||||
| <td valign="top">Encoding of the resources being selected. | |||||
| Required in practice if the encoding of the files being | |||||
| selected is different from the default encoding of the JVM | |||||
| where Ant is running. | |||||
| Since Ant 1.9.0 | |||||
| </td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| </table> | </table> | ||||
| <p>Here is an example of how to use the Contains Selector:</p> | <p>Here is an example of how to use the Contains Selector:</p> | ||||
| @@ -39,7 +39,8 @@ public class StringResource extends Resource { | |||||
| private static final int STRING_MAGIC | private static final int STRING_MAGIC | ||||
| = Resource.getMagicNumber("StringResource".getBytes()); | = Resource.getMagicNumber("StringResource".getBytes()); | ||||
| private String encoding = null; | |||||
| private static final String DEFAULT_ENCODING = "UTF-8"; | |||||
| private String encoding = DEFAULT_ENCODING; | |||||
| /** | /** | ||||
| * Default constructor. | * Default constructor. | ||||
| @@ -212,7 +213,7 @@ public class StringResource extends Resource { | |||||
| * @param r the Reference to set. | * @param r the Reference to set. | ||||
| */ | */ | ||||
| public void setRefid(Reference r) { | public void setRefid(Reference r) { | ||||
| if (encoding != null) { | |||||
| if (encoding != DEFAULT_ENCODING) { | |||||
| throw tooManyAttributes(); | throw tooManyAttributes(); | ||||
| } | } | ||||
| super.setRefid(r); | super.setRefid(r); | ||||
| @@ -42,6 +42,7 @@ public class ContainsSelector extends BaseExtendSelector implements ResourceSele | |||||
| private String contains = null; | private String contains = null; | ||||
| private boolean casesensitive = true; | private boolean casesensitive = true; | ||||
| private boolean ignorewhitespace = false; | private boolean ignorewhitespace = false; | ||||
| private String encoding = null; | |||||
| /** Key to used for parameterized custom selector */ | /** Key to used for parameterized custom selector */ | ||||
| public static final String EXPRESSION_KEY = "expression"; | public static final String EXPRESSION_KEY = "expression"; | ||||
| /** Used for parameterized custom selector */ | /** Used for parameterized custom selector */ | ||||
| @@ -82,6 +83,15 @@ public class ContainsSelector extends BaseExtendSelector implements ResourceSele | |||||
| this.contains = contains; | this.contains = contains; | ||||
| } | } | ||||
| /** | |||||
| * The encoding of the resources processed | |||||
| * @since Ant 1.9.0 | |||||
| * @param encoding encoding of the resources processed | |||||
| */ | |||||
| public void setEncoding(String encoding) { | |||||
| this.encoding = encoding; | |||||
| } | |||||
| /** | /** | ||||
| * Whether to ignore case in the string being searched. | * Whether to ignore case in the string being searched. | ||||
| * | * | ||||
| @@ -176,7 +186,11 @@ public class ContainsSelector extends BaseExtendSelector implements ResourceSele | |||||
| } | } | ||||
| BufferedReader in = null; | BufferedReader in = null; | ||||
| try { | try { | ||||
| in = new BufferedReader(new InputStreamReader(r.getInputStream())); | |||||
| if (encoding != null) { | |||||
| in = new BufferedReader(new InputStreamReader(r.getInputStream(), encoding)); | |||||
| } else { | |||||
| in = new BufferedReader(new InputStreamReader(r.getInputStream())); | |||||
| } | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| throw new BuildException("Could not get InputStream from " | throw new BuildException("Could not get InputStream from " | ||||
| + r.toLongString(), e); | + r.toLongString(), e); | ||||
| @@ -48,6 +48,7 @@ import org.apache.tools.ant.types.resources.FileResource; | |||||
| import org.apache.tools.ant.types.resources.Union; | import org.apache.tools.ant.types.resources.Union; | ||||
| import org.apache.tools.ant.types.resources.Restrict; | import org.apache.tools.ant.types.resources.Restrict; | ||||
| import org.apache.tools.ant.types.resources.Resources; | import org.apache.tools.ant.types.resources.Resources; | ||||
| import org.apache.tools.ant.types.resources.StringResource; | |||||
| import org.apache.tools.ant.types.resources.Touchable; | import org.apache.tools.ant.types.resources.Touchable; | ||||
| import org.apache.tools.ant.types.resources.selectors.Date; | import org.apache.tools.ant.types.resources.selectors.Date; | ||||
| import org.apache.tools.ant.types.resources.selectors.ResourceSelector; | import org.apache.tools.ant.types.resources.selectors.ResourceSelector; | ||||
| @@ -393,7 +394,12 @@ public class ResourceUtils { | |||||
| && filters.hasFilters()); | && filters.hasFilters()); | ||||
| final boolean filterChainsAvailable = (filterChains != null | final boolean filterChainsAvailable = (filterChains != null | ||||
| && filterChains.size() > 0); | && filterChains.size() > 0); | ||||
| String effectiveInputEncoding = null; | |||||
| if (source instanceof StringResource) { | |||||
| effectiveInputEncoding = ((StringResource) source).getEncoding(); | |||||
| } else { | |||||
| effectiveInputEncoding = inputEncoding; | |||||
| } | |||||
| File destFile = null; | File destFile = null; | ||||
| if (dest.as(FileProvider.class) != null) { | if (dest.as(FileProvider.class) != null) { | ||||
| destFile = dest.as(FileProvider.class).getFile(); | destFile = dest.as(FileProvider.class).getFile(); | ||||
| @@ -413,11 +419,11 @@ public class ResourceUtils { | |||||
| BufferedWriter out = null; | BufferedWriter out = null; | ||||
| try { | try { | ||||
| InputStreamReader isr = null; | InputStreamReader isr = null; | ||||
| if (inputEncoding == null) { | |||||
| if (effectiveInputEncoding == null) { | |||||
| isr = new InputStreamReader(source.getInputStream()); | isr = new InputStreamReader(source.getInputStream()); | ||||
| } else { | } else { | ||||
| isr = new InputStreamReader(source.getInputStream(), | isr = new InputStreamReader(source.getInputStream(), | ||||
| inputEncoding); | |||||
| effectiveInputEncoding); | |||||
| } | } | ||||
| in = new BufferedReader(isr); | in = new BufferedReader(isr); | ||||
| OutputStream os = getOutputStream(dest, append, project); | OutputStream os = getOutputStream(dest, append, project); | ||||
| @@ -457,18 +463,18 @@ public class ResourceUtils { | |||||
| FileUtils.close(in); | FileUtils.close(in); | ||||
| } | } | ||||
| } else if (filterChainsAvailable | } else if (filterChainsAvailable | ||||
| || (inputEncoding != null | |||||
| && !inputEncoding.equals(outputEncoding)) | |||||
| || (inputEncoding == null && outputEncoding != null)) { | |||||
| || (effectiveInputEncoding != null | |||||
| && !effectiveInputEncoding.equals(outputEncoding)) | |||||
| || (effectiveInputEncoding == null && outputEncoding != null)) { | |||||
| BufferedReader in = null; | BufferedReader in = null; | ||||
| BufferedWriter out = null; | BufferedWriter out = null; | ||||
| try { | try { | ||||
| InputStreamReader isr = null; | InputStreamReader isr = null; | ||||
| if (inputEncoding == null) { | |||||
| if (effectiveInputEncoding == null) { | |||||
| isr = new InputStreamReader(source.getInputStream()); | isr = new InputStreamReader(source.getInputStream()); | ||||
| } else { | } else { | ||||
| isr = new InputStreamReader(source.getInputStream(), | isr = new InputStreamReader(source.getInputStream(), | ||||
| inputEncoding); | |||||
| effectiveInputEncoding); | |||||
| } | } | ||||
| in = new BufferedReader(isr); | in = new BufferedReader(isr); | ||||
| OutputStream os = getOutputStream(dest, append, project); | OutputStream os = getOutputStream(dest, append, project); | ||||
| @@ -32,12 +32,11 @@ | |||||
| <!-- https://issues.apache.org/bugzilla/show_bug.cgi?id=46285 --> | <!-- https://issues.apache.org/bugzilla/show_bug.cgi?id=46285 --> | ||||
| <target name="testNumericEntities"> | <target name="testNumericEntities"> | ||||
| <echo>ä©</echo> | |||||
| <loadresource property="foo"> | |||||
| <au:logcontent/> | |||||
| <echo encoding="UTF-8" file="${output}/abc.txt">ä©</echo> | |||||
| <loadresource property="foo" encoding="UTF-8"> | |||||
| <file file="${output}/abc.txt"/> | |||||
| </loadresource> | </loadresource> | ||||
| <au:assertPropertyEquals name="foo" value="ä©"/> | <au:assertPropertyEquals name="foo" value="ä©"/> | ||||
| <au:assertLogContains text="ä©"/> | |||||
| </target> | </target> | ||||
| </project> | </project> | ||||
| @@ -127,9 +127,9 @@ | |||||
| <resourcecount count="1"> | <resourcecount count="1"> | ||||
| <restrict> | <restrict> | ||||
| <concat encoding="UTF-8"> | <concat encoding="UTF-8"> | ||||
| <file file="${output}/echo8.txt" /> | |||||
| <file file="${output}/echo8.txt"/> | |||||
| </concat> | </concat> | ||||
| <contains text="${char}" /> | |||||
| <contains text="${char}" encoding="UTF-8"/> | |||||
| </restrict> | </restrict> | ||||
| </resourcecount> | </resourcecount> | ||||
| </au:assertTrue> | </au:assertTrue> | ||||
| @@ -18,19 +18,20 @@ | |||||
| package org.apache.tools.ant.taskdefs; | package org.apache.tools.ant.taskdefs; | ||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.PrintStream; | |||||
| import java.io.*; | |||||
| import junit.framework.TestCase; | import junit.framework.TestCase; | ||||
| 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; | |||||
| /** | /** | ||||
| * Test Java-dependent parts of the Echo task. | * Test Java-dependent parts of the Echo task. | ||||
| */ | */ | ||||
| public class EchoTest extends TestCase { | public class EchoTest extends TestCase { | ||||
| private File removeThis; | |||||
| /** | /** | ||||
| * Create a new EchoTest. | * Create a new EchoTest. | ||||
| * @param name | * @param name | ||||
| @@ -50,7 +51,38 @@ public class EchoTest extends TestCase { | |||||
| echo.execute(); | echo.execute(); | ||||
| assertEquals("[testLogBlankEcho] ", logger.lastLoggedMessage ); | assertEquals("[testLogBlankEcho] ", logger.lastLoggedMessage ); | ||||
| } | } | ||||
| public void testLogUTF8Echo() { | |||||
| Project p = new Project(); | |||||
| p.init(); | |||||
| EchoTestLogger logger = new EchoTestLogger(); | |||||
| p.addBuildListener(logger); | |||||
| Echo echo = new Echo(); | |||||
| echo.setProject(p); | |||||
| echo.setTaskName("testLogUTF8Echo"); | |||||
| echo.setMessage("\u00e4\u00a9"); | |||||
| removeThis = new File("abc.txt"); | |||||
| echo.setFile(removeThis); | |||||
| echo.setEncoding("UTF-8"); | |||||
| echo.execute(); | |||||
| FileUtils fu = FileUtils.getFileUtils(); | |||||
| try { | |||||
| String x = FileUtils.readFully(new InputStreamReader(new FileInputStream(removeThis), "UTF-8" )); | |||||
| assertEquals(x,"\u00e4\u00a9"); | |||||
| } catch (Exception exc) { | |||||
| } | |||||
| } | |||||
| public void tearDown() { | |||||
| if (removeThis != null && removeThis.exists()) { | |||||
| if (!removeThis.delete()) | |||||
| { | |||||
| removeThis.deleteOnExit(); | |||||
| } | |||||
| } | |||||
| } | |||||
| private class EchoTestLogger extends DefaultLogger { | private class EchoTestLogger extends DefaultLogger { | ||||
| String lastLoggedMessage; | String lastLoggedMessage; | ||||