Skip to content

Commit 2c44281

Browse files
committed
SWS-457
1 parent 3dfe569 commit 2c44281

File tree

3 files changed

+151
-16
lines changed

3 files changed

+151
-16
lines changed

core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ private class DelegatingStreamWriter implements XMLStreamWriter {
6969

7070
private int elementDepth = 0;
7171

72+
private boolean payloadAdded = false;
73+
7274
private DelegatingStreamWriter() {
7375
try {
7476
this.delegate = StAXUtils.createXMLStreamWriter(baos);
@@ -90,10 +92,6 @@ public void writeStartDocument(String encoding, String version) throws XMLStream
9092
this.encoding = encoding;
9193
}
9294

93-
public void writeEndDocument() throws XMLStreamException {
94-
// ignored
95-
}
96-
9795
public void writeStartElement(String localName) throws XMLStreamException {
9896
if (name == null) {
9997
name = new QName(localName);
@@ -121,20 +119,22 @@ public void writeStartElement(String prefix, String localName, String namespaceU
121119
public void writeEndElement() throws XMLStreamException {
122120
elementDepth--;
123121
delegate.writeEndElement();
124-
if (elementDepth <= 0) {
125-
addPayload();
126-
}
122+
addPayload();
127123
}
128124

129125
private void addPayload() throws XMLStreamException {
130-
delegate.flush();
131-
if (baos.size() > 0) {
132-
byte[] buf = baos.toByteArray();
133-
OMDataSource dataSource = new ByteArrayDataSource(buf, encoding);
134-
OMNamespace namespace = getAxiomFactory().createOMNamespace(name.getNamespaceURI(), name.getPrefix());
135-
OMElement payloadElement =
136-
getAxiomFactory().createOMElement(dataSource, name.getLocalPart(), namespace);
137-
getAxiomBody().addChild(payloadElement);
126+
if (elementDepth <= 0 && !payloadAdded) {
127+
delegate.flush();
128+
if (baos.size() > 0) {
129+
byte[] buf = baos.toByteArray();
130+
OMDataSource dataSource = new ByteArrayDataSource(buf, encoding);
131+
OMNamespace namespace =
132+
getAxiomFactory().createOMNamespace(name.getNamespaceURI(), name.getPrefix());
133+
OMElement payloadElement =
134+
getAxiomFactory().createOMElement(dataSource, name.getLocalPart(), namespace);
135+
getAxiomBody().addChild(payloadElement);
136+
payloadAdded = true;
137+
}
138138
}
139139
}
140140

@@ -143,25 +143,35 @@ public void writeEmptyElement(String localName) throws XMLStreamException {
143143
name = new QName(localName);
144144
}
145145
delegate.writeEmptyElement(localName);
146+
addPayload();
146147
}
147148

148149
public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
149150
if (name == null) {
150151
name = new QName(namespaceURI, localName);
151152
}
152153
delegate.writeEmptyElement(namespaceURI, localName);
154+
addPayload();
153155
}
154156

155157
public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
156158
if (name == null) {
157159
name = new QName(namespaceURI, localName, prefix);
158160
}
159161
delegate.writeEmptyElement(prefix, localName, namespaceURI);
162+
addPayload();
163+
}
164+
165+
public void writeEndDocument() throws XMLStreamException {
166+
elementDepth = 0;
167+
delegate.writeEndDocument();
168+
addPayload();
160169
}
161170

162171
// Delegation
163172

164173
public void close() throws XMLStreamException {
174+
addPayload();
165175
delegate.close();
166176
}
167177

core/src/test/java/org/springframework/ws/server/endpoint/StaxStreamPayloadEndpointTest.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ protected void invokeInternal(XMLStreamReader streamReader, XMLStreamWriter stre
7272
assertEquals("Invalid end event local name", REQUEST_ELEMENT, streamReader.getLocalName());
7373
assertEquals("Invalid end event namespace", NAMESPACE_URI, streamReader.getNamespaceURI());
7474
streamWriter.setDefaultNamespace(NAMESPACE_URI);
75-
streamWriter.writeEmptyElement(NAMESPACE_URI, RESPONSE_ELEMENT);
75+
streamWriter.writeStartElement(NAMESPACE_URI, RESPONSE_ELEMENT);
76+
streamWriter.writeDefaultNamespace(NAMESPACE_URI);
77+
streamWriter.writeEndElement();
7678
streamWriter.flush();
7779
streamWriter.close();
7880
}
@@ -133,5 +135,39 @@ public void testAxiomNoResponse() throws Exception {
133135
assertFalse("context has response", context.hasResponse());
134136
}
135137

138+
public void testAxiomResponseNoPayloadCaching() throws Exception {
139+
Transformer transformer = TransformerFactory.newInstance().newTransformer();
140+
SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
141+
AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory);
142+
transformer.transform(new StringSource(REQUEST), request.getPayloadResult());
143+
AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory();
144+
soapMessageFactory.setPayloadCaching(false);
145+
soapMessageFactory.afterPropertiesSet();
146+
MessageContext context = new DefaultMessageContext(request, soapMessageFactory);
147+
148+
MessageEndpoint endpoint = createResponseEndpoint();
149+
endpoint.invoke(context);
150+
assertTrue("context has not response", context.hasResponse());
151+
152+
StringResult stringResult = new StringResult();
153+
transformer.transform(context.getResponse().getPayloadSource(), stringResult);
154+
assertXMLEqual(RESPONSE, stringResult.toString());
155+
}
156+
157+
public void testAxiomNoResponseNoPayloadCaching() throws Exception {
158+
Transformer transformer = TransformerFactory.newInstance().newTransformer();
159+
SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
160+
AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory);
161+
transformer.transform(new StringSource(REQUEST), request.getPayloadResult());
162+
AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory();
163+
soapMessageFactory.setPayloadCaching(false);
164+
soapMessageFactory.afterPropertiesSet();
165+
MessageContext context = new DefaultMessageContext(request, soapMessageFactory);
166+
167+
MessageEndpoint endpoint = createNoResponseEndpoint();
168+
endpoint.invoke(context);
169+
assertFalse("context has response", context.hasResponse());
170+
}
171+
136172

137173
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package org.springframework.ws.soap.axiom;
2+
3+
import java.io.StringWriter;
4+
import javax.xml.stream.XMLStreamWriter;
5+
6+
import org.apache.axiom.soap.SOAPBody;
7+
import org.apache.axiom.soap.SOAPFactory;
8+
import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
9+
import org.custommonkey.xmlunit.XMLTestCase;
10+
11+
import org.springframework.xml.transform.StaxResult;
12+
13+
public class NonCachingPayloadTest extends XMLTestCase {
14+
15+
private Payload payload;
16+
17+
private SOAPBody body;
18+
19+
public final void setUp() {
20+
SOAPFactory soapFactory = new SOAP11Factory();
21+
body = soapFactory.createSOAPBody();
22+
payload = new NonCachingPayload(body, soapFactory);
23+
}
24+
25+
public void testDelegatingStreamWriter() throws Exception {
26+
StaxResult result = (StaxResult) payload.getResult();
27+
XMLStreamWriter streamWriter = result.getXMLStreamWriter();
28+
29+
String namespace = "http://springframework.org/spring-ws";
30+
streamWriter.setDefaultNamespace(namespace);
31+
streamWriter.writeStartElement(namespace, "root");
32+
streamWriter.writeDefaultNamespace(namespace);
33+
streamWriter.writeStartElement(namespace, "child");
34+
streamWriter.writeCharacters("text");
35+
streamWriter.writeEndElement();
36+
streamWriter.writeEndElement();
37+
streamWriter.flush();
38+
39+
StringWriter writer = new StringWriter();
40+
body.serialize(writer);
41+
42+
String expected = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
43+
"<root xmlns='http://springframework.org/spring-ws'>" + "<child>text</child>" + "</root></soapenv:Body>"
44+
;
45+
assertXMLEqual(expected, writer.toString());
46+
}
47+
48+
public void testDelegatingStreamWriterWriteEndDocument() throws Exception {
49+
StaxResult result = (StaxResult) payload.getResult();
50+
XMLStreamWriter streamWriter = result.getXMLStreamWriter();
51+
52+
String namespace = "http://springframework.org/spring-ws";
53+
streamWriter.setDefaultNamespace(namespace);
54+
streamWriter.writeStartElement(namespace, "root");
55+
streamWriter.writeDefaultNamespace(namespace);
56+
streamWriter.writeStartElement(namespace, "child");
57+
streamWriter.writeCharacters("text");
58+
streamWriter.writeEndDocument();
59+
streamWriter.flush();
60+
61+
StringWriter writer = new StringWriter();
62+
body.serialize(writer);
63+
64+
String expected = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
65+
"<root xmlns='http://springframework.org/spring-ws'>" + "<child>text</child>" + "</root></soapenv:Body>"
66+
;
67+
assertXMLEqual(expected, writer.toString());
68+
}
69+
70+
public void testDelegatingStreamWriterWriteEmptyElement() throws Exception {
71+
StaxResult result = (StaxResult) payload.getResult();
72+
XMLStreamWriter streamWriter = result.getXMLStreamWriter();
73+
74+
String namespace = "http://springframework.org/spring-ws";
75+
streamWriter.setDefaultNamespace(namespace);
76+
streamWriter.writeStartElement(namespace, "root");
77+
streamWriter.writeDefaultNamespace(namespace);
78+
streamWriter.writeEmptyElement(namespace, "child");
79+
streamWriter.writeEndElement();
80+
streamWriter.flush();
81+
82+
StringWriter writer = new StringWriter();
83+
body.serialize(writer);
84+
85+
String expected = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
86+
"<root xmlns='http://springframework.org/spring-ws'>" + "<child />" + "</root></soapenv:Body>";
87+
assertXMLEqual(expected, writer.toString());
88+
}
89+
}

0 commit comments

Comments
 (0)