PR: 6351 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272312 13f79535-47bb-0310-9956-ffa450edef68master
@@ -225,6 +225,10 @@ for all test cases. Custom formatters that need to implement | |||
<code>org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter</code> | |||
can be specified.</p> | |||
<p>If you use the XML formatter, it may not include the same output | |||
that your tests have written as some characters are illegal in XML | |||
documents and will be dropped.</p> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td width="12%" valign="top"><b>Attribute</b></td> | |||
@@ -231,7 +231,7 @@ public class XMLResultAggregator extends Task implements XMLConstants { | |||
try { | |||
out = new FileOutputStream( file ); | |||
wri = new PrintWriter(new OutputStreamWriter(out, "UTF8")); | |||
wri.write("<?xml version=\"1.0\"?>\n"); | |||
wri.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); | |||
(new DOMElementWriter()).write(doc.getDocumentElement(), wri, 0, " "); | |||
wri.flush(); | |||
// writers do not throw exceptions, so check for them. | |||
@@ -201,8 +201,8 @@ public class DOMElementWriter { | |||
} | |||
/** | |||
* Escape <, > & ', " and control characters | |||
* < 0x20 as their entities. | |||
* Escape <, > & ', " as their entities and | |||
* drop characters that are illegal in XML documents. | |||
*/ | |||
public String encode(String value) { | |||
sb.setLength(0); | |||
@@ -230,17 +230,8 @@ public class DOMElementWriter { | |||
sb.append('&'); | |||
} | |||
break; | |||
case '\t': | |||
case '\n': | |||
case '\r': | |||
sb.append(c); | |||
break; | |||
default: | |||
if (c < 0x20) { | |||
sb.append("&#x"); | |||
sb.append(Integer.toHexString(c)); | |||
sb.append(';'); | |||
} else { | |||
if (isLegalCharacter(c)) { | |||
sb.append(c); | |||
} | |||
break; | |||
@@ -250,7 +241,7 @@ public class DOMElementWriter { | |||
} | |||
/** | |||
* Escape control characters < x20 as their entities. | |||
* Drop characters that are illegal in XML documents. | |||
* | |||
* <p>See XML 1.0 2.2 <a | |||
* href="http://www.w3.org/TR/1998/REC-xml-19980210#charsets">http://www.w3.org/TR/1998/REC-xml-19980210#charsets</a>.</p> | |||
@@ -259,22 +250,8 @@ public class DOMElementWriter { | |||
sb.setLength(0); | |||
for (int i = 0; i < value.length(); ++i) { | |||
char c = value.charAt(i); | |||
switch (c) { | |||
case '\t': | |||
case '\n': | |||
case '\r': | |||
if (isLegalCharacter(c)) { | |||
sb.append(c); | |||
break; | |||
default: | |||
if (c < 0x20) { | |||
sb.append("&#x"); | |||
sb.append(Integer.toHexString(c)); | |||
sb.append(';'); | |||
} else { | |||
sb.append(c); | |||
} | |||
break; | |||
} | |||
} | |||
return sb.toString(); | |||
@@ -314,4 +291,27 @@ public class DOMElementWriter { | |||
} | |||
return false; | |||
} | |||
/** | |||
* Is the given character allowed inside an XML document? | |||
* | |||
* <p>See XML 1.0 2.2 <a | |||
* href="http://www.w3.org/TR/1998/REC-xml-19980210#charsets">http://www.w3.org/TR/1998/REC-xml-19980210#charsets</a>.</p> | |||
* | |||
* @since 1.10, Ant 1.5 | |||
*/ | |||
public boolean isLegalCharacter(char c) { | |||
if (c == 0x9 || c == 0xA || c == 0xD) { | |||
return true; | |||
} else if (c < 0x20) { | |||
return false; | |||
} else if (c <= 0xD7FF) { | |||
return true; | |||
} else if (c < 0xE000) { | |||
return false; | |||
} else if (c <= 0xFFFD) { | |||
return true; | |||
} | |||
return false; | |||
} | |||
} |
@@ -1,7 +1,7 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000-2001 The Apache Software Foundation. All rights | |||
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
@@ -100,8 +100,23 @@ public class DOMElementWriterTest extends TestCase { | |||
assertEquals(""", w.encode("\"")); | |||
assertEquals("<", w.encode("<")); | |||
assertEquals("&", w.encode("&")); | |||
assertEquals("", w.encode("\u0017")); | |||
assertEquals("", w.encode("\u0017")); | |||
assertEquals("\"20;&", w.encodedata("\"20;&")); | |||
assertEquals("", w.encodedata("\u0017")); | |||
assertEquals("", w.encodedata("\u0017")); | |||
} | |||
public void testIsLegalCharacter() { | |||
assertTrue("0x00", !w.isLegalCharacter('\u0000')); | |||
assertTrue("0x09", w.isLegalCharacter('\t')); | |||
assertTrue("0x0A", w.isLegalCharacter('\n')); | |||
assertTrue("0x0C", w.isLegalCharacter('\r')); | |||
assertTrue("0x1F", !w.isLegalCharacter('\u001F')); | |||
assertTrue("0x20", w.isLegalCharacter('\u0020')); | |||
assertTrue("0xD7FF", w.isLegalCharacter('\uD7FF')); | |||
assertTrue("0xD800", !w.isLegalCharacter('\uD800')); | |||
assertTrue("0xDFFF", !w.isLegalCharacter('\uDFFF')); | |||
assertTrue("0xE000", w.isLegalCharacter('\uE000')); | |||
assertTrue("0xFFFD", w.isLegalCharacter('\uFFFD')); | |||
assertTrue("0xFFFE", !w.isLegalCharacter('\uFFFE')); | |||
} | |||
} |