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 2012/09/24 18:15:59 UTC

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

Author: sergeyb
Date: Mon Sep 24 16:15:58 2012
New Revision: 1389470

URL: http://svn.apache.org/viewvc?rev=1389470&view=rev
Log:
[CXF-4455] Minor update to get Application name-bindings applied to root resources, as well as an update to get the inheritance between sub and root resources working better

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java?rev=1389470&r1=1389469&r2=1389470&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java Mon Sep 24 16:15:58 2012
@@ -44,6 +44,7 @@ import org.apache.cxf.jaxrs.lifecycle.Re
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.utils.AnnotationUtils;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.service.factory.FactoryBeanListener;
@@ -93,7 +94,10 @@ public class JAXRSServerFactoryBean exte
      * @param app
      */
     public void setApplication(Application app) {
-        appProvider = new ProviderInfo<Application>(app, getBus());    
+        appProvider = new ProviderInfo<Application>(app, getBus());
+        for (ClassResourceInfo cri : getServiceFactory().getClassResourceInfo()) {
+            cri.setNameBindings(AnnotationUtils.getNameBindings(app.getClass().getAnnotations()));
+        }
     }
     
     /**

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java?rev=1389470&r1=1389469&r2=1389470&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java Mon Sep 24 16:15:58 2012
@@ -57,6 +57,8 @@ public class ClassResourceInfo extends A
     private boolean createdFromModel; 
     private String consumesTypes;
     private String producesTypes;
+    private List<String> nameBindings = Collections.emptyList();
+    private ClassResourceInfo parent;
     
     public ClassResourceInfo(ClassResourceInfo cri) {
         super(cri.getBus());       
@@ -69,6 +71,8 @@ public class ClassResourceInfo extends A
             this.paramFields = cri.paramFields;
             this.paramMethods = cri.paramMethods;
             this.enableStatic = true;
+            this.nameBindings = cri.nameBindings;
+            this.parent = cri.parent;
         } else {
             throw new IllegalArgumentException();
         }
@@ -82,6 +86,7 @@ public class ClassResourceInfo extends A
         if (root && resourceClass != null) {
             setParamField(serviceClass);
             setParamMethods(serviceClass);
+            nameBindings = AnnotationUtils.getNameBindings(serviceClass.getAnnotations());
         }
     }
     
@@ -102,7 +107,7 @@ public class ClassResourceInfo extends A
     
     // The following constructors are used by tests only
     public ClassResourceInfo(Class<?> theResourceClass) {
-        this(theResourceClass, false);
+        this(theResourceClass, true);
     }
     
     public ClassResourceInfo(Class<?> theResourceClass, boolean theRoot) {
@@ -136,16 +141,40 @@ public class ClassResourceInfo extends A
                 ClassResourceInfo tmpCri = subResources.putIfAbsent(key, cri);
                 if (tmpCri != null) {
                     cri = tmpCri;
+                    if (cri != this) {
+                        cri.setParent(this);
+                    }
                 }
             }
         }
         return cri;
     }
     
+    public void addSubClassResourceInfo(ClassResourceInfo cri) {
+        subResources.putIfAbsent(new SubresourceKey(cri.getResourceClass(), 
+                                            cri.getServiceClass()),
+                                 cri);
+        if (cri != this) {
+            cri.setParent(this);
+        }
+    }
+    
     public Collection<ClassResourceInfo> getSubResources() {
         return Collections.unmodifiableCollection(subResources.values());
     }
     
+    public List<String> getNameBindings() {
+        if (root || parent == null) {
+            return nameBindings;
+        } else {
+            return parent.nameBindings;
+        }
+    }
+    
+    public void setNameBindings(List<String> names) {
+        nameBindings = names;
+    }
+    
     public Set<String> getAllowedMethods() {
         Set<String> methods = new HashSet<String>();
         for (OperationResourceInfo o : methodDispatcher.getOperationResourceInfos()) {
@@ -214,11 +243,6 @@ public class ClassResourceInfo extends A
         return !subResources.isEmpty();
     }
     
-    public void addSubClassResourceInfo(ClassResourceInfo cri) {
-        subResources.putIfAbsent(new SubresourceKey(cri.getResourceClass(), 
-                                            cri.getServiceClass()),
-                                 cri);
-    }
     
     public boolean isCreatedFromModel() {
         return createdFromModel;
@@ -233,19 +257,27 @@ public class ClassResourceInfo extends A
     }
     
     public List<MediaType> getProduceMime() {
-        if (producesTypes != null) {
-            return JAXRSUtils.parseMediaTypes(producesTypes);
+        if (root || parent == null) {
+            if (producesTypes != null) {
+                return JAXRSUtils.parseMediaTypes(producesTypes);
+            }
+            return JAXRSUtils.getProduceTypes(
+                 AnnotationUtils.getClassAnnotation(getServiceClass(), Produces.class));
+        } else {
+            return parent.getProduceMime();
         }
-        return JAXRSUtils.getProduceTypes(
-             AnnotationUtils.getClassAnnotation(getServiceClass(), Produces.class));
     }
     
     public List<MediaType> getConsumeMime() {
-        if (consumesTypes != null) {
-            return JAXRSUtils.parseMediaTypes(consumesTypes);
+        if (root || parent == null) {
+            if (consumesTypes != null) {
+                return JAXRSUtils.parseMediaTypes(consumesTypes);
+            }
+            return JAXRSUtils.getConsumeTypes(
+                 AnnotationUtils.getClassAnnotation(getServiceClass(), Consumes.class));
+        } else {
+            return parent.getConsumeMime();
         }
-        return JAXRSUtils.getConsumeTypes(
-             AnnotationUtils.getClassAnnotation(getServiceClass(), Consumes.class));
     }
     
     public Path getPath() {
@@ -281,4 +313,8 @@ public class ClassResourceInfo extends A
     public boolean isSingleton() {
         return resourceProvider != null && resourceProvider.isSingleton();
     }
+
+    void setParent(ClassResourceInfo parent) {
+        this.parent = parent;
+    }
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java?rev=1389470&r1=1389469&r2=1389470&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java Mon Sep 24 16:15:58 2012
@@ -20,6 +20,7 @@
 package org.apache.cxf.jaxrs.model;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -102,7 +103,15 @@ public class OperationResourceInfo {
     }
     
     public List<String> getNameBindings() {
-        return nameBindings;
+        List<String> criNames = classResourceInfo.getNameBindings();
+        if (criNames.isEmpty()) {
+            return nameBindings;
+        } else {
+            List<String> all = new ArrayList<String>(criNames.size() + nameBindings.size());
+            all.addAll(criNames);
+            all.addAll(nameBindings);
+            return all;
+        }
     }
     
     private void checkOneway() {

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java?rev=1389470&r1=1389469&r2=1389470&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java Mon Sep 24 16:15:58 2012
@@ -19,7 +19,12 @@
 
 package org.apache.cxf.jaxrs.model;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 import java.lang.reflect.Field;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -31,12 +36,15 @@ import javax.servlet.http.HttpServletRes
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.HEAD;
+import javax.ws.rs.NameBinding;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.UriInfo;
 
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.utils.ResourceUtils;
 
 import org.junit.After;
@@ -48,7 +56,7 @@ public class ClassResourceInfoTest exten
     @Path("/bar")
     @Produces("test/bar")
     @Consumes("test/foo")
-    static class TestClass {
+    public static class TestClass {
         @Context UriInfo u;
         @Context HttpHeaders h;
         @Resource HttpServletRequest req;
@@ -74,6 +82,16 @@ public class ClassResourceInfoTest exten
         public void getIt() { 
             
         }
+      
+        @Path("/same")
+        public TestClass2 getThis() { 
+            return this;
+        }
+        
+        @Path("sub")
+        public TestClass3 getTestClass3() { 
+            return new TestClass3();
+        }
     }
     
     static class TestClass3 {
@@ -99,7 +117,7 @@ public class ClassResourceInfoTest exten
     
     @Test
     public void testGetHttpContexts() {
-        ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
+        ClassResourceInfo c = new ClassResourceInfo(TestClass.class, false);
         List<Field> fields = c.getContextFields();
         assertEquals("Only root classes should check these fields", 0, fields.size());
         
@@ -191,4 +209,43 @@ public class ClassResourceInfoTest exten
         assertEquals(2, methods.size());
         assertTrue(methods.contains("HEAD") && methods.contains("GET"));
     }
+    
+    @Test
+    public void testSubresourceInheritProduces() {
+        ClassResourceInfo c = ResourceUtils.createClassResourceInfo(
+                                  TestClass2.class, TestClass2.class, true, true);
+        assertEquals("test/bar", c.getProduceMime().get(0).toString());
+        ClassResourceInfo sub = c.getSubResource(TestClass2.class, TestClass3.class);
+        assertNotNull(sub);
+        assertEquals("test/bar", sub.getProduceMime().get(0).toString());
+        sub = c.getSubResource(TestClass2.class, TestClass2.class);
+        assertNotNull(sub);
+        assertEquals("test/bar", sub.getProduceMime().get(0).toString());
+    }
+    
+    @Test
+    public void testNameBindings() {
+        Application app = new TestApplication();
+        JAXRSServerFactoryBean bean = ResourceUtils.createApplication(app, true, true);
+        ClassResourceInfo cri = bean.getServiceFactory().getClassResourceInfo().get(0);
+        List<String> names = cri.getNameBindings();
+        assertEquals(Collections.singletonList(CustomNameBinding.class.getName()), names);
+    }
+    
+    @Target({ ElementType.TYPE, ElementType.METHOD })
+    @Retention(value = RetentionPolicy.RUNTIME)
+    @NameBinding
+    public @interface CustomNameBinding { 
+        
+    }
+    
+    @CustomNameBinding
+    public class TestApplication extends Application {
+        @Override
+        public Set<Class<?>> getClasses() {
+            Set<Class<?>> classes = new HashSet<Class<?>>();
+            classes.add(TestClass.class);
+            return classes;
+        }
+    }
 }