You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/10/01 18:30:49 UTC
svn commit: r1528138 - in /cxf/trunk/rt/frontend/jaxrs/src:
main/java/org/apache/cxf/jaxrs/utils/ test/java/org/apache/cxf/jaxrs/
test/java/org/apache/cxf/jaxrs/utils/
Author: sergeyb
Date: Tue Oct 1 16:30:48 2013
New Revision: 1528138
URL: http://svn.apache.org/r1528138
Log:
[CXF-5315] Getting JAX-RS 2.0 ParamConverters always checked first
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerParameterHandler.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=1528138&r1=1528137&r2=1528138&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Tue Oct 1 16:30:48 2013
@@ -38,12 +38,10 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
@@ -109,7 +107,6 @@ public final class InjectionUtils {
private static final String HTTP_SERVLET_REQUEST_CLASS_NAME = "javax.servlet.http.HttpServletRequest";
private static final String HTTP_SERVLET_RESPONSE_CLASS_NAME = "javax.servlet.http.HttpServletResponse";
- private static final String PARAM_HANDLERS_FIRST = "check.parameter.handlers.first";
private static final String IGNORE_MATRIX_PARAMETERS = "ignore.matrix.parameters";
private InjectionUtils() {
@@ -352,6 +349,11 @@ public final class InjectionUtils {
value = decodeValue(value, decoded, pType);
+ Object result = createFromParameterHandler(value, pClass, message);
+ if (result != null) {
+ return pClass.cast(result);
+ }
+
if (pClass.isPrimitive()) {
try {
@SuppressWarnings("unchecked")
@@ -380,10 +382,8 @@ public final class InjectionUtils {
cls = valueType;
adapterHasToBeUsed = true;
}
-
- Object result = instantiateFromParameterHandler(value, cls, message);
- if (result != null) {
- return pClass.cast(result);
+ if (pClass == String.class && !adapterHasToBeUsed) {
+ return pClass.cast(value);
}
// check constructors accepting a single String value
try {
@@ -395,13 +395,10 @@ public final class InjectionUtils {
throw ex;
} catch (Exception ex) {
Throwable t = getOrThrowActualException(ex);
- result = createFromParameterHandler(value, cls, message);
- if (result == null) {
- LOG.severe(new org.apache.cxf.common.i18n.Message("CLASS_CONSTRUCTOR_FAILURE",
- BUNDLE,
- pClass.getName()).toString());
- throw new ClientErrorException(HttpUtils.getParameterFailureStatus(pType), t);
- }
+ LOG.severe(new org.apache.cxf.common.i18n.Message("CLASS_CONSTRUCTOR_FAILURE",
+ BUNDLE,
+ pClass.getName()).toString());
+ throw new ClientErrorException(HttpUtils.getParameterFailureStatus(pType), t);
}
if (result == null) {
// check for valueOf(String) static methods
@@ -416,10 +413,6 @@ public final class InjectionUtils {
}
}
- if (result == null) {
- result = createFromParameterHandler(value, cls, message);
- }
-
if (adapterHasToBeUsed) {
// as the last resort, try XmlJavaTypeAdapters
Object valueToReplace = result != null ? result : value;
@@ -437,24 +430,14 @@ public final class InjectionUtils {
return pClass.cast(result);
}
- private static <T> T instantiateFromParameterHandler(String value,
- Class<T> pClass,
- Message m) {
- if (Date.class == pClass || Locale.class == pClass
- || m != null && MessageUtils.isTrue(m.getContextualProperty(PARAM_HANDLERS_FIRST))) {
- return createFromParameterHandler(value, pClass, m);
- } else {
- return null;
- }
- }
private static <T> T createFromParameterHandler(String value,
Class<T> pClass,
Message message) {
T result = null;
if (message != null) {
- ParamConverter<T> pm = ServerProviderFactory.getInstance(message)
- .createParameterHandler(pClass);
+ ServerProviderFactory pf = ServerProviderFactory.getInstance(message);
+ ParamConverter<T> pm = pf.createParameterHandler(pClass);
if (pm != null) {
result = pm.fromString(value);
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerParameterHandler.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerParameterHandler.java?rev=1528138&r1=1528137&r2=1528138&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerParameterHandler.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerParameterHandler.java Tue Oct 1 16:30:48 2013
@@ -31,7 +31,7 @@ public class CustomerParameterHandler im
@SuppressWarnings("unchecked")
@Override
public <T> ParamConverter<T> getConverter(Class<T> cls, Type arg1, Annotation[] arg2) {
- if (Customer.class.isAssignableFrom(cls)) {
+ if (Customer.class == cls) {
return (ParamConverter<T>)this;
} else {
return null;
@@ -39,10 +39,7 @@ public class CustomerParameterHandler im
}
public Customer fromString(String s) throws IllegalArgumentException {
- if ("noName".equals(s)) {
- throw new IllegalArgumentException();
- }
- Customer c = Character.isLowerCase(((CharSequence)s).charAt(0)) ? new Customer2() : new Customer();
+ Customer c = new Customer();
c.setName(s);
return c;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java?rev=1528138&r1=1528137&r2=1528138&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java Tue Oct 1 16:30:48 2013
@@ -228,7 +228,7 @@ public class InjectionUtilsTest extends
EasyMock.expectLastCall().andReturn(0).anyTimes();
endpoint.isEmpty();
EasyMock.expectLastCall().andReturn(true).anyTimes();
- endpoint.get(ProviderFactory.class.getName());
+ endpoint.get(ServerProviderFactory.class.getName());
EasyMock.expectLastCall().andReturn(factory).anyTimes();
EasyMock.replay(endpoint);
e.put(Endpoint.class, endpoint);
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=1528138&r1=1528137&r2=1528138&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Tue Oct 1 16:30:48 2013
@@ -132,7 +132,7 @@ public class JAXRSUtilsTest extends Asse
private void doTestFormParamsWithEncoding(String enc, boolean setEnc) throws Exception {
Class<?>[] argType = {String.class, List.class};
Method m = Customer.class.getMethod("testFormParam", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
String body = "p1=" + URLEncoder.encode("\u00E4\u00F6\u00FC", enc) + "&p2=2&p2=3";
messageImpl.put(Message.REQUEST_URI, "/foo");
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
@@ -818,7 +818,7 @@ public class JAXRSUtilsTest extends Asse
public void testQueryParameters() throws Exception {
Class<?>[] argType = {String.class, Integer.TYPE, String.class, String.class};
Method m = Customer.class.getMethod("testQuery", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.QUERY_STRING, "query=24&query2");
List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m,
@@ -836,7 +836,7 @@ public class JAXRSUtilsTest extends Asse
public void testQueryParametersIntegerArray() throws Exception {
Class<?>[] argType = {Integer[].class};
Method m = Customer.class.getMethod("testQueryIntegerArray", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.QUERY_STRING, "query=1&query=2");
List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m,
@@ -853,7 +853,7 @@ public class JAXRSUtilsTest extends Asse
public void testQueryParametersIntArray() throws Exception {
Class<?>[] argType = {int[].class};
Method m = Customer.class.getMethod("testQueryIntArray", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.QUERY_STRING, "query=1&query=2");
List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m,
@@ -917,7 +917,7 @@ public class JAXRSUtilsTest extends Asse
public void testCookieParameters() throws Exception {
Class<?>[] argType = {String.class, Set.class, String.class, Set.class};
Method m = Customer.class.getMethod("testCookieParam", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
headers.add("Cookie", "c1=c1Value");
messageImpl.put(Message.PROTOCOL_HEADERS, headers);
@@ -941,7 +941,7 @@ public class JAXRSUtilsTest extends Asse
public void testMultipleCookieParameters() throws Exception {
Class<?>[] argType = {String.class, String.class, Cookie.class};
Method m = Customer.class.getMethod("testMultipleCookieParam", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
headers.add("Cookie", "c1=c1Value; c2=c2Value");
headers.add("Cookie", "c3=c3Value");
@@ -992,7 +992,7 @@ public class JAXRSUtilsTest extends Asse
@Test
public void testCustomerParameter() throws Exception {
Message messageImpl = createMessage();
- ProviderFactory.getInstance(messageImpl).registerUserProvider(
+ ServerProviderFactory.getInstance(messageImpl).registerUserProvider(
new CustomerParameterHandler());
Class<?>[] argType = {Customer.class, Customer[].class, Customer2.class};
Method m = Customer.class.getMethod("testCustomerParam", argType);
@@ -1059,25 +1059,6 @@ public class JAXRSUtilsTest extends Asse
}
@Test
- public void testConstructorFirstAndParameterHandler() throws Exception {
- Message messageImpl = createMessage();
- ProviderFactory.getInstance(messageImpl).registerUserProvider(
- new CustomerParameterHandler());
- Class<?>[] argType = {Customer.class, Customer[].class, Customer2.class};
- Method m = Customer.class.getMethod("testCustomerParam", argType);
-
- messageImpl.put(Message.QUERY_STRING, "p3=jack");
- List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m,
- new ClassResourceInfo(Customer.class)),
- null,
- messageImpl);
- assertEquals(3, params.size());
- Customer2 c3 = (Customer2)params.get(2);
- assertEquals("jack", c3.getName());
- }
-
-
- @Test
public void testArrayParamNoProvider() throws Exception {
Message messageImpl = createMessage();
Class<?>[] argType = {String[].class};
@@ -1119,7 +1100,7 @@ public class JAXRSUtilsTest extends Asse
public void testExceptionDuringConstruction() throws Exception {
Class<?>[] argType = {CustomerGender.class};
Method m = Customer.class.getMethod("testWrongType2", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.QUERY_STRING, "p1=3");
try {
JAXRSUtils.processParameters(new OperationResourceInfo(m,
@@ -1138,10 +1119,10 @@ public class JAXRSUtilsTest extends Asse
public void testQueryParametersBean() throws Exception {
Class<?>[] argType = {Customer.CustomerBean.class};
Method m = Customer.class.getMethod("testQueryBean", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.QUERY_STRING, "a=aValue&b=123");
- MessageImpl complexMessageImpl = new MessageImpl();
+ Message complexMessageImpl = createMessage();
complexMessageImpl.put(Message.QUERY_STRING, "c=1&a=A&b=123&c=2&c=3&"
+ "d.c=4&d.a=B&d.b=456&d.c=5&d.c=6&"
+ "e.c=41&e.a=B1&e.b=457&e.c=51&e.c=61&"
@@ -1254,17 +1235,17 @@ public class JAXRSUtilsTest extends Asse
complexPathTemplates.add("d.e.c", "82");
complexPathTemplates.add("d.e.c", "92");
- verifyParametersBean(m, pathTemplates, new MessageImpl(), complexPathTemplates, new MessageImpl());
+ verifyParametersBean(m, pathTemplates, createMessage(), complexPathTemplates, createMessage());
}
@Test
public void testMatrixParametersBean() throws Exception {
Class<?>[] argType = {Customer.CustomerBean.class};
Method m = Customer.class.getMethod("testMatrixBean", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.REQUEST_URI, "/bar;a=aValue/baz;b=123");
- MessageImpl complexMessageImpl = new MessageImpl();
+ Message complexMessageImpl = createMessage();
complexMessageImpl.put(Message.REQUEST_URI, "/bar;c=1/bar;a=A/bar;b=123/bar;c=2/bar;c=3"
+ "/bar;d.c=4/bar;d.a=B/bar;d.b=456/bar;d.c=5/bar;d.c=6"
+ "/bar;e.c=41/bar;e.a=B1/bar;e.b=457/bar;e.c=51/bar;e.c=61"
@@ -1280,7 +1261,7 @@ public class JAXRSUtilsTest extends Asse
public void testFormParametersBeanWithBoolean() throws Exception {
Class<?>[] argType = {Customer.CustomerBean.class};
Method m = Customer.class.getMethod("testFormBean", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.REQUEST_URI, "/bar");
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
headers.putSingle("Content-Type", MediaType.APPLICATION_FORM_URLENCODED);
@@ -1305,7 +1286,7 @@ public class JAXRSUtilsTest extends Asse
public void testFormParametersBean() throws Exception {
Class<?>[] argType = {Customer.CustomerBean.class};
Method m = Customer.class.getMethod("testFormBean", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.REQUEST_URI, "/bar");
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
headers.putSingle("Content-Type", MediaType.APPLICATION_FORM_URLENCODED);
@@ -1313,7 +1294,7 @@ public class JAXRSUtilsTest extends Asse
String body = "a=aValue&b=123&cb=true";
messageImpl.setContent(InputStream.class, new ByteArrayInputStream(body.getBytes()));
- MessageImpl complexMessageImpl = new MessageImpl();
+ Message complexMessageImpl = createMessage();
complexMessageImpl.put(Message.REQUEST_URI, "/bar");
complexMessageImpl.put(Message.PROTOCOL_HEADERS, headers);
body = "c=1&a=A&b=123&c=2&c=3&"
@@ -1356,9 +1337,9 @@ public class JAXRSUtilsTest extends Asse
private void verifyParametersBean(Method m,
MultivaluedMap<String, String> simpleValues,
- MessageImpl simpleMessageImpl,
+ Message simpleMessageImpl,
MultivaluedMap<String, String> complexValues,
- MessageImpl complexMessageImpl) throws Exception {
+ Message complexMessageImpl) throws Exception {
List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m,
new ClassResourceInfo(Customer.class)),
simpleValues,
@@ -1448,7 +1429,7 @@ public class JAXRSUtilsTest extends Asse
Class<?>[] argType = {String.class, String.class, Long.class,
Boolean.TYPE, String.class};
Method m = Customer.class.getMethod("testMultipleQuery", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.QUERY_STRING,
"query=first&query2=second&query3=3&query4=true&query5");
@@ -1473,7 +1454,7 @@ public class JAXRSUtilsTest extends Asse
Class<?>[] argType = {String.class, String.class, String.class, String.class,
List.class, String.class};
Method m = Customer.class.getMethod("testMatrixParam", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.REQUEST_URI, "/foo;p4=0;p3=3/bar;p1=1;p2/baz;p4=4;p4=5;p5");
List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m,
@@ -1502,7 +1483,7 @@ public class JAXRSUtilsTest extends Asse
public void testMatrixAndPathSegmentParameters() throws Exception {
Class<?>[] argType = {PathSegment.class, String.class};
Method m = Customer.class.getMethod("testPathSegment", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
messageImpl.put(Message.REQUEST_URI, "/bar%20foo;p4=0%201");
MultivaluedMap<String, String> values = new MetadataMap<String, String>();
values.add("ps", "bar%20foo;p4=0%201");
@@ -1533,7 +1514,7 @@ public class JAXRSUtilsTest extends Asse
private void doTestFormParameters(boolean useMediaType) throws Exception {
Class<?>[] argType = {String.class, List.class};
Method m = Customer.class.getMethod("testFormParam", argType);
- MessageImpl messageImpl = new MessageImpl();
+ Message messageImpl = createMessage();
String body = "p1=1&p2=2&p2=3";
messageImpl.put(Message.REQUEST_URI, "/foo");
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
@@ -1662,7 +1643,7 @@ public class JAXRSUtilsTest extends Asse
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
headers.add("Foo", "bar, baz");
- Message m = new MessageImpl();
+ Message m = createMessage();
m.put("org.apache.cxf.http.header.split", "true");
m.put(Message.PROTOCOL_HEADERS, headers);