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