1   package org.springframework.ws.transport.http;
2   
3   import java.io.ByteArrayInputStream;
4   import java.util.List;
5   import javax.servlet.ServletConfig;
6   import javax.servlet.ServletException;
7   import javax.xml.parsers.DocumentBuilder;
8   import javax.xml.parsers.DocumentBuilderFactory;
9   
10  import org.custommonkey.xmlunit.XMLTestCase;
11  import org.custommonkey.xmlunit.XMLUnit;
12  import org.w3c.dom.Document;
13  
14  import org.springframework.beans.BeansException;
15  import org.springframework.beans.MutablePropertyValues;
16  import org.springframework.core.io.ClassPathResource;
17  import org.springframework.mock.web.MockHttpServletRequest;
18  import org.springframework.mock.web.MockHttpServletResponse;
19  import org.springframework.mock.web.MockServletConfig;
20  import org.springframework.mock.web.MockServletContext;
21  import org.springframework.web.context.support.StaticWebApplicationContext;
22  import org.springframework.ws.server.MessageDispatcher;
23  import org.springframework.ws.server.endpoint.adapter.PayloadEndpointAdapter;
24  import org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping;
25  import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver;
26  import org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition;
27  
28  public class MessageDispatcherServletTest extends XMLTestCase {
29  
30      private ServletConfig config;
31  
32      private MessageDispatcherServlet servlet;
33  
34      protected void setUp() throws Exception {
35          config = new MockServletConfig(new MockServletContext(), "spring-ws");
36          servlet = new MessageDispatcherServlet();
37      }
38  
39      private void assertStrategies(Class expectedClass, List actual) {
40          assertEquals("Invalid amount of strategies", 1, actual.size());
41          Object strategy = actual.get(0);
42          assertTrue("Invalid strategy", expectedClass.isAssignableFrom(strategy.getClass()));
43      }
44  
45      public void testDefaultStrategies() throws ServletException {
46          servlet.setContextClass(StaticWebApplicationContext.class);
47          servlet.init(config);
48          MessageDispatcher messageDispatcher = (MessageDispatcher) servlet.getMessageReceiver();
49          assertNotNull("No messageDispatcher created", messageDispatcher);
50      }
51  
52      public void testDetectedStrategies() throws ServletException {
53          servlet.setContextClass(DetectWebApplicationContext.class);
54          servlet.init(config);
55          MessageDispatcher messageDispatcher = (MessageDispatcher) servlet.getMessageReceiver();
56          assertNotNull("No messageDispatcher created", messageDispatcher);
57          assertStrategies(PayloadRootQNameEndpointMapping.class, messageDispatcher.getEndpointMappings());
58          assertStrategies(PayloadEndpointAdapter.class, messageDispatcher.getEndpointAdapters());
59          assertStrategies(SimpleSoapExceptionResolver.class, messageDispatcher.getEndpointExceptionResolvers());
60      }
61  
62      public void testDetectWsdlDefinitions() throws Exception {
63          servlet.setContextClass(WsdlDefinitionWebApplicationContext.class);
64          servlet.init(config);
65          MockHttpServletRequest request =
66                  new MockHttpServletRequest(HttpTransportConstants.METHOD_GET, "/definition.wsdl");
67          MockHttpServletResponse response = new MockHttpServletResponse();
68          servlet.service(request, response);
69          DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
70          documentBuilderFactory.setNamespaceAware(true);
71          DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
72          Document result = documentBuilder.parse(new ByteArrayInputStream(response.getContentAsByteArray()));
73          Document expected = documentBuilder.parse(getClass().getResourceAsStream("wsdl11-input.wsdl"));
74          XMLUnit.setIgnoreWhitespace(true);
75          assertXMLEqual("Invalid WSDL written", expected, result);
76      }
77  
78      private static class DetectWebApplicationContext extends StaticWebApplicationContext {
79  
80          public void refresh() throws BeansException, IllegalStateException {
81              registerSingleton("payloadMapping", PayloadRootQNameEndpointMapping.class);
82              registerSingleton("payloadAdapter", PayloadEndpointAdapter.class);
83              registerSingleton("simpleExceptionResolver", SimpleSoapExceptionResolver.class);
84              super.refresh();
85          }
86      }
87  
88      private static class WsdlDefinitionWebApplicationContext extends StaticWebApplicationContext {
89  
90          public void refresh() throws BeansException, IllegalStateException {
91              MutablePropertyValues mpv = new MutablePropertyValues();
92              mpv.addPropertyValue("wsdl", new ClassPathResource("wsdl11-input.wsdl", getClass()));
93              registerSingleton("definition", SimpleWsdl11Definition.class, mpv);
94              super.refresh();
95          }
96      }
97  }