bodewig 2003/03/14 05:45:17
Modified: docs/manual/CoreTypes filterchain.html src/etc/testcases/filters build.xml src/main/org/apache/tools/ant/types FilterChain.java Added: src/etc/testcases/filters/expected escapeunicode.test src/etc/testcases/filters/input escapeunicode.test src/main/org/apache/tools/ant/filters EscapeUnicode.java src/testcases/org/apache/tools/ant/filters EscapeUnicodeTest.java Log: New filter <escapeunicode> that translates non-ASCII characters to \u1234 escapes. addresses PR: 17506 Revision Changes Path 1.5 +29 -1 ant/docs/manual/CoreTypes/filterchain.html Index: filterchain.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTypes/filterchain.html,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- filterchain.html 3 Sep 2002 15:24:08 -0000 1.4 +++ filterchain.html 14 Mar 2003 13:45:16 -0000 1.5 @@ -89,6 +89,7 @@ nested elements.<BR> <a href="#filterreader">FilterReader</a><BR> <a href="#classconstants">ClassConstants</a><BR> +<a href="#escapeunicode">EscapeUnicode</a><BR> <a href="#expandproperties">ExpandProperties</a><BR> <a href="#headfilter">HeadFilter</a><BR> <a href="#linecontains">LineContains</a><BR> @@ -162,6 +163,33 @@ </loadproperties> </PRE></BLOCKQUOTE> +<H3><a name="escapeunicode">EscapeUnicode</a></H3> +<P> +This filter converts its input by changing all non US-ASCII characters +into their equivalent unicode escape backslash u plus 4 digits.</p> + +<P><em>since Ant 1.6</em></p> + +<H4>Example:</H4> + +This loads the basic constants defined in a Java class as Ant properties. +<BLOCKQUOTE><PRE> +<loadproperties srcfile="non_ascii_property.properties"> + <filterchain> + <filterreader classname="org.apache.tools.ant.filters.EscapeUnicode"/> + </filterchain> +</loadproperties> +</PRE></BLOCKQUOTE> + +Convenience method: +<BLOCKQUOTE><PRE> +<loadproperties srcfile="non_ascii_property.properties"> + <filterchain> + <escapeunicode/> + </filterchain> +</loadproperties> +</PRE></BLOCKQUOTE> + <H3><a name="expandproperties">ExpandProperties</a></H3> <P> If the data contains data that represents Ant @@ -629,5 +657,5 @@ <HR> -<P align=center>Copyright © 2002 Apache Software Foundation. All rights +<P align=center>Copyright © 2002-2003 Apache Software Foundation. All rights Reserved.</P></BODY></HTML> 1.2 +21 -2 ant/src/etc/testcases/filters/build.xml Index: build.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/filters/build.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- build.xml 30 Sep 2002 12:08:20 -0000 1.1 +++ build.xml 14 Mar 2003 13:45:16 -0000 1.2 @@ -6,18 +6,37 @@ </target> <target name="cleanup"> - <delete dir="result" /> + <delete dir="result"/> </target> <target name="testLineContains" depends="init"> <copy todir="result"> - <fileset dir="input"/> + <fileset dir="input"> + <include name="linecontains.test"/> + </fileset> <filterchain> <filterreader classname="org.apache.tools.ant.filters.LineContains"> <param type="contains" value="beta"/> </filterreader> </filterchain> </copy> + <!--fixcrlf srcdir="result" eol="lf"> + <include name="linecontains.test"/> + </fixcrlf--> + </target> + + <target name="testEscapeUnicode" depends="init"> + <copy todir="result" encoding="UTF-8"> + <fileset dir="input"> + <include name="escapeunicode.test"/> + </fileset> + <filterchain> + <escapeunicode/> + </filterchain> + </copy> + <fixcrlf srcdir="result" eol="crlf"> + <include name="escapeunicode.test"/> + </fixcrlf> </target> </project> 1.1 ant/src/etc/testcases/filters/expected/escapeunicode.test Index: escapeunicode.test =================================================================== #hebrew shalom olam (hello world) text.hebrew=\u05e9\u05dc\u05d5\u05dd \u05e2\u05d5\u05dc\u05dd #goethe gingko biloba text.german.1=Sp\u00fcrst du nicht an meinen Liedern, text.german.2=Da\u00df ich eins und doppelt bin ? # Francois Villon Ballade des Pendus text.french=Fr\u00e8res humains qui apr\u00e8s nous vivez # Usual IT example text.basic.latin=Hello World 1.1 ant/src/etc/testcases/filters/input/escapeunicode.test Index: escapeunicode.test =================================================================== #hebrew shalom olam (hello world) text.hebrew=שלום עולם #goethe gingko biloba text.german.1=Spürst du nicht an meinen Liedern, text.german.2=Daß ich eins und doppelt bin ? # Francois Villon Ballade des Pendus text.french=Frères humains qui après nous vivez # Usual IT example text.basic.latin=Hello World 1.1 ant/src/main/org/apache/tools/ant/filters/EscapeUnicode.java Index: EscapeUnicode.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Ant" and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.filters; import java.io.IOException; import java.io.Reader; import org.apache.tools.ant.types.Parameter; /** * Converts non latin characters to unicode escapes * Useful to load properties containing non latin * Example: * * <pre><escapeunicode></pre> * * Or: * * <pre><filterreader classname="org.apache.tools.ant.filters.EscapeUnicode"/> * </pre> * * @author <a href="mailto:[EMAIL PROTECTED]">Antoine Levy-Lambert</a> * @since Ant 1.6 */ public class EscapeUnicode extends BaseParamFilterReader implements ChainableReader { //this field will hold unnnn right after reading a non latin character //afterwards it will be truncated of one char every call to read private StringBuffer unicodeBuf; /** * Constructor for "dummy" instances. * * @see BaseFilterReader#BaseFilterReader() */ public EscapeUnicode() { super(); unicodeBuf = new StringBuffer(); } /** * Creates a new filtered reader. * * @param in A Reader object providing the underlying stream. * Must not be <code>null</code>. */ public EscapeUnicode(final Reader in) { super(in); unicodeBuf = new StringBuffer(); } /** * Returns the next character in the filtered stream, converting non latin * characters to unicode escapes. * * @return the next character in the resulting stream, or -1 * if the end of the resulting stream has been reached * * @exception java.io.IOException if the underlying stream throws * an IOException during reading */ public final int read() throws IOException { if (!getInitialized()) { initialize(); setInitialized(true); } int ch= - 1; if (unicodeBuf.length() == 0) { ch = in.read(); if (ch != -1) { char achar = (char) ch; if (achar >= '\u0080') { unicodeBuf = new StringBuffer("u0000"); String s = Integer.toHexString(ch); //replace the last 0s by the chars contained in s for (int i = 0; i < s.length(); i++) { unicodeBuf.setCharAt(unicodeBuf.length() - s.length() + i, s.charAt(i)); } ch='\\'; } } } else { ch = (int) unicodeBuf.charAt(0); unicodeBuf.deleteCharAt(0); } return ch; } /** * Creates a new EscapeUnicode using the passed in * Reader for instantiation. * * @param rdr A Reader object providing the underlying stream. * Must not be <code>null</code>. * * @return a new filter based on this configuration, but filtering * the specified reader */ public final Reader chain(final Reader rdr) { EscapeUnicode newFilter = new EscapeUnicode(rdr); newFilter.setInitialized(true); return newFilter; } /** * Parses the parameters (currently unused) */ private final void initialize() { Parameter[] params = getParameters(); if (params != null) { for (int i = 0; i < params.length; i++) { } } } } 1.9 +9 -1 ant/src/main/org/apache/tools/ant/types/FilterChain.java Index: FilterChain.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/FilterChain.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- FilterChain.java 10 Feb 2003 14:14:30 -0000 1.8 +++ FilterChain.java 14 Mar 2003 13:45:16 -0000 1.9 @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2002 The Apache Software Foundation. All rights + * Copyright (c) 2002-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -56,6 +56,7 @@ import java.util.Vector; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.filters.ClassConstants; +import org.apache.tools.ant.filters.EscapeUnicode; import org.apache.tools.ant.filters.ExpandProperties; import org.apache.tools.ant.filters.HeadFilter; import org.apache.tools.ant.filters.LineContains; @@ -135,6 +136,13 @@ public final void addTailFilter(final TailFilter tailFilter) { filterReaders.addElement(tailFilter); + } + + /** + * @since Ant 1.6 + */ + public final void addEscapeUnicode(final EscapeUnicode escapeUnicode) { + filterReaders.addElement(escapeUnicode); } /** 1.1 ant/src/testcases/org/apache/tools/ant/filters/EscapeUnicodeTest.java Index: EscapeUnicodeTest.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Ant" and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.filters; import java.io.File; import java.io.IOException; import org.apache.tools.ant.BuildFileTest; import org.apache.tools.ant.util.FileUtils; /** */ public class EscapeUnicodeTest extends BuildFileTest { public EscapeUnicodeTest(String name) { super(name); } public void setUp() { configureProject("src/etc/testcases/filters/build.xml"); } public void tearDown() { executeTarget("cleanup"); } public void testEscapeUnicode() throws IOException { executeTarget("testEscapeUnicode"); File expected = getProject().resolveFile("expected/escapeunicode.test"); File result = getProject().resolveFile("result/escapeunicode.test"); FileUtils fu = FileUtils.newFileUtils(); assertTrue(fu.contentEquals(expected, result)); } }