/*
* 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.server.endpoint.adapter.method;
import java.lang.reflect.Method;
import org.springframework.core.MethodParameter;
import org.springframework.ws.MockWebServiceMessage;
import org.springframework.ws.MockWebServiceMessageFactory;
import org.springframework.ws.context.DefaultMessageContext;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.server.endpoint.annotation.Namespace;
import org.springframework.ws.server.endpoint.annotation.Namespaces;
import org.springframework.ws.server.endpoint.annotation.XPathParam;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import static org.junit.Assert.*;
@Namespaces(@Namespace(prefix = "tns", uri = "http://springframework.org/spring-ws"))
public class XPathParamMethodArgumentResolverTest {
private static final String CONTENTS = "<root><child><text>text</text><number>42</number></child></root>";
private XPathParamMethodArgumentResolver resolver;
private MethodParameter booleanParameter;
private MethodParameter doubleParameter;
private MethodParameter nodeParameter;
private MethodParameter nodeListParameter;
private MethodParameter stringParameter;
private MethodParameter convertedParameter;
private MethodParameter unsupportedParameter;
private MethodParameter namespaceMethodParameter;
private MethodParameter namespaceClassParameter;
@Before
public void setUp() throws Exception {
resolver = new XPathParamMethodArgumentResolver();
Method supportedTypes = getClass()
.getMethod("supportedTypes", Boolean.TYPE, Double.TYPE, Node.class, NodeList.class, String.class);
booleanParameter = new MethodParameter(supportedTypes, 0);
doubleParameter = new MethodParameter(supportedTypes, 1);
nodeParameter = new MethodParameter(supportedTypes, 2);
nodeListParameter = new MethodParameter(supportedTypes, 3);
stringParameter = new MethodParameter(supportedTypes, 4);
convertedParameter = new MethodParameter(getClass().getMethod("convertedType", Integer.TYPE), 0);
unsupportedParameter = new MethodParameter(getClass().getMethod("unsupported", String.class), 0);
namespaceMethodParameter = new MethodParameter(getClass().getMethod("namespacesMethod", String.class), 0);
namespaceClassParameter = new MethodParameter(getClass().getMethod("namespacesClass", String.class), 0);
}
@Test
public void supportsParameter() {
assertTrue("resolver does not support boolean parameter", resolver.supportsParameter(booleanParameter));
assertTrue("resolver does not support double parameter", resolver.supportsParameter(doubleParameter));
assertTrue("resolver does not support Node parameter", resolver.supportsParameter(nodeParameter));
assertTrue("resolver does not support NodeList parameter", resolver.supportsParameter(nodeListParameter));
assertTrue("resolver does not support String parameter", resolver.supportsParameter(stringParameter));
assertTrue("resolver does not support String parameter", resolver.supportsParameter(convertedParameter));
assertFalse("resolver supports parameter without @XPathParam", resolver.supportsParameter(unsupportedParameter));
}
@Test
public void resolveBoolean() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(CONTENTS);
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, booleanParameter);
assertTrue("resolver does not return boolean", result instanceof Boolean);
Boolean b = (Boolean) result;
assertTrue("Invalid boolean value", b);
}
@Test
public void resolveDouble() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(CONTENTS);
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, doubleParameter);
assertTrue("resolver does not return double", result instanceof Double);
Double d = (Double) result;
assertEquals("Invalid double value", 42D, d, 0D);
}
@Test
public void resolveNode() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(CONTENTS);
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, nodeParameter);
assertTrue("resolver does not return Node", result instanceof Node);
Node node = (Node) result;
assertEquals("Invalid node value", "child", node.getLocalName());
}
@Test
public void resolveNodeList() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(CONTENTS);
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, nodeListParameter);
assertTrue("resolver does not return NodeList", result instanceof NodeList);
NodeList nodeList = (NodeList) result;
assertEquals("Invalid NodeList value", 1, nodeList.getLength());
assertEquals("Invalid Node value", "child", nodeList.item(0).getLocalName());
}
@Test
public void resolveString() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(CONTENTS);
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, stringParameter);
assertTrue("resolver does not return String", result instanceof String);
String s = (String) result;
assertEquals("Invalid string value", "text", s);
}
@Test
public void resolveConvertedType() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(CONTENTS);
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, convertedParameter);
assertTrue("resolver does not return String", result instanceof Integer);
Integer i = (Integer) result;
assertEquals("Invalid integer value", new Integer(42), i);
}
@Test
public void resolveNamespacesMethod() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(
"<root xmlns=\"http://springframework.org/spring-ws\">text</root>");
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, namespaceMethodParameter);
assertTrue("resolver does not return String", result instanceof String);
String s = (String) result;
assertEquals("Invalid string value", "text", s);
}
@Test
public void resolveNamespacesClass() throws Exception {
MockWebServiceMessage request = new MockWebServiceMessage(
"<root xmlns=\"http://springframework.org/spring-ws\">text</root>");
MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory());
Object result = resolver.resolveArgument(messageContext, namespaceClassParameter);
assertTrue("resolver does not return String", result instanceof String);
String s = (String) result;
assertEquals("Invalid string value", "text", s);
}
public void unsupported(String s) {
}
public void supportedTypes(@XPathParam("/root/child")boolean param1,
@XPathParam("/root/child/number")double param2,
@XPathParam("/root/child") Node param3,
@XPathParam("/root/*") NodeList param4,
@XPathParam("/root/child/text")String param5) {
}
public void convertedType(@XPathParam("/root/child/number")int param) {
}
@Namespaces(@Namespace(prefix = "tns", uri = "http://springframework.org/spring-ws"))
public void namespacesMethod(@XPathParam("/tns:root")String s) {
}
public void namespacesClass(@XPathParam("/tns:root")String s) {
}
}