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