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 621d031f0113 CAMEL-23127: camel-jbang - Route transform to YAML with 
inlined errorHandler is empty (#21839)
621d031f0113 is described below

commit 621d031f0113273122c331bbf205f871ea2e39de
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Mar 9 09:59:10 2026 +0100

    CAMEL-23127: camel-jbang - Route transform to YAML with inlined 
errorHandler is empty (#21839)
---
 .../java/org/apache/camel/yaml/io/EipNode.java     |  4 +++
 .../java/org/apache/camel/yaml/io/YamlWriter.java  | 41 ++++++++++++++++++++--
 .../org/apache/camel/yaml/out/ModelWriterTest.java | 26 ++++++++++++++
 core/camel-yaml-io/src/test/resources/route17.yaml | 28 +++++++++++++++
 4 files changed, 96 insertions(+), 3 deletions(-)

diff --git 
a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/EipNode.java 
b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/EipNode.java
index bd85a0f461a8..843bc0d300ce 100644
--- a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/EipNode.java
+++ b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/EipNode.java
@@ -192,6 +192,10 @@ class EipNode {
                 if (otherwise != null) {
                     answer.put("otherwise", otherwise);
                 }
+            } else if ("errorHandler".equals(name)) {
+                EipNode o = outputs.get(0);
+                JsonObject jo = o.asJsonObject();
+                answer.put(o.getName(), jo);
             } else {
                 JsonArray arr = new JsonArray();
                 for (EipNode o : outputs) {
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 f4ef49a0d5b9..9a962617f86d 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
@@ -242,6 +242,8 @@ public class YamlWriter extends ServiceSupport implements 
CamelContextAware {
                     }
                 } else if ("marshal".equals(parent.getName()) || 
"unmarshal".equals(parent.getName())) {
                     parent.getMetadata().put("_dataFormatType", last);
+                } else if ("errorHandler".equals(parent.getName())) {
+                    parent.getMetadata().put("_errorHandlerType", last);
                 }
             }
         }
@@ -384,6 +386,10 @@ public class YamlWriter extends ServiceSupport implements 
CamelContextAware {
                     && "_dataFormatType".equals(key)) {
                 EipModel other = (EipModel) entry.getValue();
                 node.addOutput(asNode(other));
+            } else if ("errorHandler".equals(node.getName())
+                    && "_errorHandlerType".equals(key)) {
+                EipModel other = (EipModel) entry.getValue();
+                node.addOutput(asNode(other));
             } else {
                 boolean skip = key.startsWith("_") || key.equals("customId");
                 if (skip) {
@@ -472,6 +478,10 @@ public class YamlWriter extends ServiceSupport implements 
CamelContextAware {
                         if (r instanceof EipModel eipModel) {
                             EipNode en = asNode(eipModel);
                             value = en.asJsonObject();
+                            if ("route".equals(model.getName()) && 
"errorHandler".equals(en.getName())) {
+                                jo.put("errorHandler", value);
+                                continue;
+                            }
                             JsonObject wrap = new JsonObject();
                             wrap.put(en.getName(), value);
                             r = wrap;
@@ -481,11 +491,36 @@ public class YamlWriter extends ServiceSupport implements 
CamelContextAware {
                     if ("_output".equals(key)) {
                         key = "steps";
                     }
-                    // special with "from" where outputs needs to be embedded
-                    if (jo.containsKey("from")) {
-                        jo = jo.getMap("from");
+                    if ("route".equals(model.getName())) {
+                        // special with "from" where outputs needs to be 
embedded
+                        if (jo.containsKey("from")) {
+                            jo = jo.getMap("from");
+                        }
                     }
                     jo.put(key, list);
+                } else if ("_input".equals(key)) {
+                    jo = answer.getMap("route");
+                    if (!jo.containsKey("from")) {
+                        jo.put("from", new JsonObject());
+                    }
+                    jo = jo.getMap("from");
+                    if (value instanceof EipModel eipModel) {
+                        EipNode r = asNode(eipModel);
+                        JsonObject uri = r.asJsonObject();
+                        Object steps = jo.remove("steps");
+                        if (steps == null) {
+                            // steps was placed directly on route and not 
under from so move it
+                            var route = answer.getMap("route");
+                            steps = route.remove("steps");
+                        }
+                        // ensure uri comes before steps
+                        jo.putAll(uri);
+                        if (steps != null) {
+                            jo.put("steps", steps);
+                        }
+                    } else {
+                        jo.put(key, value);
+                    }
                 } else {
                     if (value instanceof EipModel eipModel) {
                         EipNode r = asNode(eipModel);
diff --git 
a/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/ModelWriterTest.java
 
b/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/ModelWriterTest.java
index c11ef22274bd..122c5e032d99 100644
--- 
a/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/ModelWriterTest.java
+++ 
b/core/camel-yaml-io/src/test/java/org/apache/camel/yaml/out/ModelWriterTest.java
@@ -25,11 +25,13 @@ import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.model.AggregateDefinition;
 import org.apache.camel.model.ChoiceDefinition;
+import org.apache.camel.model.ErrorHandlerDefinition;
 import org.apache.camel.model.ExpressionSubElementDefinition;
 import org.apache.camel.model.FromDefinition;
 import org.apache.camel.model.LogDefinition;
 import org.apache.camel.model.MarshalDefinition;
 import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.model.ProcessDefinition;
 import org.apache.camel.model.ResequenceDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RoutesDefinition;
@@ -42,6 +44,7 @@ import org.apache.camel.model.SplitDefinition;
 import org.apache.camel.model.ToDefinition;
 import org.apache.camel.model.TransactedDefinition;
 import org.apache.camel.model.dataformat.CsvDataFormat;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.model.language.ConstantExpression;
 import org.apache.camel.model.language.HeaderExpression;
 import org.apache.camel.model.language.SimpleExpression;
@@ -436,4 +439,27 @@ public class ModelWriterTest {
         Assertions.assertEquals(expected, out);
     }
 
+    @Test
+    public void testErrorHandler() throws Exception {
+        StringWriter sw = new StringWriter();
+        ModelWriter writer = new ModelWriter(sw);
+
+        RouteDefinition route = new RouteDefinition();
+        ErrorHandlerDefinition ehd = new ErrorHandlerDefinition();
+        ehd.setErrorHandlerType(new NoErrorHandlerDefinition());
+        route.setErrorHandler(ehd);
+        route.setId("myRout17");
+        route.setInput(new FromDefinition("direct:sub"));
+        route.addOutput(new ToDefinition("mock:b"));
+        ProcessDefinition p = new ProcessDefinition();
+        p.setRef("myProcessor");
+        route.addOutput(p);
+
+        writer.writeRouteDefinition(route);
+
+        String out = sw.toString();
+        String expected = 
stripLineComments(Paths.get("src/test/resources/route17.yaml"), "#", true);
+        Assertions.assertEquals(expected, out);
+    }
+
 }
diff --git a/core/camel-yaml-io/src/test/resources/route17.yaml 
b/core/camel-yaml-io/src/test/resources/route17.yaml
new file mode 100644
index 000000000000..d8fedab22c94
--- /dev/null
+++ b/core/camel-yaml-io/src/test/resources/route17.yaml
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+
+- route:
+    id: myRout17
+    errorHandler:
+      noErrorHandler: {}
+    from:
+      uri: direct:sub
+      steps:
+        - to:
+            uri: mock:b
+        - process:
+            ref: myProcessor

Reply via email to