Author: schor Date: Thu Jun 13 18:18:38 2013 New Revision: 1492799 URL: http://svn.apache.org/r1492799 Log: [UIMA-2849] add location of bad character to error message given for invalid xml characters. Add test case for bad characters.
Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLSerializer.java uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/XMLSerializerTest.java Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLSerializer.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLSerializer.java?rev=1492799&r1=1492798&r2=1492799&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLSerializer.java (original) +++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLSerializer.java Thu Jun 13 18:18:38 2013 @@ -339,18 +339,26 @@ public class XMLSerializer { private final void checkForInvalidXmlChars(String s, boolean xml11) throws SAXParseException { final int index = XMLUtils.checkForNonXmlCharacters(s, xml11); if (index >= 0) { - throw new SAXParseException("Trying to serialize non-XML " + (xml11 ? "1.1" : "1.0") + - " character: " + s.charAt(index) - + ", 0x" + Integer.toHexString(s.charAt(index)), null); + String msg = String.format("Trying to serialize non-XML %s character: %c, 0x%x at offset %,d in string starting with %s", + (xml11 ? "1.1" : "1.0"), + s.charAt(index), + (int)s.charAt(index), + index, + s.substring(0, Math.min(100, s.length()))); + throw new SAXParseException(msg, null); } } private final void checkForInvalidXmlChars(char[] ch, int start, int length, boolean xml11) throws SAXParseException { final int index = XMLUtils.checkForNonXmlCharacters(ch, start, length, xml11); if (index >= 0) { - throw new SAXParseException("Trying to serialize non-XML " + (xml11 ? "1.1" : "1.0") + - " character: " + ch[index] - + ", 0x" + Integer.toHexString(ch[index]), null); + String msg = String.format("Trying to serialize non-XML %s character: %c, 0x%x at offset %,d in string starting with %s", + (xml11 ? "1.1" : "1.0"), + ch[index], + (int)(ch[index]), + index, + (new String(ch)).substring(0, Math.min(100, ch.length))); + throw new SAXParseException(msg, null); } } Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/XMLSerializerTest.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/XMLSerializerTest.java?rev=1492799&r1=1492798&r2=1492799&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/XMLSerializerTest.java (original) +++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/XMLSerializerTest.java Thu Jun 13 18:18:38 2013 @@ -25,6 +25,7 @@ import javax.xml.transform.OutputKeys; import junit.framework.TestCase; import org.xml.sax.ContentHandler; +import org.xml.sax.SAXParseException; import org.xml.sax.helpers.AttributesImpl; public class XMLSerializerTest extends TestCase { @@ -53,4 +54,66 @@ public class XMLSerializerTest extends T String xmlStr = new String(baos.toByteArray(), "UTF-8"); assertEquals("<?xml version=\"1.1\" encoding=\"UTF-8\"?><foo/>", xmlStr); } + + public void testXml10Error() throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + XMLSerializer sax2xml = new XMLSerializer(baos, false); + ContentHandler ch = sax2xml.getContentHandler(); + ch.startDocument(); + char[] data = new char[] {32, 33, 5, 34}; + + ch.startElement("","foo","foo", new AttributesImpl()); + boolean eh = false; + try { + ch.characters(data, 0, 4); + } catch (SAXParseException e) { + String msg = e.getMessage(); + String expected = "Trying to serialize non-XML 1.0 character: " + (char)5 + ", 0x5 at offset 2"; + assertEquals(msg.substring(0, expected.length()), expected); + eh = true; + } + assertTrue(eh); + } + + public void testXml11Error() throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + XMLSerializer sax2xml = new XMLSerializer(baos, false); + sax2xml.setOutputProperty(OutputKeys.VERSION, "1.1"); + ContentHandler ch = sax2xml.getContentHandler(); + ch.startDocument(); + char[] data = new char[] {32, 33, 5, 34}; + + ch.startElement("","foo","foo", new AttributesImpl()); + boolean eh = false; + try { + ch.characters(data, 0, 4); + } catch (SAXParseException e) { + eh = true; + } + assertFalse(eh); + } + + public void testXml11Error2() throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + XMLSerializer sax2xml = new XMLSerializer(baos, false); + sax2xml.setOutputProperty(OutputKeys.VERSION, "1.1"); + ContentHandler ch = sax2xml.getContentHandler(); + ch.startDocument(); + char[] data = new char[] {32, 33, 0, 34}; + + ch.startElement("","foo","foo", new AttributesImpl()); + boolean eh = false; + try { + ch.characters(data, 0, 4); + } catch (SAXParseException e) { + String msg = e.getMessage(); + System.out.println(msg); + String expected = "Trying to serialize non-XML 1.1 character: " + (char)0 + ", 0x0 at offset 2"; + assertEquals(msg.substring(0, expected.length()), expected); + eh = true; + } + assertTrue(eh); + } + + }