This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch route-collector
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 12b90dca63edf48de9f7a94569b889eb814e5ee5
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Thu Oct 17 21:08:49 2019 +0200

    CAMEL-14050: camel-main - Add logic for automatic RouteBuilder class 
detection ala camel-spring-boot has
---
 .../org/apache/camel/main/BaseMainSupport.java     | 14 +++++++++++++
 .../camel/main/MainConfigurationProperties.java    | 24 ++++++++++++++++++++++
 .../camel-main-configuration-metadata.json         |  6 ++++++
 .../main/MainRoutesCollectorPackageScanTest.java   | 10 +--------
 4 files changed, 45 insertions(+), 9 deletions(-)

diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java 
b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index c3816a5..ee06fdd 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -28,6 +28,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Properties;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -423,6 +424,19 @@ public abstract class BaseMainSupport extends 
ServiceSupport {
                 }
             }
         }
+
+        if (mainConfigurationProperties.getPackageScanRouteBuilders() != null) 
{
+            String[] pkgs = 
mainConfigurationProperties.getPackageScanRouteBuilders().split(",");
+            Set<Class<?>> set = 
camelContext.getExtension(ExtendedCamelContext.class).getPackageScanClassResolver().findImplementations(RoutesBuilder.class,
 pkgs);
+            for (Class<?> routeClazz : set) {
+                Object builder = 
camelContext.getInjector().newInstance(routeClazz);
+                if (builder instanceof RouteBuilder) {
+                    getRoutesBuilders().add((RouteBuilder) builder);
+                } else {
+                    LOG.warn("Class {} is not a RouteBuilder class", 
routeClazz);
+                }
+            }
+        }
     }
 
     protected void loadConfigurations(CamelContext camelContext) throws 
Exception {
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
index ffdca5d..28ab76d 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
@@ -30,6 +30,7 @@ public class MainConfigurationProperties extends 
DefaultConfigurationProperties<
     private boolean autowireComponentPropertiesAllowPrivateSetter = true;
     private int durationHitExitCode;
     private boolean hangupInterceptorEnabled = true;
+    private String packageScanRouteBuilders;
 
     // extended configuration
     private final HystrixConfigurationProperties 
hystrixConfigurationProperties = new HystrixConfigurationProperties(this);
@@ -178,6 +179,19 @@ public class MainConfigurationProperties extends 
DefaultConfigurationProperties<
         this.hangupInterceptorEnabled = hangupInterceptorEnabled;
     }
 
+    public String getPackageScanRouteBuilders() {
+        return packageScanRouteBuilders;
+    }
+
+    /**
+     * Sets package names for scanning for {@link 
org.apache.camel.builder.RouteBuilder} classes as candidates to be included.
+     * If you are using Spring Boot then its instead recommended to use Spring 
Boots component scanning and annotate your route builder
+     * classes with `@Component`. In other words only use this for Camel Main 
in standalone mode.
+     */
+    public void setPackageScanRouteBuilders(String packageScanRouteBuilders) {
+        this.packageScanRouteBuilders = packageScanRouteBuilders;
+    }
+
     public int getDurationHitExitCode() {
         return durationHitExitCode;
     }
@@ -301,4 +315,14 @@ public class MainConfigurationProperties extends 
DefaultConfigurationProperties<
         return this;
     }
 
+    /**
+     * Sets package names for scanning for {@link 
org.apache.camel.builder.RouteBuilder} classes as candidates to be included.
+     * If you are using Spring Boot then its instead recommended to use Spring 
Boots component scanning and annotate your route builder
+     * classes with `@Component`. In other words only use this for Camel Main 
in standalone mode.
+     */
+    public MainConfigurationProperties withPackageScanRouteBuilders(String 
packageScanRouteBuilders) {
+        this.packageScanRouteBuilders = packageScanRouteBuilders;
+        return this;
+    }
+
 }
diff --git 
a/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json
 
b/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json
index 67616b3..bd3d045 100644
--- 
a/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json
+++ 
b/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json
@@ -230,6 +230,12 @@
                        "description":"Sets the name of the CamelContext."
                },
                {
+                       "name":"camel.main.package-scan-route-builders",
+                       "type":"java.lang.String",
+                       
"sourceType":"org.apache.camel.main.MainConfigurationProperties",
+                       "description":"Sets package names for scanning for 
org.apache.camel.builder.RouteBuilder classes as candidates to be included. If 
you are using Spring Boot then its instead recommended to use Spring Boots 
component scanning and annotate your route builder classes with Component. In 
other words only use this for Camel Main in standalone mode."
+               },
+               {
                        "name":"camel.main.producer-template-cache-size",
                        "type":"int",
                        
"sourceType":"org.apache.camel.main.DefaultConfigurationProperties",
diff --git 
a/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java
 
b/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java
index 208a5e5..06a4b1d 100644
--- 
a/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java
+++ 
b/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java
@@ -16,13 +16,8 @@
  */
 package org.apache.camel.main;
 
-import java.util.Set;
-
 import org.apache.camel.CamelContext;
-import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.impl.engine.DefaultPackageScanClassResolver;
-import org.apache.camel.spi.PackageScanClassResolver;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -31,10 +26,7 @@ public class MainRoutesCollectorPackageScanTest extends 
Assert {
     @Test
     public void testMainRoutesCollector() throws Exception {
         Main main = new Main();
-
-        PackageScanClassResolver resolver = new 
DefaultPackageScanClassResolver();
-        Set<Class<?>> set = resolver.findImplementations(RouteBuilder.class, 
"org.apache.camel.main.scan");
-        set.forEach(main::addRouteBuilder);
+        
main.configure().withPackageScanRouteBuilders("org.apache.camel.main.scan");
         main.start();
 
         CamelContext camelContext = main.getCamelContext();

Reply via email to