SWS-146
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.springframework.ws.transport.http;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
@@ -70,6 +71,15 @@ public class MessageDispatcherServlet extends FrameworkServlet {
|
||||
/** Well-known name for the {@link WebServiceMessageReceiver} object in the bean factory for this namespace. */
|
||||
public static final String DEFAULT_MESSAGE_RECEIVER_BEAN_NAME = "messageReceiver";
|
||||
|
||||
/**
|
||||
* Well-known name for the {@link WebServiceMessageReceiverHandlerAdapter} object in the bean factory for this
|
||||
* namespace.
|
||||
*/
|
||||
public static final String DEFAULT_MESSAGE_RECEIVER_HANDLER_ADAPTER_BEAN_NAME = "messageReceiverHandlerAdapter";
|
||||
|
||||
/** Well-known name for the {@link WsdlDefinitionHandlerAdapter} object in the bean factory for this namespace. */
|
||||
public static final String DEFAULT_WSDL_DEFINITION_HANDLER_ADAPTER_BEAN_NAME = "wsdlDefinitionHandlerAdapter";
|
||||
|
||||
/**
|
||||
* Name of the class path resource (relative to the {@link MessageDispatcherServlet} class) that defines
|
||||
* <code>MessageDispatcherServlet's</code> default strategy names.
|
||||
@@ -83,12 +93,15 @@ public class MessageDispatcherServlet extends FrameworkServlet {
|
||||
|
||||
private String messageFactoryBeanName = DEFAULT_MESSAGE_FACTORY_BEAN_NAME;
|
||||
|
||||
private String messageReceiverHandlerAdapterBeanName = DEFAULT_MESSAGE_RECEIVER_HANDLER_ADAPTER_BEAN_NAME;
|
||||
|
||||
/** The {@link WebServiceMessageReceiverHandlerAdapter} used by this servlet. */
|
||||
private WebServiceMessageReceiverHandlerAdapter messageReceiverHandlerAdapter =
|
||||
new WebServiceMessageReceiverHandlerAdapter();
|
||||
private WebServiceMessageReceiverHandlerAdapter messageReceiverHandlerAdapter;
|
||||
|
||||
private String wsdlDefinitionHandlerAdapterBeanName = DEFAULT_WSDL_DEFINITION_HANDLER_ADAPTER_BEAN_NAME;
|
||||
|
||||
/** The {@link WsdlDefinitionHandlerAdapter} used by this servlet. */
|
||||
private WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter();
|
||||
private WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter;
|
||||
|
||||
private String messageReceiverBeanName = DEFAULT_MESSAGE_RECEIVER_BEAN_NAME;
|
||||
|
||||
@@ -140,6 +153,32 @@ public class MessageDispatcherServlet extends FrameworkServlet {
|
||||
return transformWsdlLocations;
|
||||
}
|
||||
|
||||
/** Returns the bean name used to lookup a {@link WebServiceMessageReceiverHandlerAdapter}. */
|
||||
public String getMessageReceiverHandlerAdapterBeanName() {
|
||||
return messageReceiverHandlerAdapterBeanName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the bean name used to lookup a {@link WebServiceMessageReceiverHandlerAdapter}. Defaults to {@link
|
||||
* #DEFAULT_MESSAGE_RECEIVER_HANDLER_ADAPTER_BEAN_NAME}.
|
||||
*/
|
||||
public void setMessageReceiverHandlerAdapterBeanName(String messageReceiverHandlerAdapterBeanName) {
|
||||
this.messageReceiverHandlerAdapterBeanName = messageReceiverHandlerAdapterBeanName;
|
||||
}
|
||||
|
||||
/** Returns the bean name used to lookup a {@link WsdlDefinitionHandlerAdapter}. */
|
||||
public String getWsdlDefinitionHandlerAdapterBeanName() {
|
||||
return wsdlDefinitionHandlerAdapterBeanName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the bean name used to lookup a {@link WsdlDefinitionHandlerAdapter}. Defaults to {@link
|
||||
* #DEFAULT_WSDL_DEFINITION_HANDLER_ADAPTER_BEAN_NAME}.
|
||||
*/
|
||||
public void setWsdlDefinitionHandlerAdapterBeanName(String wsdlDefinitionHandlerAdapterBeanName) {
|
||||
this.wsdlDefinitionHandlerAdapterBeanName = wsdlDefinitionHandlerAdapterBeanName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether relative address locations in the WSDL are to be transformed using the request URI of the incoming
|
||||
* {@link HttpServletRequest}. Defaults to <code>false</code>.
|
||||
@@ -160,7 +199,8 @@ public class MessageDispatcherServlet extends FrameworkServlet {
|
||||
}
|
||||
|
||||
protected void initFrameworkServlet() throws ServletException, BeansException {
|
||||
initHandlerAdapters();
|
||||
initMessageReceiverHandlerAdapter();
|
||||
initWsdlDefinitionHandlerAdapter();
|
||||
initMessageReceiver();
|
||||
initWsdlDefinitions();
|
||||
}
|
||||
@@ -200,23 +240,25 @@ public class MessageDispatcherServlet extends FrameworkServlet {
|
||||
}
|
||||
}
|
||||
|
||||
private void initHandlerAdapters() throws BeansException {
|
||||
private void initMessageReceiverHandlerAdapter() {
|
||||
try {
|
||||
// setup the receiver adapter
|
||||
messageReceiverHandlerAdapter = new WebServiceMessageReceiverHandlerAdapter();
|
||||
try {
|
||||
messageReceiverHandlerAdapter = (WebServiceMessageReceiverHandlerAdapter) getWebApplicationContext()
|
||||
.getBean(getMessageReceiverHandlerAdapterBeanName(),
|
||||
WebServiceMessageReceiverHandlerAdapter.class);
|
||||
}
|
||||
catch (NoSuchBeanDefinitionException ignored) {
|
||||
messageReceiverHandlerAdapter = new WebServiceMessageReceiverHandlerAdapter();
|
||||
}
|
||||
initWebServiceMessageFactory();
|
||||
messageReceiverHandlerAdapter.afterPropertiesSet();
|
||||
// setup the wsdl adapter
|
||||
wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter();
|
||||
wsdlDefinitionHandlerAdapter.setTransformLocations(isTransformWsdlLocations());
|
||||
wsdlDefinitionHandlerAdapter.afterPropertiesSet();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new BeanInitializationException("Could not initialize handler adapters", ex);
|
||||
throw new BeanInitializationException("Could not initialize WebServiceMessageReceiverHandlerAdapter", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void initWebServiceMessageFactory() throws Exception {
|
||||
private void initWebServiceMessageFactory() {
|
||||
WebServiceMessageFactory messageFactory;
|
||||
try {
|
||||
messageFactory = (WebServiceMessageFactory) getWebApplicationContext()
|
||||
@@ -232,6 +274,24 @@ public class MessageDispatcherServlet extends FrameworkServlet {
|
||||
messageReceiverHandlerAdapter.setMessageFactory(messageFactory);
|
||||
}
|
||||
|
||||
private void initWsdlDefinitionHandlerAdapter() {
|
||||
try {
|
||||
try {
|
||||
wsdlDefinitionHandlerAdapter = (WsdlDefinitionHandlerAdapter) getWebApplicationContext()
|
||||
.getBean(getWsdlDefinitionHandlerAdapterBeanName(), WsdlDefinitionHandlerAdapter.class);
|
||||
|
||||
}
|
||||
catch (NoSuchBeanDefinitionException ignored) {
|
||||
wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter();
|
||||
}
|
||||
wsdlDefinitionHandlerAdapter.setTransformLocations(isTransformWsdlLocations());
|
||||
wsdlDefinitionHandlerAdapter.afterPropertiesSet();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new BeanInitializationException("Could not initialize WsdlDefinitionHandlerAdapter", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void initMessageReceiver() {
|
||||
try {
|
||||
messageReceiver = (WebServiceMessageReceiver) getWebApplicationContext()
|
||||
@@ -253,5 +313,13 @@ public class MessageDispatcherServlet extends FrameworkServlet {
|
||||
private void initWsdlDefinitions() {
|
||||
wsdlDefinitions = BeanFactoryUtils
|
||||
.beansOfTypeIncludingAncestors(getWebApplicationContext(), WsdlDefinition.class, true, false);
|
||||
if (logger.isDebugEnabled()) {
|
||||
for (Iterator iterator = wsdlDefinitions.entrySet().iterator(); iterator.hasNext();) {
|
||||
Map.Entry entry = (Map.Entry) iterator.next();
|
||||
String beanName = (String) entry.getKey();
|
||||
WsdlDefinition definition = (WsdlDefinition) entry.getValue();
|
||||
logger.debug("Exposing [" + definition + "] as " + beanName + WSDL_SUFFIX_NAME);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,12 +55,11 @@ public class WebServiceMessageReceiverHandlerAdapter extends WebServiceMessageRe
|
||||
if ("POST".equals(httpServletRequest.getMethod())) {
|
||||
WebServiceConnection connection = new HttpServletConnection(httpServletRequest, httpServletResponse);
|
||||
handleConnection(connection, (WebServiceMessageReceiver) handler);
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
httpServletResponse.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean supports(Object handler) {
|
||||
|
||||
@@ -19,7 +19,6 @@ package org.springframework.ws.transport.http;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.xml.transform.Source;
|
||||
@@ -114,22 +113,24 @@ public class WsdlDefinitionHandlerAdapter extends TransformerObjectSupport imple
|
||||
|
||||
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
|
||||
throws Exception {
|
||||
if (!"GET".equals(request.getMethod())) {
|
||||
throw new ServletException("Request method '" + request.getMethod() + "' not supported");
|
||||
if ("GET".equals(request.getMethod())) {
|
||||
response.setContentType(CONTENT_TYPE);
|
||||
Transformer transformer = createTransformer();
|
||||
WsdlDefinition definition = (WsdlDefinition) handler;
|
||||
Source definitionSource = definition.getSource();
|
||||
if (transformLocations) {
|
||||
DOMResult domResult = new DOMResult();
|
||||
transformer.transform(definitionSource, domResult);
|
||||
Document definitionDocument = (Document) domResult.getNode();
|
||||
transformLocations(definitionDocument, request);
|
||||
definitionSource = new DOMSource(definitionDocument);
|
||||
}
|
||||
StreamResult responseResult = new StreamResult(response.getOutputStream());
|
||||
transformer.transform(definitionSource, responseResult);
|
||||
}
|
||||
response.setContentType(CONTENT_TYPE);
|
||||
Transformer transformer = createTransformer();
|
||||
WsdlDefinition definition = (WsdlDefinition) handler;
|
||||
Source definitionSource = definition.getSource();
|
||||
if (transformLocations) {
|
||||
DOMResult domResult = new DOMResult();
|
||||
transformer.transform(definitionSource, domResult);
|
||||
Document definitionDocument = (Document) domResult.getNode();
|
||||
transformLocations(definitionDocument, request);
|
||||
definitionSource = new DOMSource(definitionDocument);
|
||||
else {
|
||||
response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
|
||||
}
|
||||
StreamResult responseResult = new StreamResult(response.getOutputStream());
|
||||
transformer.transform(definitionSource, responseResult);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ package org.springframework.ws.transport.http;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.wsdl.Definition;
|
||||
import javax.wsdl.factory.WSDLFactory;
|
||||
import javax.wsdl.xml.WSDLReader;
|
||||
@@ -71,14 +71,10 @@ public class WsdlDefinitionHandlerAdapterTest extends XMLTestCase {
|
||||
public void testHandleNonGet() throws Exception {
|
||||
request.setMethod("POST");
|
||||
definitionControl.replay();
|
||||
try {
|
||||
adapter.handle(request, response, definitionMock);
|
||||
fail("ServletException expected");
|
||||
}
|
||||
catch (ServletException ex) {
|
||||
// expected
|
||||
}
|
||||
adapter.handle(request, response, definitionMock);
|
||||
definitionControl.verify();
|
||||
assertEquals("METHOD_NOT_ALLOWED expected", HttpServletResponse.SC_METHOD_NOT_ALLOWED, response.getStatus());
|
||||
|
||||
}
|
||||
|
||||
public void testTransformLocations() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user