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 2014/12/03 13:18:16 UTC

cxf git commit: [CXF-6121] Extending JAX-RS Spring parser to support an annotation based filtering of the resources, modified patch from Thorsten Hoeger applied

Repository: cxf
Updated Branches:
  refs/heads/master 6233ee16b -> 50f5cd8c3


[CXF-6121] Extending JAX-RS Spring parser to support an annotation based filtering of the resources, modified patch from Thorsten Hoeger applied


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/50f5cd8c
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/50f5cd8c
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/50f5cd8c

Branch: refs/heads/master
Commit: 50f5cd8c3b7c6d174f59ee111646f2625b890a00
Parents: 6233ee1
Author: Sergey Beryozkin <sb...@talend.com>
Authored: Wed Dec 3 12:17:57 2014 +0000
Committer: Sergey Beryozkin <sb...@talend.com>
Committed: Wed Dec 3 12:17:57 2014 +0000

----------------------------------------------------------------------
 .../JAXRSServerFactoryBeanDefinitionParser.java | 60 ++++++++++++++++----
 .../jaxrs/src/main/resources/schemas/jaxrs.xsd  |  1 +
 2 files changed, 50 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/50f5cd8c/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
index 7f15346..e6f33ce 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -32,6 +33,7 @@ import javax.xml.namespace.QName;
 import org.w3c.dom.Element;
 
 import org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor;
+import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.util.ClasspathScanner;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.configuration.spring.AbstractBeanDefinitionParser;
@@ -78,6 +80,8 @@ public class JAXRSServerFactoryBeanDefinitionParser extends AbstractBeanDefiniti
             bean.addPropertyValue(name, q);
         } else if ("basePackages".equals(name)) {            
             bean.addPropertyValue("basePackages", ClasspathScanner.parsePackages(val));
+        } else if ("serviceAnnotation".equals(name)) {
+            bean.addPropertyValue("serviceAnnotation", val);
         } else {
             mapToProperty(bean, name, val);
         }
@@ -151,6 +155,7 @@ public class JAXRSServerFactoryBeanDefinitionParser extends AbstractBeanDefiniti
         
         private List<SpringResourceFactory> tempFactories;
         private List<String> basePackages;
+        private String serviceAnnotation;
         private ApplicationContext context;
         public SpringJAXRSServerFactoryBean() {
             super();
@@ -171,6 +176,10 @@ public class JAXRSServerFactoryBeanDefinitionParser extends AbstractBeanDefiniti
             this.basePackages = basePackages;
         }
         
+        public void setServiceAnnotation(String serviceAnnotation) {
+            this.serviceAnnotation = serviceAnnotation;
+        }
+        
         public void setTempResourceProviders(List<SpringResourceFactory> providers) {
             tempFactories = providers;
         }
@@ -189,29 +198,58 @@ public class JAXRSServerFactoryBeanDefinitionParser extends AbstractBeanDefiniti
                 tempFactories.clear();
                 super.setResourceProviders(factories);
             }
-            
-            try {
-                if (basePackages != null) {
+            Class<? extends Annotation> serviceAnnotationClass = loadServiceAnnotationClass();
+            if (basePackages != null) {
+                try {
                     final Map< Class< ? extends Annotation >, Collection< Class< ? > > > classes =
                         ClasspathScanner.findClasses(basePackages, Provider.class, Path.class);
                                               
-                    this.setProviders(createBeans(classes.get(Provider.class)));
-                    this.setServiceBeans(createBeans(classes.get(Path.class)));
+                    this.setServiceBeans(createBeansFromDiscoveredClasses(classes.get(Path.class),
+                                                                          serviceAnnotationClass));
+                    this.setProviders(createBeansFromDiscoveredClasses(classes.get(Provider.class),
+                                                                       serviceAnnotationClass));
+                } catch (IOException ex) {
+                    throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
+                } catch (ClassNotFoundException ex) {
+                    throw new BeanCreationException("Failed to create bean from classfile", ex);
+                }
+            } else if (serviceAnnotationClass != null) {
+                List<Object> services = new LinkedList<Object>();
+                List<Object> providers = new LinkedList<Object>();
+                for (Object obj : ctx.getBeansWithAnnotation(serviceAnnotationClass).values()) {
+                    Class<?> cls = obj.getClass();
+                    if (cls.getAnnotation(Path.class) != null) {
+                        services.add(obj);
+                    } else if (cls.getAnnotation(Provider.class) != null) {
+                        providers.add(obj);
+                    } 
                 }
-            } catch (IOException ex) {
-                throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
-            } catch (ClassNotFoundException ex) {
-                throw new BeanCreationException("Failed to create bean from classfile", ex);
+                this.setServiceBeans(services);
+                this.setProviders(providers);
             }
-            
             if (bus == null) {
                 setBus(BusWiringBeanFactoryPostProcessor.addDefaultBus(ctx));
             }
         }        
-        private List<Object> createBeans(Collection<Class<?>> classes) {
+        @SuppressWarnings("unchecked")
+        private Class<? extends Annotation> loadServiceAnnotationClass() {
+            if (serviceAnnotation != null) {
+                try {
+                    return (Class<? extends Annotation>)ClassLoaderUtils.loadClass(serviceAnnotation, this.getClass());
+                } catch (Exception ex) {
+                    throw new RuntimeException(ex);
+                }
+            } 
+            return null;
+        }
+        private List<Object> createBeansFromDiscoveredClasses(Collection<Class<?>> classes, 
+                                                              Class<? extends Annotation> serviceClassAnnotation) {
             AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
             final List< Object > providers = new ArrayList< Object >();
             for (final Class< ? > clazz: classes) {
+                if (serviceClassAnnotation != null && clazz.getAnnotation(serviceClassAnnotation) == null) {
+                    continue;
+                }
                 Object bean = null;
                 try {
                     bean = beanFactory.createBean(clazz, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);

http://git-wip-us.apache.org/repos/asf/cxf/blob/50f5cd8c/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs.xsd
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs.xsd b/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs.xsd
index 932dbe9..ef408ad 100644
--- a/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs.xsd
+++ b/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs.xsd
@@ -69,6 +69,7 @@
           <xsd:attribute name="docLocation" type="xsd:string"/>
           <xsd:attribute name="publishedEndpointUrl" type="xsd:string"/>
           <xsd:attribute name="basePackages" type="xsd:string"/>
+          <xsd:attribute name="serviceAnnotation" type="xsd:string"/>
         </xsd:extension>
       </xsd:complexContent>
     </xsd:complexType>