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/03/21 16:03:07 UTC

cxf git commit: [CXF-7290] Adding cxf.jaxrs.component-scan-packages and cxf.jaxrs.component-scan-beans properties

Repository: cxf
Updated Branches:
  refs/heads/master 1a7411c27 -> 3833280c6


[CXF-7290] Adding cxf.jaxrs.component-scan-packages and cxf.jaxrs.component-scan-beans properties


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

Branch: refs/heads/master
Commit: 3833280c67c489a7e83b8540361df4154f4aeccf
Parents: 1a7411c
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Tue Mar 21 16:02:48 2017 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Tue Mar 21 16:02:48 2017 +0000

----------------------------------------------------------------------
 .../AbstractSpringComponentScanServer.java      | 42 +++++++++++++++++---
 1 file changed, 36 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/3833280c/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 04b338e..9225ad9 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
@@ -33,6 +33,7 @@ import javax.ws.rs.ext.Provider;
 import org.apache.cxf.annotations.Provider.Scope;
 import org.apache.cxf.common.logging.LogUtils;
 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.feature.Feature;
 import org.apache.cxf.interceptor.Interceptor;
@@ -55,6 +56,10 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
     private static final Logger LOG = LogUtils.getL7dLogger(AbstractSpringComponentScanServer.class);
     @Value("${cxf.jaxrs.classes-scan-packages:}")
     private String classesScanPackages;
+    @Value("${cxf.jaxrs.component-scan-packages:}")
+    private String componentScanPackages;
+    @Value("${cxf.jaxrs.component-scan-beans:}")
+    private String componentScanBeans;
 
     private List<ResourceProvider> resourceProviders = new LinkedList<ResourceProvider>();
     private List<Object> jaxrsProviders = new LinkedList<Object>();
@@ -74,17 +79,23 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
         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;    
+            
         for (String beanName : applicationContext.getBeanDefinitionNames()) {
-            if (checkJaxrsRoots && isAnnotationAvailable(beanName, Path.class)
-                && matchesServiceAnnotation(beanName)) {
+            if (checkJaxrsRoots 
+                && isValidComponent(beanName, Path.class, componentScanPackagesSet, componentScanBeansSet)) {
                 SpringResourceFactory resourceFactory = new SpringResourceFactory(beanName);
                 resourceFactory.setApplicationContext(applicationContext);
                 resourceProviders.add(resourceFactory);
-            } else if (checkJaxrsProviders && isAnnotationAvailable(beanName, Provider.class)
-                && matchesServiceAnnotation(beanName)) {
+            } else if (checkJaxrsProviders 
+                && isValidComponent(beanName, Provider.class, componentScanPackagesSet, componentScanBeansSet)) {
                 jaxrsProviders.add(getProviderBean(beanName));
-            } else if (checkCxfProviders && isAnnotationAvailable(beanName,
-                org.apache.cxf.annotations.Provider.class) && matchesServiceAnnotation(beanName)) {
+            } else if (checkCxfProviders 
+                && isValidComponent(beanName, org.apache.cxf.annotations.Provider.class, 
+                                    componentScanPackagesSet, componentScanBeansSet)) {
                 addCxfProvider(getProviderBean(beanName));
             }
         }
@@ -119,6 +130,25 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
 
     }
 
+    protected boolean isValidComponent(String beanName, 
+                                      Class<? extends Annotation> ann,
+                                      Set<String> componentScanPackagesSet,
+                                      Set<String> componentScanBeansSet) {
+        return isAnnotationAvailable(beanName, ann)
+            && matchesServiceAnnotation(beanName)
+            && matchesComponentPackage(beanName, componentScanPackagesSet)
+            && matchesComponentName(beanName, componentScanBeansSet);
+    }
+    protected boolean matchesComponentName(String beanName, Set<String> componentScanBeansSet) {
+        return componentScanBeansSet == null || componentScanBeansSet.contains(beanName);
+    }
+    protected boolean matchesComponentPackage(String beanName, Set<String> componentScanPackagesSet) {
+        return componentScanPackagesSet == null 
+            || !applicationContext.isSingleton(beanName)
+            || componentScanPackagesSet.contains(
+                PackageUtils.getPackageName(applicationContext.getBean(beanName).getClass()));
+        
+    }
     private static void warnIfDuplicatesAvailable(List<? extends Object> providers) {
         Set<String> classNames = new HashSet<>();
         for (Object o : providers) {