Working on client-side stuff.

This commit is contained in:
Arjen Poutsma
2007-01-08 19:41:06 +00:00
parent bc4581adc0
commit e667b6c957
3 changed files with 145 additions and 18 deletions

View File

@@ -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
* <code>Marshaller</code>. 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 <code>true</code> if a response was received; <code>false</code> 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 <code>null</code> 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 <code>null</code> if no response is given
*/
WebServiceMessage sendAndReceive(WebServiceMessageCallback callback) throws IOException;
void sendAndReceive(Source requestPayload, Result result) throws IOException;
}

View File

@@ -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 {

View File

@@ -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("<response/>");
messageControl.expectAndReturn(responseMock.getPayloadSource(), expected);
template.setMessageSender(new ResponseMessageSender());
replayMockControls();
Source response = template.sendAndReceive(new StringSource("<request />"));
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("<request />"));
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();
}
}
}