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));
}
}