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);
+  }
+
+
 }


Reply via email to