You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2006/10/27 14:08:58 UTC
svn commit: r468355 - in /incubator/servicemix/trunk/servicemix-core/src:
main/java/org/apache/servicemix/jbi/jaxp/StaxSource.java
test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java
Author: gnodet
Date: Fri Oct 27 05:08:57 2006
New Revision: 468355
URL: http://svn.apache.org/viewvc?view=rev&rev=468355
Log:
SM-722: White spaces stripped during xml processing
Modified:
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/StaxSource.java
incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java
Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/StaxSource.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/StaxSource.java?view=diff&rev=468355&r1=468354&r2=468355
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/StaxSource.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/StaxSource.java Fri Oct 27 05:08:57 2006
@@ -33,6 +33,7 @@
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.helpers.AttributesImpl;
public class StaxSource extends SAXSource implements XMLReader {
@@ -40,6 +41,8 @@
private XMLStreamReader streamReader;
private ContentHandler contentHandler;
+
+ private LexicalHandler lexicalHandler;
public StaxSource(XMLStreamReader streamReader) {
this.streamReader = streamReader;
@@ -52,29 +55,49 @@
protected void parse() throws SAXException {
try {
- contentHandler.startDocument();
while (true) {
switch (streamReader.getEventType()) {
+ // Attributes are handled in START_ELEMENT
case XMLStreamConstants.ATTRIBUTE:
+ break;
case XMLStreamConstants.CDATA:
+ {
+ if (lexicalHandler != null) {
+ lexicalHandler.startCDATA();
+ }
+ int length = streamReader.getTextLength();
+ int start = streamReader.getTextStart();
+ char[] chars = streamReader.getTextCharacters();
+ contentHandler.characters(chars, start, length);
+ if (lexicalHandler != null) {
+ lexicalHandler.endCDATA();
+ }
break;
+ }
case XMLStreamConstants.CHARACTERS:
- if (!streamReader.isWhiteSpace()) {
-
+ {
+ int length = streamReader.getTextLength();
+ int start = streamReader.getTextStart();
+ char[] chars = streamReader.getTextCharacters();
+ contentHandler.characters(chars, start, length);
+ break;
+ }
+ case XMLStreamConstants.SPACE:
+ {
+ int length = streamReader.getTextLength();
+ int start = streamReader.getTextStart();
+ char[] chars = streamReader.getTextCharacters();
+ contentHandler.ignorableWhitespace(chars, start, length);
+ break;
+ }
+ case XMLStreamConstants.COMMENT:
+ if (lexicalHandler != null) {
int length = streamReader.getTextLength();
int start = streamReader.getTextStart();
char[] chars = streamReader.getTextCharacters();
- contentHandler.characters(chars, start, length);
- /*
- for (int textLength = streamReader.getTextLength(); textLength > 0; textLength -= chars.length) {
- int l = Math.min(textLength, chars.length);
- streamReader.getTextCharacters(0, chars, 0, l);
- contentHandler.characters(chars, 0, l);
- }
- */
+ lexicalHandler.comment(chars, start, length);
}
break;
- case XMLStreamConstants.COMMENT:
case XMLStreamConstants.DTD:
break;
case XMLStreamConstants.END_DOCUMENT:
@@ -95,9 +118,11 @@
case XMLStreamConstants.ENTITY_REFERENCE:
case XMLStreamConstants.NAMESPACE:
case XMLStreamConstants.NOTATION_DECLARATION:
+ break;
case XMLStreamConstants.PROCESSING_INSTRUCTION:
- case XMLStreamConstants.SPACE:
+ break;
case XMLStreamConstants.START_DOCUMENT:
+ contentHandler.startDocument();
break;
case XMLStreamConstants.START_ELEMENT: {
for (int i = 0; i < streamReader.getNamespaceCount(); i++) {
@@ -191,6 +216,11 @@
}
public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException {
+ if( "http://xml.org/sax/properties/lexical-handler".equals(name) ) {
+ lexicalHandler = (LexicalHandler) value;
+ } else {
+ throw new SAXNotRecognizedException(name);
+ }
}
public void setEntityResolver(EntityResolver resolver) {
Modified: incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java?view=diff&rev=468355&r1=468354&r2=468355
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java Fri Oct 27 05:08:57 2006
@@ -17,9 +17,9 @@
package org.apache.servicemix.jbi.jaxp;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.StringWriter;
-import java.util.Arrays;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.XMLInputFactory;
@@ -30,31 +30,44 @@
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
+import junit.framework.TestCase;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.servicemix.jbi.jaxp.StaxSource;
+import org.apache.servicemix.jbi.util.FileUtil;
import org.w3c.dom.Document;
-import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
-import junit.framework.TestCase;
-
public class StaxSourceTest extends TestCase {
private static final Log log = LogFactory.getLog(StaxSourceTest.class);
public void testStaxSourceOnStream() throws Exception {
InputStream is = getClass().getResourceAsStream("test.xml");
- XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader(is);
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
+ XMLStreamReader xsr = factory.createXMLStreamReader(is);
StaxSource ss = new StaxSource(xsr);
StringWriter buffer = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(ss, new StreamResult(buffer));
log.info(buffer.toString());
+
+ /*
+ * Attribute ordering is not preserved, so we can not compare the strings
+ *
+ is = getClass().getResourceAsStream("test.xml");
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ FileUtil.copyInputStream(is, baos);
+ compare(baos.toString().replaceAll("\r", ""), buffer.toString().replaceAll("\r", ""));
+ */
+
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new ByteArrayInputStream(buffer.toString().getBytes()));
+ checkDomResult(doc);
+
StringWriter buffer2 = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(buffer2));
log.info(buffer2.toString());
@@ -68,6 +81,7 @@
DOMResult result = new DOMResult();
transformer.transform(ss, result);
assertNotNull(result.getNode());
+ checkDomResult((Document) result.getNode());
}
public void testStaxToDOM() throws Exception {
@@ -77,11 +91,22 @@
DOMSource src = new SourceTransformer().toDOMSource(ss);
assertNotNull(src);
assertNotNull(src.getNode());
- NodeList nl = ((Document) src.getNode()).getDocumentElement().getElementsByTagName("long");
- assertEquals(1, nl.getLength());
- Text txt = (Text) nl.item(0).getFirstChild();
- System.out.println(txt.getTextContent());
-
+ checkDomResult((Document) src.getNode());
+ }
+
+ protected void checkDomResult(Document doc) {
+ // Whitespace only elements must be preserved
+ NodeList l = doc.getElementsByTagName("child4");
+ assertEquals(1, l.getLength());
+ assertEquals(1, l.item(0).getChildNodes().getLength());
+ Text txt = (Text) l.item(0).getFirstChild();
+ assertEquals(" ", txt.getTextContent());
+
+ // Check long string
+ l = doc.getDocumentElement().getElementsByTagName("long");
+ assertEquals(1, l.getLength());
+ assertEquals(1, l.item(0).getChildNodes().getLength());
+ txt = (Text) l.item(0).getFirstChild();
StringBuffer expected = new StringBuffer();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 10; j++) {
@@ -95,16 +120,23 @@
expected.append("\n");
}
}
- /*
- char[] c1 = txt.getTextContent().toCharArray();
- char[] c2 = expected.toString().toCharArray();
+ assertEquals(expected.toString(), txt.getTextContent());
+ }
+
+ protected void compare(String s1, String s2) {
+ char[] c1 = s1.toCharArray();
+ char[] c2 = s2.toCharArray();
for (int i = 0; i < c1.length; i++) {
if (c1[i] != c2[i]) {
- fail("Expected '" + (int)c2[i] + "' but found '" + (int)c1[i] + "' at index " + i);
+ fail("Expected '" + (int)c2[i] + "' but found '" + (int)c1[i] + "' at index " + i + ". Expected '" + build(c2, i) + "' but found '" + build(c1, i) + "'.");
}
}
- */
- assertEquals(expected.toString(), txt.getTextContent());
+ }
+
+ protected String build(char[] c, int i) {
+ int min = Math.max(0, i - 10);
+ int cnt = Math.min(20, c.length - min);
+ return new String(c, min, cnt);
}
}