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 <claus.ib...@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); } }