Browse Source

use a better approach to encode CDATA end markers in CDATA sections as suggested by Mark Lassau and Wikipedia. PR 49404

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@955226 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 15 years ago
parent
commit
9cde786c6e
3 changed files with 9 additions and 18 deletions
  1. +3
    -0
      WHATSNEW
  2. +1
    -13
      src/main/org/apache/tools/ant/util/DOMElementWriter.java
  3. +5
    -5
      src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java

+ 3
- 0
WHATSNEW View File

@@ -20,6 +20,9 @@ Changes that could break older environments:
ampersands so that { remained { rather than being turned ampersands so that { remained { rather than being turned
into {. This is no longer the case, ampersands will now into {. This is no longer the case, ampersands will now
be encoded unconditionally. be encoded unconditionally.
Also DOMElementWriter#encodeData will treat CDATA sections containing a
literal "]]>" sequence different now - it will split the CDATA
section between the second "]" and ">" and create two sections.
This affects <echoxml> task as well as the XML logger or JUnit This affects <echoxml> task as well as the XML logger or JUnit
formatter where ampersands will now always get encoded. formatter where ampersands will now always get encoded.
Bugzilla Report 49404. Bugzilla Report 49404.


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

@@ -467,19 +467,7 @@ public class DOMElementWriter {
} }
} }


String result = sb.substring(0);
int cdEnd = result.indexOf("]]>");
while (cdEnd != -1) {
sb.setLength(cdEnd);
// CheckStyle:MagicNumber OFF
sb.append("&#x5d;&#x5d;&gt;")
.append(result.substring(cdEnd + 3));
// CheckStyle:MagicNumber ON
result = sb.substring(0);
cdEnd = result.indexOf("]]>");
}

return result;
return sb.toString().replace("]]>", "]]]]><![CDATA[>");
} }


/** /**


+ 5
- 5
src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java View File

@@ -90,11 +90,11 @@ public class DOMElementWriterTest extends TestCase {
public void testCDATAEndEncoding() { public void testCDATAEndEncoding() {
assertEquals("]>", w.encodedata("]>")); assertEquals("]>", w.encodedata("]>"));
assertEquals("]]", w.encodedata("]]")); assertEquals("]]", w.encodedata("]]"));
assertEquals("&#x5d;&#x5d;&gt;", w.encodedata("]]>"));
assertEquals("&#x5d;&#x5d;&gt;A", w.encodedata("]]>A"));
assertEquals("A&#x5d;&#x5d;&gt;", w.encodedata("A]]>"));
assertEquals("A&#x5d;&#x5d;&gt;A", w.encodedata("A]]>A"));
assertEquals("A&#x5d;&#x5d;&gt;B&#x5d;&#x5d;&gt;C",
assertEquals("]]]]><![CDATA[>", w.encodedata("]]>"));
assertEquals("]]]]><![CDATA[>A", w.encodedata("]]>A"));
assertEquals("A]]]]><![CDATA[>", w.encodedata("A]]>"));
assertEquals("A]]]]><![CDATA[>A", w.encodedata("A]]>A"));
assertEquals("A]]]]><![CDATA[>B]]]]><![CDATA[>C",
w.encodedata("A]]>B]]>C")); w.encodedata("A]]>B]]>C"));
} }




Loading…
Cancel
Save