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