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 2017/04/21 11:52:04 UTC

cxf git commit: [CXF-7001] Updating AbstractSpringComponentScanner to discover JAXRS Applications, modified patch from Dennis Kieselhorst applied, This closes #264

Repository: cxf
Updated Branches:
  refs/heads/master 40cb28fbc -> 5afec44d7


[CXF-7001] Updating AbstractSpringComponentScanner to discover JAXRS Applications, modified patch from Dennis Kieselhorst applied, This closes #264


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

Branch: refs/heads/master
Commit: 5afec44d741580762fb5d6f4f4fac7d34446ae95
Parents: 40cb28f
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Fri Apr 21 12:51:47 2017 +0100
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Fri Apr 21 12:51:47 2017 +0100

----------------------------------------------------------------------
 .../AbstractSpringComponentScanServer.java      | 133 +++++++++++++------
 .../AbstractSpringConfigurationFactory.java     |   7 +-
 2 files changed, 100 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/5afec44d/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
index d5a11dc..65c665b 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
@@ -28,7 +28,9 @@ import java.util.Map;
 import java.util.Set;
 import java.util.logging.Logger;
 
+import javax.ws.rs.ApplicationPath;
 import javax.ws.rs.Path;
+import javax.ws.rs.core.Application;
 import javax.ws.rs.ext.Provider;
 
 import org.apache.cxf.annotations.Provider.Scope;
@@ -37,10 +39,13 @@ import org.apache.cxf.common.util.ClassHelper;
 import org.apache.cxf.common.util.ClasspathScanner;
 import org.apache.cxf.common.util.PackageUtils;
 import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.feature.Feature;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.utils.ResourceUtils;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.service.factory.ServiceConstructionException;
 import org.springframework.beans.factory.annotation.Value;
@@ -49,7 +54,8 @@ import org.springframework.context.annotation.FilterType;
 
 @ComponentScan(
     includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,
-                                           value = {Path.class,
+                                           value = {ApplicationPath.class,
+                                                    Path.class,
                                                     Provider.class,
                                                     org.apache.cxf.annotations.Provider.class})
 )
@@ -76,27 +82,72 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
     protected AbstractSpringComponentScanServer(Class<? extends Annotation> serviceAnnotation) {
         this.serviceAnnotation = serviceAnnotation;
     }
+    @Override
+    protected Server createJaxRsServer() {
+            
+        JAXRSServerFactoryBean factoryBean = null;
+        
+        String[] beanNames = applicationContext.getBeanNamesForAnnotation(ApplicationPath.class);
+
+        if (beanNames.length > 0) {
+            Set<String> componentScanPackagesSet = parseSetProperty(componentScanPackages);
+            Set<String> componentScanBeansSet = parseSetProperty(componentScanBeans);
+            
+            for (String beanName : beanNames) {
+                if (isComponentMatched(beanName, componentScanPackagesSet, componentScanBeansSet)) {
+                    Application app = applicationContext.getBean(beanName, Application.class);
+                    factoryBean = createFactoryBeanFromApplication(app);
+                    for (String cxfBeanName : applicationContext.getBeanNamesForAnnotation(
+                                                  org.apache.cxf.annotations.Provider.class)) {
+                        if (isComponentMatched(cxfBeanName, componentScanPackagesSet, componentScanBeansSet)) {
+                            addCxfProvider(getProviderBean(cxfBeanName));
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+            
+        if (!StringUtils.isEmpty(classesScanPackages)) {
+            try {
+                final Map< Class< ? extends Annotation >, Collection< Class< ? > > > appClasses =
+                    ClasspathScanner.findClasses(classesScanPackages, ApplicationPath.class);
+                
+                List<Application> apps = CastUtils.cast(JAXRSServerFactoryBeanDefinitionParser
+                    .createBeansFromDiscoveredClasses(super.applicationContext, 
+                                                      appClasses.get(ApplicationPath.class), null));
+                if (apps.size() > 0) {
+                    factoryBean = createFactoryBeanFromApplication(apps.get(0));
+                    final Map< Class< ? extends Annotation >, Collection< Class< ? > > > cxfClasses =
+                        ClasspathScanner.findClasses(classesScanPackages, org.apache.cxf.annotations.Provider.class);
+                    addCxfProvidersFromClasses(cxfClasses.get(org.apache.cxf.annotations.Provider.class));
+                }
+                
+            } catch (Exception ex) {
+                throw new ServiceConstructionException(ex);
+            }
+        }
+            
+        if (factoryBean != null) {
+            setFactoryCxfProviders(factoryBean);
+            return factoryBean.create();
+        }
+        
+        return super.createJaxRsServer();
+    }
+    
     protected void setJaxrsResources(JAXRSServerFactoryBean factory) {
-        boolean checkJaxrsRoots = checkJaxrsRoots();
-        boolean checkJaxrsProviders = checkJaxrsProviders();
-        boolean checkCxfProviders = checkCxfProviders();
-
-        Set<String> componentScanPackagesSet = !StringUtils.isEmpty(componentScanPackages) 
-            ? ClasspathScanner.parsePackages(componentScanPackages) : null;
-        Set<String> componentScanBeansSet = !StringUtils.isEmpty(componentScanBeans) 
-                ? ClasspathScanner.parsePackages(componentScanBeans) : null;    
+        Set<String> componentScanPackagesSet = parseSetProperty(componentScanPackages);
+        Set<String> componentScanBeansSet = parseSetProperty(componentScanBeans);
             
         for (String beanName : applicationContext.getBeanDefinitionNames()) {
-            if (checkJaxrsRoots 
-                && isValidComponent(beanName, Path.class, componentScanPackagesSet, componentScanBeansSet)) {
+            if (isValidComponent(beanName, Path.class, componentScanPackagesSet, componentScanBeansSet)) {
                 SpringResourceFactory resourceFactory = new SpringResourceFactory(beanName);
                 resourceFactory.setApplicationContext(applicationContext);
                 resourceProviders.add(resourceFactory);
-            } else if (checkJaxrsProviders 
-                && isValidComponent(beanName, Provider.class, componentScanPackagesSet, componentScanBeansSet)) {
+            } else if (isValidComponent(beanName, Provider.class, componentScanPackagesSet, componentScanBeansSet)) {
                 jaxrsProviders.add(getProviderBean(beanName));
-            } else if (checkCxfProviders 
-                && isValidComponent(beanName, org.apache.cxf.annotations.Provider.class, 
+            } else if (isValidComponent(beanName, org.apache.cxf.annotations.Provider.class, 
                                     componentScanPackagesSet, componentScanBeansSet)) {
                 addCxfProvider(getProviderBean(beanName));
             }
@@ -109,16 +160,9 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
                                                  org.apache.cxf.annotations.Provider.class);
 
                 jaxrsProviders.addAll(JAXRSServerFactoryBeanDefinitionParser
-                    .createBeansFromDiscoveredClasses(super.applicationContext, classes.get(Provider.class), null));
+                    .createBeansFromDiscoveredClasses(applicationContext, classes.get(Provider.class), null));
                 warnIfDuplicatesAvailable(jaxrsProviders);
-                List<Object> cxfProviders = JAXRSServerFactoryBeanDefinitionParser
-                    .createBeansFromDiscoveredClasses(super.applicationContext,
-                                                      classes.get(org.apache.cxf.annotations.Provider.class),
-                                                      null);
-                for (Object cxfProvider : cxfProviders) {
-                    addCxfProvider(cxfProvider);
-                }
-                warnIfDuplicatesAvailable(cxfFeatures);
+                addCxfProvidersFromClasses(classes.get(org.apache.cxf.annotations.Provider.class));
             } catch (Exception ex) {
                 throw new ServiceConstructionException(ex);
             }
@@ -126,19 +170,35 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
 
         factory.setResourceProviders(getResourceProviders());
         factory.setProviders(getJaxrsProviders());
+        setFactoryCxfProviders(factory);
+
+    }
+
+    protected void setFactoryCxfProviders(JAXRSServerFactoryBean factory) {
         factory.setFeatures(getFeatures());
         factory.setInInterceptors(getInInterceptors());
         factory.setOutInterceptors(getOutInterceptors());
-
     }
-
+    protected void addCxfProvidersFromClasses(Collection<Class<?>> classes) {
+        List<Object> cxfProviders = JAXRSServerFactoryBeanDefinitionParser
+            .createBeansFromDiscoveredClasses(applicationContext, classes, null);
+        for (Object cxfProvider : cxfProviders) {
+            addCxfProvider(cxfProvider);
+        }
+        warnIfDuplicatesAvailable(cxfFeatures);    
+    }
     protected boolean isValidComponent(String beanName, 
                                       Class<? extends Annotation> ann,
                                       Set<String> componentScanPackagesSet,
                                       Set<String> componentScanBeansSet) {
         return isAnnotationAvailable(beanName, ann)
             && nonProxyClass(beanName)
-            && matchesServiceAnnotation(beanName)
+            && isComponentMatched(beanName, componentScanPackagesSet, componentScanBeansSet);
+    }
+    protected boolean isComponentMatched(String beanName, 
+                                         Set<String> componentScanPackagesSet,
+                                         Set<String> componentScanBeansSet) {
+        return matchesServiceAnnotation(beanName)
             && matchesComponentPackage(beanName, componentScanPackagesSet)
             && matchesComponentName(beanName, componentScanBeansSet);
     }
@@ -201,18 +261,6 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
         return applicationContext.findAnnotationOnBean(beanName, annClass) != null;
     }
 
-    protected boolean checkCxfProviders() {
-        return true;
-    }
-
-    protected boolean checkJaxrsProviders() {
-        return true;
-    }
-
-    protected boolean checkJaxrsRoots() {
-        return true;
-    }
-
     protected List<ResourceProvider> getResourceProviders() {
         return resourceProviders;
     }
@@ -232,4 +280,11 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
         return cxfOutInterceptors;
     }
 
+    protected JAXRSServerFactoryBean createFactoryBeanFromApplication(Application app) {
+        return ResourceUtils.createApplication(app, false, true, false, getBus());
+    }
+    protected static Set<String> parseSetProperty(String componentScanProp) {
+        return !StringUtils.isEmpty(componentScanProp) 
+            ? ClasspathScanner.parsePackages(componentScanProp) : null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/5afec44d/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
index 2c675d4..1ba53ef 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
@@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.spring;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.cxf.Bus;
 import org.apache.cxf.bus.spring.SpringBus;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.endpoint.Server;
@@ -44,7 +45,7 @@ public abstract class AbstractSpringConfigurationFactory
         JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
         factory.setAddress(getAddress());
         factory.setTransportId(getTransportId());
-        factory.setBus(applicationContext.getBean(SpringBus.class));
+        factory.setBus(getBus());
 
         setJaxrsResources(factory);
 
@@ -55,6 +56,10 @@ public abstract class AbstractSpringConfigurationFactory
         finalizeFactorySetup(factory);
         return factory.create();
     }
+    
+    protected Bus getBus() {
+        return applicationContext.getBean(SpringBus.class);
+    }
 
     @Override
     public void setApplicationContext(ApplicationContext ac) throws BeansException {