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 2009/05/01 15:59:20 UTC

svn commit: r770684 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/form/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ rt/frontend/jaxrs/src/test/java...

Author: sergeyb
Date: Fri May  1 13:59:19 2009
New Revision: 770684

URL: http://svn.apache.org/viewvc?rev=770684&view=rev
Log:
JAXRS: support for parameter extensions on the client side

Added:
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java   (with props)
Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
    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/ext/form/Form.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Fri May  1 13:59:19 2009
@@ -59,6 +59,8 @@
 import org.apache.cxf.jaxrs.impl.UriBuilderImpl;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
+import org.apache.cxf.jaxrs.utils.InjectionUtils;
+import org.apache.cxf.jaxrs.utils.ParameterType;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.ExchangeImpl;
 import org.apache.cxf.message.Message;
@@ -397,6 +399,35 @@
         return null;                                                
     }
     
+    // TODO : shall we just do the reflective invocation here ?
+    protected static void addParametersToBuilder(UriBuilder ub, String paramName, Object pValue,
+                                                 ParameterType pt) {
+        if (pt != ParameterType.MATRIX && pt != ParameterType.QUERY) {
+            throw new IllegalArgumentException("This method currently deal "
+                                               + "with matrix and query parameters only");
+        }
+        if (!"".equals(paramName)) {
+            addToBuilder(ub, paramName, pValue, pt);    
+        } else {
+            MultivaluedMap<String, Object> values = 
+                InjectionUtils.extractValuesFromBean(pValue, "");
+            for (Map.Entry<String, List<Object>> entry : values.entrySet()) {
+                for (Object v : entry.getValue()) {
+                    addToBuilder(ub, entry.getKey(), v, pt);
+                }
+            }
+        }
+    }
+
+    private static void addToBuilder(UriBuilder ub, String paramName, Object pValue,
+                                     ParameterType pt) {
+        if (pt == ParameterType.MATRIX) {
+            ub.matrixParam(paramName, pValue.toString());
+        } else {
+            ub.queryParam(paramName, pValue.toString());
+        }
+    }
+    
     protected static void reportNoMessageHandler(String name, Class<?> cls) {
         org.apache.cxf.common.i18n.Message errorMsg = 
             new org.apache.cxf.common.i18n.Message(name, 

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Fri May  1 13:59:19 2009
@@ -56,6 +56,7 @@
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.utils.AnnotationUtils;
+import org.apache.cxf.jaxrs.utils.FormUtils;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
 import org.apache.cxf.jaxrs.utils.ParameterType;
 import org.apache.cxf.message.Message;
@@ -290,7 +291,17 @@
                     }
                 }
             } else {
-                list.add(params[p.getIndex()]);
+                String paramName = p.getValue();
+                if (!"".equals(paramName)) {
+                    list.add(params[p.getIndex()]);
+                } else {
+                    MultivaluedMap<String, Object> values = 
+                        InjectionUtils.extractValuesFromBean(params[p.getIndex()], "");
+                    for (String var : vars) {
+                        list.addAll(values.get(var));
+                    }
+                }
+                
             }
         }
         return list;
@@ -308,7 +319,7 @@
         List<Parameter> qs = getParameters(map, ParameterType.QUERY);
         for (Parameter p : qs) {
             if (params[p.getIndex()] != null) {
-                ub.queryParam(p.getValue(), params[p.getIndex()].toString());
+                addParametersToBuilder(ub, p.getValue(), params[p.getIndex()], ParameterType.QUERY);
             }
         }
     }
@@ -318,20 +329,20 @@
         List<Parameter> mx = getParameters(map, ParameterType.MATRIX);
         for (Parameter p : mx) {
             if (params[p.getIndex()] != null) {
-                ub.matrixParam(p.getValue(), params[p.getIndex()].toString());
+                addParametersToBuilder(ub, p.getValue(), params[p.getIndex()], ParameterType.MATRIX);
             }
         }
     }
 
-    private MultivaluedMap<String, String> handleForm(MultivaluedMap<ParameterType, Parameter> map, 
+    private MultivaluedMap<String, Object> handleForm(MultivaluedMap<ParameterType, Parameter> map, 
                                                       Object[] params) {
         
-        MultivaluedMap<String, String> form = new MetadataMap<String, String>();
+        MultivaluedMap<String, Object> form = new MetadataMap<String, Object>();
         
         List<Parameter> fm = getParameters(map, ParameterType.FORM);
         for (Parameter p : fm) {
             if (params[p.getIndex()] != null) {
-                form.add(p.getValue(), params[p.getIndex()].toString());
+                FormUtils.addPropertyToForm(form, p.getValue(), params[p.getIndex()]);
             }
         }
         

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=770684&r1=770683&r2=770684&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 Fri May  1 13:59:19 2009
@@ -44,6 +44,7 @@
 import org.apache.cxf.jaxrs.ext.form.Form;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
+import org.apache.cxf.jaxrs.utils.ParameterType;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageContentsList;
 import org.apache.cxf.phase.Phase;
@@ -298,6 +299,7 @@
      */
     public WebClient path(Object path) {
         getCurrentBuilder().path(path.toString());
+        
         return this;
     }
     
@@ -308,7 +310,11 @@
      * @return updated WebClient
      */
     public WebClient query(String name, Object ...values) {
-        getCurrentBuilder().queryParam(name, values);
+        if (!"".equals(name)) {
+            getCurrentBuilder().queryParam(name, values);
+        } else {
+            addParametersToBuilder(getCurrentBuilder(), name, values[0], ParameterType.QUERY);
+        }
         
         return this;
     }
@@ -320,7 +326,12 @@
      * @return updated WebClient
      */
     public WebClient matrix(String name, Object ...values) {
-        getCurrentBuilder().matrixParam(name, values);
+        if (!"".equals(name)) {
+            getCurrentBuilder().matrixParam(name, values);
+        } else {
+            addParametersToBuilder(getCurrentBuilder(), name, values[0], ParameterType.MATRIX);
+        }
+        
         return this;
     }
     

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/form/Form.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/form/Form.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/form/Form.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/form/Form.java Fri May  1 13:59:19 2009
@@ -22,6 +22,7 @@
 import javax.ws.rs.core.MultivaluedMap;
 
 import org.apache.cxf.jaxrs.impl.MetadataMap;
+import org.apache.cxf.jaxrs.utils.FormUtils;
 
 /**
  * Simple MultivaluedMap wrapper 
@@ -32,7 +33,8 @@
         new MetadataMap<String, Object>();
     
     public Form set(String name, Object value) {
-        map.add(name, value);
+        
+        FormUtils.addPropertyToForm(map, name, value);
         return this;
     }
     

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java Fri May  1 13:59:19 2009
@@ -24,6 +24,7 @@
 import java.io.InputStream;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MultivaluedMap;
@@ -42,6 +43,20 @@
         
     }
     
+    public static void addPropertyToForm(MultivaluedMap<String, Object> map, String name, Object value) {
+        if (!"".equals(name)) {
+            map.add(name, value);
+        } else {
+            MultivaluedMap<String, Object> values = 
+                InjectionUtils.extractValuesFromBean(value, "");
+            for (Map.Entry<String, List<Object>> entry : values.entrySet()) {
+                for (Object v : entry.getValue()) {
+                    map.add(entry.getKey(), v.toString());
+                }
+            }
+        }
+    }
+    
     public static String readBody(InputStream is) {
         try {
             ByteArrayOutputStream bos = new ByteArrayOutputStream();

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=770684&r1=770683&r2=770684&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 Fri May  1 13:59:19 2009
@@ -31,6 +31,7 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -62,6 +63,7 @@
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.PrimitiveUtils;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.ext.MessageContext;
 import org.apache.cxf.jaxrs.ext.ParameterHandler;
 import org.apache.cxf.jaxrs.impl.MetadataMap;
@@ -300,7 +302,7 @@
     }
     
     public static Object handleBean(Class<?> paramType, MultivaluedMap<String, String> values,
-                                    ParameterType pType, Message message) {
+                                    ParameterType pType, Message message, boolean decoded) {
         Object bean = null;
         try {
             bean = paramType.newInstance();
@@ -392,12 +394,11 @@
                                                             genericType);
                         } else if (isbean) {
                             paramValue = InjectionUtils.handleBean(type, processedValues,
-                                                            pType, message);
+                                                            pType, message, decoded);
                         } else {
-                            paramValue = InjectionUtils.handleParameter(
-                                                            processedValues.values().iterator().next().get(0),
-                                                            type,
-                                                            pType, message);
+                            String value = decodeValue(processedValues.values().iterator().next().get(0),
+                                                       decoded, pType);
+                            paramValue = InjectionUtils.handleParameter(value, type, pType, message);
                         }
 
                         if (paramValue != null) {
@@ -531,7 +532,7 @@
             theValues = Array.newInstance(realType, isbean ? 1 : values.values().iterator().next().size());
         }
         if (isbean) {
-            Object o = InjectionUtils.handleBean(realType, values, pathParam, message);
+            Object o = InjectionUtils.handleBean(realType, values, pathParam, message, decoded);
             addToCollectionValues(theValues, o, 0);
         } else {
             List<String> valuesList = values.values().iterator().next();
@@ -727,6 +728,44 @@
         }
     }
     
+    public static MultivaluedMap<String, Object> extractValuesFromBean(Object bean, String baseName) {
+        MultivaluedMap<String, Object> values = new MetadataMap<String, Object>();
+        fillInValuesFromBean(bean, baseName, values);
+        return values;
+    }
+    
+    public static void fillInValuesFromBean(Object bean, String baseName, 
+                                            MultivaluedMap<String, Object> values) {
+        for (Method m : bean.getClass().getMethods()) {
+            if (m.getName().startsWith("get") && m.getParameterTypes().length == 0 
+                && m.getName().length() > 3) {
+                String propertyName = m.getName().substring(3).toLowerCase();
+                if (baseName.contains(propertyName) || "class".equals(propertyName)) {
+                    continue;
+                }
+                if (!"".equals(baseName)) {
+                    propertyName = baseName + "." + propertyName;
+                }
+                
+                Object value = extractFromMethod(bean, m);
+                if (isPrimitive(value.getClass())) {
+                    values.putSingle(propertyName, value);
+                } else if (isSupportedCollectionOrArray(value.getClass())) {
+                    // ignoring arrrays for a moment
+                    List<Object> theValues = null;
+                    if (value.getClass().isArray()) {
+                        theValues = Arrays.asList(value);
+                    } else {
+                        theValues = CastUtils.cast((List<?>)value);
+                    }
+                    values.put(propertyName, theValues);
+                } else {
+                    fillInValuesFromBean(value, propertyName, values);
+                }
+            }
+        }
+    }
+    
     public static boolean isPrimitive(Class<?> type) {
         return type.isPrimitive() 
             || Number.class.isAssignableFrom(type)

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Fri May  1 13:59:19 2009
@@ -547,10 +547,7 @@
             }
             
             if ("".equals(key)) {
-                return InjectionUtils.handleBean(pClass, 
-                                                 params, 
-                                                 ParameterType.MATRIX,
-                                                 m);
+                return InjectionUtils.handleBean(pClass, params, ParameterType.MATRIX, m, false);
             } else {
                 List<String> values = params.get(key);
                 return InjectionUtils.createParameterObject(values, 
@@ -589,7 +586,7 @@
         }
         
         if ("".equals(key)) {
-            return InjectionUtils.handleBean(pClass, params, ParameterType.FORM, m);
+            return InjectionUtils.handleBean(pClass, params, ParameterType.FORM, m, false);
         } else {
             List<String> results = params.get(key);
     
@@ -724,11 +721,11 @@
                                            Type genericType,
                                            MultivaluedMap<String, String> values,
                                            String defaultValue,
-                                           boolean  decoded) {
+                                           boolean decoded) {
         
         String parameterName = uriParamAnnotation.value();
         if ("".equals(parameterName)) {
-            return InjectionUtils.handleBean(paramType, values, ParameterType.PATH, m);
+            return InjectionUtils.handleBean(paramType, values, ParameterType.PATH, m, decoded);
         } else {
             List<String> results = values.get(parameterName);
             return InjectionUtils.createParameterObject(results, 
@@ -753,9 +750,8 @@
         String queryName = queryParam.value();
 
         if ("".equals(queryName)) {
-            return InjectionUtils.handleBean(paramType, 
-                                             new UriInfoImpl(m, null).getQueryParameters(),
-                                             ParameterType.QUERY, m);
+            return InjectionUtils.handleBean(paramType, new UriInfoImpl(m, null).getQueryParameters(),
+                                             ParameterType.QUERY, m, decode);
         } else {
             List<String> results = getStructuredParams((String)m.get(Message.QUERY_STRING),
                                        "&",

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java Fri May  1 13:59:19 2009
@@ -59,6 +59,15 @@
         assertEquals(URI.create("http://foo/bar"), wc.getCurrentURI());
     }
     
+    @Test 
+    public void testCompositePath() {
+        WebClient wc = WebClient.create("http://foo");
+        wc.path("/bar/baz/");
+        assertEquals(URI.create("http://foo"), wc.getBaseURI());
+        assertEquals(URI.create("http://foo/bar/baz/"), wc.getCurrentURI());
+    }
+    
+    
     @Test(expected = IllegalArgumentException.class) 
     public void testWrongForward() {
         WebClient wc = WebClient.create("http://foo");

Added: 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=770684&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java Fri May  1 13:59:19 2009
@@ -0,0 +1,127 @@
+/**
+ * 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.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class InjectionUtilsTest extends Assert {
+    
+    @Test
+    public void testExtractValuesFromBean() {
+        CustomerBean1 bean1 = new CustomerBean1();
+        bean1.setA("aValue");
+        bean1.setB(1L);
+        List<String> values = new ArrayList<String>();
+        values.add("lv1");
+        values.add("lv2");
+        bean1.setC(values);
+        CustomerBean2 bean2 = new CustomerBean2();
+        bean2.setA("aaValue");
+        bean2.setB(2L);
+        values = new ArrayList<String>();
+        values.add("lv11");
+        values.add("lv22");
+        bean2.setC(values);
+        bean1.setD(bean2);
+        
+        MultivaluedMap<String, Object> map = InjectionUtils.extractValuesFromBean(bean1, "");
+        assertEquals("Size is wrong", 6, map.size());
+        assertEquals(1, map.get("a").size());
+        assertEquals("aValue", map.getFirst("a"));
+        assertEquals(1, map.get("b").size());
+        assertEquals(1L, map.getFirst("b"));
+        assertEquals(2, map.get("c").size());
+        assertEquals("lv1", map.get("c").get(0));
+        assertEquals("lv2", map.get("c").get(1));
+        
+        assertEquals(1, map.get("d.a").size());
+        assertEquals("aaValue", map.getFirst("d.a"));
+        assertEquals(1, map.get("d.b").size());
+        assertEquals(2L, map.getFirst("d.b"));
+        assertEquals(2, map.get("d.c").size());
+        assertEquals("lv11", map.get("d.c").get(0));
+        assertEquals("lv22", map.get("d.c").get(1));
+        
+    }
+
+    private static class CustomerBean1 {
+        private String a;
+        private Long b;
+        private List<String> c;
+        private CustomerBean2 d;
+        public void setA(String aString) {
+            this.a = aString;
+        }
+        public void setB(Long bLong) {
+            this.b = bLong;
+        }
+        public void setC(List<String> cStringList) {
+            this.c = cStringList;
+        }
+        public void setD(CustomerBean2 dCustomerBean) {
+            this.d = dCustomerBean;
+        }
+        public String getA() {
+            return a;
+        }
+        public Long getB() {
+            return b;
+        }
+        public List<String> getC() {
+            return c;
+        }
+        public CustomerBean2 getD() {
+            return d;
+        }
+        
+    }
+    
+    private static class CustomerBean2 {
+        private String a;
+        private Long b;
+        private List<String> c;
+        public void setA(String aString) {
+            this.a = aString;
+        }
+        public void setB(Long bLong) {
+            this.b = bLong;
+        }
+        public void setC(List<String> cStringList) {
+            this.c = cStringList;
+        }
+        public String getA() {
+            return a;
+        }
+        public Long getB() {
+            return b;
+        }
+        public List<String> getC() {
+            return c;
+        }
+        
+        
+    }
+    
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java Fri May  1 13:59:19 2009
@@ -57,5 +57,13 @@
     Book getTheBook3(@FormParam("id") String id,
                      @FormParam("name") String name) throws BookNotFoundFault;
     
+    @GET
+    @Path("/subresource4/{id}/{name}")
+    @Produces("application/xml")
+    Book getTheBook4(@PathParam("") Book bookPath,
+                     @QueryParam("") Book bookQuery,
+                     @MatrixParam("") Book matrixBook) throws BookNotFoundFault;
+    
+    
 }
 

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java Fri May  1 13:59:19 2009
@@ -62,5 +62,24 @@
         b.setName(name);
         return b;
     }
+    
+    public Book getTheBook4(Book bookPath, Book bookQuery, Book bookMatrix) throws BookNotFoundFault {
+        if (bookPath == null || bookQuery == null || bookMatrix == null) {
+            throw new RuntimeException();
+        }
+        long id1 = bookPath.getId();
+        long id2 = bookQuery.getId();
+        long id3 = bookMatrix.getId();
+        if (id1 != 139L || id1 != id2 || id1 != id3 || id1 != id.longValue()) {
+            throw new RuntimeException();
+        }
+        String name1 = bookPath.getName();
+        String name2 = bookQuery.getName();
+        String name3 = bookMatrix.getName();
+        if (!"CXF Rocks".equals(name1) || !name1.equals(name2) || !name1.equals(name3)) {
+            throw new RuntimeException();
+        }
+        return bookPath;
+    }
 
 }

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=770684&r1=770683&r2=770684&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Fri May  1 13:59:19 2009
@@ -58,7 +58,7 @@
     @BeforeClass
     public static void startServers() throws Exception {
         assertTrue("server did not launch correctly", 
-                   launchServer(BookServerRestSoap.class));
+                   launchServer(BookServerRestSoap.class, true));
     }
     
     @Test
@@ -174,6 +174,31 @@
     }
     
     @Test
+    public void testGetBookSubresourceParamExtensions() throws Exception {
+        
+        String baseAddress = "http://localhost:9092/test/services/rest";
+        BookStoreJaxrsJaxws proxy = JAXRSClientFactory.create(baseAddress,
+                                                              BookStoreJaxrsJaxws.class);
+        BookSubresource bs = proxy.getBookSubresource("139");
+        Book bean = new Book("CXF Rocks", 139L);
+        Book b = bs.getTheBook4(bean, bean, bean);
+        assertEquals(139, b.getId());
+        assertEquals("CXF Rocks", b.getName());
+    }
+    
+    @Test
+    public void testGetBookSubresourceWebClientParamExtensions() throws Exception {
+        
+        WebClient client = WebClient.create("http://localhost:9092/test/services/rest");
+        client.type(MediaType.TEXT_PLAIN_TYPE).accept(MediaType.APPLICATION_XML_TYPE);
+        client.path("/bookstore/books/139/subresource4/139/CXF Rocks");
+        Book bean = new Book("CXF Rocks", 139L);
+        Book b = client.matrix("", bean).query("", bean).get(Book.class);
+        assertEquals(139, b.getId());
+        assertEquals("CXF Rocks", b.getName());
+    }
+    
+    @Test
     public void testGetBookSubresourceClient2() throws Exception {
         
         String baseAddress = "http://localhost:9092/test/services/rest";