From 920309cfc55f43fc7c16c66ffcdca04c16b1a8a0 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 21 Sep 2010 09:48:14 +0000 Subject: [PATCH] polishing --- ...apHeaderElementMethodArgumentResolver.java | 57 +++++++++---------- ...aderElementMethodArgumentResolverTest.java | 39 ++++++++----- 2 files changed, 51 insertions(+), 45 deletions(-) diff --git a/core/src/main/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolver.java b/core/src/main/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolver.java index a270b3c6..1bea223c 100644 --- a/core/src/main/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolver.java +++ b/core/src/main/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolver.java @@ -16,6 +16,13 @@ package org.springframework.ws.soap.server.endpoint.adapter.method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import javax.xml.namespace.QName; + import org.springframework.core.MethodParameter; import org.springframework.util.Assert; import org.springframework.ws.context.MessageContext; @@ -25,28 +32,21 @@ import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.server.endpoint.annotation.SoapHeader; import org.springframework.xml.namespace.QNameUtils; -import javax.xml.namespace.QName; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - /** - * Implementation of {@link MethodArgumentResolver} that supports resolving {@link SoapHeaderElement} parameters. - * Target method parameters must be annotated with {@link SoapHeader} to indicate the SOAP header to resolve. - * This resolver supports simple {@link SoapHeaderElement} parameters and {@link List} parameters for elements that - * appear multiple times in the same SOAP header. - *

- * The following snippet shows an example of supported declarations. + * Implementation of {@link MethodArgumentResolver} that supports resolving {@link SoapHeaderElement} parameters. Target + * method parameters must be annotated with {@link SoapHeader} to indicate the SOAP header to resolve. This resolver + * supports simple {@link SoapHeaderElement} parameters and {@link List} parameters for elements that appear multiple + * times in the same SOAP header.

The following snippet shows an example of supported declarations. *
  * {@code
  * public void soapHeaderElement(@SoapHeader("{http://springframework.org/ws}header") SoapHeaderElement element)
  * 

- * public void soapHeaderElementList(@SoapHeader("{http://springframework.org/ws}header") List elements) + * public void soapHeaderElementList(@SoapHeader("{http://springframework.org/ws}header") List + * elements) *

* * @author Tareq Abedrabbo + * @author Arjen Poutsma * @see SoapHeader * @since 2.0 */ @@ -58,23 +58,20 @@ public class SoapHeaderElementMethodArgumentResolver implements MethodArgumentRe return false; } - Class type = parameter.getParameterType(); + Class parameterType = parameter.getParameterType(); // Simple SoapHeaderElement parameter - if (SoapHeaderElement.class.equals(type)) { + if (SoapHeaderElement.class.equals(parameterType)) { return true; } // List parameter - if (List.class.equals(type)) { + if (List.class.equals(parameterType)) { Type genericType = parameter.getGenericParameterType(); if (genericType instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) genericType; - Type[] types = parameterizedType.getActualTypeArguments(); - if (types.length != 1) { - return false; - } - if (SoapHeaderElement.class.equals(types[0])) { + Type[] typeArguments = parameterizedType.getActualTypeArguments(); + if (typeArguments.length == 1 && SoapHeaderElement.class.equals(typeArguments[0])) { return true; } } @@ -82,25 +79,24 @@ public class SoapHeaderElementMethodArgumentResolver implements MethodArgumentRe return false; } - public Object resolveArgument(MessageContext messageContext, MethodParameter parameter) throws Exception { Assert.isInstanceOf(SoapMessage.class, messageContext.getRequest()); SoapMessage request = (SoapMessage) messageContext.getRequest(); org.springframework.ws.soap.SoapHeader soapHeader = request.getSoapHeader(); - String qnameString = parameter.getParameterAnnotation(SoapHeader.class).value(); + String paramValue = parameter.getParameterAnnotation(SoapHeader.class).value(); - if (!QNameUtils.validateQName(qnameString)) { - throw new IllegalArgumentException("Invalid header qualified name [" + qnameString + "]. QName must be of the form '{namespace}localPart'."); - } + Assert.isTrue(QNameUtils.validateQName(paramValue), "Invalid header qualified name [" + paramValue + "]. " + + "QName must be of the form '{namespace}localPart'."); - QName qname = QName.valueOf(qnameString); + QName qname = QName.valueOf(paramValue); Class parameterType = parameter.getParameterType(); if (SoapHeaderElement.class.equals(parameterType)) { return extractSoapHeader(qname, soapHeader); - } else if (List.class.equals(parameterType)) { + } + else if (List.class.equals(parameterType)) { return extractSoapHeaderList(qname, soapHeader); } // should not happen @@ -118,7 +114,8 @@ public class SoapHeaderElementMethodArgumentResolver implements MethodArgumentRe return null; } - private List extractSoapHeaderList(QName qname, org.springframework.ws.soap.SoapHeader soapHeader) { + private List extractSoapHeaderList(QName qname, + org.springframework.ws.soap.SoapHeader soapHeader) { List result = new ArrayList(); Iterator elements = soapHeader.examineAllHeaderElements(); while (elements.hasNext()) { diff --git a/core/src/test/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolverTest.java b/core/src/test/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolverTest.java index c83a0f23..c4621b3c 100644 --- a/core/src/test/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolverTest.java +++ b/core/src/test/java/org/springframework/ws/soap/server/endpoint/adapter/method/SoapHeaderElementMethodArgumentResolverTest.java @@ -16,8 +16,9 @@ package org.springframework.ws.soap.server.endpoint.adapter.method; -import org.junit.Before; -import org.junit.Test; +import java.util.List; +import javax.xml.namespace.QName; + import org.springframework.core.MethodParameter; import org.springframework.ws.context.MessageContext; import org.springframework.ws.server.endpoint.adapter.method.AbstractMethodArgumentResolverTestCase; @@ -25,8 +26,8 @@ import org.springframework.ws.soap.SoapHeaderElement; import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.server.endpoint.annotation.SoapHeader; -import javax.xml.namespace.QName; -import java.util.List; +import org.junit.Before; +import org.junit.Test; import static org.junit.Assert.*; @@ -62,17 +63,23 @@ public class SoapHeaderElementMethodArgumentResolverTest extends AbstractMethodA SoapHeaderElement element = message.getSoapHeader().addHeaderElement(HEADER_QNAME); element.setText(HEADER_CONTENT + i); } - soapHeaderWithEmptyValue = new MethodParameter(getClass().getMethod("soapHeaderWithEmptyValue", SoapHeaderElement.class), 0); - soapHeaderElementParameter = new MethodParameter(getClass().getMethod("soapHeaderElement", SoapHeaderElement.class), 0); - soapHeaderElementListParameter = new MethodParameter(getClass().getMethod("soapHeaderElementList", List.class), 0); - soapHeaderMismatch = new MethodParameter(getClass().getMethod("soapHeaderMismatch", SoapHeaderElement.class), 0); + soapHeaderWithEmptyValue = + new MethodParameter(getClass().getMethod("soapHeaderWithEmptyValue", SoapHeaderElement.class), 0); + soapHeaderElementParameter = + new MethodParameter(getClass().getMethod("soapHeaderElement", SoapHeaderElement.class), 0); + soapHeaderElementListParameter = + new MethodParameter(getClass().getMethod("soapHeaderElementList", List.class), 0); + soapHeaderMismatch = + new MethodParameter(getClass().getMethod("soapHeaderMismatch", SoapHeaderElement.class), 0); soapHeaderMismatchList = new MethodParameter(getClass().getMethod("soapHeaderMismatchList", List.class), 0); } @Test public void supportsParameter() throws Exception { - assertTrue("resolver does not support soapHeaderElement", resolver.supportsParameter(soapHeaderElementParameter)); - assertTrue("resolver does not support List", resolver.supportsParameter(soapHeaderElementListParameter)); + assertTrue("resolver does not support soapHeaderElement", + resolver.supportsParameter(soapHeaderElementParameter)); + assertTrue("resolver does not support List", + resolver.supportsParameter(soapHeaderElementListParameter)); } @Test(expected = IllegalArgumentException.class) @@ -92,8 +99,8 @@ public class SoapHeaderElementMethodArgumentResolverTest extends AbstractMethodA assertEquals("header text must be equal to [" + HEADER_CONTENT + "0]", HEADER_CONTENT + "0", element.getText()); } - @Test + @SuppressWarnings("unchecked") public void resolveSoapHeaderElementList() throws Exception { Object result = resolver.resolveArgument(messageContext, soapHeaderElementListParameter); @@ -105,7 +112,8 @@ public class SoapHeaderElementMethodArgumentResolverTest extends AbstractMethodA for (int i = 0; i < elements.size(); i++) { SoapHeaderElement element = elements.get(i); assertTrue("headers must be equal", element.getName().equals(HEADER_QNAME)); - assertEquals("header must be equal to [" + HEADER_CONTENT + i + "]", HEADER_CONTENT + i, elements.get(i).getText()); + assertEquals("header must be equal to [" + HEADER_CONTENT + i + "]", HEADER_CONTENT + i, + elements.get(i).getText()); } } @@ -122,20 +130,21 @@ public class SoapHeaderElementMethodArgumentResolverTest extends AbstractMethodA assertTrue("result List must be empty", ((List) result).isEmpty()); } - public void soapHeaderWithEmptyValue(@SoapHeader("") SoapHeaderElement element) { } public void soapHeaderElement(@SoapHeader("{http://springframework.org/ws}header") SoapHeaderElement element) { } - public void soapHeaderElementList(@SoapHeader("{http://springframework.org/ws}header") List elements) { + public void soapHeaderElementList(@SoapHeader( + "{http://springframework.org/ws}header") List elements) { } public void soapHeaderMismatch(@SoapHeader("{http://springframework.org/ws}xxx") SoapHeaderElement element) { } - public void soapHeaderMismatchList(@SoapHeader("{http://springframework.org/ws}xxx") List elements) { + public void soapHeaderMismatchList(@SoapHeader( + "{http://springframework.org/ws}xxx") List elements) { }