diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java b/sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java
index ad899499..46b1f40d 100644
--- a/sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java
+++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java
@@ -24,6 +24,7 @@ import org.springframework.ws.WebServiceMessage;
/**
* @author Arjen Poutsma
+ * @see org.springframework.ws.client.WebServiceTemplate
*/
public interface WebServiceOperations {
@@ -37,15 +38,30 @@ public interface WebServiceOperations {
Source sendAndReceive(Source requestPayload) throws IOException;
/**
- * Sends a web service message that contains the given payload, marshalled by the configured
- * Marshaller. Returns the unmarshalled payload of the response message, if any.
+ * Sends a web service message that contains the given payload. Writes the response, if any, to the given {@link
+ * Result}.
+ *
+ * @param requestPayload the payload of the request message
+ * @param responseResult the result to write the response payload to
+ * @return true if a response was received; false otherwise
+ */
+ boolean sendAndReceive(Source requestPayload, Result responseResult) throws IOException;
+
+ /**
+ * Sends a web service message that contains the given payload, marshalled by the configured {@link
+ * org.springframework.oxm.Marshaller}. Returns the unmarshalled payload of the response message, if any.
*
* @param requestPayload the object to marshal into the request message payload
* @return the unmarshalled payload of the response message, or null if no response is given
*/
- Object marshalAndSend(Object requestPayload) throws IOException;
+ Object sendAndReceive(Object requestPayload) throws IOException;
+ /**
+ * Sends a web service message that can be manipulated with the given callback. Returns the response message, if
+ * any.
+ *
+ * @param callback the callback to be used for manipulating the request message
+ * @return the response message, or null if no response is given
+ */
WebServiceMessage sendAndReceive(WebServiceMessageCallback callback) throws IOException;
-
- void sendAndReceive(Source requestPayload, Result result) throws IOException;
}
diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java b/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java
index 6a955b2a..9fc3377c 100644
--- a/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java
+++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java
@@ -64,7 +64,7 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
this.unmarshaller = unmarshaller;
}
- public Object marshalAndSend(final Object requestPayload) throws IOException {
+ public Object sendAndReceive(final Object requestPayload) throws IOException {
checkMarshallerAndUnmarshaller();
WebServiceMessage response = sendAndReceive(new WebServiceMessageCallback() {
@@ -80,21 +80,25 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
}
}
- public void sendAndReceive(final Source requestPayload, Result result) throws IOException {
+ public boolean sendAndReceive(final Source requestPayload, Result result) throws IOException {
Source responsePayload = sendAndReceive(requestPayload);
if (responsePayload != null) {
try {
Transformer transformer = createTransformer();
transformer.transform(responsePayload, result);
+ return true;
}
catch (TransformerException e) {
throw new WebServiceClientException("Could not transform payload of responsePayload message");
}
}
+ else {
+ return false;
+ }
}
public Source sendAndReceive(final Source requestPayload) throws IOException {
- return (Source) sendAndReceive(new WebServiceMessageCallback() {
+ WebServiceMessage response = sendAndReceive(new WebServiceMessageCallback() {
public void doInMessage(WebServiceMessage message) {
try {
Transformer transformer = createTransformer();
@@ -105,6 +109,7 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
}
}
});
+ return response != null ? response.getPayloadSource() : null;
}
public WebServiceMessage sendAndReceive(WebServiceMessageCallback requestCallback) throws IOException {
diff --git a/sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java b/sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java
index c397c779..9686a314 100644
--- a/sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java
+++ b/sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java
@@ -17,13 +17,19 @@
package org.springframework.ws.client;
import java.io.IOException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
import junit.framework.TestCase;
import org.easymock.MockControl;
+import org.springframework.oxm.Marshaller;
+import org.springframework.oxm.Unmarshaller;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.WebServiceMessageFactory;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.transport.WebServiceMessageSender;
+import org.springframework.xml.transform.StringResult;
+import org.springframework.xml.transform.StringSource;
public class WebServiceTemplateTest extends TestCase {
@@ -53,7 +59,7 @@ public class WebServiceTemplateTest extends TestCase {
template.setMarshaller(null);
replayMockControls();
try {
- template.marshalAndSend(new Object());
+ template.sendAndReceive(new Object());
fail("IllegalStateException expected");
}
catch (IllegalStateException ex) {
@@ -66,7 +72,7 @@ public class WebServiceTemplateTest extends TestCase {
template.setUnmarshaller(null);
replayMockControls();
try {
- template.marshalAndSend(new Object());
+ template.sendAndReceive(new Object());
fail("IllegalStateException expected");
}
catch (IllegalStateException ex) {
@@ -78,23 +84,110 @@ public class WebServiceTemplateTest extends TestCase {
public void testSendAndReceiveMessageResponse() throws Exception {
factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), requestMock);
factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), responseMock);
- template.setMessageSender(new WebServiceMessageSender() {
-
- public void sendAndReceive(MessageContext messageContext) throws IOException {
- assertEquals("Invalid request message", requestMock, messageContext.getRequest());
- messageContext.getResponse();
- }
- });
+ template.setMessageSender(new ResponseMessageSender());
replayMockControls();
WebServiceMessage response = template.sendAndReceive(new WebServiceMessageCallback() {
public void doInMessage(WebServiceMessage message) throws IOException {
assertEquals("Invalid request message", requestMock, message);
}
});
- assertEquals("No response", responseMock, response);
+ assertEquals("Invalid response", responseMock, response);
verifyMockControls();
}
+ public void testSendAndReceiveMessageNoResponse() throws Exception {
+ factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), requestMock);
+ template.setMessageSender(new NoResponseMessageSender());
+ replayMockControls();
+ WebServiceMessage response = template.sendAndReceive(new WebServiceMessageCallback() {
+ public void doInMessage(WebServiceMessage message) throws IOException {
+ assertEquals("Invalid request message", requestMock, message);
+ }
+ });
+ assertNull("No response", response);
+ verifyMockControls();
+ }
+
+ public void testSendAndReceiveSourceResponse() throws Exception {
+ factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), requestMock);
+ factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), responseMock);
+ messageControl.expectAndReturn(requestMock.getPayloadResult(), new StringResult());
+ Source expected = new StringSource("");
+ messageControl.expectAndReturn(responseMock.getPayloadSource(), expected);
+ template.setMessageSender(new ResponseMessageSender());
+ replayMockControls();
+ Source response = template.sendAndReceive(new StringSource(""));
+ assertEquals("Invalid response", expected, response);
+ }
+
+ public void testSendAndReceiveSourceNoResponse() throws Exception {
+ factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), requestMock);
+ messageControl.expectAndReturn(requestMock.getPayloadResult(), new StringResult());
+ template.setMessageSender(new NoResponseMessageSender());
+ replayMockControls();
+ Source response = template.sendAndReceive(new StringSource(""));
+ assertNull("Invalid response", response);
+ }
+
+ public void testSendAndReceiveMarshallResponse() throws Exception {
+ template.setMessageSender(new ResponseMessageSender());
+ MockControl marshallerControl = MockControl.createControl(Marshaller.class);
+ Marshaller marshallerMock = (Marshaller) marshallerControl.getMock();
+ template.setMarshaller(marshallerMock);
+ MockControl unmarshallerControl = MockControl.createControl(Unmarshaller.class);
+ Unmarshaller unmarshallerMock = (Unmarshaller) unmarshallerControl.getMock();
+ template.setUnmarshaller(unmarshallerMock);
+ Object request = new Object();
+ Object expected = new Object();
+ Result requestResult = new StringResult();
+ Source responseSource = new StringSource("");
+
+ factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), requestMock);
+ messageControl.expectAndReturn(requestMock.getPayloadResult(), requestResult);
+ marshallerMock.marshal(request, requestResult);
+ factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), responseMock);
+ messageControl.expectAndReturn(responseMock.getPayloadSource(), responseSource);
+ unmarshallerControl.expectAndReturn(unmarshallerMock.unmarshal(responseSource), expected);
+
+ replayMockControls();
+ marshallerControl.replay();
+ unmarshallerControl.replay();
+
+ Object response = template.sendAndReceive(request);
+
+ assertEquals("Invalid response", expected, response);
+
+ verifyMockControls();
+ marshallerControl.verify();
+ unmarshallerControl.verify();
+ }
+
+ public void testSendAndReceiveMarshallNoResponse() throws Exception {
+ template.setMessageSender(new NoResponseMessageSender());
+ MockControl marshallerControl = MockControl.createControl(Marshaller.class);
+ Marshaller marshallerMock = (Marshaller) marshallerControl.getMock();
+ template.setMarshaller(marshallerMock);
+ MockControl unmarshallerControl = MockControl.createControl(Unmarshaller.class);
+ Unmarshaller unmarshallerMock = (Unmarshaller) unmarshallerControl.getMock();
+ template.setUnmarshaller(unmarshallerMock);
+ Object request = new Object();
+ Result requestResult = new StringResult();
+
+ factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), requestMock);
+ messageControl.expectAndReturn(requestMock.getPayloadResult(), requestResult);
+ marshallerMock.marshal(request, requestResult);
+
+ replayMockControls();
+ marshallerControl.replay();
+
+ Object response = template.sendAndReceive(request);
+
+ assertNull("Invalid response", response);
+
+ verifyMockControls();
+ marshallerControl.verify();
+ }
+
private void replayMockControls() {
factoryControl.replay();
messageControl.replay();
@@ -105,5 +198,18 @@ public class WebServiceTemplateTest extends TestCase {
messageControl.verify();
}
+ private class NoResponseMessageSender implements WebServiceMessageSender {
+ public void sendAndReceive(MessageContext messageContext) throws IOException {
+ assertEquals("Invalid request message", requestMock, messageContext.getRequest());
+ }
+ }
+
+ private class ResponseMessageSender implements WebServiceMessageSender {
+
+ public void sendAndReceive(MessageContext messageContext) throws IOException {
+ assertEquals("Invalid request message", requestMock, messageContext.getRequest());
+ messageContext.getResponse();
+ }
+ }
}
\ No newline at end of file