SWS-457
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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 = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
|
||||
"<root xmlns='http://springframework.org/spring-ws'>" + "<child>text</child>" + "</root></soapenv:Body>"
|
||||
;
|
||||
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 = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
|
||||
"<root xmlns='http://springframework.org/spring-ws'>" + "<child>text</child>" + "</root></soapenv:Body>"
|
||||
;
|
||||
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 = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
|
||||
"<root xmlns='http://springframework.org/spring-ws'>" + "<child />" + "</root></soapenv:Body>";
|
||||
assertXMLEqual(expected, writer.toString());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user