diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java index 7984ab4a..869c5efc 100644 --- a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java +++ b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java @@ -18,7 +18,6 @@ package org.springframework.ws.soap.axiom; import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.io.InputStreamReader; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -26,9 +25,6 @@ import javax.xml.transform.TransformerFactory; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.util.FileCopyUtils; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.WebServiceMessageFactory; import org.springframework.ws.soap.soap11.AbstractSoap11MessageFactoryTestCase; @@ -91,17 +87,26 @@ public class AxiomSoap11MessageFactoryTest extends AbstractSoap11MessageFactoryT messageFactory.setPayloadCaching(false); messageFactory.afterPropertiesSet(); - Resource resource = new ClassPathResource("SWS-502.xml", getClass()); - String expected = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream())); - InputStream inputStream = resource.getInputStream(); - TransportInputStream tis = new MockTransportInputStream(inputStream); - AxiomSoapMessage message = (AxiomSoapMessage) messageFactory.createWebServiceMessage(tis); + String payload = + "" + + "" + + "" + "" + + "true" + "0" + + "ok]]]]>>" + + "]]>" + ""; + String envelope = + "" + + payload + ""; + + InputStream inputStream = new ByteArrayInputStream(envelope.getBytes("UTF-8")); + AxiomSoapMessage message = + (AxiomSoapMessage) messageFactory.createWebServiceMessage(new MockTransportInputStream(inputStream)); StringResult result = new StringResult(); - transformer.transform(message.getEnvelope().getSource(), result); + transformer.transform(message.getPayloadSource(), result); XMLUnit.setIgnoreWhitespace(true); - XMLAssert.assertXMLEqual(expected, result.toString()); + XMLAssert.assertXMLEqual(payload, result.toString()); } diff --git a/xml/src/main/java/org/springframework/xml/stream/StaxStreamXmlReader.java b/xml/src/main/java/org/springframework/xml/stream/StaxStreamXmlReader.java index 1174e1e1..7164f11d 100644 --- a/xml/src/main/java/org/springframework/xml/stream/StaxStreamXmlReader.java +++ b/xml/src/main/java/org/springframework/xml/stream/StaxStreamXmlReader.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import org.xml.sax.helpers.AttributesImpl; import org.springframework.util.StringUtils; import org.springframework.xml.namespace.QNameUtils; +import org.springframework.xml.namespace.SimpleNamespaceContext; /** * SAX XMLReader that reads from a StAX XMLStreamReader. Reads from an @@ -44,6 +45,8 @@ public class StaxStreamXmlReader extends AbstractStaxXmlReader { private final XMLStreamReader reader; + private final SimpleNamespaceContext namespaceContext = new SimpleNamespaceContext(); + /** * Constructs a new instance of the StaxStreamXmlReader that reads from the given * XMLStreamReader. The supplied stream reader must be in XMLStreamConstants.START_DOCUMENT @@ -139,10 +142,22 @@ public class StaxStreamXmlReader extends AbstractStaxXmlReader { if (prefix == null) { prefix = ""; } - getContentHandler().startPrefixMapping(prefix, reader.getNamespaceURI(i)); + startPrefixMapping(prefix, reader.getNamespaceURI(i)); } - getContentHandler().startElement(qName.getNamespaceURI(), qName.getLocalPart(), - QNameUtils.toQualifiedName(qName), getAttributes()); + for (int i = 0; i < reader.getAttributeCount(); i++) { + String prefix = reader.getAttributePrefix(i); + if (prefix == null) { + prefix = ""; + } + String namespace = reader.getAttributeNamespace(i); + if (namespace == null) { + continue; + } + startPrefixMapping(prefix, namespace); + } + getContentHandler() + .startElement(qName.getNamespaceURI(), qName.getLocalPart(), QNameUtils.toQualifiedName(qName), + getAttributes()); } else { getContentHandler().startElement("", "", QNameUtils.toQualifiedName(qName), getAttributes()); @@ -150,6 +165,13 @@ public class StaxStreamXmlReader extends AbstractStaxXmlReader { } } + private void startPrefixMapping(String prefix, String namespace) throws SAXException { + if (!namespaceContext.getNamespaceURI(prefix).equals(namespace)) { + getContentHandler().startPrefixMapping(prefix, namespace); + namespaceContext.bindNamespaceUri(prefix, namespace); + } + } + private void handleEndElement() throws SAXException { if (getContentHandler() != null) { QName qName = reader.getName(); @@ -162,6 +184,7 @@ public class StaxStreamXmlReader extends AbstractStaxXmlReader { prefix = ""; } getContentHandler().endPrefixMapping(prefix); + namespaceContext.removeBinding(prefix); } } else { @@ -180,8 +203,7 @@ public class StaxStreamXmlReader extends AbstractStaxXmlReader { getLexicalHandler().startCDATA(); } if (getContentHandler() != null) { - getContentHandler() - .characters(reader.getTextCharacters(), reader.getTextStart(), reader.getTextLength()); + getContentHandler().characters(reader.getTextCharacters(), reader.getTextStart(), reader.getTextLength()); } if (XMLStreamConstants.CDATA == reader.getEventType() && getLexicalHandler() != null) { getLexicalHandler().endCDATA();