Skip to content
This repository has been archived by the owner on Jan 14, 2019. It is now read-only.

Commit

Permalink
fixes #177
Browse files Browse the repository at this point in the history
  • Loading branch information
baev committed Apr 9, 2014
1 parent 5c92d93 commit 2cf1ca2
Showing 1 changed file with 10 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

/**
* Doesn't marshall bad XML 1.0 characters.
*/
public class XmlEscapeHandler implements CharacterEscapeHandler {

private XmlEscapeHandler() {
Expand All @@ -16,54 +18,34 @@ private XmlEscapeHandler() {
@Override
public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
int limit = start + length;
boolean cData = false;
StringWriter buffer = new StringWriter();

for (int i = start; i < limit; i++) {
switch (ch[i]) {
case '&':
buffer.append("&amp;");
out.write("&amp;");
break;
case '<':
buffer.append("&lt;");
out.write("&lt;");
break;
case '>':
buffer.append("&gt;");
out.write("&gt;");
break;
case '\"':
if (isAttVal) {
buffer.append("&quot;");
out.write("&quot;");
} else {
buffer.append('\"');
out.write('\"');
}
break;
default:
if (isCDATA(ch[i])) {
writeEntity(ch[i], buffer);
cData = true;
} else if (ch[i] > '\u007f') {
writeEntity(ch[i], buffer);
} else {
if (!isBadXmlCharacter(ch[i])) {
out.write(ch[i]);
}
}
}
if (cData) {
out.write("<![CDATA[");
}
out.write(buffer.toString());
if (cData) {
out.write("]]>");
}
}

private void writeEntity(char i, Writer out) throws IOException {
out.write("&#");
out.write(Integer.toString(i));
out.write(';');
}

private boolean isCDATA(char c) {
private boolean isBadXmlCharacter(char c) {
boolean cDataCharacter = (c < '\u0020' && c != '\t' && c != '\r' && c != '\n');
cDataCharacter |= (c >= '\uD800' && c < '\uE000');
cDataCharacter |= (c == '\uFFFE' || c == '\uFFFF');
Expand Down

0 comments on commit 2cf1ca2

Please sign in to comment.