You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2010/06/29 09:46:07 UTC
svn commit: r958857 - in /ant/core/trunk/src:
main/org/apache/tools/ant/util/DOMElementWriter.java
tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java
Author: bodewig
Date: Tue Jun 29 07:46:06 2010
New Revision: 958857
URL: http://svn.apache.org/viewvc?rev=958857&view=rev
Log:
properly encode whitespace in attribute values
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/util/DOMElementWriter.java
ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java
Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/DOMElementWriter.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/DOMElementWriter.java?rev=958857&r1=958856&r2=958857&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/DOMElementWriter.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/DOMElementWriter.java Tue Jun 29 07:46:06 2010
@@ -332,7 +332,7 @@ public class DOMElementWriter {
}
out.write(attr.getName());
out.write("=\"");
- out.write(encode(attr.getValue()));
+ out.write(encodeAttributeValue(attr.getValue()));
out.write("\"");
}
@@ -411,6 +411,21 @@ public class DOMElementWriter {
* @return the encoded string.
*/
public String encode(String value) {
+ return encode(value, false);
+ }
+
+ /**
+ * Escape <, > & ', " as their entities, \n,
+ * \r and \t as numeric entities and drop characters that are
+ * illegal in XML documents.
+ * @param value the string to encode.
+ * @return the encoded string.
+ */
+ public String encodeAttributeValue(String value) {
+ return encode(value, true);
+ }
+
+ private String encode(String value, boolean encodeWhitespace) {
int len = value.length();
StringBuffer sb = new StringBuffer(len);
for (int i = 0; i < len; i++) {
@@ -431,6 +446,15 @@ public class DOMElementWriter {
case '&':
sb.append("&");
break;
+ case '\r':
+ case '\n':
+ case '\t':
+ if (encodeWhitespace) {
+ sb.append("&#x").append(Integer.toHexString(c)).append(";");
+ } else {
+ sb.append(c);
+ }
+ break;
default:
if (isLegalCharacter(c)) {
sb.append(c);
Modified: ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java?rev=958857&r1=958856&r2=958857&view=diff
==============================================================================
--- ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java (original)
+++ ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java Tue Jun 29 07:46:06 2010
@@ -68,6 +68,40 @@ public class DOMElementWriterTest extend
assertEquals("<", w.encode("<"));
assertEquals("&", w.encode("&"));
assertEquals("", w.encode("\u0017"));
+ assertEquals("\r\n\t", w.encode("\r\n\t"));
+ }
+
+ public void testEncodeAttributeValue() {
+ assertEquals("&#20;", w.encodeAttributeValue(""));
+ assertEquals("&#x20;", w.encodeAttributeValue(" "));
+ assertEquals("&#xA0;", w.encodeAttributeValue(" "));
+ assertEquals("&#A0;", w.encodeAttributeValue("&#A0;"));
+ assertEquals("20;", w.encodeAttributeValue("20;"));
+ assertEquals("&#20", w.encodeAttributeValue(""));
+ assertEquals("&quot;", w.encodeAttributeValue("""));
+ assertEquals("&apos;", w.encodeAttributeValue("'"));
+ assertEquals("&gt;", w.encodeAttributeValue(">"));
+ assertEquals("&lt;", w.encodeAttributeValue("<"));
+ assertEquals("&amp;", w.encodeAttributeValue("&"));
+ assertEquals(""", w.encodeAttributeValue("\""));
+ assertEquals("<", w.encodeAttributeValue("<"));
+ assertEquals("&", w.encodeAttributeValue("&"));
+ assertEquals("", w.encodeAttributeValue("\u0017"));
+ assertEquals("
	", w.encodeAttributeValue("\r\n\t"));
+ }
+
+ public void testAttributeWithWhitespace() throws IOException {
+ Document d = DOMUtils.newDocument();
+ Element root = d.createElement("root");
+ root.setAttribute("foo", "bar\nbaz");
+ StringWriter sw = new StringWriter();
+ DOMElementWriter w = new DOMElementWriter();
+ w.write(root, sw, 0, " ");
+ assertEquals("<root foo=\"bar
baz\" />" + StringUtils.LINE_SEP,
+ sw.toString());
+ }
+
+ public void testEncodeData() {
assertEquals("\"20;&", w.encodedata("\"20;&"));
assertEquals("", w.encodedata("\u0017"));
}