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/03/06 20:04:28 UTC
[camel] branch master updated: CAMEL-13283: Add @BindRegistry
annotation to allow to bind beans/classes to registry.
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 32752d9 CAMEL-13283: Add @BindRegistry annotation to allow to bind beans/classes to registry.
32752d9 is described below
commit 32752d9690cf70009f30b31c769f62ffb7f3aba6
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Mar 6 21:04:01 2019 +0100
CAMEL-13283: Add @BindRegistry annotation to allow to bind beans/classes to registry.
---
.../java/org/apache/camel/main/MainSupport.java | 87 +++++++++++++++-------
.../camel/main/MainIoCNewRouteBuilderTest.java | 30 ++++++++
2 files changed, 92 insertions(+), 25 deletions(-)
diff --git a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
index 660ffdf..d289eb8 100644
--- a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
@@ -78,8 +78,9 @@ public abstract class MainSupport extends ServiceSupport {
protected CamelContext camelContext;
protected List<RouteBuilder> routeBuilders = new ArrayList<>();
- protected List<Class> configurationClasses;
protected String routeBuilderClasses;
+ protected List<Object> configurations = new ArrayList<>();
+ protected String configurationClasses;
protected String fileWatchDirectory;
protected boolean fileWatchDirectoryRecursively;
protected ProducerTemplate camelTemplate;
@@ -428,23 +429,32 @@ public abstract class MainSupport extends ServiceSupport {
return exitCode.get();
}
- public List<Class> getConfigurationClasses() {
+ public String getConfigurationClasses() {
return configurationClasses;
}
- /**
- * Sets optional configuration classes which allows to do any initial configuration.
- * The class can/should have a method named <tt>configure</tt> which is called.
- */
- public void setConfigurationClasses(List<Class> configurationClasses) {
- this.configurationClasses = configurationClasses;
+ public void setConfigurationClasses(String configurations) {
+ this.configurationClasses = configurations;
}
- public void addConfigurationClass(Class... configurationClasses) {
- if (this.configurationClasses == null) {
- this.configurationClasses = new ArrayList<>();
+ public void addConfigurationClass(Class... configuration) {
+ String existing = configurationClasses;
+ if (existing == null) {
+ existing = "";
}
- this.configurationClasses.addAll(Arrays.asList(configurationClasses));
+ if (configuration != null) {
+ for (Class clazz : configuration) {
+ if (!existing.isEmpty()) {
+ existing = existing + ",";
+ }
+ existing = existing + clazz.getName();
+ }
+ }
+ setConfigurationClasses(existing);
+ }
+
+ public void addConfiguration(Object configuration) {
+ configurations.add(configuration);
}
public String getRouteBuilderClasses() {
@@ -608,6 +618,14 @@ public abstract class MainSupport extends ServiceSupport {
this.routeBuilders = routeBuilders;
}
+ public List<Object> getConfigurations() {
+ return configurations;
+ }
+
+ public void setConfigurations(List<Object> configurations) {
+ this.configurations = configurations;
+ }
+
public List<RouteDefinition> getRouteDefinitions() {
List<RouteDefinition> answer = new ArrayList<>();
if (camelContext != null) {
@@ -656,6 +674,35 @@ public abstract class MainSupport extends ServiceSupport {
}
}
+ protected void loadConfigurations(CamelContext camelContext) throws Exception {
+ // lets use Camel's bean post processor on any existing configuration classes
+ // so the instance has some support for dependency injection
+ CamelBeanPostProcessor postProcessor = camelContext.getBeanPostProcessor();
+ for (Object configuration : getConfigurations()) {
+ postProcessor.postProcessBeforeInitialization(configuration, configuration.getClass().getName());
+ postProcessor.postProcessAfterInitialization(configuration, configuration.getClass().getName());
+ }
+
+ if (configurationClasses != null) {
+ String[] configClasses = configurationClasses.split(",");
+ for (String configClass : configClasses) {
+ Class<?> configClazz = camelContext.getClassResolver().resolveClass(configClass);
+ // lets use Camel's injector so the class has some support for dependency injection
+ Object config = camelContext.getInjector().newInstance(configClazz);
+ getConfigurations().add(config);
+ }
+ }
+
+ for (Object config : getConfigurations()) {
+ // invoke configure method if exists
+ Method method = findMethod(config.getClass(), "configure");
+ if (method != null) {
+ log.info("Calling configure method on configuration class: {}", config.getClass().getName());
+ invokeMethod(method, config);
+ }
+ }
+ }
+
protected void postProcessCamelContext(CamelContext camelContext) throws Exception {
if (propertyPlaceholderLocations != null) {
PropertiesComponent pc = camelContext.getPropertiesComponent();
@@ -706,18 +753,8 @@ public abstract class MainSupport extends ServiceSupport {
camelContext.getManagementStrategy().addEventNotifier(notifier);
}
- if (configurationClasses != null) {
- for (Class<?> clazz : configurationClasses) {
- // create instance of configuration class as it may do dependency injection and bind to registry
- Object config = camelContext.getInjector().newInstance(clazz);
- // invoke configure method if exists
- Method method = findMethod(clazz, "configure");
- if (method != null) {
- log.info("Calling configure method on configuration class: {}", clazz.getName());
- invokeMethod(method, config);
- }
- }
- }
+ // try to load configurations
+ loadConfigurations(camelContext);
// conventional configuration via properties to allow configuring options on
// component, dataformat, and languages (like spring-boot auto-configuration)
@@ -726,7 +763,7 @@ public abstract class MainSupport extends ServiceSupport {
autoConfigurationFromProperties(camelContext);
}
- // try to load the route builders from the routeBuilderClasses
+ // try to load the route builders
loadRouteBuilders(camelContext);
for (RouteBuilder routeBuilder : routeBuilders) {
camelContext.addRoutes(routeBuilder);
diff --git a/core/camel-core/src/test/java/org/apache/camel/main/MainIoCNewRouteBuilderTest.java b/core/camel-core/src/test/java/org/apache/camel/main/MainIoCNewRouteBuilderTest.java
index 24e933a..9eae041 100644
--- a/core/camel-core/src/test/java/org/apache/camel/main/MainIoCNewRouteBuilderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/main/MainIoCNewRouteBuilderTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.main;
+import org.apache.camel.BeanInject;
import org.apache.camel.BindToRegistry;
import org.apache.camel.CamelContext;
import org.apache.camel.PropertyInject;
@@ -29,6 +30,7 @@ public class MainIoCNewRouteBuilderTest extends Assert {
@Test
public void testMainIoC() throws Exception {
Main main = new Main();
+ main.addConfiguration(new MyConfiguration());
main.addRouteBuilder(new MyRouteBuilder());
main.start();
@@ -42,9 +44,37 @@ public class MainIoCNewRouteBuilderTest extends Assert {
endpoint.assertIsSatisfied();
+ MainIoCNewRouteBuilderTest.MyConfiguration.MyCoolBean mcb = (MainIoCNewRouteBuilderTest.MyConfiguration.MyCoolBean) camelContext.getRegistry().lookupByName("MyCoolBean");
+ assertNotNull(mcb);
+ assertEquals("Tiger", mcb.getName());
+
main.stop();
}
+ public static class MyConfiguration {
+
+ @BeanInject
+ private CamelContext camel;
+
+ @BindToRegistry
+ public static class MyCoolBean {
+
+ private String name = "Tiger";
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ }
+
+ public void configure() {
+ camel.getGlobalOptions().put("foo", "123");
+ }
+ }
+
public static class MyBar {
private final String name;