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;