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 2011/02/18 18:08:17 UTC

svn commit: r1072065 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/client/ test/java/org/apache/cxf/jaxrs/client/

Author: sergeyb
Date: Fri Feb 18 17:08:17 2011
New Revision: 1072065

URL: http://svn.apache.org/viewvc?rev=1072065&view=rev
Log:
CXF-3350: selecting the correct resource from the complex user model

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java?rev=1072065&r1=1072064&r2=1072065&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java Fri Feb 18 17:08:17 2011
@@ -184,7 +184,7 @@ public final class JAXRSClientFactory {
      */
     public static <T> T createFromModel(String baseAddress, Class<T> cls, String modelRef, 
                                List<?> providers, String configLocation) {
-        JAXRSClientFactoryBean bean = WebClient.getBean(baseAddress, configLocation);
+        JAXRSClientFactoryBean bean = getBean(baseAddress, cls, configLocation);
         bean.setProviders(providers);
         bean.setModelRef(modelRef);
         return bean.create(cls);
@@ -201,7 +201,7 @@ public final class JAXRSClientFactory {
      */
     public static <T> T createFromModel(String baseAddress, Class<T> cls, String modelRef, 
                                         List<?> providers, boolean threadSafe) {
-        JAXRSClientFactoryBean bean = WebClient.getBean(baseAddress, null);
+        JAXRSClientFactoryBean bean = getBean(baseAddress, cls, null);
         bean.setProviders(providers);
         bean.setModelRef(modelRef);
         if (threadSafe) {
@@ -232,7 +232,7 @@ public final class JAXRSClientFactory {
      */
     public static <T> T createFromModel(String baseAddress, Class<T> cls, List<UserResource> modelBeans,
                                List<?> providers, String configLocation) {
-        JAXRSClientFactoryBean bean = WebClient.getBean(baseAddress, configLocation);
+        JAXRSClientFactoryBean bean = getBean(baseAddress, cls, configLocation);
         bean.setProviders(providers);
         bean.setModelBeans(modelBeans);
         return bean.create(cls);

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java?rev=1072065&r1=1072064&r2=1072065&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java Fri Feb 18 17:08:17 2011
@@ -48,6 +48,7 @@ public class JAXRSClientFactoryBean exte
     private MultivaluedMap<String, String> headers;
     private ClientState initialState;
     private boolean threadSafe; 
+    private Class serviceClass;
     
     public JAXRSClientFactoryBean() {
         this(new JAXRSServiceFactoryBean());
@@ -123,7 +124,7 @@ public class JAXRSClientFactoryBean exte
      * Sets the resource class
      * @param cls the resource class
      */
-    public void setResourceClass(Class cls) {
+    public void setResourceClass(Class<?> cls) {
         setServiceClass(cls);
     }
     
@@ -131,11 +132,20 @@ public class JAXRSClientFactoryBean exte
      * Sets the resource class, may be called from a Spring handler 
      * @param cls the resource class
      */
-    public void setServiceClass(Class cls) {
+    public void setServiceClass(Class<?> cls) {
+        this.serviceClass = cls;
         serviceFactory.setResourceClass(cls);
     }
     
     /**
+     * Returns the service class 
+     * @param cls the service class
+     */
+    public Class<?> getServiceClass() {
+        return serviceClass;
+    }
+    
+    /**
      * Sets the headers new proxy or WebClient instances will be
      * initialized with.
      * 
@@ -228,7 +238,22 @@ public class JAXRSClientFactoryBean exte
         ClassResourceInfo cri = null;
         try {
             Endpoint ep = createEndpoint();
-            cri = serviceFactory.getClassResourceInfo().get(0);
+            if (getServiceClass() != null) {
+                for (ClassResourceInfo info : serviceFactory.getClassResourceInfo()) {
+                    if (info.getServiceClass().isAssignableFrom(getServiceClass())) {
+                        cri = info;
+                        break;
+                    }
+                }
+                if (cri == null) {
+                    // can not happen in the reality
+                    throw new RuntimeException("Service class " + getServiceClass().getName()
+                                               + " is not recognized");
+                }
+            } else {
+                cri = serviceFactory.getClassResourceInfo().get(0);
+            }
+            
             boolean isRoot = cri.getURITemplate() != null;
             ClientProxyImpl proxyImpl = null;
             ClientState actualState = getActualState();

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java?rev=1072065&r1=1072064&r2=1072065&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java Fri Feb 18 17:08:17 2011
@@ -20,12 +20,16 @@
 package org.apache.cxf.jaxrs.client;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.feature.AbstractFeature;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.interceptor.InterceptorProvider;
+import org.apache.cxf.jaxrs.model.UserOperation;
+import org.apache.cxf.jaxrs.model.UserResource;
+import org.apache.cxf.jaxrs.resources.Book;
 import org.apache.cxf.jaxrs.resources.BookStore;
 import org.apache.cxf.jaxrs.resources.BookStoreSubresourcesOnly;
 import org.apache.cxf.message.Message;
@@ -48,6 +52,46 @@ public class JAXRSClientFactoryBeanTest 
     }
     
     @Test
+    public void testCreateClientWithUserResource() throws Exception {
+        JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+        bean.setAddress("http://bar");
+        UserResource r = new UserResource();
+        r.setName(BookStore.class.getName());
+        r.setPath("/");
+        UserOperation op = new UserOperation();
+        op.setName("getDescription");
+        op.setVerb("GET");
+        r.setOperations(Collections.singletonList(op));
+        bean.setModelBeans(r);
+        assertTrue(bean.create() instanceof BookStore);
+    }
+    
+    @Test
+    public void testCreateClientWithTwoUserResources() throws Exception {
+        JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+        bean.setAddress("http://bar");
+        UserResource r1 = new UserResource();
+        r1.setName(BookStore.class.getName());
+        r1.setPath("/store");
+        UserOperation op = new UserOperation();
+        op.setName("getDescription");
+        op.setVerb("GET");
+        r1.setOperations(Collections.singletonList(op));
+        
+        UserResource r2 = new UserResource();
+        r2.setName(Book.class.getName());
+        r2.setPath("/book");
+        UserOperation op2 = new UserOperation();
+        op2.setName("getName");
+        op2.setVerb("GET");
+        r2.setOperations(Collections.singletonList(op2));
+        
+        bean.setModelBeans(r1, r2);
+        bean.setServiceClass(Book.class);
+        assertTrue(bean.create() instanceof Book);
+    }
+    
+    @Test
     public void testGetConduit() throws Exception {
         JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
         bean.setAddress("http://bar");