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(); + } + }; + } +}
