Author: sergeyb Date: Thu Jan 6 14:37:16 2011 New Revision: 1055895 URL: http://svn.apache.org/viewvc?rev=1055895&view=rev Log: [JAX-RS] Making sure ParameterHandlers are checked in case of String constructors throwing exceptions
Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer2.java (with props) Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java 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/Customer.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/JAXRSUtilsTest.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=1055895&r1=1055894&r2=1055895&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Thu Jan 6 14:37:16 2011 @@ -180,8 +180,7 @@ public class WebClient extends AbstractC /** * Creates WebClient, baseURI will be set to Client currentURI * @param client existing client - * @param inheritHeaders if existing Client headers can be inherited by new proxy - * and subresource proxies if any + * @param inheritHeaders if existing Client headers can be inherited by new client */ public static WebClient fromClient(Client client, boolean inheritHeaders) { 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=1055895&r1=1055894&r2=1055895&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 Thu Jan 6 14:37:16 2011 @@ -318,7 +318,11 @@ public final class InjectionUtils { // try valueOf } catch (WebApplicationException ex) { throw ex; - } catch (Exception ex) { + } catch (Exception ex) { + Object result = createFromParameterHandler(value, pClass, message); + if (result != null) { + return result; + } LOG.severe(new org.apache.cxf.common.i18n.Message("CLASS_CONSTRUCTOR_FAILURE", BUNDLE, pClass.getName()).toString()); @@ -337,22 +341,31 @@ public final class InjectionUtils { } } - if (result == null && message != null) { + if (result == null) { + result = createFromParameterHandler(value, pClass, message); + } + + if (result == null) { + reportServerError("WRONG_PARAMETER_TYPE", pClass.getName()); + } + + return result; + } + + private static Object createFromParameterHandler(String value, + Class<?> pClass, + Message message) { + Object result = null; + if (message != null) { ParameterHandler<?> pm = ProviderFactory.getInstance(message) .createParameterHandler(pClass); if (pm != null) { result = pm.fromString(value); } } - - if (result != null) { - return result; - } - - reportServerError("WRONG_PARAMETER_TYPE", pClass.getName()); - return null; + return result; } - + public static void reportServerError(String messageName, String parameter) { org.apache.cxf.common.i18n.Message errorMessage = new org.apache.cxf.common.i18n.Message(messageName, Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java?rev=1055895&r1=1055894&r2=1055895&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java Thu Jan 6 14:37:16 2011 @@ -307,7 +307,9 @@ public class Customer extends AbstractCu // complete } - public void testCustomerParam(@QueryParam("p1") Customer c, @QueryParam("p2") Customer[] c2) { + public void testCustomerParam(@QueryParam("p1") Customer c, + @QueryParam("p2") Customer[] c2, + @QueryParam("p3") Customer2 c3) { // complete } Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer2.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer2.java?rev=1055895&view=auto ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer2.java (added) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer2.java Thu Jan 6 14:37:16 2011 @@ -0,0 +1,35 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.cxf.jaxrs; + +public class Customer2 extends Customer { + + public Customer2() { + + } + + public Customer2(String name) { + if (Character.isLowerCase(((CharSequence)name).charAt(0))) { + throw new IllegalArgumentException(); + } + //CHECKSTYLE:OFF + setName(name); + //CHECKSTYLE:ON + } +} Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer2.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer2.java ------------------------------------------------------------------------------ svn:keywords = Rev Date 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=1055895&r1=1055894&r2=1055895&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 Thu Jan 6 14:37:16 2011 @@ -24,7 +24,10 @@ import org.apache.cxf.jaxrs.ext.Paramete public class CustomerParameterHandler implements ParameterHandler<Customer> { public Customer fromString(String s) { - Customer c = new Customer(); + if ("noName".equals(s)) { + throw new IllegalArgumentException(); + } + Customer c = Character.isLowerCase(((CharSequence)s).charAt(0)) ? new Customer2() : new Customer(); c.setName(s); return c; } 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=1055895&r1=1055894&r2=1055895&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 Thu Jan 6 14:37:16 2011 @@ -47,6 +47,7 @@ import javax.xml.bind.JAXBContext; import org.apache.cxf.endpoint.Endpoint; import org.apache.cxf.jaxrs.Customer; +import org.apache.cxf.jaxrs.Customer2; import org.apache.cxf.jaxrs.CustomerGender; import org.apache.cxf.jaxrs.CustomerParameterHandler; import org.apache.cxf.jaxrs.JAXBContextProvider; @@ -644,20 +645,49 @@ public class JAXRSUtilsTest extends Asse Message messageImpl = createMessage(); ProviderFactory.getInstance(messageImpl).registerUserProvider( new CustomerParameterHandler()); - Class[] argType = {Customer.class, Customer[].class}; + Class[] argType = {Customer.class, Customer[].class, Customer2.class}; Method m = Customer.class.getMethod("testCustomerParam", argType); - messageImpl.put(Message.QUERY_STRING, "p1=Fred&p2=Barry"); + messageImpl.put(Message.QUERY_STRING, "p1=Fred&p2=Barry&p3=Jack&p4=John"); List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), null, messageImpl); - assertEquals(2, params.size()); + assertEquals(3, params.size()); Customer c = (Customer)params.get(0); assertEquals("Fred", c.getName()); Customer c2 = ((Customer[])params.get(1))[0]; assertEquals("Barry", c2.getName()); + Customer2 c3 = (Customer2)params.get(2); + assertEquals("Jack", c3.getName()); + + try { + messageImpl.put(Message.QUERY_STRING, "p3=noName"); + JAXRSUtils.processParameters(new OperationResourceInfo(m, null), null, messageImpl); + fail("Customer2 constructor does not accept names starting with lower-case chars"); + } catch (Exception ex) { + // expected + } + + } + + @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, null), + 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();