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 2023/12/31 12:07:37 UTC

(camel-spring-boot) branch main updated: CAMEL-19749: Add variables as concept to Camel

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git


The following commit(s) were added to refs/heads/main by this push:
     new 671e772eb22 CAMEL-19749: Add variables as concept to Camel
671e772eb22 is described below

commit 671e772eb2240ff0e4537f5e5d4330714cb73f24
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Dec 31 13:06:25 2023 +0100

    CAMEL-19749: Add variables as concept to Camel
---
 .../camel/spring/boot/CamelAutoConfiguration.java  | 55 +++++++++++++++++++++-
 1 file changed, 54 insertions(+), 1 deletion(-)

diff --git a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
index 2934b2a00c0..f49794f995a 100644
--- a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
+++ b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
@@ -16,8 +16,10 @@
  */
 package org.apache.camel.spring.boot;
 
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -38,13 +40,19 @@ import org.apache.camel.spi.CliConnectorFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.PackageScanResourceResolver;
 import org.apache.camel.spi.StartupStepRecorder;
+import org.apache.camel.spi.VariableRepository;
+import org.apache.camel.spi.VariableRepositoryFactory;
 import org.apache.camel.spring.boot.aot.CamelRuntimeHints;
 import org.apache.camel.spring.spi.ApplicationContextBeanRepository;
 import org.apache.camel.spring.spi.CamelBeanPostProcessor;
 import org.apache.camel.support.DefaultRegistry;
+import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.startup.LoggingStartupStepRecorder;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;
@@ -61,12 +69,13 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Role;
 import org.springframework.core.OrderComparator;
 import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.EnumerablePropertySource;
 import org.springframework.core.env.Environment;
 import org.springframework.core.env.MutablePropertySources;
 
 @ImportRuntimeHints(CamelRuntimeHints.class)
 @Configuration(proxyBeanMethods = false)
-@EnableConfigurationProperties(CamelConfigurationProperties.class)
+@EnableConfigurationProperties({CamelConfigurationProperties.class})
 @Import(TypeConversionConfiguration.class)
 @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
 public class CamelAutoConfiguration {
@@ -136,6 +145,32 @@ public class CamelAutoConfiguration {
             }
         }
 
+        // configure camel.variable.xx configurations
+        Environment env = applicationContext.getEnvironment();
+        if (env instanceof ConfigurableEnvironment cev) {
+            Map<String, String> vars = doExtractVariablesFromSpringBoot(cev);
+            if (!vars.isEmpty()) {
+                // set variables
+                for (String key : vars.keySet()) {
+                    String value = vars.get(key);
+                    String id = StringHelper.before(key, ":", "global");
+                    key = StringHelper.after(key, ":", key);
+                    VariableRepository repo = camelContext.getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class)
+                            .getVariableRepository(id);
+                    // it may be a resource to load from disk then
+                    if (value.startsWith(LanguageSupport.RESOURCE)) {
+                        value = value.substring(9);
+                        if (ResourceHelper.hasScheme(value)) {
+                            InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, value);
+                            value = IOHelper.loadText(is);
+                            IOHelper.close(is);
+                        }
+                    }
+                    repo.setVariable(key, value);
+                }
+            }
+        }
+
         // setup cli connector eager
         configureCliConnector(applicationContext, camelContext);
 
@@ -157,6 +192,24 @@ public class CamelAutoConfiguration {
         return camelContext;
     }
 
+    protected static Map<String, String> doExtractVariablesFromSpringBoot(ConfigurableEnvironment env) {
+        Map<String, String> answer = new LinkedHashMap<>();
+
+        // grab all variables
+        env.getPropertySources().forEach(ps -> {
+            if (ps instanceof EnumerablePropertySource eps) {
+                for (String n : eps.getPropertyNames()) {
+                    if (n.startsWith("camel.variable.")) {
+                        String v = env.getRequiredProperty(n);
+                        n = n.substring(15);
+                        answer.put(n, v);
+                    }
+                }
+            }});
+
+        return answer;
+    }
+
     static void configureCliConnector(ApplicationContext applicationContext,
                                       CamelContext camelContext) {