This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch eh in repository https://gitbox.apache.org/repos/asf/camel.git
commit f9b792de35f3f976677d07e2e1f8d6cd2bfa5f54 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Mar 9 09:24:34 2026 +0100 CAMEL-23127: camel-jbang - Route transform to YAML with inlined errorHandler is empty --- .../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
