This commit is contained in:
Arjen Poutsma
2008-02-06 00:28:22 +00:00
parent 3ba48e6648
commit c14f950304
8 changed files with 348 additions and 132 deletions

View File

@@ -17,8 +17,7 @@
package org.springframework.xml.stream;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.InputStream;
import java.util.Arrays;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
@@ -28,75 +27,89 @@ import org.easymock.AbstractMatcher;
import org.easymock.MockControl;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.DTDHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.XMLReaderFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.xml.sax.SaxUtils;
public abstract class AbstractStaxXmlReaderTestCase extends TestCase {
protected static XMLInputFactory inputFactory = XMLInputFactory.newInstance();
private static final String XML_DTD_HANDLER =
"<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'><beans />";
private Resource testContentHandler;
private static final String XML_CONTENT_HANDLER =
"<?pi content?><root xmlns='namespace'><prefix:child xmlns:prefix='namespace2'>content</prefix:child></root>";
private XMLReader standardReader;
private static final String XML_CONTENT_HANDLER_ATTS = "<element xmlns='namespace' attr='value'/>";
private MockControl contentHandlerControl;
private XMLReader reader;
private ContentHandler contentHandler;
protected void setUp() throws Exception {
reader = XMLReaderFactory.createXMLReader();
reader.setFeature("http://xml.org/sax/features/namespaces", true);
reader.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
standardReader = XMLReaderFactory.createXMLReader();
contentHandlerControl = MockControl.createStrictControl(ContentHandler.class);
contentHandlerControl.setDefaultMatcher(new SaxArgumentMatcher());
ContentHandler contentHandlerMock = (ContentHandler) contentHandlerControl.getMock();
contentHandler = new CopyingContentHandler(contentHandlerMock);
standardReader.setContentHandler(contentHandler);
testContentHandler = new ClassPathResource("testContentHandler.xml", getClass());
}
public void testContentHandler() throws SAXException, IOException, XMLStreamException {
// record the callbacks by parsing the XML with a regular SAX parser
MockControl control = MockControl.createStrictControl(ContentHandler.class);
control.setDefaultMatcher(new SaxArgumentMatcher());
ContentHandler mock = (ContentHandler) control.getMock();
reader.setContentHandler(mock);
reader.parse(new InputSource(new StringReader(XML_CONTENT_HANDLER)));
control.replay();
AbstractStaxXmlReader staxXmlReader = createStaxXmlReader(new StringReader(XML_CONTENT_HANDLER));
staxXmlReader.setContentHandler(mock);
public void testContentHandlerNamespacesNoPrefixes() throws SAXException, IOException, XMLStreamException {
standardReader.setFeature("http://xml.org/sax/features/namespaces", true);
standardReader.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
standardReader.parse(SaxUtils.createInputSource(testContentHandler));
contentHandlerControl.replay();
AbstractStaxXmlReader staxXmlReader = createStaxXmlReader(testContentHandler.getInputStream());
staxXmlReader.setFeature("http://xml.org/sax/features/namespaces", true);
staxXmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
staxXmlReader.setContentHandler(contentHandler);
staxXmlReader.parse(new InputSource());
control.verify();
contentHandlerControl.verify();
}
public void testContentHandlerAttributes() throws SAXException, IOException, XMLStreamException {
MockControl control = MockControl.createStrictControl(ContentHandler.class);
control.setDefaultMatcher(new SaxArgumentMatcher());
ContentHandler mock = (ContentHandler) control.getMock();
reader.setContentHandler(mock);
reader.parse(new InputSource(new StringReader(XML_CONTENT_HANDLER_ATTS)));
control.replay();
AbstractStaxXmlReader staxXmlReader = createStaxXmlReader(new StringReader(XML_CONTENT_HANDLER_ATTS));
staxXmlReader.setContentHandler(mock);
public void testContentHandlerNamespacesPrefixes() throws SAXException, IOException, XMLStreamException {
standardReader.setFeature("http://xml.org/sax/features/namespaces", true);
standardReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
standardReader.parse(SaxUtils.createInputSource(testContentHandler));
contentHandlerControl.replay();
AbstractStaxXmlReader staxXmlReader = createStaxXmlReader(testContentHandler.getInputStream());
staxXmlReader.setFeature("http://xml.org/sax/features/namespaces", true);
staxXmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
staxXmlReader.setContentHandler(contentHandler);
staxXmlReader.parse(new InputSource());
control.verify();
contentHandlerControl.verify();
}
public void testDtdHandler() throws IOException, SAXException, XMLStreamException {
// record the callbacks by parsing the XML with a regular SAX parser
MockControl control = MockControl.createStrictControl(DTDHandler.class);
control.setDefaultMatcher(new SaxArgumentMatcher());
DTDHandler mock = (DTDHandler) control.getMock();
reader.setDTDHandler(mock);
reader.parse(new InputSource(new StringReader(XML_DTD_HANDLER)));
control.replay();
AbstractStaxXmlReader staxXmlReader = createStaxXmlReader(new StringReader(XML_DTD_HANDLER));
staxXmlReader.setDTDHandler(mock);
public void testContentHandlerNoNamespacesPrefixes() throws SAXException, IOException, XMLStreamException {
standardReader.setFeature("http://xml.org/sax/features/namespaces", false);
standardReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
standardReader.parse(SaxUtils.createInputSource(testContentHandler));
contentHandlerControl.replay();
AbstractStaxXmlReader staxXmlReader = createStaxXmlReader(testContentHandler.getInputStream());
staxXmlReader.setFeature("http://xml.org/sax/features/namespaces", false);
staxXmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
staxXmlReader.setContentHandler(contentHandler);
staxXmlReader.parse(new InputSource());
control.verify();
contentHandlerControl.verify();
}
protected abstract AbstractStaxXmlReader createStaxXmlReader(Reader reader) throws XMLStreamException;
protected abstract AbstractStaxXmlReader createStaxXmlReader(InputStream inputStream) throws XMLStreamException;
/** Easymock <code>ArgumentMatcher</code> implementation that matches SAX arguments. */
protected static class SaxArgumentMatcher extends AbstractMatcher {
@@ -139,22 +152,37 @@ public abstract class AbstractStaxXmlReaderTestCase extends TestCase {
return false;
}
for (int i = 0; i < expectedAttributes.getLength(); i++) {
if (!expectedAttributes.getURI(i).equals(actualAttributes.getURI(i)) ||
!expectedAttributes.getQName(i).equals(actualAttributes.getQName(i)) ||
!expectedAttributes.getType(i).equals(actualAttributes.getType(i)) ||
!expectedAttributes.getValue(i).equals(actualAttributes.getValue(i))) {
boolean found = false;
for (int j = 0; j < actualAttributes.getLength(); j++) {
if (expectedAttributes.getURI(i).equals(actualAttributes.getURI(j)) &&
expectedAttributes.getQName(i).equals(actualAttributes.getQName(j)) &&
// expectedAttributes.getLocalName(i).equals(actualAttributes.getLocalName(j)) &&
expectedAttributes.getType(i).equals(actualAttributes.getType(j)) &&
expectedAttributes.getValue(i).equals(actualAttributes.getValue(j))) {
found = true;
break;
}
}
if (!found) {
return false;
}
}
return true;
}
else if (expected instanceof Locator) {
Locator expectedLocator = (Locator) expected;
Locator actualLocator = (Locator) actual;
return expectedLocator.getColumnNumber() == actualLocator.getColumnNumber() &&
expectedLocator.getLineNumber() == actualLocator.getLineNumber();
else {
return super.argumentMatches(expected, actual);
}
}
public String toString(Object[] arguments) {
if (arguments != null && arguments.length == 3 && arguments[0] instanceof char[] &&
arguments[1] instanceof Integer && arguments[2] instanceof Integer) {
return new String((char[]) arguments[0], ((Integer) arguments[1]).intValue(),
((Integer) arguments[2]).intValue());
}
else {
return super.toString(arguments);
}
return super.argumentMatches(expected, actual);
}
protected String argumentToString(Object argument) {
@@ -170,10 +198,19 @@ public abstract class AbstractStaxXmlReaderTestCase extends TestCase {
Attributes attributes = (Attributes) argument;
StringBuffer buffer = new StringBuffer("[");
for (int i = 0; i < attributes.getLength(); i++) {
buffer.append('{');
buffer.append(attributes.getURI(i));
buffer.append('}');
buffer.append(attributes.getQName(i));
if (attributes.getURI(i).length() != 0) {
buffer.append('{');
buffer.append(attributes.getURI(i));
buffer.append('}');
}
// if (attributes.getLocalName(i).length() != 0) {
// buffer.append('[');
// buffer.append(attributes.getLocalName(i));
// buffer.append(']');
// }
if (attributes.getQName(i).length() != 0) {
buffer.append(attributes.getQName(i));
}
buffer.append('=');
buffer.append(attributes.getValue(i));
if (i < attributes.getLength() - 1) {
@@ -198,5 +235,64 @@ public abstract class AbstractStaxXmlReaderTestCase extends TestCase {
}
}
private static class CopyingContentHandler implements ContentHandler {
private ContentHandler wrappee;
private CopyingContentHandler(ContentHandler wrappee) {
this.wrappee = wrappee;
}
public void setDocumentLocator(Locator locator) {
wrappee.setDocumentLocator(locator);
}
public void startDocument() throws SAXException {
wrappee.startDocument();
}
public void endDocument() throws SAXException {
wrappee.endDocument();
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
wrappee.startPrefixMapping(prefix, uri);
}
public void endPrefixMapping(String prefix) throws SAXException {
wrappee.endPrefixMapping(prefix);
}
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
wrappee.startElement(uri, localName, qName, new AttributesImpl(attributes));
}
public void endElement(String uri, String localName, String qName) throws SAXException {
wrappee.endElement(uri, localName, qName);
}
public void characters(char ch[], int start, int length) throws SAXException {
wrappee.characters(copy(ch), start, length);
}
public void ignorableWhitespace(char ch[], int start, int length) throws SAXException {
}
public void processingInstruction(String target, String data) throws SAXException {
wrappee.processingInstruction(target, data);
}
public void skippedEntity(String name) throws SAXException {
wrappee.skippedEntity(name);
}
}
private static char[] copy(char[] ch) {
char[] copy = new char[ch.length];
System.arraycopy(ch, 0, copy, 0, ch.length);
return copy;
}
}

View File

@@ -16,7 +16,7 @@
package org.springframework.xml.stream;
import java.io.Reader;
import java.io.InputStream;
import java.io.StringReader;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
@@ -31,8 +31,8 @@ public class StaxEventXmlReaderTest extends AbstractStaxXmlReaderTestCase {
public static final String CONTENT = "<root xmlns='http://springframework.org/spring-ws'><child/></root>";
protected AbstractStaxXmlReader createStaxXmlReader(Reader reader) throws XMLStreamException {
return new StaxEventXmlReader(inputFactory.createXMLEventReader(reader));
protected AbstractStaxXmlReader createStaxXmlReader(InputStream inputStream) throws XMLStreamException {
return new StaxEventXmlReader(inputFactory.createXMLEventReader(inputStream));
}
public void testPartial() throws Exception {

View File

@@ -16,7 +16,7 @@
package org.springframework.xml.stream;
import java.io.Reader;
import java.io.InputStream;
import java.io.StringReader;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
@@ -32,8 +32,8 @@ public class StaxStreamXmlReaderTest extends AbstractStaxXmlReaderTestCase {
public static final String CONTENT = "<root xmlns='http://springframework.org/spring-ws'><child/></root>";
protected AbstractStaxXmlReader createStaxXmlReader(Reader reader) throws XMLStreamException {
return new StaxStreamXmlReader(inputFactory.createXMLStreamReader(reader));
protected AbstractStaxXmlReader createStaxXmlReader(InputStream inputStream) throws XMLStreamException {
return new StaxStreamXmlReader(inputFactory.createXMLStreamReader(inputStream));
}
public void testPartial() throws Exception {