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
into {. This is no longer the case, ampersands will now
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
formatter where ampersands will now always get encoded.
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() {
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"));
}



Loading…
Cancel
Save