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 }