/*
* Copyright 2005-2010 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.io.ByteArrayInputStream;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletConfig;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.support.StaticWebApplicationContext;
import org.springframework.ws.server.MessageDispatcher;
import org.springframework.ws.server.endpoint.adapter.PayloadEndpointAdapter;
import org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping;
import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver;
import org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
public class MessageDispatcherServletTest {
private ServletConfig config;
private MessageDispatcherServlet servlet;
@Before
public void setUp() throws Exception {
config = new MockServletConfig(new MockServletContext(), "spring-ws");
servlet = new MessageDispatcherServlet();
}
private void assertStrategies(Class<?> expectedClass, List<?> actual) {
Assert.assertEquals("Invalid amount of strategies", 1, actual.size());
Object strategy = actual.get(0);
Assert.assertTrue("Invalid strategy", expectedClass.isAssignableFrom(strategy.getClass()));
}
@Test
public void testDefaultStrategies() throws ServletException {
servlet.setContextClass(StaticWebApplicationContext.class);
servlet.init(config);
MessageDispatcher messageDispatcher = (MessageDispatcher) servlet.getMessageReceiver();
Assert.assertNotNull("No messageDispatcher created", messageDispatcher);
}
@Test
public void testDetectedStrategies() throws ServletException {
servlet.setContextClass(DetectWebApplicationContext.class);
servlet.init(config);
MessageDispatcher messageDispatcher = (MessageDispatcher) servlet.getMessageReceiver();
Assert.assertNotNull("No messageDispatcher created", messageDispatcher);
assertStrategies(PayloadRootQNameEndpointMapping.class, messageDispatcher.getEndpointMappings());
assertStrategies(PayloadEndpointAdapter.class, messageDispatcher.getEndpointAdapters());
assertStrategies(SimpleSoapExceptionResolver.class, messageDispatcher.getEndpointExceptionResolvers());
}
@Test
public void testDetectWsdlDefinitions() throws Exception {
servlet.setContextClass(WsdlDefinitionWebApplicationContext.class);
servlet.init(config);
MockHttpServletRequest request =
new MockHttpServletRequest(HttpTransportConstants.METHOD_GET, "/definition.wsdl");
MockHttpServletResponse response = new MockHttpServletResponse();
servlet.service(request, response);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document result = documentBuilder.parse(new ByteArrayInputStream(response.getContentAsByteArray()));
Document expected = documentBuilder.parse(getClass().getResourceAsStream("wsdl11-input.wsdl"));
XMLUnit.setIgnoreWhitespace(true);
assertXMLEqual("Invalid WSDL written", expected, result);
}
private static class DetectWebApplicationContext extends StaticWebApplicationContext {
@Override
public void refresh() throws BeansException, IllegalStateException {
registerSingleton("payloadMapping", PayloadRootQNameEndpointMapping.class);
registerSingleton("payloadAdapter", PayloadEndpointAdapter.class);
registerSingleton("simpleExceptionResolver", SimpleSoapExceptionResolver.class);
super.refresh();
}
}
private static class WsdlDefinitionWebApplicationContext extends StaticWebApplicationContext {
@Override
public void refresh() throws BeansException, IllegalStateException {
MutablePropertyValues mpv = new MutablePropertyValues();
mpv.addPropertyValue("wsdl", new ClassPathResource("wsdl11-input.wsdl", getClass()));
registerSingleton("definition", SimpleWsdl11Definition.class, mpv);
super.refresh();
}
}
}