This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch yaml-ns in repository https://gitbox.apache.org/repos/asf/camel.git
commit e4a4c1b5f83687f93fe6c39e4175dfe81d162c41 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Nov 11 10:40:25 2024 +0100 CAMEL-21420: camel-yaml-io - Should support writing namespace as output for xpath and other languages that can do namespaces --- .../model/language/NamespaceAwareExpression.java | 5 +++ .../java/org/apache/camel/yaml/io/YamlWriter.java | 38 ++++++++++++++++++++-- .../apache/camel/yaml/out/XPathNamespacesTest.java | 11 +++---- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java index 834158bb6ef..5dd263e5365 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java @@ -16,6 +16,7 @@ */ package org.apache.camel.model.language; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -80,6 +81,10 @@ public abstract class NamespaceAwareExpression extends SingleInputTypedExpressio } public List<PropertyDefinition> getNamespace() { + if (namespace == null && namespaces != null && !namespaces.isEmpty()) { + namespace = new ArrayList<>(); + namespaces.forEach((k, v) -> namespace.add(new PropertyDefinition(k, v))); + } return namespace; } diff --git a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/YamlWriter.java b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/YamlWriter.java index 7e7eb3121b2..f121a8d03f9 100644 --- a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/YamlWriter.java +++ b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/YamlWriter.java @@ -21,6 +21,7 @@ import java.io.Writer; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.StringJoiner; @@ -94,6 +95,14 @@ public class YamlWriter extends ServiceSupport implements CamelContextAware { } } + private EipModel lookupEipModel(String name) { + // namespace is using the property model + if ("namespace".equals(name)) { + name = "property"; + } + return catalog.eipModel(name); + } + public void setUriAsParameters(boolean uriAsParameters) { this.uriAsParameters = uriAsParameters; } @@ -105,9 +114,9 @@ public class YamlWriter extends ServiceSupport implements CamelContextAware { return; } - EipModel model = catalog.eipModel(name); + EipModel model = lookupEipModel(name); if (model == null) { - // not an EIP model + // not an EIP model or namespace return; } @@ -137,12 +146,35 @@ public class YamlWriter extends ServiceSupport implements CamelContextAware { return; } - EipModel model = catalog.eipModel(name); + EipModel model = lookupEipModel(name); if (model == null) { // not an EIP model return; } + // special for namespace + if ("namespace".equals(name)) { + EipModel last = models.isEmpty() ? null : models.peek(); + if (!models.isEmpty()) { + models.pop(); + } + EipModel parent = models.isEmpty() ? null : models.peek(); + if (parent != null) { + Map<String, String> map = (Map<String, String>) parent.getMetadata().get("namespace"); + if (map == null) { + map = new LinkedHashMap<>(); + parent.getMetadata().put("namespace", map); + } + String key = (String) last.getMetadata().get("key"); + String value = (String) last.getMetadata().get("value"); + // skip xsi namespace + if (key != null && !"xsi".equals(key) && value != null) { + map.put(key, value); + } + } + return; + } + EipModel last = models.isEmpty() ? null : models.peek(); if (last != null && isLanguage(last)) { if (!models.isEmpty()) { diff --git a/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/XPathNamespacesTest.java b/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/XPathNamespacesTest.java index c0d00525354..a5ad9e372ff 100644 --- a/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/XPathNamespacesTest.java +++ b/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/XPathNamespacesTest.java @@ -33,7 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat; class XPathNamespacesTest { @Test - void test() throws Exception { + void testNamespace() throws Exception { try (ByteArrayInputStream is = new ByteArrayInputStream(XML.getBytes(Charset.defaultCharset()))) { Optional<RoutesDefinition> routesDefinition = new ModelParser(is, XmlToYamlTest.NAMESPACE).parseRoutesDefinition(); assertThat(routesDefinition).isPresent() @@ -91,31 +91,28 @@ class XPathNamespacesTest { xpath: resultType: java.lang.String saxon: "true" + expression: /routes-ns-def:parent/routes-ns-def:child namespace: - xsi: http://www.w3.org/2001/XMLSchema-instance routes-ns-def: http://www.example.com/schema route-ns-def: http://www.example.com/schema - expression: /routes-ns-def:parent/routes-ns-def:child - setProperty: name: child-expression-namespace-from-route xpath: resultType: java.lang.String saxon: "true" + expression: /route-ns-def:parent/route-ns-def:child namespace: - xsi: http://www.w3.org/2001/XMLSchema-instance routes-ns-def: http://www.example.com/schema route-ns-def: http://www.example.com/schema - expression: /route-ns-def:parent/route-ns-def:child - setProperty: name: child-expression-namespace-from-xpath xpath: resultType: java.lang.String saxon: "true" + expression: /expression-ns-def:parent/expression-ns-def:child namespace: - xsi: http://www.w3.org/2001/XMLSchema-instance routes-ns-def: http://www.example.com/schema route-ns-def: http://www.example.com/schema expression-ns-def: http://www.example.com/schema - expression: /expression-ns-def:parent/expression-ns-def:child """; }
