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/06/20 18:24:47 UTC

svn commit: r786850 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ systests/src/test/java/org/apache/cxf/systest/jaxrs/

Author: sergeyb
Date: Sat Jun 20 16:24:47 2009
New Revision: 786850

URL: http://svn.apache.org/viewvc?rev=786850&view=rev
Log:
JAXRS: avoiding loading model resource class if it is already been loaded elsewhere (ex, OSGI)

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerUserResourceTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java?rev=786850&r1=786849&r2=786850&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java Sat Jun 20 16:24:47 2009
@@ -247,6 +247,10 @@
         serviceFactory.setUserResources(resources);
     }
     
+    public void setModelBeansWithServiceClass(List<UserResource> resources, Class<?> sClass) {
+        serviceFactory.setUserResourcesWithServiceClass(resources, sClass);
+    }
+    
     public void setModelRef(String modelRef) {
         List<UserResource> resources = ResourceUtils.getUserResources(modelRef);
         if (resources != null) {
@@ -254,4 +258,12 @@
         }
     }
     
+    public void setModelRefWithServiceClass(String modelRef, Class<?> sClass) {
+        List<UserResource> resources = ResourceUtils.getUserResources(modelRef);
+        if (resources != null) {
+            serviceFactory.setUserResourcesWithServiceClass(resources, sClass);
+        }
+    }
+    
+    
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java?rev=786850&r1=786849&r2=786850&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java Sat Jun 20 16:24:47 2009
@@ -131,10 +131,7 @@
     }
     
     public void setUserResources(List<UserResource> resources) {
-        Map<String, UserResource> map = new HashMap<String, UserResource>();
-        for (UserResource ur : resources) {
-            map.put(ur.getName(), ur);
-        }
+        Map<String, UserResource> map = userResourcesAsMap(resources);
         for (UserResource ur : resources) {
             if (ur.getPath() != null) {
                 ClassResourceInfo cri = ResourceUtils.createClassResourceInfo(map, ur, true);
@@ -145,6 +142,22 @@
         }
     }
     
+    public void setUserResourcesWithServiceClass(List<UserResource> resources, Class<?> sClass) {
+        Map<String, UserResource> map = userResourcesAsMap(resources);
+        ClassResourceInfo cri = ResourceUtils.createServiceClassResourceInfo(map, sClass, true);
+        if (cri != null) {
+            classResourceInfos.add(cri);
+        }
+    }
+    
+    private Map<String, UserResource> userResourcesAsMap(List<UserResource> resources) {
+        Map<String, UserResource> map = new HashMap<String, UserResource>();
+        for (UserResource ur : resources) {
+            map.put(ur.getName(), ur);
+        }
+        return map;
+    }
+    
     protected ClassResourceInfo createResourceInfo(Class cls, boolean isRoot) {
         ClassResourceInfo classResourceInfo = 
             ResourceUtils.createClassResourceInfo(cls, cls, isRoot, enableStatic);

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java?rev=786850&r1=786849&r2=786850&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java Sat Jun 20 16:24:47 2009
@@ -119,6 +119,46 @@
 
     }
     
+    public static ClassResourceInfo createServiceClassResourceInfo(
+        Map<String, UserResource> resources, Class<?> sClass, boolean isRoot) {
+        UserResource model = resources.get(sClass.getName());
+        if (model == null) {
+            throw new RuntimeException("Resource class " + sClass.getName() + " has no model info");
+        }
+        ClassResourceInfo cri  = new ClassResourceInfo(sClass, sClass, isRoot, true, true);
+        URITemplate t = URITemplate.createTemplate(model.getPath());
+        cri.setURITemplate(t);
+        MethodDispatcher md = new MethodDispatcher();
+        Map<String, UserOperation> ops = model.getOperationsAsMap();
+        for (Method m : cri.getServiceClass().getMethods()) {
+            UserOperation op = ops.get(m.getName());
+            if (op == null || op.getName() == null) {
+                continue;
+            }
+            OperationResourceInfo ori = 
+                new OperationResourceInfo(m, cri, URITemplate.createTemplate(op.getPath()),
+                                          op.getVerb(), op.getConsumes(), op.getProduces(),
+                                          op.getParameters());
+            String rClassName = m.getReturnType().getName();
+            if (op.getVerb() == null) {
+                if (resources.containsKey(rClassName)) {
+                    ClassResourceInfo subCri = rClassName.equals(model.getName()) ? cri 
+                        : createServiceClassResourceInfo(resources, m.getReturnType(), false);
+                    if (subCri != null) {
+                        cri.addSubClassResourceInfo(subCri);
+                        md.bind(ori, m);
+                    }
+                }
+            } else {
+                md.bind(ori, m);
+            }
+        }
+        cri.setMethodDispatcher(md);
+        return checkMethodDispatcher(cri) ? cri : null;
+
+    }
+    
+    
     public static ClassResourceInfo createClassResourceInfo(
         final Class<?> rClass, final Class<?> sClass, boolean root, boolean enableStatic) {
         ClassResourceInfo cri  = new ClassResourceInfo(rClass, sClass, root, enableStatic);

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerUserResourceTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerUserResourceTest.java?rev=786850&r1=786849&r2=786850&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerUserResourceTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerUserResourceTest.java Sat Jun 20 16:24:47 2009
@@ -80,6 +80,9 @@
             
             sf.setModelBeans(ur, ur2);
             
+            String modelRef = "classpath:/org/apache/cxf/systest/jaxrs/resources/resources2.xml";
+            sf.setModelRefWithServiceClass(modelRef, BookStoreNoAnnotationsInterface.class);
+            sf.setServiceBeans(new BookStoreNoAnnotationsImpl());
             sf.create();
 
         }
@@ -110,6 +113,12 @@
     }
     
     @Test
+    public void testGetBookInterface123() throws Exception {
+        getAndCompare("http://localhost:9080/bookstore2/books/123",
+                      "application/xml", 200);
+    }
+    
+    @Test
     public void testGetChapter() throws Exception {
         
         getAndCompareChapter("http://localhost:9080/bookstoreNoAnnotations/books/123/chapter",