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

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


The following commit(s) were added to refs/heads/camel-4.8.x by this push:
     new a5ed07a7554 [BACKPORT-4.8.x] CAMEL-21276, CAMEL-21336 (#15927)
a5ed07a7554 is described below

commit a5ed07a7554ab36d8197f7876fbfbe6e2f903362
Author: Christoph Deppisch <[email protected]>
AuthorDate: Fri Oct 11 16:12:13 2024 +0200

    [BACKPORT-4.8.x] CAMEL-21276, CAMEL-21336 (#15927)
    
    * CAMEL-21276: camel-core: Lookup ENV variable should use IOHelper to be 
consistent, and also support camelCase style to have more human readable keys 
and still match ENV variables that are UPPER_CASE with underscores only. 
(#15744)
    
    (cherry picked from commit 171a84be7173eb053c06529793732523978e2f87)
    
    * CAMEL-21336: Allow Kamelets configured by EnvVars only
    
    - Consider environment variables when validating Kamelet parameter 
configuration
    - Avoids errors due to missing required Kamelet parameter validation when 
parameter is configured via environment variables
    
    (cherry picked from commit d30f8862c6ab7444177cf63762c32725cf76dca4)
    
    ---------
    
    Co-authored-by: Claus Ibsen <[email protected]>
---
 .../apache/camel/component/kamelet/Kamelet.java    | 50 ++++++++++++++++++++++
 .../camel/component/kamelet/KameletComponent.java  |  9 ++++
 .../org/apache/camel/RouteTemplateContext.java     | 22 ++++++++++
 .../impl/debugger/DefaultBacklogDebugger.java      |  3 +-
 .../properties/EnvPropertiesFunction.java          | 11 +----
 .../properties/ServiceHostPropertiesFunction.java  |  9 +---
 .../properties/ServicePortPropertiesFunction.java  |  9 +---
 .../properties/ServicePropertiesFunction.java      |  5 ++-
 .../java/org/apache/camel/impl/DefaultModel.java   | 17 ++++----
 .../camel/model/DefaultRouteTemplateContext.java   | 27 ++++++++++++
 .../java/org/apache/camel/main/MainHelper.java     |  2 +-
 .../org/apache/camel/support/LanguageHelper.java   | 14 +-----
 core/camel-util/pom.xml                            |  1 +
 .../org/apache/camel/util/FilePathResolver.java    |  4 +-
 .../main/java/org/apache/camel/util/IOHelper.java  | 37 ++++++++++++----
 .../java/org/apache/camel/util/IOHelperTest.java   |  4 ++
 16 files changed, 167 insertions(+), 57 deletions(-)

diff --git 
a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java
 
b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java
index 94d94e229cc..da2cdc792b0 100644
--- 
a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java
+++ 
b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.kamelet;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 import java.util.function.Predicate;
@@ -30,6 +31,7 @@ import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.SimpleUuidGenerator;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
 
@@ -37,6 +39,7 @@ import static 
org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutpu
 
 public final class Kamelet {
     public static final String PROPERTIES_PREFIX = "camel.kamelet.";
+    public static final String ENV_VAR_PREFIX = "CAMEL_KAMELET_";
     public static final String SCHEME = "kamelet";
     public static final String SOURCE_ID = "source";
     public static final String SINK_ID = "sink";
@@ -128,6 +131,53 @@ public final class Kamelet {
         }
     }
 
+    /**
+     * Looking for OS environment variables that match the properties of the 
given Kamelet. At first lookup attempt is
+     * made without considering camelCase keys in the elements. The second 
lookup is converting camelCase to
+     * underscores.
+     *
+     * For example given an ENV variable in either format: - 
CAMEL_KAMELET_AWSS3SOURCE_BUCKETNAMEORARN=myArn -
+     * CAMEL_KAMELET_AWS_S3_SOURCE_BUCKET_NAME_OR_ARN=myArn
+     */
+    public static void extractKameletEnvironmentVariables(Map<String, Object> 
properties, String... elements) {
+        StringBuilder prefixBuffer = new StringBuilder(Kamelet.ENV_VAR_PREFIX);
+
+        // Map contains parameter name as key and full environment variable as 
value
+        Map<String, String> propertyMappings = new HashMap<>();
+        for (String element : elements) {
+            if (element == null) {
+                continue;
+            }
+            
prefixBuffer.append(IOHelper.normalizeEnvironmentVariable(element)).append('_');
+
+            String prefix = prefixBuffer.toString();
+            System.getenv().keySet().stream()
+                    .filter(Kamelet.startsWith(prefix))
+                    .forEach(name -> 
propertyMappings.put(name.substring(prefix.length()), name));
+        }
+
+        prefixBuffer = new StringBuilder(Kamelet.ENV_VAR_PREFIX);
+
+        for (String element : elements) {
+            if (element == null) {
+                continue;
+            }
+            
prefixBuffer.append(IOHelper.normalizeEnvironmentVariable(StringHelper.camelCaseToDash(element))).append('_');
+
+            String prefix = prefixBuffer.toString();
+            System.getenv().keySet().stream()
+                    .filter(Kamelet.startsWith(prefix))
+                    .forEach(name -> 
propertyMappings.put(name.substring(prefix.length()), name));
+        }
+
+        for (Map.Entry<String, String> mapping : propertyMappings.entrySet()) {
+            String value = System.getenv(mapping.getValue());
+            if (value != null) {
+                properties.put(mapping.getKey(), value);
+            }
+        }
+    }
+
     public static RouteDefinition templateToRoute(RouteTemplateDefinition in, 
Map<String, Object> parameters) {
         final String rid = (String) parameters.get(PARAM_ROUTE_ID);
         final boolean noErrorHandler = (boolean) 
parameters.get(NO_ERROR_HANDLER);
diff --git 
a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java
 
b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java
index ace60eda2fe..5e3eb6cc9da 100644
--- 
a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java
+++ 
b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java
@@ -218,6 +218,15 @@ public class KameletComponent extends DefaultComponent {
                 Kamelet.extractKameletProperties(getCamelContext(), 
kameletProperties, templateId, routeId);
             }
 
+            //
+            // Look for OS environment variables that match the Kamelet 
properties
+            // Environment variables are loaded in the following order:
+            //
+            //   CAMEL_KAMELET_" + templateId
+            //   CAMEL_KAMELET_" + templateId + "_" routeId
+            //
+            Kamelet.extractKameletEnvironmentVariables(kameletProperties, 
templateId, routeId);
+
             //
             // Uri params have the highest precedence
             //
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java 
b/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java
index 35cba9e23c8..75d3c46ac28 100644
--- a/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java
@@ -108,6 +108,17 @@ public interface RouteTemplateContext extends 
HasCamelContext {
      */
     Object getProperty(String name);
 
+    /**
+     * Gets the environment variable parameter that matches the given property 
name. The match is performed by
+     * normalizing the given property name as an OS environment variable name. 
The environment variable name may use
+     * pure uppercase or camelCase converted to underscore property names. As 
an example bucketNameOrArn property
+     * matches BUCKETNAMEORARN and BUCKET_NAME_OR_ARN environment variables.
+     *
+     * @param  name name of property
+     * @return      the property value or <tt>null</tt> if no property exists
+     */
+    Object getEnvironmentVariable(String name);
+
     /**
      * Gets the property with the given name
      *
@@ -139,6 +150,17 @@ public interface RouteTemplateContext extends 
HasCamelContext {
      */
     boolean hasParameter(String name);
 
+    /**
+     * Whether the route template has an environment variable parameter that 
matches the given parameter name. The match
+     * is performed by normalizing the given name as an OS environment 
variable name. The environment variable name may
+     * use pure uppercase or camelCase converted to underscore property names. 
As an example bucketNameOrArn property
+     * matches BUCKETNAMEORARN and BUCKET_NAME_OR_ARN environment variables.
+     *
+     * @param  name the parameter name
+     * @return      true if exists
+     */
+    boolean hasEnvironmentVariable(String name);
+
     /**
      * Gets the local bean repository for the route template when creating the 
new route
      */
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
index be0c939544e..57bad2b4e6b 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java
@@ -52,6 +52,7 @@ import org.apache.camel.support.LoggerHelper;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StopWatch;
 import org.apache.camel.util.json.JsonObject;
 import org.slf4j.Logger;
@@ -258,7 +259,7 @@ public final class DefaultBacklogDebugger extends 
ServiceSupport implements Back
      *         the value of the system property {@link 
#SUSPEND_MODE_SYSTEM_PROP_NAME}, {@code false} by default.
      */
     private static boolean resolveSuspendMode() {
-        final String value = System.getenv(SUSPEND_MODE_ENV_VAR_NAME);
+        final String value = 
IOHelper.lookupEnvironmentVariable(SUSPEND_MODE_ENV_VAR_NAME);
         return value == null ? 
Boolean.getBoolean(SUSPEND_MODE_SYSTEM_PROP_NAME) : Boolean.parseBoolean(value);
     }
 
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
index 1d94cbd26b4..8bf0ff9f122 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.properties;
 
 import org.apache.camel.spi.PropertiesFunction;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
 
 /**
@@ -39,15 +40,7 @@ public class EnvPropertiesFunction implements 
PropertiesFunction {
             defaultValue = StringHelper.after(remainder, ":");
         }
 
-        // lookup OS environment variable using upper case key
-        key = key.toUpperCase();
-
-        String value = System.getenv(key);
-        // some OS do not support dashes in keys, so replace with underscore
-        if (value == null) {
-            String noDashKey = key.replace('-', '_');
-            value = System.getenv(noDashKey);
-        }
+        String value = IOHelper.lookupEnvironmentVariable(key);
         return value != null ? value : defaultValue;
     }
 
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/ServiceHostPropertiesFunction.java
 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/ServiceHostPropertiesFunction.java
index 45336fd60d3..4c10798a671 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/ServiceHostPropertiesFunction.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/ServiceHostPropertiesFunction.java
@@ -16,9 +16,8 @@
  */
 package org.apache.camel.component.properties;
 
-import java.util.Locale;
-
 import org.apache.camel.spi.PropertiesFunction;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
 
 /**
@@ -57,12 +56,8 @@ public class ServiceHostPropertiesFunction implements 
PropertiesFunction {
 
         // make sure to use upper case
         if (key != null) {
-            // make sure to use underscore as dash is not supported as ENV 
variables
-            key = key.toUpperCase(Locale.ENGLISH).replace('-', '_');
-
             // a service should have both the host and port defined
-            String host = System.getenv(key + HOST_PREFIX);
-
+            String host = IOHelper.lookupEnvironmentVariable(key + 
HOST_PREFIX);
             if (host != null) {
                 return host;
             } else {
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePortPropertiesFunction.java
 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePortPropertiesFunction.java
index 70d300c3776..6a9a12bed9b 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePortPropertiesFunction.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePortPropertiesFunction.java
@@ -16,9 +16,8 @@
  */
 package org.apache.camel.component.properties;
 
-import java.util.Locale;
-
 import org.apache.camel.spi.PropertiesFunction;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
 
 /**
@@ -57,12 +56,8 @@ public class ServicePortPropertiesFunction implements 
PropertiesFunction {
 
         // make sure to use upper case
         if (key != null) {
-            // make sure to use underscore as dash is not supported as ENV 
variables
-            key = key.toUpperCase(Locale.ENGLISH).replace('-', '_');
-
             // a service should have both the host and port defined
-            String port = System.getenv(key + PORT_PREFIX);
-
+            String port = IOHelper.lookupEnvironmentVariable(key + 
PORT_PREFIX);
             if (port != null) {
                 return port;
             } else {
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
index fb2f3d137c9..4c59acbdc11 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.properties;
 import java.util.Locale;
 
 import org.apache.camel.spi.PropertiesFunction;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
 
 /**
@@ -57,8 +58,8 @@ public class ServicePropertiesFunction implements 
PropertiesFunction {
             key = key.toUpperCase(Locale.ENGLISH).replace('-', '_');
 
             // a service should have both the host and port defined
-            String host = System.getenv(key + HOST_PREFIX);
-            String port = System.getenv(key + PORT_PREFIX);
+            String host = IOHelper.lookupEnvironmentVariable(key + 
HOST_PREFIX);
+            String port = IOHelper.lookupEnvironmentVariable(key + 
PORT_PREFIX);
 
             if (host != null && port != null) {
                 return host + ":" + port;
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java 
b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
index 8651458a9d3..f167ce5b73a 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
@@ -460,23 +460,24 @@ public class DefaultModel implements Model {
         final Map<String, Object> propDefaultValues = new HashMap<>();
         // include default values first from the template (and validate that 
we have inputs for all required parameters)
         if (target.getTemplateParameters() != null) {
-            StringJoiner templatesBuilder = new StringJoiner(", ");
+            StringJoiner missingParameters = new StringJoiner(", ");
 
             for (RouteTemplateParameterDefinition temp : 
target.getTemplateParameters()) {
                 if (temp.getDefaultValue() != null) {
                     addProperty(prop, temp.getName(), temp.getDefaultValue());
                     addProperty(propDefaultValues, temp.getName(), 
temp.getDefaultValue());
-                } else {
-                    if (temp.isRequired() && 
!routeTemplateContext.hasParameter(temp.getName())) {
-                        // this is a required parameter which is missing
-                        templatesBuilder.add(temp.getName());
-                    }
+                } else if 
(routeTemplateContext.hasEnvironmentVariable(temp.getName())) {
+                    // property is configured via environment variables
+                    addProperty(prop, temp.getName(), 
routeTemplateContext.getEnvironmentVariable(temp.getName()));
+                } else if (temp.isRequired() && 
!routeTemplateContext.hasParameter(temp.getName())) {
+                    // this is a required parameter which is missing
+                    missingParameters.add(temp.getName());
                 }
             }
-            if (templatesBuilder.length() > 0) {
+            if (missingParameters.length() > 0) {
                 throw new IllegalArgumentException(
                         "Route template " + routeTemplateId + " the following 
mandatory parameters must be provided: "
-                                                   + templatesBuilder);
+                                                   + missingParameters);
             }
         }
 
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java
index 68f85c0395c..e03c4fe54c5 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java
@@ -27,6 +27,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.RouteTemplateContext;
 import org.apache.camel.spi.BeanRepository;
 import org.apache.camel.support.LocalBeanRegistry;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
 
 /**
@@ -129,6 +130,32 @@ public final class DefaultRouteTemplateContext implements 
RouteTemplateContext {
         return false;
     }
 
+    @Override
+    public boolean hasEnvironmentVariable(String name) {
+        String normalizedKey = IOHelper.normalizeEnvironmentVariable(name);
+        if (parameters.containsKey(normalizedKey)) {
+            return true;
+        }
+        normalizedKey = 
IOHelper.normalizeEnvironmentVariable(StringHelper.camelCaseToDash(name));
+        if (parameters.containsKey(normalizedKey)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public Object getEnvironmentVariable(String name) {
+        String normalizedKey = IOHelper.normalizeEnvironmentVariable(name);
+        if (parameters.containsKey(normalizedKey)) {
+            return parameters.get(normalizedKey);
+        }
+        normalizedKey = 
IOHelper.normalizeEnvironmentVariable(StringHelper.camelCaseToDash(name));
+        if (parameters.containsKey(normalizedKey)) {
+            return parameters.get(normalizedKey);
+        }
+        return null;
+    }
+
     @Override
     public BeanRepository getLocalBeanRepository() {
         return registry;
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java 
b/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
index c5551bed229..61f994e899c 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
@@ -111,7 +111,7 @@ public final class MainHelper {
     public static Optional<String> lookupPropertyFromSysOrEnv(String name) {
         String answer = System.getProperty(name);
         if (answer == null) {
-            answer = System.getenv(toEnvVar(name));
+            answer = IOHelper.lookupEnvironmentVariable(name);
         }
 
         return Optional.ofNullable(answer);
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java
index 03fd5350720..f9cc5123e57 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java
@@ -32,6 +32,7 @@ import org.apache.camel.ExchangePropertyKey;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.ExchangeFormatter;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.TimeUtils;
 
 public final class LanguageHelper {
@@ -169,18 +170,7 @@ public final class LanguageHelper {
      * @return      the environment variable value
      */
     public static String sysenv(String name) {
-        String answer = null;
-        if (name != null) {
-            // lookup OS env with upper case key
-            name = name.toUpperCase();
-            answer = System.getenv(name);
-            // some OS do not support dashes in keys, so replace with 
underscore
-            if (answer == null) {
-                String noDashKey = name.replace('-', '_');
-                answer = System.getenv(noDashKey);
-            }
-        }
-        return answer;
+        return IOHelper.lookupEnvironmentVariable(name);
     }
 
     public static String escapeQuotes(String text) {
diff --git a/core/camel-util/pom.xml b/core/camel-util/pom.xml
index 2a90f57e52e..117c2889436 100644
--- a/core/camel-util/pom.xml
+++ b/core/camel-util/pom.xml
@@ -266,6 +266,7 @@
                             <environmentVariables>
                                 <FOO_SERVICE_HOST>myserver</FOO_SERVICE_HOST>
                                 <FOO_SERVICE_PORT>8081</FOO_SERVICE_PORT>
+                                
<CAMEL_KAMELET_AWS_S3_SOURCE_BUCKET_NAME_OR_ARN>mys3arn</CAMEL_KAMELET_AWS_S3_SOURCE_BUCKET_NAME_OR_ARN>
                             </environmentVariables>
                         </configuration>
                     </plugin>
diff --git 
a/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java 
b/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java
index 04672fdc9ec..bfc8d156f70 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java
@@ -49,7 +49,7 @@ public final class FilePathResolver {
             int pos = fun.indexOf("${env:");
             if (pos != -1) {
                 String key = fun.substring(pos + 6);
-                String value = System.getenv(key);
+                String value = IOHelper.lookupEnvironmentVariable(key);
                 if (value != null) {
                     path = path.replace("${env:" + key + "}", value);
                 }
@@ -57,7 +57,7 @@ public final class FilePathResolver {
             pos = fun.indexOf("${env.");
             if (pos != -1) {
                 String key = fun.substring(pos + 6);
-                String value = System.getenv(key);
+                String value = IOHelper.lookupEnvironmentVariable(key);
                 if (value != null) {
                     path = path.replace("${env." + key + "}", value);
                 }
diff --git a/core/camel-util/src/main/java/org/apache/camel/util/IOHelper.java 
b/core/camel-util/src/main/java/org/apache/camel/util/IOHelper.java
index e31ecfdf909..de347a45612 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/IOHelper.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/IOHelper.java
@@ -667,6 +667,15 @@ public final class IOHelper {
 
     /**
      * Lookup the OS environment variable in a safe manner by using upper case 
keys and underscore instead of dash.
+     *
+     * At first lookup attempt is made without considering camelCase keys. The 
second lookup is converting camelCase to
+     * underscores.
+     *
+     * For example given an ENV variable in either format: - 
CAMEL_KAMELET_AWS_S3_SOURCE_BUCKETNAMEORARN=myArn -
+     * CAMEL_KAMELET_AWS_S3_SOURCE_BUCKET_NAME_OR_ARN=myArn
+     *
+     * Then the following keys can look up both ENV formats above: - 
camel.kamelet.awsS3Source.bucketNameOrArn -
+     * camel.kamelet.aws-s3-source.bucketNameOrArn - 
camel.kamelet.aws-s3-source.bucket-name-or-arn
      */
     public static String lookupEnvironmentVariable(String key) {
         // lookup OS env with upper case key
@@ -674,18 +683,30 @@ public final class IOHelper {
         String value = System.getenv(upperKey);
 
         if (value == null) {
-            // some OS do not support dashes in keys, so replace with 
underscore
-            String normalizedKey = upperKey.replace('-', '_');
-
-            // and replace dots with underscores so keys like my.key are
-            // translated to MY_KEY
-            normalizedKey = normalizedKey.replace('.', '_');
-
-            value = System.getenv(normalizedKey);
+            value = System.getenv(normalizeEnvironmentVariable(upperKey));
+        }
+        if (value == null) {
+            // camelCase keys should use underscore as separator
+            String caseKey = StringHelper.camelCaseToDash(key);
+            value = System.getenv(normalizeEnvironmentVariable(caseKey));
         }
         return value;
     }
 
+    /**
+     * Convert given key into an OS environment variable. Uses uppercase keys 
and converts dashes and dots to
+     * underscores.
+     */
+    public static String normalizeEnvironmentVariable(String key) {
+        String upperKey = key.toUpperCase();
+        // some OS do not support dashes in keys, so replace with underscore
+        String normalizedKey = upperKey.replace('-', '_');
+
+        // and replace dots with underscores so keys like my.key are
+        // translated to MY_KEY
+        return normalizedKey.replace('.', '_');
+    }
+
     /**
      * Encoding-aware input stream.
      */
diff --git 
a/core/camel-util/src/test/java/org/apache/camel/util/IOHelperTest.java 
b/core/camel-util/src/test/java/org/apache/camel/util/IOHelperTest.java
index 997907a978c..c7c820ef041 100644
--- a/core/camel-util/src/test/java/org/apache/camel/util/IOHelperTest.java
+++ b/core/camel-util/src/test/java/org/apache/camel/util/IOHelperTest.java
@@ -28,6 +28,10 @@ public class IOHelperTest {
         assertEquals("8081", 
IOHelper.lookupEnvironmentVariable("foo-service.port"));
         assertEquals("8081", 
IOHelper.lookupEnvironmentVariable("foo-service-port"));
         assertEquals("8081", 
IOHelper.lookupEnvironmentVariable("foo.service.port"));
+
+        assertEquals("mys3arn", 
IOHelper.lookupEnvironmentVariable("camel.kamelet.aws-s3-source.bucketNameOrArn"));
+        assertEquals("mys3arn", 
IOHelper.lookupEnvironmentVariable("camel.kamelet.aws-s3-source.bucket-name-or-arn"));
+        assertEquals("mys3arn", 
IOHelper.lookupEnvironmentVariable("camel.kamelet.awsS3Source.bucketNameOrArn"));
     }
 
     @Test

Reply via email to