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
             """;
 }

Reply via email to