You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/07/01 21:27:32 UTC

camel git commit: CAMEL-8926: camel-spring - contextScan should allow to exclude non-singletons

Repository: camel
Updated Branches:
  refs/heads/master 614a4f43d -> c94530132


CAMEL-8926: camel-spring - contextScan should allow to exclude non-singletons


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

Branch: refs/heads/master
Commit: c945301320db78bcf139964031faf62ee6eb0aab
Parents: 614a4f4
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Jul 1 21:10:45 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Jul 1 21:10:45 2015 +0200

----------------------------------------------------------------------
 .../camel/model/ContextScanDefinition.java      | 24 ++++++++++++++++----
 .../blueprint/BlueprintContainerRegistry.java   | 11 +++++++++
 .../blueprint/CamelContextFactoryBean.java      |  4 ++--
 .../ContextScanRouteBuilderFinder.java          |  6 +++--
 .../xml/AbstractCamelContextFactoryBean.java    |  6 +++--
 .../camel/spring/CamelContextFactoryBean.java   |  4 ++--
 .../spring/ContextScanRouteBuilderFinder.java   |  6 +++--
 7 files changed, 47 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c9453013/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java
index 19d1a41..cffc3dc 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -32,6 +33,8 @@ import org.apache.camel.spi.Metadata;
 @XmlRootElement(name = "contextScan")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class ContextScanDefinition {
+    @XmlAttribute
+    private Boolean includeNonSingletons;
     @XmlElement(name = "excludes")
     private List<String> excludes = new ArrayList<String>();
     @XmlElement(name = "includes")
@@ -40,12 +43,21 @@ public class ContextScanDefinition {
     public ContextScanDefinition() {
     }
 
-    public List<String> getExcludes() {
-        return excludes;
+    public Boolean getIncludeNonSingletons() {
+        return includeNonSingletons;
     }
 
-    public List<String> getIncludes() {
-        return includes;
+    /**
+     * Whether to include non-singleton beans (prototypes)
+     * <p/>
+     * By default only singleton beans is included in the context scan
+     */
+    public void setIncludeNonSingletons(Boolean includeNonSingletons) {
+        this.includeNonSingletons = includeNonSingletons;
+    }
+
+    public List<String> getExcludes() {
+        return excludes;
     }
 
     /**
@@ -55,6 +67,10 @@ public class ContextScanDefinition {
         this.excludes = excludes;
     }
 
+    public List<String> getIncludes() {
+        return includes;
+    }
+
     /**
      * Include finding route builder from these java package names.
      */

http://git-wip-us.apache.org/repos/asf/camel/blob/c9453013/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java
----------------------------------------------------------------------
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java
index 26900a1..84f9c93 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java
@@ -97,6 +97,10 @@ public class BlueprintContainerRegistry implements Registry {
     }
 
     public static <T> Map<String, T> lookupByType(BlueprintContainer blueprintContainer, Class<T> type) {
+        return lookupByType(blueprintContainer, type, true);
+    }
+
+    public static <T> Map<String, T> lookupByType(BlueprintContainer blueprintContainer, Class<T> type, boolean includeNonSingletons) {
         Bundle bundle = (Bundle) blueprintContainer.getComponentInstance("blueprintBundle");
         Map<String, T> objects = new LinkedHashMap<String, T>();
         Set<String> ids = blueprintContainer.getComponentIds();
@@ -106,6 +110,13 @@ public class BlueprintContainerRegistry implements Registry {
                 Class<?> cl = null;
                 if (metadata instanceof BeanMetadata) {
                     BeanMetadata beanMetadata = (BeanMetadata)metadata;
+                    // should we skip the bean if its prototype and we are only looking for singletons?
+                    if (!includeNonSingletons) {
+                        String scope = beanMetadata.getScope();
+                        if (BeanMetadata.SCOPE_PROTOTYPE.equals(scope)) {
+                            continue;
+                        }
+                    }
                     cl = bundle.loadClass(beanMetadata.getClassName());
                 } else if (metadata instanceof ReferenceMetadata) {
                     ReferenceMetadata referenceMetadata = (ReferenceMetadata)metadata;

http://git-wip-us.apache.org/repos/asf/camel/blob/c9453013/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
index b8500cd..2ae5729 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
@@ -289,8 +289,8 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Blu
     }
 
     @Override
-    protected void findRouteBuildersByContextScan(PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception {
-        ContextScanRouteBuilderFinder finder = new ContextScanRouteBuilderFinder(getContext(), filter);
+    protected void findRouteBuildersByContextScan(PackageScanFilter filter, boolean includeNonSingletons, List<RoutesBuilder> builders) throws Exception {
+        ContextScanRouteBuilderFinder finder = new ContextScanRouteBuilderFinder(getContext(), filter, includeNonSingletons);
         finder.appendBuilders(builders);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/c9453013/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/ContextScanRouteBuilderFinder.java
----------------------------------------------------------------------
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/ContextScanRouteBuilderFinder.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/ContextScanRouteBuilderFinder.java
index a2ed6ce..f4a938d 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/ContextScanRouteBuilderFinder.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/ContextScanRouteBuilderFinder.java
@@ -36,17 +36,19 @@ public class ContextScanRouteBuilderFinder {
     private static final Logger LOG = LoggerFactory.getLogger(ContextScanRouteBuilderFinder.class);
     private final BlueprintContainer blueprintContainer;
     private final PackageScanFilter filter;
+    private final boolean includeNonSingletons;
 
-    public ContextScanRouteBuilderFinder(BlueprintCamelContext camelContext, PackageScanFilter filter) {
+    public ContextScanRouteBuilderFinder(BlueprintCamelContext camelContext, PackageScanFilter filter, boolean includeNonSingletons) {
         this.blueprintContainer = camelContext.getBlueprintContainer();
         this.filter = filter;
+        this.includeNonSingletons = includeNonSingletons;
     }
 
     /**
      * Appends all the {@link org.apache.camel.builder.RouteBuilder} instances that can be found in the context
      */
     public void appendBuilders(List<RoutesBuilder> list) {
-        Map<String, RoutesBuilder> beans = BlueprintContainerRegistry.lookupByType(blueprintContainer, RoutesBuilder.class);
+        Map<String, RoutesBuilder> beans = BlueprintContainerRegistry.lookupByType(blueprintContainer, RoutesBuilder.class, includeNonSingletons);
 
         for (Entry<String, RoutesBuilder> entry : beans.entrySet()) {
             String key = entry.getKey();

http://git-wip-us.apache.org/repos/asf/camel/blob/c9453013/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index cc77527..4caefee 100644
--- a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -897,13 +897,15 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
                 exclude = getContext().resolvePropertyPlaceholders(exclude);
                 filter.addExcludePattern(exclude);
             }
-            findRouteBuildersByContextScan(filter, builders);
+            // lets be false by default, to skip prototype beans
+            boolean includeNonSingletons = contextScanDef.getIncludeNonSingletons() != null ? contextScanDef.getIncludeNonSingletons() : false;
+            findRouteBuildersByContextScan(filter, includeNonSingletons, builders);
         }
     }
 
     protected abstract void findRouteBuildersByPackageScan(String[] packages, PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception;
 
-    protected abstract void findRouteBuildersByContextScan(PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception;
+    protected abstract void findRouteBuildersByContextScan(PackageScanFilter filter, boolean includeNonSingletons, List<RoutesBuilder> builders) throws Exception;
 
     private void addPackageElementContentsToScanDefinition() {
         PackageScanDefinition packageScanDef = getPackageScan();

http://git-wip-us.apache.org/repos/asf/camel/blob/c9453013/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
index 1c02e5f..1725227 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
@@ -228,8 +228,8 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
     }
 
     @Override
-    protected void findRouteBuildersByContextScan(PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception {
-        ContextScanRouteBuilderFinder finder = new ContextScanRouteBuilderFinder(getContext(), filter);
+    protected void findRouteBuildersByContextScan(PackageScanFilter filter, boolean includeNonSingletons, List<RoutesBuilder> builders) throws Exception {
+        ContextScanRouteBuilderFinder finder = new ContextScanRouteBuilderFinder(getContext(), filter, includeNonSingletons);
         finder.appendBuilders(builders);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/c9453013/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java b/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java
index aa2a098..cf60c17 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java
@@ -36,17 +36,19 @@ public class ContextScanRouteBuilderFinder {
     private static final Logger LOG = LoggerFactory.getLogger(ContextScanRouteBuilderFinder.class);
     private final ApplicationContext applicationContext;
     private final PackageScanFilter filter;
+    private final boolean includeNonSingletons;
 
-    public ContextScanRouteBuilderFinder(SpringCamelContext camelContext, PackageScanFilter filter) {
+    public ContextScanRouteBuilderFinder(SpringCamelContext camelContext, PackageScanFilter filter, boolean includeNonSingletons) {
         this.applicationContext = camelContext.getApplicationContext();
         this.filter = filter;
+        this.includeNonSingletons = includeNonSingletons;
     }
 
     /**
      * Appends all the {@link org.apache.camel.builder.RouteBuilder} instances that can be found in the context
      */
     public void appendBuilders(List<RoutesBuilder> list) {
-        Map<String, RoutesBuilder> beans = applicationContext.getBeansOfType(RoutesBuilder.class, true, true);
+        Map<String, RoutesBuilder> beans = applicationContext.getBeansOfType(RoutesBuilder.class, includeNonSingletons, true);
 
         for (Entry<String, RoutesBuilder> entry : beans.entrySet()) {
             Object bean = entry.getValue();