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.git
commit 53b399d885e94763d7b1b41f93a38bdaaa47f79f Author: Claus Ibsen <[email protected]> AuthorDate: Fri Jul 10 19:40:40 2026 +0200 chore: fix bind command arity, template substitution, and object reference bugs - Remove arity="0" from --property option so picocli accepts space-separated values - Replace replaceFirst with String.replace in Bind, UriBindingProvider and ObjectReferenceBindingProvider to avoid regex replacement issues with $ and \ in values - Fix ObjectReferenceBindingProvider regex: [alphbetv0-9] typo to [a-z0-9], and [A-Z][a-z]+ to [A-Z][a-zA-Z]+ to match multi-word kinds like ConfigMap - Fix getEndpointUriProperties to merge query params with endpointProperties using putAll instead of replacing the map Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../camel/dsl/jbang/core/commands/bind/Bind.java | 19 +++++++++---------- .../commands/bind/ObjectReferenceBindingProvider.java | 14 +++++++------- .../jbang/core/commands/bind/UriBindingProvider.java | 4 ++-- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java index 7d13475ef143..33ada9981261 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java @@ -75,8 +75,7 @@ public class Bind extends CamelCommand { String errorHandler; @CommandLine.Option(names = { "--property" }, - description = "Adds a pipe property in the form of [source|sink|error-handler|step-<n>].<key>=<value> where <n> is the step number starting from 1", - arity = "0") + description = "Adds a pipe property in the form of [source|sink|error-handler|step-<n>].<key>=<value> where <n> is the step number starting from 1") String[] properties; @CommandLine.Option(names = { "--output" }, @@ -175,15 +174,15 @@ public class Bind extends CamelCommand { is = templateProvider.getErrorHandlerTemplate("sink"); errorHandlerSpec = IOHelper.loadText(is); IOHelper.close(is); - errorHandlerSpec = errorHandlerSpec.replaceFirst("\\{\\{ \\.Endpoint }}", endpoint); - errorHandlerSpec = errorHandlerSpec.replaceFirst("\\{\\{ \\.ErrorHandlerParameter }}", + errorHandlerSpec = errorHandlerSpec.replace("{{ .Endpoint }}", endpoint); + errorHandlerSpec = errorHandlerSpec.replace("{{ .ErrorHandlerParameter }}", templateProvider.asErrorHandlerParameters(errorHandlerParameters)); break; case "log": is = templateProvider.getErrorHandlerTemplate("log"); errorHandlerSpec = IOHelper.loadText(is); IOHelper.close(is); - errorHandlerSpec = errorHandlerSpec.replaceFirst("\\{\\{ \\.ErrorHandlerParameter }}", + errorHandlerSpec = errorHandlerSpec.replace("{{ .ErrorHandlerParameter }}", templateProvider.asErrorHandlerParameters(errorHandlerParameters)); break; default: @@ -194,11 +193,11 @@ public class Bind extends CamelCommand { } String name = FileUtil.onlyName(file, false); - context = context.replaceFirst("\\{\\{ \\.Name }}", name); - context = context.replaceFirst("\\{\\{ \\.Source }}\n", sourceEndpoint); - context = context.replaceFirst("\\{\\{ \\.Sink }}\n", sinkEndpoint); - context = context.replaceFirst("\\{\\{ \\.Steps }}", stepsContext); - context = context.replaceFirst("\\{\\{ \\.ErrorHandler }}", errorHandlerContext); + context = context.replace("{{ .Name }}", name); + context = context.replace("{{ .Source }}\n", sourceEndpoint); + context = context.replace("{{ .Sink }}\n", sinkEndpoint); + context = context.replace("{{ .Steps }}", stepsContext); + context = context.replace("{{ .ErrorHandler }}", errorHandlerContext); return context; } catch (Exception e) { printer().printErr(e); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/ObjectReferenceBindingProvider.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/ObjectReferenceBindingProvider.java index b46259df8b35..6ee4e24dcdbf 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/ObjectReferenceBindingProvider.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/ObjectReferenceBindingProvider.java @@ -40,7 +40,7 @@ import org.apache.camel.util.URISupport; public class ObjectReferenceBindingProvider implements BindingProvider { private static final Pattern OBJECT_REFERENCE_URI_PATTERN - = Pattern.compile("^([a-z.]+/[alphbetv0-9]+):([A-Z][a-z]+):([a-z][a-z-]*/?[a-z][a-z-]*)\\??[^?]*", Pattern.DOTALL); + = Pattern.compile("^([a-z.]+/[a-z0-9]+):([A-Z][a-zA-Z]+):([a-z][a-z-]*/?[a-z][a-z-]*)\\??[^?]*", Pattern.DOTALL); private final String apiVersion; private final String kind; @@ -105,11 +105,11 @@ public class ObjectReferenceBindingProvider implements BindingProvider { namespaceContext = " namespace: " + namespace + "\n"; } - context = context.replaceFirst("\\{\\{ \\.ApiVersion }}", apiVersionValue); - context = context.replaceFirst("\\{\\{ \\.Kind }}", kindValue); - context = context.replaceFirst("\\{\\{ \\.Name }}", objectName); - context = context.replaceFirst("\\{\\{ \\.Namespace }}\n", namespaceContext); - context = context.replaceFirst("\\{\\{ \\.EndpointProperties }}\n", + context = context.replace("{{ .ApiVersion }}", apiVersionValue); + context = context.replace("{{ .Kind }}", kindValue); + context = context.replace("{{ .Name }}", objectName); + context = context.replace("{{ .Namespace }}\n", namespaceContext); + context = context.replace("{{ .EndpointProperties }}\n", templateProvider.asEndpointProperties(endpointUriProperties)); return context; @@ -148,7 +148,7 @@ public class ObjectReferenceBindingProvider implements BindingProvider { if (uriExpression.contains("?")) { String query = StringHelper.after(uriExpression, "?"); if (query != null) { - endpointUriProperties = URISupport.parseQuery(query, true); + endpointUriProperties.putAll(URISupport.parseQuery(query, true)); } } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/UriBindingProvider.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/UriBindingProvider.java index 39babfa3b95f..220fdf828536 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/UriBindingProvider.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/UriBindingProvider.java @@ -57,8 +57,8 @@ public class UriBindingProvider implements BindingProvider { String context = IOHelper.loadText(is); IOHelper.close(is); - context = context.replaceFirst("\\{\\{ \\.URI }}", endpointUri); - context = context.replaceFirst("\\{\\{ \\.EndpointProperties }}\n", + context = context.replace("{{ .URI }}", endpointUri); + context = context.replace("{{ .EndpointProperties }}\n", templateProvider.asEndpointProperties(endpointProperties)); return context;
