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

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

commit 10354a58082811cffd37dc573da8e8ea80f2bbe4
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Feb 3 19:59:08 2026 +0100

    CAMEL-22953: camel-core - XML languages that are Namespace should support 
property placeholders in key/ns
---
 .../org/apache/camel/reifier/AbstractReifier.java  | 27 +++++++++++++++
 .../dataformat/XMLSecurityDataFormatReifier.java   |  2 +-
 .../language/XMLTokenizerExpressionReifier.java    |  2 +-
 .../reifier/language/XPathExpressionReifier.java   |  2 +-
 .../reifier/language/XQueryExpressionReifier.java  |  2 +-
 .../camel/reifier/rest/RestBindingReifier.java     | 14 ++++----
 .../builder/xml/XPathNamespacePlaceholderTest.java | 38 ++++++++++++++++++++++
 7 files changed, 76 insertions(+), 11 deletions(-)

diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
index 21e6976c05b8..f76ca5a68488 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
@@ -17,6 +17,8 @@
 package org.apache.camel.reifier;
 
 import java.time.Duration;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -54,6 +56,31 @@ public abstract class AbstractReifier implements 
BeanRepository {
         return camelContext;
     }
 
+    protected Map<String, String> parseMap(Map<String, String> map) {
+        if (map == null) {
+            return null;
+        }
+        Map<String, String> answer = new LinkedHashMap<>();
+        for (var e : map.entrySet()) {
+            String newKey = parseString(e.getKey());
+            String newValue = parseString(e.getValue());
+            answer.put(newKey, newValue);
+        }
+        return answer.isEmpty() ? map : answer;
+    }
+
+    protected Set<String> parseSet(Set<String> set) {
+        if (set == null) {
+            return null;
+        }
+        Set<String> answer = new LinkedHashSet<>();
+        for (var e : set) {
+            String value = parseString(e);
+            answer.add(value);
+        }
+        return answer.isEmpty() ? set : answer;
+    }
+
     protected String parseString(String text) {
         return CamelContextHelper.parseText(camelContext, text);
     }
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/XMLSecurityDataFormatReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/XMLSecurityDataFormatReifier.java
index 0f5237ad5bae..f91f28df5c1c 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/XMLSecurityDataFormatReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/XMLSecurityDataFormatReifier.java
@@ -38,7 +38,7 @@ public class XMLSecurityDataFormatReifier extends 
DataFormatReifier<XMLSecurityD
         properties.put("recipientKeyAlias", definition.getRecipientKeyAlias());
         properties.put("keyOrTrustStoreParameters",
                 or(definition.getKeyStoreParameters(), 
asRef(definition.getKeyOrTrustStoreParameters())));
-        properties.put("namespaces", or(definition.getNamespaces(), 
asRef(definition.getNamespaceRef())));
+        properties.put("namespaces", or(parseMap(definition.getNamespaces()), 
asRef(definition.getNamespaceRef())));
         properties.put("keyPassword", definition.getKeyPassword());
         properties.put("digestAlgorithm", definition.getDigestAlgorithm());
         properties.put("mgfAlgorithm", definition.getMgfAlgorithm());
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
index 5f5b0e0ba70e..344b49058198 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
@@ -41,7 +41,7 @@ public class XMLTokenizerExpressionReifier extends 
SingleInputTypedExpressionRei
 
     protected void configureNamespaceAware(Object builder) {
         if (definition.getNamespaces() != null && builder instanceof 
NamespaceAware namespaceAware) {
-            namespaceAware.setNamespaces(definition.getNamespaces());
+            namespaceAware.setNamespaces(parseMap(definition.getNamespaces()));
         }
     }
 
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
index f8b2ac95090c..7136d3dd8bbe 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
@@ -46,7 +46,7 @@ public class XPathExpressionReifier extends 
SingleInputTypedExpressionReifier<XP
 
     protected void configureNamespaceAware(Object builder) {
         if (definition.getNamespaces() != null && builder instanceof 
NamespaceAware namespaceAware) {
-            namespaceAware.setNamespaces(definition.getNamespaces());
+            namespaceAware.setNamespaces(parseMap(definition.getNamespaces()));
         }
     }
 
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
index 4cfdc70bcd64..b17affbfc990 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
@@ -42,7 +42,7 @@ public class XQueryExpressionReifier extends 
SingleInputTypedExpressionReifier<X
 
     protected void configureNamespaceAware(Object builder) {
         if (definition.getNamespaces() != null && builder instanceof 
NamespaceAware namespaceAware) {
-            namespaceAware.setNamespaces(definition.getNamespaces());
+            namespaceAware.setNamespaces(parseMap(definition.getNamespaces()));
         }
     }
 
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
index 7798198e7e66..6fbe8c8df71c 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
@@ -73,18 +73,18 @@ public class RestBindingReifier extends AbstractReifier {
         rbc.setClientResponseValidation(validation);
         rbc.setConsumes(parseString(definition.getConsumes()));
         rbc.setProduces(parseString(definition.getProduces()));
-        rbc.setCorsHeaders(config.getCorsHeaders());
-        rbc.setQueryDefaultValues(definition.getDefaultValues());
-        rbc.setQueryAllowedValues(definition.getAllowedValues());
+        rbc.setCorsHeaders(parseMap(config.getCorsHeaders()));
+        rbc.setQueryDefaultValues(parseMap(definition.getDefaultValues()));
+        rbc.setQueryAllowedValues(parseMap(definition.getAllowedValues()));
         rbc.setRequiredBody(definition.getRequiredBody() != null && 
definition.getRequiredBody());
-        
rbc.setRequiredQueryParameters(definition.getRequiredQueryParameters());
-        rbc.setRequiredHeaders(definition.getRequiredHeaders());
+        
rbc.setRequiredQueryParameters(parseSet(definition.getRequiredQueryParameters()));
+        rbc.setRequiredHeaders(parseSet(definition.getRequiredHeaders()));
         rbc.setType(parseString(definition.getType()));
         rbc.setTypeClass(definition.getTypeClass());
         rbc.setOutType(parseString(definition.getOutType()));
         rbc.setOutTypeClass(definition.getOutTypeClass());
-        rbc.setResponseCodes(definition.getResponseCodes());
-        rbc.setResponseHeaders(definition.getResponseHeaders());
+        rbc.setResponseCodes(parseMap(definition.getResponseCodes()));
+        rbc.setResponseHeaders(parseSet(definition.getResponseHeaders()));
 
         // use factory to create advice
         return RestBindingAdviceFactory.build(camelContext, rbc);
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathNamespacePlaceholderTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathNamespacePlaceholderTest.java
new file mode 100644
index 000000000000..9a3ee291fe8d
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/builder/xml/XPathNamespacePlaceholderTest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.xml;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.support.builder.Namespaces;
+
+public class XPathNamespacePlaceholderTest extends XPathNamespaceTest {
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                context.getPropertiesComponent().addInitialProperty("myKey", 
"c");
+                context.getPropertiesComponent().addInitialProperty("myNS", 
"http://acme.com/cheese";);
+
+                Namespaces ns = new Namespaces("{{myKey}}", "{{myNS}}");
+
+                from("direct:in").choice().when(xpath("/c:number = 55", 
Integer.class, ns)).to("mock:55").otherwise()
+                        .to("mock:other").end();
+            }
+        };
+    }
+}

Reply via email to