From 9bb70213d6b67b6680448eb4dff7cbe6391d35f5 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 21 May 2026 09:06:36 +0200 Subject: [PATCH 1/2] CAMEL-23593: camel-yaml-io - Fix YAML dump for REST DSL and routeConfigurations The YamlWriter only special-cased "routes" and "dataFormats" as root container elements. When dumping REST DSL or routeConfiguration blocks, startElement/endElement fell through to the EipModel lookup path, producing empty objects like "rests: {}" or "routeConfigurations: {}". Add "rests" and "routeConfigurations" to the container name checks in both startElement() and endElement(), and fix NPE in the normalize command by wiring up the MavenResolverMixin. Co-Authored-By: Claude --- .../main/java/org/apache/camel/yaml/io/YamlWriter.java | 8 ++++---- .../core/commands/validate/YamlNormalizeCommand.java | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) 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 e9cf741459467..715128aa5e8cc 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 @@ -106,8 +106,8 @@ public void setUriAsParameters(boolean uriAsParameters) { } public void startElement(String name) throws IOException { - if ("routes".equals(name) || "dataFormats".equals(name)) { - // special for routes or dataFormats + if ("routes".equals(name) || "rests".equals(name) || "routeConfigurations".equals(name) + || "dataFormats".equals(name)) { routesIsRoot = true; return; } @@ -138,8 +138,8 @@ public void endExpressionElement(String name) throws IOException { } public void endElement(String name) throws IOException { - if ("routes".equals(name) || "dataFormats".equals(name)) { - // we are done + if ("routes".equals(name) || "rests".equals(name) || "routeConfigurations".equals(name) + || "dataFormats".equals(name)) { writer.write(toYaml()); return; } diff --git a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java index 9281ccfafd597..8e569c2eed00e 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java +++ b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlNormalizeCommand.java @@ -26,6 +26,7 @@ import org.apache.camel.dsl.jbang.core.commands.CamelCommand; import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain; +import org.apache.camel.dsl.jbang.core.commands.MavenResolverMixin; import org.apache.camel.dsl.jbang.core.commands.Run; import org.apache.camel.dsl.jbang.core.common.CamelJBangConstants; import org.apache.camel.dsl.jbang.core.common.CommandLineHelper; @@ -41,6 +42,9 @@ public class YamlNormalizeCommand extends CamelCommand { private static final String IGNORE_FILE = "application"; + @CommandLine.Mixin + MavenResolverMixin mavenResolver; + @CommandLine.Option(names = { "--output" }, description = "File or directory to write normalized output. If not specified, output is printed to console.") private String output; @@ -86,6 +90,7 @@ protected void doAddInitialProperty(KameletMain main) { main.addInitialProperty("camel.language.bean.validate", "false"); } }; + run.mavenResolver = mavenResolver; run.files = matched; run.executionLimitOptions.maxSeconds = 1; Integer exit = run.runTransform(true); From 4b56cf9c512fa901dd57e384d3bf18b5054e1cf5 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 21 May 2026 09:26:49 +0200 Subject: [PATCH 2/2] CAMEL-23593: camel-yaml-io - Fix circuitBreaker config placement in YAML dump The resilience4jConfiguration and faultToleranceConfiguration were incorrectly placed inside the circuitBreaker steps list instead of as direct properties. Add special-case handling in YamlWriter to treat them as configuration properties, following the same pattern used for resequence batchConfig/streamConfig. Co-Authored-By: Claude --- .../org/apache/camel/yaml/io/YamlWriter.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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 715128aa5e8cc..dc698a21e3041 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 @@ -228,6 +228,10 @@ public void endElement(String name) throws IOException { && ("batchConfig".equals(name) || "streamConfig".equals(name))) { // special for resequence setMetadata(parent, "resequenceConfig", last); + } else if ("circuitBreaker".equals(parent.getName()) + && ("resilience4jConfiguration".equals(name) + || "faultToleranceConfiguration".equals(name))) { + setMetadata(parent, name, last); } else if (parent.isOutput()) { List list = (List) parent.getMetadata().get("_output"); if (list == null) { @@ -368,6 +372,21 @@ private void doAsNode(EipModel model, EipNode node) { if (!jo.isEmpty()) { node.addProperty(config.getName(), jo); } + } else if ("circuitBreaker".equals(node.getName()) + && ("resilience4jConfiguration".equals(key) + || "faultToleranceConfiguration".equals(key))) { + EipModel config = (EipModel) entry.getValue(); + JsonObject jo = new JsonObject(); + for (var o : config.getOptions()) { + String n = o.getName(); + Object v = config.getMetadata().get(n); + if (v != null) { + jo.put(n, v); + } + } + if (!jo.isEmpty()) { + node.addProperty(config.getName(), jo); + } } else if ("choice".equals(node.getName()) && "otherwise".equals(key)) { EipModel other = (EipModel) entry.getValue(); node.addOutput(asNode(other));