This commit is contained in:
Arjen Poutsma
2008-12-18 21:00:44 +00:00
parent 3dfe569726
commit 2c44281cf9
3 changed files with 151 additions and 16 deletions

View File

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

View File

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

View File

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