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 10cce47a..85547e2c 100644
--- a/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java
+++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java
@@ -25,7 +25,10 @@ import javax.xml.transform.TransformerException;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.WebServiceMessageFactory;
+import org.springframework.ws.client.support.WebServiceAccessor;
import org.springframework.ws.context.MessageContext;
+import org.springframework.ws.transport.WebServiceMessageSender;
/**
* @author Arjen Poutsma
@@ -36,6 +39,29 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
private Unmarshaller unmarshaller;
+ /**
+ * Creates a new WebServiceTemplate.
+ *
WebServiceTemplate based on the given message factory and message sender.
+ *
+ * @param messageFactory the message factory to use
+ * @param messageSender the message sender to use
+ */
+ public WebServiceTemplate(WebServiceMessageFactory messageFactory, WebServiceMessageSender messageSender) {
+ setMessageFactory(messageFactory);
+ setMessageSender(messageSender);
+ }
+
/**
* Returns the marshaller for this template.
*/
diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceAccessor.java b/sandbox/src/main/java/org/springframework/ws/client/support/WebServiceAccessor.java
similarity index 98%
rename from sandbox/src/main/java/org/springframework/ws/client/WebServiceAccessor.java
rename to sandbox/src/main/java/org/springframework/ws/client/support/WebServiceAccessor.java
index 2006abd0..f274db64 100644
--- a/sandbox/src/main/java/org/springframework/ws/client/WebServiceAccessor.java
+++ b/sandbox/src/main/java/org/springframework/ws/client/support/WebServiceAccessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.ws.client;
+package org.springframework.ws.client.support;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
diff --git a/sandbox/src/main/java/org/springframework/ws/client/support/WebServiceGatewaySupport.java b/sandbox/src/main/java/org/springframework/ws/client/support/WebServiceGatewaySupport.java
new file mode 100644
index 00000000..143c46b3
--- /dev/null
+++ b/sandbox/src/main/java/org/springframework/ws/client/support/WebServiceGatewaySupport.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.ws.client.support;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.BeanInitializationException;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.oxm.Marshaller;
+import org.springframework.oxm.Unmarshaller;
+import org.springframework.ws.WebServiceMessageFactory;
+import org.springframework.ws.client.WebServiceTemplate;
+import org.springframework.ws.transport.WebServiceMessageSender;
+
+/**
+ * Convenient super class for application classes that need Web service access.
+ *
+ * Requires a {@link org.springframework.ws.WebServiceMessageFactory} and {@link org.springframework.ws.transport.WebServiceMessageSender},
+ * or a {@link org.springframework.ws.client.WebServiceTemplate} instance to be set. It will create its own
+ * WebServiceTemplate if WebServiceMessageFactory and WebServiceMessageSender are
+ * passed in.
+ *
+ * In addition to the message factory and sender properties, this gateway offers {@link
+ * org.springframework.oxm.Marshaller} and {@link org.springframework.oxm.Unmarshaller} properties. Setting these is
+ * required when the {@link org.springframework.ws.client.WebServiceTemplate#marshalSendAndReceive(Object) marshalling
+ * methods} of the template are to be used.
+ *
+ * @author Arjen Poutsma
+ * @see #setMessageFactory(org.springframework.ws.WebServiceMessageFactory)
+ * @see #setMessageSender(org.springframework.ws.transport.WebServiceMessageSender)
+ * @see org.springframework.ws.client.WebServiceTemplate
+ * @see #setMarshaller(org.springframework.oxm.Marshaller)
+ */
+public abstract class WebServiceGatewaySupport implements InitializingBean {
+
+ protected final Log logger = LogFactory.getLog(getClass());
+
+ private WebServiceMessageFactory messageFactory;
+
+ private WebServiceMessageSender messageSender;
+
+ private WebServiceTemplate webServiceTemplate;
+
+ private Marshaller marshaller;
+
+ private Unmarshaller unmarshaller;
+
+ /**
+ * Returns the WebServiceMessageFactory used by the gateway.
+ */
+ public final WebServiceMessageFactory getMessageFactory() {
+ return messageFactory;
+ }
+
+ /**
+ * Set the WebServiceMessageFactory to be used by the gateway.
+ */
+ public final void setMessageFactory(WebServiceMessageFactory messageFactory) {
+ this.messageFactory = messageFactory;
+ }
+
+ /**
+ * Returns the WebServiceMessageSender used by the gateway.
+ */
+ public final WebServiceMessageSender getMessageSender() {
+ return messageSender;
+ }
+
+ /**
+ * Sets the WebServiceMessageSender to be used by the gateway.
+ */
+ public final void setMessageSender(WebServiceMessageSender messageSender) {
+ this.messageSender = messageSender;
+ }
+
+ /**
+ * Returns the WebServiceTemplate for the gateway.
+ */
+ public final WebServiceTemplate getWebServiceTemplate() {
+ return webServiceTemplate;
+ }
+
+ /**
+ * Sets the WebServiceTemplate to be used by the gateway.
+ */
+ public final void setWebServiceTemplate(WebServiceTemplate webServiceTemplate) {
+ this.webServiceTemplate = webServiceTemplate;
+ }
+
+ /**
+ * Returns the Marshaller used by the gateway.
+ */
+ public final Marshaller getMarshaller() {
+ return marshaller;
+ }
+
+ /**
+ * Sets the Marshaller used by the gateway. Setting this property is only required if the marshalling
+ * functionality of WebServiceTemplate is to be used.
+ *
+ * @see org.springframework.ws.client.WebServiceTemplate#marshalSendAndReceive
+ */
+ public void setMarshaller(Marshaller marshaller) {
+ this.marshaller = marshaller;
+ }
+
+ /**
+ * Returns the Unmarshaller used by the gateway.
+ */
+ public final Unmarshaller getUnmarshaller() {
+ return unmarshaller;
+ }
+
+ /**
+ * Sets the Unmarshaller used by the gateway. Setting this property is only required if the marshalling
+ * functionality of WebServiceTemplate is to be used.
+ *
+ * @see org.springframework.ws.client.WebServiceTemplate#marshalSendAndReceive
+ */
+ public final void setUnmarshaller(Unmarshaller unmarshaller) {
+ this.unmarshaller = unmarshaller;
+ }
+
+ public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {
+ if (webServiceTemplate == null && messageFactory != null && messageSender != null) {
+ webServiceTemplate = new WebServiceTemplate(messageFactory, messageSender);
+ if (marshaller != null) {
+ webServiceTemplate.setMarshaller(marshaller);
+ }
+ if (unmarshaller != null) {
+ webServiceTemplate.setUnmarshaller(unmarshaller);
+ }
+ }
+ if (webServiceTemplate == null) {
+ throw new IllegalArgumentException("messageFactory and messageSender or webServiceTemplate is required");
+ }
+ try {
+ initGateway();
+ }
+ catch (Exception ex) {
+ throw new BeanInitializationException("Initialization of Web service gateway failed: " + ex.getMessage(),
+ ex);
+ }
+ }
+
+ /**
+ * Subclasses can override this for custom initialization behavior. Gets called after population of this instance's
+ * bean properties.
+ *
+ * @throws java.lang.Exception if initialization fails
+ */
+ protected void initGateway() throws Exception {
+ }
+
+}
diff --git a/sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java b/sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java
index 28806e7f..c7fbe8bd 100644
--- a/sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java
+++ b/sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java
@@ -5,6 +5,9 @@ import java.io.IOException;
import org.springframework.ws.context.MessageContext;
/**
+ * Defines the methods for classes capable of sending and receiving {@link org.springframework.ws.WebServiceMessage}
+ * instances across a transport.
+ *
* @author Arjen Poutsma
*/
public interface WebServiceMessageSender {
diff --git a/sandbox/src/main/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSender.java b/sandbox/src/main/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSender.java
new file mode 100644
index 00000000..70398cf5
--- /dev/null
+++ b/sandbox/src/main/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSender.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.ws.transport.http;
+
+import java.net.URL;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.util.Assert;
+import org.springframework.ws.transport.WebServiceMessageSender;
+
+/**
+ * Abstract base class for {@link org.springframework.ws.transport.WebServiceMessageSender} implementations that use
+ * HTTP.
+ *
+ * @author Arjen Poutsma
+ */
+public abstract class AbstractHttpWebServiceMessageSender implements WebServiceMessageSender, InitializingBean {
+
+ private URL url;
+
+ /**
+ * Returns the url used by this message sender.
+ */
+ public URL getUrl() {
+ return url;
+ }
+
+ /**
+ * Sets the url used by this message sender.
+ */
+ public void setUrl(URL url) {
+ this.url = url;
+ }
+
+ public void afterPropertiesSet() throws Exception {
+ Assert.notNull(url, "url is required");
+ }
+
+}
diff --git a/sandbox/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java b/sandbox/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java
index 245ba2a0..f32230d7 100644
--- a/sandbox/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java
+++ b/sandbox/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java
@@ -17,7 +17,6 @@
package org.springframework.ws.transport.http;
import java.io.IOException;
-import java.net.URL;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
@@ -26,7 +25,6 @@ import org.apache.commons.httpclient.methods.PostMethod;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.transport.TransportInputStream;
-import org.springframework.ws.transport.WebServiceMessageSender;
/**
* WebServiceMessageSender implementation that uses Jakarta
@@ -38,12 +36,10 @@ import org.springframework.ws.transport.WebServiceMessageSender;
* @author Arjen Poutsma
* @see org.springframework.ws.transport.http.HttpUrlConnectionMessageSender
*/
-public class CommonsHttpMessageSender implements WebServiceMessageSender {
+public class CommonsHttpMessageSender extends AbstractHttpWebServiceMessageSender {
private HttpClient httpClient;
- private URL url;
-
/**
* Create a new instance of the CommonsHttpMessageSender with a default HttpClient that
* uses a default MultiThreadedHttpConnectionManager.
@@ -166,18 +162,4 @@ public class CommonsHttpMessageSender implements WebServiceMessageSender {
}
}
}
-
- /**
- * Returns the url used by this message sender.
- */
- public URL getUrl() {
- return url;
- }
-
- /**
- * Sets the url used by this message sender.
- */
- public void setUrl(URL url) {
- this.url = url;
- }
}
diff --git a/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionMessageSender.java b/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionMessageSender.java
index 34ad360e..704fb5a3 100644
--- a/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionMessageSender.java
+++ b/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionMessageSender.java
@@ -18,14 +18,12 @@ package org.springframework.ws.transport.http;
import java.io.IOException;
import java.net.HttpURLConnection;
-import java.net.URL;
import java.net.URLConnection;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.transport.TransportInputStream;
import org.springframework.ws.transport.TransportOutputStream;
-import org.springframework.ws.transport.WebServiceMessageSender;
/**
* WebServiceMessageSender implementation that uses standard J2SE facilities to execute POST requests,
@@ -38,26 +36,10 @@ import org.springframework.ws.transport.WebServiceMessageSender;
* @author Arjen Poutsma
* @see java.net.HttpURLConnection
*/
-public class HttpUrlConnectionMessageSender implements WebServiceMessageSender {
+public class HttpUrlConnectionMessageSender extends AbstractHttpWebServiceMessageSender {
private static final String HTTP_METHOD_POST = "POST";
- private URL url;
-
- /**
- * Returns the url used by this message sender.
- */
- public URL getUrl() {
- return url;
- }
-
- /**
- * Sets the url used by this message sender.
- */
- public void setUrl(URL url) {
- this.url = url;
- }
-
public void sendAndReceive(MessageContext messageContext) throws IOException {
HttpURLConnection connection = openConnection();
try {
@@ -123,4 +105,5 @@ public class HttpUrlConnectionMessageSender implements WebServiceMessageSender {
}
}
}
+
}
diff --git a/sandbox/src/test/java/org/springframework/ws/client/WebServiceAccessorTest.java b/sandbox/src/test/java/org/springframework/ws/client/support/WebServiceAccessorTest.java
similarity index 98%
rename from sandbox/src/test/java/org/springframework/ws/client/WebServiceAccessorTest.java
rename to sandbox/src/test/java/org/springframework/ws/client/support/WebServiceAccessorTest.java
index 3a7eedfb..d91fe635 100644
--- a/sandbox/src/test/java/org/springframework/ws/client/WebServiceAccessorTest.java
+++ b/sandbox/src/test/java/org/springframework/ws/client/support/WebServiceAccessorTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.ws.client;
+package org.springframework.ws.client.support;
import junit.framework.TestCase;
import org.easymock.MockControl;
diff --git a/sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java b/sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java
index b92d6645..34145c1d 100644
--- a/sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java
+++ b/sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java
@@ -16,21 +16,37 @@
package org.springframework.ws.transport.http;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.net.URL;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.stream.StreamSource;
-import junit.framework.TestCase;
+import org.custommonkey.xmlunit.XMLTestCase;
+import org.custommonkey.xmlunit.XMLUnit;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.springframework.util.FileCopyUtils;
+import org.springframework.ws.context.DefaultMessageContext;
+import org.springframework.ws.context.MessageContext;
+import org.springframework.ws.soap.saaj.SaajSoapMessage;
+import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
+import org.springframework.xml.transform.StringResult;
+import org.springframework.xml.transform.StringSource;
-public abstract class AbstractHttpWebServiceMessageSenderTestCase extends TestCase {
+public abstract class AbstractHttpWebServiceMessageSenderTestCase extends XMLTestCase {
protected Server jettyServer;
@@ -40,33 +56,103 @@ public abstract class AbstractHttpWebServiceMessageSenderTestCase extends TestCa
protected static final String URL = "http://localhost:8888";
+ protected static final String REQUEST = "