Browse Source

swallow characters that are illegal in XML documents.

PR: 6351


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272312 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
c17d143ac3
4 changed files with 51 additions and 32 deletions
  1. +4
    -0
      docs/manual/OptionalTasks/junit.html
  2. +1
    -1
      src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java
  3. +28
    -28
      src/main/org/apache/tools/ant/util/DOMElementWriter.java
  4. +18
    -3
      src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java

+ 4
- 0
docs/manual/OptionalTasks/junit.html View File

@@ -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>


+ 1
- 1
src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java View File

@@ -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.


+ 28
- 28
src/main/org/apache/tools/ant/util/DOMElementWriter.java View File

@@ -201,8 +201,8 @@ public class DOMElementWriter {
}

/**
* Escape &lt;, &gt; &amp; &apos;, &quot; and control characters
* &lt; 0x20 as their entities.
* Escape &lt;, &gt; &amp; &apos;, &quot; 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 &lt; 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;
}
}

+ 18
- 3
src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java View File

@@ -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("&quot;", w.encode("\""));
assertEquals("&lt;", w.encode("<"));
assertEquals("&amp;", w.encode("&"));
assertEquals("&#x17;", w.encode("\u0017"));
assertEquals("", w.encode("\u0017"));
assertEquals("&#20;\"20;&", w.encodedata("&#20;\"20;&"));
assertEquals("&#x17;", 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'));
}
}

Loading…
Cancel
Save