From 2c44281cf9d3e271a24cbdfab47a37c685c38f7b Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 18 Dec 2008 21:00:44 +0000 Subject: [PATCH] SWS-457 --- .../ws/soap/axiom/NonCachingPayload.java | 40 +++++---- .../StaxStreamPayloadEndpointTest.java | 38 +++++++- .../ws/soap/axiom/NonCachingPayloadTest.java | 89 +++++++++++++++++++ 3 files changed, 151 insertions(+), 16 deletions(-) create mode 100644 core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java b/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java index 89b7a813..596f8e88 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java @@ -69,6 +69,8 @@ class NonCachingPayload extends Payload { private int elementDepth = 0; + private boolean payloadAdded = false; + private DelegatingStreamWriter() { try { this.delegate = StAXUtils.createXMLStreamWriter(baos); @@ -90,10 +92,6 @@ class NonCachingPayload extends Payload { this.encoding = encoding; } - public void writeEndDocument() throws XMLStreamException { - // ignored - } - public void writeStartElement(String localName) throws XMLStreamException { if (name == null) { name = new QName(localName); @@ -121,20 +119,22 @@ class NonCachingPayload extends Payload { public void writeEndElement() throws XMLStreamException { elementDepth--; delegate.writeEndElement(); - if (elementDepth <= 0) { - addPayload(); - } + addPayload(); } private void addPayload() throws XMLStreamException { - delegate.flush(); - if (baos.size() > 0) { - byte[] buf = baos.toByteArray(); - OMDataSource dataSource = new ByteArrayDataSource(buf, encoding); - OMNamespace namespace = getAxiomFactory().createOMNamespace(name.getNamespaceURI(), name.getPrefix()); - OMElement payloadElement = - getAxiomFactory().createOMElement(dataSource, name.getLocalPart(), namespace); - getAxiomBody().addChild(payloadElement); + if (elementDepth <= 0 && !payloadAdded) { + delegate.flush(); + if (baos.size() > 0) { + byte[] buf = baos.toByteArray(); + OMDataSource dataSource = new ByteArrayDataSource(buf, encoding); + OMNamespace namespace = + getAxiomFactory().createOMNamespace(name.getNamespaceURI(), name.getPrefix()); + OMElement payloadElement = + getAxiomFactory().createOMElement(dataSource, name.getLocalPart(), namespace); + getAxiomBody().addChild(payloadElement); + payloadAdded = true; + } } } @@ -143,6 +143,7 @@ class NonCachingPayload extends Payload { name = new QName(localName); } delegate.writeEmptyElement(localName); + addPayload(); } public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException { @@ -150,6 +151,7 @@ class NonCachingPayload extends Payload { name = new QName(namespaceURI, localName); } delegate.writeEmptyElement(namespaceURI, localName); + addPayload(); } public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException { @@ -157,11 +159,19 @@ class NonCachingPayload extends Payload { name = new QName(namespaceURI, localName, prefix); } delegate.writeEmptyElement(prefix, localName, namespaceURI); + addPayload(); + } + + public void writeEndDocument() throws XMLStreamException { + elementDepth = 0; + delegate.writeEndDocument(); + addPayload(); } // Delegation public void close() throws XMLStreamException { + addPayload(); delegate.close(); } diff --git a/core/src/test/java/org/springframework/ws/server/endpoint/StaxStreamPayloadEndpointTest.java b/core/src/test/java/org/springframework/ws/server/endpoint/StaxStreamPayloadEndpointTest.java index a86fb2ee..d4d9430c 100644 --- a/core/src/test/java/org/springframework/ws/server/endpoint/StaxStreamPayloadEndpointTest.java +++ b/core/src/test/java/org/springframework/ws/server/endpoint/StaxStreamPayloadEndpointTest.java @@ -72,7 +72,9 @@ public class StaxStreamPayloadEndpointTest extends AbstractMessageEndpointTestCa assertEquals("Invalid end event local name", REQUEST_ELEMENT, streamReader.getLocalName()); assertEquals("Invalid end event namespace", NAMESPACE_URI, streamReader.getNamespaceURI()); streamWriter.setDefaultNamespace(NAMESPACE_URI); - streamWriter.writeEmptyElement(NAMESPACE_URI, RESPONSE_ELEMENT); + streamWriter.writeStartElement(NAMESPACE_URI, RESPONSE_ELEMENT); + streamWriter.writeDefaultNamespace(NAMESPACE_URI); + streamWriter.writeEndElement(); streamWriter.flush(); streamWriter.close(); } @@ -133,5 +135,39 @@ public class StaxStreamPayloadEndpointTest extends AbstractMessageEndpointTestCa assertFalse("context has response", context.hasResponse()); } + public void testAxiomResponseNoPayloadCaching() throws Exception { + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory(); + AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory); + transformer.transform(new StringSource(REQUEST), request.getPayloadResult()); + AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory(); + soapMessageFactory.setPayloadCaching(false); + soapMessageFactory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(request, soapMessageFactory); + + MessageEndpoint endpoint = createResponseEndpoint(); + endpoint.invoke(context); + assertTrue("context has not response", context.hasResponse()); + + StringResult stringResult = new StringResult(); + transformer.transform(context.getResponse().getPayloadSource(), stringResult); + assertXMLEqual(RESPONSE, stringResult.toString()); + } + + public void testAxiomNoResponseNoPayloadCaching() throws Exception { + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory(); + AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory); + transformer.transform(new StringSource(REQUEST), request.getPayloadResult()); + AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory(); + soapMessageFactory.setPayloadCaching(false); + soapMessageFactory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(request, soapMessageFactory); + + MessageEndpoint endpoint = createNoResponseEndpoint(); + endpoint.invoke(context); + assertFalse("context has response", context.hasResponse()); + } + } \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java new file mode 100644 index 00000000..7d856b3e --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTest.java @@ -0,0 +1,89 @@ +package org.springframework.ws.soap.axiom; + +import java.io.StringWriter; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.axiom.soap.SOAPBody; +import org.apache.axiom.soap.SOAPFactory; +import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory; +import org.custommonkey.xmlunit.XMLTestCase; + +import org.springframework.xml.transform.StaxResult; + +public class NonCachingPayloadTest extends XMLTestCase { + + private Payload payload; + + private SOAPBody body; + + public final void setUp() { + SOAPFactory soapFactory = new SOAP11Factory(); + body = soapFactory.createSOAPBody(); + payload = new NonCachingPayload(body, soapFactory); + } + + public void testDelegatingStreamWriter() throws Exception { + StaxResult result = (StaxResult) payload.getResult(); + XMLStreamWriter streamWriter = result.getXMLStreamWriter(); + + String namespace = "http://springframework.org/spring-ws"; + streamWriter.setDefaultNamespace(namespace); + streamWriter.writeStartElement(namespace, "root"); + streamWriter.writeDefaultNamespace(namespace); + streamWriter.writeStartElement(namespace, "child"); + streamWriter.writeCharacters("text"); + streamWriter.writeEndElement(); + streamWriter.writeEndElement(); + streamWriter.flush(); + + StringWriter writer = new StringWriter(); + body.serialize(writer); + + String expected = "" + + "" + "text" + "" + ; + assertXMLEqual(expected, writer.toString()); + } + + public void testDelegatingStreamWriterWriteEndDocument() throws Exception { + StaxResult result = (StaxResult) payload.getResult(); + XMLStreamWriter streamWriter = result.getXMLStreamWriter(); + + String namespace = "http://springframework.org/spring-ws"; + streamWriter.setDefaultNamespace(namespace); + streamWriter.writeStartElement(namespace, "root"); + streamWriter.writeDefaultNamespace(namespace); + streamWriter.writeStartElement(namespace, "child"); + streamWriter.writeCharacters("text"); + streamWriter.writeEndDocument(); + streamWriter.flush(); + + StringWriter writer = new StringWriter(); + body.serialize(writer); + + String expected = "" + + "" + "text" + "" + ; + assertXMLEqual(expected, writer.toString()); + } + + public void testDelegatingStreamWriterWriteEmptyElement() throws Exception { + StaxResult result = (StaxResult) payload.getResult(); + XMLStreamWriter streamWriter = result.getXMLStreamWriter(); + + String namespace = "http://springframework.org/spring-ws"; + streamWriter.setDefaultNamespace(namespace); + streamWriter.writeStartElement(namespace, "root"); + streamWriter.writeDefaultNamespace(namespace); + streamWriter.writeEmptyElement(namespace, "child"); + streamWriter.writeEndElement(); + streamWriter.flush(); + + StringWriter writer = new StringWriter(); + body.serialize(writer); + + String expected = "" + + "" + "" + ""; + assertXMLEqual(expected, writer.toString()); + } +}