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