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);
}
}