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
The following commit(s) were added to refs/heads/main by this push:
new 9f273732d56c CAMEL-22953: camel-core - XML languages that are
Namespace should support property placeholders in key/ns (#21235)
9f273732d56c is described below
commit 9f273732d56c69ae090ac8e79640e30b2df8adae
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Feb 3 20:31:20 2026 +0100
CAMEL-22953: camel-core - XML languages that are Namespace should support
property placeholders in key/ns (#21235)
---
.../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();
+ }
+ };
+ }
+}