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 2019/10/17 19:09:26 UTC

[camel] 05/09: CAMEL-14050: camel-main - Add logic for automatic RouteBuilder class detection ala camel-spring-boot has

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 80dc28aea98279569536b534de58559643849e7f
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Oct 17 18:54:59 2019 +0200

    CAMEL-14050: camel-main - Add logic for automatic RouteBuilder class detection ala camel-spring-boot has
---
 .../spring/boot/SpringBootRoutesCollector.java     |  6 +--
 .../org/apache/camel/main/BaseMainSupport.java     | 21 +++++---
 ...sCollector.java => DefaultRoutesCollector.java} | 57 ++++++++++++++++++++--
 .../org/apache/camel/main/RoutesConfigurer.java    | 34 ++++++++++---
 4 files changed, 98 insertions(+), 20 deletions(-)

diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringBootRoutesCollector.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringBootRoutesCollector.java
index e2a30a1..d6b446f 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringBootRoutesCollector.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringBootRoutesCollector.java
@@ -21,10 +21,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.RoutesBuilder;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.main.BaseRoutesCollector;
-import org.apache.camel.main.DefaultConfigurationProperties;
+import org.apache.camel.main.DefaultRoutesCollector;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
@@ -34,7 +32,7 @@ import org.springframework.core.io.Resource;
 /**
  * Spring Boot {@link org.apache.camel.main.RoutesCollector}.
  */
-public class SpringBootRoutesCollector extends BaseRoutesCollector {
+public class SpringBootRoutesCollector extends DefaultRoutesCollector {
 
     private final ApplicationContext applicationContext;
 
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 ad8caf5..c3816a5 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
@@ -51,7 +51,6 @@ import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.support.LifecycleStrategySupport;
-import org.apache.camel.support.OrderedComparator;
 import org.apache.camel.support.PropertyBindingSupport;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
@@ -81,6 +80,7 @@ public abstract class BaseMainSupport extends ServiceSupport {
 
     protected final List<MainListener> listeners = new ArrayList<>();
     protected final MainConfigurationProperties mainConfigurationProperties = new MainConfigurationProperties();
+    protected RoutesCollector routesCollector = new DefaultRoutesCollector();
     protected List<RoutesBuilder> routeBuilders = new ArrayList<>();
     protected String routeBuilderClasses;
     protected List<Object> configurations = new ArrayList<>();
@@ -210,6 +210,17 @@ public abstract class BaseMainSupport extends ServiceSupport {
         configurations.add(configuration);
     }
 
+    public RoutesCollector getRoutesCollector() {
+        return routesCollector;
+    }
+
+    /**
+     * To use a custom {@link RoutesCollector}.
+     */
+    public void setRoutesCollector(RoutesCollector routesCollector) {
+        this.routesCollector = routesCollector;
+    }
+
     public String getRouteBuilderClasses() {
         return routeBuilderClasses;
     }
@@ -519,11 +530,9 @@ public abstract class BaseMainSupport extends ServiceSupport {
 
         // try to load the route builders
         loadRouteBuilders(camelContext);
-        // sort routes according to ordered
-        routeBuilders.sort(OrderedComparator.get());
-        for (RoutesBuilder routeBuilder : routeBuilders) {
-            camelContext.addRoutes(routeBuilder);
-        }
+        // then configure and add the routes
+        RoutesConfigurer configurer = new RoutesConfigurer(routesCollector, routeBuilders);
+        configurer.configureRoutes(camelContext, mainConfigurationProperties);
         // register lifecycle so we are notified in Camel is stopped from JMX or somewhere else
         camelContext.addLifecycleStrategy(new MainLifecycleStrategy(completed, latch));
         // allow to do configuration before its started
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseRoutesCollector.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultRoutesCollector.java
similarity index 67%
rename from core/camel-main/src/main/java/org/apache/camel/main/BaseRoutesCollector.java
rename to core/camel-main/src/main/java/org/apache/camel/main/DefaultRoutesCollector.java
index 17fe2a3..2b64ff9 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseRoutesCollector.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultRoutesCollector.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.main;
 
+import java.io.FileNotFoundException;
+import java.io.InputStream;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.List;
@@ -23,17 +25,20 @@ import java.util.Set;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.model.ModelHelper;
+import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.util.AntPathMatcher;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Base {@link RoutesCollector}.
+ * A default {@link RoutesCollector}.
  */
-public abstract class BaseRoutesCollector implements RoutesCollector {
-
-    // TODO: Add to camel main that it uses route collector
+public class DefaultRoutesCollector implements RoutesCollector {
 
     protected final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -105,4 +110,48 @@ public abstract class BaseRoutesCollector implements RoutesCollector {
         return routes;
     }
 
+    @Override
+    public List<RoutesDefinition> collectXmlRoutesFromDirectory(CamelContext camelContext, String directory) {
+        List<RoutesDefinition> answer = new ArrayList<>();
+
+        String[] parts = directory.split(",");
+        for (String part : parts) {
+            log.info("Loading additional Camel XML routes from: {}", part);
+            try {
+                InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, part);
+                log.debug("Found XML route: {}", is);
+                RoutesDefinition routes = ModelHelper.loadRoutesDefinition(camelContext, is);
+                answer.add(routes);
+            } catch (FileNotFoundException e) {
+                log.debug("No XML routes found in {}. Skipping XML routes detection.", part);
+            } catch (Exception e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
+        }
+
+        return answer;
+    }
+
+    @Override
+    public List<RestsDefinition> collectXmlRestsFromDirectory(CamelContext camelContext, String directory) {
+        List<RestsDefinition> answer = new ArrayList<>();
+
+        String[] parts = directory.split(",");
+        for (String part : parts) {
+            log.info("Loading additional Camel XML rests from: {}", part);
+            try {
+                InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, part);
+                log.debug("Found XML rest: {}", is);
+                RestsDefinition rests = ModelHelper.loadRestsDefinition(camelContext, is);
+                answer.add(rests);
+            } catch (FileNotFoundException e) {
+                log.debug("No XML rests found in {}. Skipping XML rests detection.", part);
+            } catch (Exception e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
+        }
+
+        return answer;
+    }
+
 }
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
index fd18ad4..589988e 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.main;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.camel.CamelContext;
@@ -36,16 +37,33 @@ public class RoutesConfigurer {
     private static final Logger LOG = LoggerFactory.getLogger(RoutesConfigurer.class);
 
     private final RoutesCollector routesCollector;
+    private final List<RoutesBuilder> routesBuilders;
 
+    /**
+     * Creates a new routes configurer
+     *
+     * @param routesCollector  routes collector
+     */
     public RoutesConfigurer(RoutesCollector routesCollector) {
+        this(routesCollector, new ArrayList<>());
+    }
+
+    /**
+     * Creates a new routes configurer
+     *
+     * @param routesCollector  routes collector
+     * @param routesBuilders   existing route builders
+     */
+    public RoutesConfigurer(RoutesCollector routesCollector, List<RoutesBuilder> routesBuilders) {
         this.routesCollector = routesCollector;
+        this.routesBuilders = routesBuilders;
     }
 
     /**
      * Collects routes and rests from the various sources (like registry or opinionated
-     * classpath locations) and injects these into the Camel context.
+     * classpath locations) and injects (adds) these into the Camel context.
      *
-     * @param camelContext  the Camel Context
+     * @param camelContext  the Camel context
      * @param config        the configuration
      */
     public void configureRoutes(CamelContext camelContext, DefaultConfigurationProperties config) {
@@ -56,18 +74,21 @@ public class RoutesConfigurer {
                         config.getJavaRoutesExcludePattern(),
                         config.getJavaRoutesIncludePattern());
 
+                // add newly discovered routes
+                routesBuilders.addAll(routes);
                 // sort routes according to ordered
-                routes.sort(OrderedComparator.get());
+                routesBuilders.sort(OrderedComparator.get());
                 // then add the routes
-                for (RoutesBuilder routesBuilder : routes) {
-                    LOG.debug("Injecting following route into the CamelContext: {}", routesBuilder);
-                    camelContext.addRoutes(routesBuilder);
+                for (RoutesBuilder builder : routesBuilders) {
+                    LOG.debug("Adding routes into CamelContext from RoutesBuilder: {}", builder);
+                    camelContext.addRoutes(builder);
                 }
 
                 boolean scan = !config.getXmlRoutes().equals("false");
                 if (scan) {
                     List<RoutesDefinition> defs = routesCollector.collectXmlRoutesFromDirectory(camelContext, config.getXmlRoutes());
                     for (RoutesDefinition def : defs) {
+                        LOG.debug("Adding routes into CamelContext from XML files: {}", config.getXmlRoutes());
                         camelContext.getExtension(Model.class).addRouteDefinitions(def.getRoutes());
                     }
                 }
@@ -76,6 +97,7 @@ public class RoutesConfigurer {
                 if (scanRests) {
                     List<RestsDefinition> defs = routesCollector.collectXmlRestsFromDirectory(camelContext, config.getXmlRests());
                     for (RestsDefinition def : defs) {
+                        LOG.debug("Adding rests into CamelContext from XML files: {}", config.getXmlRests());
                         camelContext.getExtension(Model.class).addRestDefinitions(def.getRests(), true);
                     }
                 }