You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/07/11 08:41:42 UTC

(camel) branch worktree-snazzy-petting-map created (now 21f00c532f85)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git


      at 21f00c532f85 CAMEL-23985: camel-yaml-dsl - Add more unit tests for YAML DSL bug fixes

This branch includes the following new commits:

     new c69d561e0bb2 CAMEL-23981: camel-yaml-dsl - Fix springTransactionErrorHandler constructing JtaTransactionErrorHandlerDefinition instead of SpringTransactionErrorHandlerDefinition
     new a26d225317bb CAMEL-23982: camel-yaml-dsl - Only clear bean cache when all pre-parsed resources have completed configure
     new c733bcba0b8c CAMEL-23983: camel-yaml-dsl - Fix @YamlProperty flag emission for required, deprecated, and secret
     new 91bb896e2537 CAMEL-23984: camel-yaml-dsl - Log warning when unsupported top-level YAML mapping is silently ignored
     new a5311e5553f6 CAMEL-23985: camel-yaml-dsl - Add validation in Pipe handling for unsupported ref kinds, missing sink endpoint, and empty errorHandler
     new 68021874bcfc CAMEL-23986: camel-yaml-dsl - Fix routeConfiguration losing line number, source location, and resource
     new 00c17d754e8f CAMEL-23987: camel-yaml-dsl - Add missing note property to OutputAwareFromDefinition, RouteConfiguration, and Kamelet deserializers
     new 399441c7533c CAMEL-23988: camel-yaml-dsl - Flatten nested-map multiValue endpoint parameters when URI has a path
     new 36ef79bd1565 CAMEL-23989: camel-yaml-dsl - Fix nodeAt() matching later pointer segments at wrong depth
     new ec5a94d4046f CAMEL-23990: camel-yaml-dsl-validator - Fix MessageFormat crash when error messages contain curly braces
     new eac1519fb182 CAMEL-23991: camel-yaml-dsl-validator - Fix application.yaml ignore check and make yamlFiles cache per-instance
     new 8b595a7ce400 CAMEL-23992: camel-yaml-dsl - Fix inverted $ref check in extractRequiredFromComposition
     new 2b4b23efb2cb CAMEL-23983: camel-yaml-dsl - Regenerate schema and deserializers after required/deprecated/secret fix
     new e53f2dd3fba1 CAMEL-23981: camel-yaml-dsl - Add unit tests for YAML DSL bug fixes
     new 21f00c532f85 CAMEL-23985: camel-yaml-dsl - Add more unit tests for YAML DSL bug fixes

The 15 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 04/15: CAMEL-23984: camel-yaml-dsl - Log warning when unsupported top-level YAML mapping is silently ignored

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 91bb896e25374ac04f0f1840b6e4adfa60b0dbf1
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:48:34 2026 +0200

    CAMEL-23984: camel-yaml-dsl - Log warning when unsupported top-level YAML mapping is silently ignored
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java   | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index 0c2edbc71c92..197284b6cd11 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -160,7 +160,13 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                             }
                         }
                     } else {
-                        doConfigure(target);
+                        boolean accepted = doConfigure(target);
+                        if (!accepted) {
+                            String loc = ctx.getResource() != null ? ctx.getResource().getLocation() : "";
+                            LOG.warn(
+                                    "Unsupported top-level YAML node in resource: {}. Ensure the YAML file uses a sequence (list) of route definitions.",
+                                    loc);
+                        }
                     }
                 }
 
@@ -326,7 +332,13 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                             }
                         }
                     } else {
-                        doConfiguration(target);
+                        boolean accepted = doConfiguration(target);
+                        if (!accepted) {
+                            String loc = ctx.getResource() != null ? ctx.getResource().getLocation() : "";
+                            LOG.warn(
+                                    "Unsupported top-level YAML node in resource: {}. Ensure the YAML file uses a sequence (list) of route definitions.",
+                                    loc);
+                        }
                     }
                 }
             }


(camel) 09/15: CAMEL-23989: camel-yaml-dsl - Fix nodeAt() matching later pointer segments at wrong depth

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 36ef79bd15651ac0dfc8a22395f4569234278ddd
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:59:04 2026 +0200

    CAMEL-23989: camel-yaml-dsl - Fix nodeAt() matching later pointer segments at wrong depth
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../apache/camel/dsl/yaml/common/YamlDeserializerSupport.java    | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java
index 0c661f570e2c..4b2bef9d6b5d 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java
@@ -418,17 +418,24 @@ public class YamlDeserializerSupport {
 
         MappingNode mn = asMappingNode(root);
         for (String path : pointer.split("/")) {
+            if (path.isEmpty()) {
+                continue;
+            }
             for (NodeTuple child : mn.getValue()) {
                 if (child.getKeyNode() instanceof ScalarNode) {
                     ScalarNode scalar = (ScalarNode) child.getKeyNode();
                     if (scalar.getValue().equals(path)) {
-                        String next = pointer.substring(path.length() + 1);
+                        String next = pointer.substring(pointer.indexOf(path) + path.length());
+                        if (next.startsWith("/")) {
+                            next = next.substring(1);
+                        }
                         return ObjectHelper.isEmpty(next)
                                 ? child.getValueNode()
                                 : nodeAt(child.getValueNode(), next);
                     }
                 }
             }
+            return null;
         }
 
         return null;


(camel) 03/15: CAMEL-23983: camel-yaml-dsl - Fix @YamlProperty flag emission for required, deprecated, and secret

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit c733bcba0b8cc557eddeeb7dd1e7aca49b195c4d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:39:48 2026 +0200

    CAMEL-23983: camel-yaml-dsl - Fix @YamlProperty flag emission for required, deprecated, and secret
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../dsl/yaml/GenerateYamlDeserializersMojo.java    | 28 ++++++++++------------
 .../maven/dsl/yaml/support/YamlProperties.java     |  2 +-
 2 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java
index e83a2766ec34..d0d60ae00fa9 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java
@@ -909,7 +909,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                                             .withDescription(descriptor.description(name))
                                             .withDisplayName(descriptor.displayName(name))
                                             .withDefaultValue(descriptor.defaultValue(name))
-                                            .withIsSecret(descriptor.defaultValue(name))
+                                            .withIsSecret(descriptor.isSecret(name))
                                             .build());
                         }
                         return true;
@@ -948,7 +948,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                                             .withDescription(descriptor.description(name))
                                             .withDisplayName(descriptor.displayName(name))
                                             .withDefaultValue(descriptor.defaultValue(name))
-                                            .withIsSecret(descriptor.defaultValue(name))
+                                            .withIsSecret(descriptor.isSecret(name))
                                             .build());
                         }
                         return true;
@@ -1024,7 +1024,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
             annotations.add(
                     YamlProperties.annotation(fieldName, "enum:" + String.join(",", values))
                             .withRequired(isRequired(field))
-                            .withRequired(isDeprecated(field))
+                            .withDeprecated(isDeprecated(field))
                             .withDescription(descriptor.description(fieldName))
                             .withDisplayName(descriptor.displayName(fieldName))
                             .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1039,7 +1039,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
             annotations.add(
                     YamlProperties.annotation(fieldName, "enum:" + getEnums(field))
                             .withRequired(isRequired(field))
-                            .withRequired(isDeprecated(field))
+                            .withDeprecated(isDeprecated(field))
                             .withDescription(descriptor.description(fieldName))
                             .withDisplayName(descriptor.displayName(fieldName))
                             .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1057,13 +1057,11 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                             YamlProperties.annotation(fieldName, "string")
                                     .withFormat("binary")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
                                     .withIsSecret(descriptor.isSecret(fieldName))
-                                    .withDefaultValue(descriptor.defaultValue(fieldName))
-                                    .withIsSecret(descriptor.isSecret(fieldName))
                                     .build());
                     break;
                 case "Z":
@@ -1075,7 +1073,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                     annotations.add(
                             YamlProperties.annotation(fieldName, "boolean")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1091,7 +1089,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                     annotations.add(
                             YamlProperties.annotation(fieldName, "number")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1107,7 +1105,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                     annotations.add(
                             YamlProperties.annotation(fieldName, "number")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1123,7 +1121,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                     annotations.add(
                             YamlProperties.annotation(fieldName, "number")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1187,7 +1185,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                     annotations.add(
                             YamlProperties.annotation(fieldName, "string")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1213,7 +1211,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                     annotations.add(
                             YamlProperties.annotation(fieldName, "number")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1229,7 +1227,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                     annotations.add(
                             YamlProperties.annotation(fieldName, "boolean")
                                     .withRequired(isRequired(field))
-                                    .withRequired(isDeprecated(field))
+                                    .withDeprecated(isDeprecated(field))
                                     .withDescription(descriptor.description(fieldName))
                                     .withDisplayName(descriptor.displayName(fieldName))
                                     .withDefaultValue(descriptor.defaultValue(fieldName))
@@ -1247,7 +1245,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo {
                                 YamlProperties.annotation(fieldName, "object")
                                         .withSubType(field.type().name().toString())
                                         .withRequired(isRequired(field))
-                                        .withRequired(isDeprecated(field))
+                                        .withDeprecated(isDeprecated(field))
                                         .withDescription(descriptor.description(fieldName))
                                         .withDisplayName(descriptor.displayName(fieldName))
                                         .withDefaultValue(descriptor.defaultValue(fieldName))
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/YamlProperties.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/YamlProperties.java
index 5bbd442855cc..377d97767f0d 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/YamlProperties.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/YamlProperties.java
@@ -142,7 +142,7 @@ public final class YamlProperties {
             if (node.isMissingNode()) {
                 return this;
             }
-            if (!node.isTextual()) {
+            if (!node.isTextual() && !node.isBoolean()) {
                 return this;
             }
 


(camel) 13/15: CAMEL-23983: camel-yaml-dsl - Regenerate schema and deserializers after required/deprecated/secret fix

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 2b4b23efb2cb74b15b98b419d48fc35f28906a1a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 10:36:13 2026 +0200

    CAMEL-23983: camel-yaml-dsl - Regenerate schema and deserializers after required/deprecated/secret fix
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../dsl/yaml/deserializers/ModelDeserializers.java | 36 ++++++-------
 .../resources/schema/camelYamlDsl-canonical.json   | 61 +++++++++++++++-------
 .../generated/resources/schema/camelYamlDsl.json   | 60 ++++++++++++++-------
 3 files changed, 101 insertions(+), 56 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 9100e8858fd7..49e692108309 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -1605,7 +1605,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "defaultValueStringAsNull", type = "boolean", defaultValue = "false", description = "To change the default value for string types to be null instead of an empty string.", displayName = "Default Value String As Null"),
                     @YamlProperty(name = "id", type = "string", description = "The id of this node", displayName = "Id"),
                     @YamlProperty(name = "locale", type = "string", description = "To configure a default locale to use, such as us for united states. To use the JVM platform default locale then use the name default.", displayName = "Locale"),
-                    @YamlProperty(name = "type", type = "enum:Csv,Fixed,KeyValue", description = "Whether to use Csv, Fixed, or KeyValue.", displayName = "Type"),
+                    @YamlProperty(name = "type", type = "enum:Csv,Fixed,KeyValue", required = true, description = "Whether to use Csv, Fixed, or KeyValue.", displayName = "Type"),
                     @YamlProperty(name = "unwrapSingleInstance", type = "boolean", defaultValue = "true", description = "When unmarshalling should a single instance be unwrapped and returned instead of wrapped in a java.util.List.", displayName = "Unwrap Single Instance")
             }
     )
@@ -2107,7 +2107,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "id", type = "string", description = "The id of this node", displayName = "Id"),
                     @YamlProperty(name = "key", type = "string", description = "The unique claim check key to use for Get, GetAndRemove, and Set operations.", displayName = "Key"),
                     @YamlProperty(name = "note", type = "string", description = "The note for this node", displayName = "Note"),
-                    @YamlProperty(name = "operation", type = "enum:Get,GetAndRemove,Set,Push,Pop", description = "The claim check operation to use. Get=retrieve, GetAndRemove=retrieve and remove, Set=store with key, Push=store on stack, Pop=retrieve from stack.", displayName = "Operation")
+                    @YamlProperty(name = "operation", type = "enum:Get,GetAndRemove,Set,Push,Pop", required = true, description = "The claim check operation to use. Get=retrieve, GetAndRemove=retrieve and remove, Set=store with key, Push=store on stack, Pop=retrieve from stack.", displayName = "Operation")
             }
     )
     public static class ClaimCheckDefinitionDeserializer extends YamlDeserializerBase<ClaimCheckDefinition> {
@@ -4510,7 +4510,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "security", type = "array:org.apache.camel.model.rest.SecurityDefinition", description = "Security settings for this REST operation", displayName = "Security"),
                     @YamlProperty(name = "skipBindingOnErrorCode", type = "boolean", defaultValue = "false", description = "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json / xml etc, as success messages otherwise will do. This option will override what may be configured on a parent level.", displayName = "Skip Binding On Error Code"),
                     @YamlProperty(name = "streamCache", type = "boolean", defaultValue = "false", description = "Whether stream caching is enabled on this rest operation.", displayName = "Stream Cache"),
-                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
+                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", required = true, description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
                     @YamlProperty(name = "type", type = "string", description = "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level.", displayName = "Type")
             }
     )
@@ -6010,7 +6010,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "security", type = "array:org.apache.camel.model.rest.SecurityDefinition", description = "Security settings for this REST operation", displayName = "Security"),
                     @YamlProperty(name = "skipBindingOnErrorCode", type = "boolean", defaultValue = "false", description = "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json / xml etc, as success messages otherwise will do. This option will override what may be configured on a parent level.", displayName = "Skip Binding On Error Code"),
                     @YamlProperty(name = "streamCache", type = "boolean", defaultValue = "false", description = "Whether stream caching is enabled on this rest operation.", displayName = "Stream Cache"),
-                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
+                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", required = true, description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
                     @YamlProperty(name = "type", type = "string", description = "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level.", displayName = "Type")
             }
     )
@@ -6582,7 +6582,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "security", type = "array:org.apache.camel.model.rest.SecurityDefinition", description = "Security settings for this REST operation", displayName = "Security"),
                     @YamlProperty(name = "skipBindingOnErrorCode", type = "boolean", defaultValue = "false", description = "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json / xml etc, as success messages otherwise will do. This option will override what may be configured on a parent level.", displayName = "Skip Binding On Error Code"),
                     @YamlProperty(name = "streamCache", type = "boolean", defaultValue = "false", description = "Whether stream caching is enabled on this rest operation.", displayName = "Stream Cache"),
-                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
+                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", required = true, description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
                     @YamlProperty(name = "type", type = "string", description = "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level.", displayName = "Type")
             }
     )
@@ -8529,7 +8529,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "maxOverlap", type = "number", required = true, description = "The maximum number of tokens that can overlap in each segment.", displayName = "Max Overlap"),
                     @YamlProperty(name = "maxTokens", type = "number", required = true, description = "The maximum number of tokens on each segment.", displayName = "Max Tokens"),
                     @YamlProperty(name = "modelName", type = "string", description = "The underlying model name used by the tokenizer. Providing this switches to computing segment sizes in terms of tokens.", displayName = "Model Name"),
-                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
+                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", required = true, description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
             }
     )
     public static class LangChain4jCharacterTokenizerDefinitionDeserializer extends YamlDeserializerBase<LangChain4jCharacterTokenizerDefinition> {
@@ -8592,7 +8592,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "maxOverlap", type = "number", required = true, description = "The maximum number of tokens that can overlap in each segment.", displayName = "Max Overlap"),
                     @YamlProperty(name = "maxTokens", type = "number", required = true, description = "The maximum number of tokens on each segment.", displayName = "Max Tokens"),
                     @YamlProperty(name = "modelName", type = "string", description = "The underlying model name used by the tokenizer. Providing this switches to computing segment sizes in terms of tokens.", displayName = "Model Name"),
-                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
+                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", required = true, description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
             }
     )
     public static class LangChain4jLineTokenizerDefinitionDeserializer extends YamlDeserializerBase<LangChain4jLineTokenizerDefinition> {
@@ -8655,7 +8655,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "maxOverlap", type = "number", required = true, description = "The maximum number of tokens that can overlap in each segment.", displayName = "Max Overlap"),
                     @YamlProperty(name = "maxTokens", type = "number", required = true, description = "The maximum number of tokens on each segment.", displayName = "Max Tokens"),
                     @YamlProperty(name = "modelName", type = "string", description = "The underlying model name used by the tokenizer. Providing this switches to computing segment sizes in terms of tokens.", displayName = "Model Name"),
-                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
+                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", required = true, description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
             }
     )
     public static class LangChain4jParagraphTokenizerDefinitionDeserializer extends YamlDeserializerBase<LangChain4jParagraphTokenizerDefinition> {
@@ -8718,7 +8718,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "maxOverlap", type = "number", required = true, description = "The maximum number of tokens that can overlap in each segment.", displayName = "Max Overlap"),
                     @YamlProperty(name = "maxTokens", type = "number", required = true, description = "The maximum number of tokens on each segment.", displayName = "Max Tokens"),
                     @YamlProperty(name = "modelName", type = "string", description = "The underlying model name used by the tokenizer. Providing this switches to computing segment sizes in terms of tokens.", displayName = "Model Name"),
-                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
+                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", required = true, description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
             }
     )
     public static class LangChain4jSentenceTokenizerDefinitionDeserializer extends YamlDeserializerBase<LangChain4jSentenceTokenizerDefinition> {
@@ -8777,7 +8777,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "maxOverlap", type = "number", required = true),
                     @YamlProperty(name = "maxTokens", type = "number", required = true),
                     @YamlProperty(name = "modelName", type = "string"),
-                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN")
+                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", required = true)
             }
     )
     public static class LangChain4jTokenizerDefinitionDeserializer extends YamlDeserializerBase<LangChain4jTokenizerDefinition> {
@@ -8840,7 +8840,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "maxOverlap", type = "number", required = true, description = "The maximum number of tokens that can overlap in each segment.", displayName = "Max Overlap"),
                     @YamlProperty(name = "maxTokens", type = "number", required = true, description = "The maximum number of tokens on each segment.", displayName = "Max Tokens"),
                     @YamlProperty(name = "modelName", type = "string", description = "The underlying model name used by the tokenizer. Providing this switches to computing segment sizes in terms of tokens.", displayName = "Model Name"),
-                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
+                    @YamlProperty(name = "tokenizerType", type = "enum:OPEN_AI,AZURE,QWEN", required = true, description = "The tokenizer type. Must be one of OPEN_AI, AZURE or QWEN.", displayName = "Tokenizer Type")
             }
     )
     public static class LangChain4jWordTokenizerDefinitionDeserializer extends YamlDeserializerBase<LangChain4jWordTokenizerDefinition> {
@@ -11393,7 +11393,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "examples", type = "array:org.apache.camel.model.rest.RestPropertyDefinition", description = "Examples of the parameter.", displayName = "Examples"),
                     @YamlProperty(name = "name", type = "string", required = true, description = "The parameter name.", displayName = "Name"),
                     @YamlProperty(name = "required", type = "boolean", defaultValue = "true", description = "Sets the parameter required flag.", displayName = "Required"),
-                    @YamlProperty(name = "type", type = "enum:body,formData,header,path,query", defaultValue = "path", description = "Sets the parameter type such as body, form, header, path, or query.", displayName = "Type")
+                    @YamlProperty(name = "type", type = "enum:body,formData,header,path,query", required = true, defaultValue = "path", description = "Sets the parameter type such as body, form, header, path, or query.", displayName = "Type")
             }
     )
     public static class ParamDefinitionDeserializer extends YamlDeserializerBase<ParamDefinition> {
@@ -11564,7 +11564,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "security", type = "array:org.apache.camel.model.rest.SecurityDefinition", description = "Security settings for this REST operation", displayName = "Security"),
                     @YamlProperty(name = "skipBindingOnErrorCode", type = "boolean", defaultValue = "false", description = "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json / xml etc, as success messages otherwise will do. This option will override what may be configured on a parent level.", displayName = "Skip Binding On Error Code"),
                     @YamlProperty(name = "streamCache", type = "boolean", defaultValue = "false", description = "Whether stream caching is enabled on this rest operation.", displayName = "Stream Cache"),
-                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
+                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", required = true, description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
                     @YamlProperty(name = "type", type = "string", description = "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level.", displayName = "Type")
             }
     )
@@ -12155,7 +12155,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "security", type = "array:org.apache.camel.model.rest.SecurityDefinition", description = "Security settings for this REST operation", displayName = "Security"),
                     @YamlProperty(name = "skipBindingOnErrorCode", type = "boolean", defaultValue = "false", description = "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json / xml etc, as success messages otherwise will do. This option will override what may be configured on a parent level.", displayName = "Skip Binding On Error Code"),
                     @YamlProperty(name = "streamCache", type = "boolean", defaultValue = "false", description = "Whether stream caching is enabled on this rest operation.", displayName = "Stream Cache"),
-                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
+                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", required = true, description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
                     @YamlProperty(name = "type", type = "string", description = "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level.", displayName = "Type")
             }
     )
@@ -12459,7 +12459,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             deprecated = false,
             properties = {
                     @YamlProperty(name = "__extends", type = "object:org.apache.camel.model.language.ExpressionDefinition", oneOf = "expression"),
-                    @YamlProperty(name = "expression", type = "object:org.apache.camel.model.language.ExpressionDefinition", description = "The property value as an expression.", displayName = "Expression", oneOf = "expression"),
+                    @YamlProperty(name = "expression", type = "object:org.apache.camel.model.language.ExpressionDefinition", required = true, description = "The property value as an expression.", displayName = "Expression", oneOf = "expression"),
                     @YamlProperty(name = "key", type = "string", required = true, description = "The property key.", displayName = "Key")
             }
     )
@@ -12704,7 +12704,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "security", type = "array:org.apache.camel.model.rest.SecurityDefinition", description = "Security settings for this REST operation", displayName = "Security"),
                     @YamlProperty(name = "skipBindingOnErrorCode", type = "boolean", defaultValue = "false", description = "Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error messages that do not bind to json / xml etc, as success messages otherwise will do. This option will override what may be configured on a parent level.", displayName = "Skip Binding On Error Code"),
                     @YamlProperty(name = "streamCache", type = "boolean", defaultValue = "false", description = "Whether stream caching is enabled on this rest operation.", displayName = "Stream Cache"),
-                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
+                    @YamlProperty(name = "to", type = "object:org.apache.camel.model.ToDefinition", required = true, description = "The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that handles this REST call.", displayName = "To"),
                     @YamlProperty(name = "type", type = "string", description = "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level.", displayName = "Type")
             }
     )
@@ -13793,7 +13793,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "batchConfig", type = "object:org.apache.camel.model.config.BatchResequencerConfig", oneOf = "resequencerConfig"),
                     @YamlProperty(name = "description", type = "string", description = "The description for this node", displayName = "Description"),
                     @YamlProperty(name = "disabled", type = "boolean", defaultValue = "false", description = "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
-                    @YamlProperty(name = "expression", type = "object:org.apache.camel.model.language.ExpressionDefinition", description = "Expression to use for re-ordering the messages, such as a header with a sequence number.", displayName = "Expression", oneOf = "expression"),
+                    @YamlProperty(name = "expression", type = "object:org.apache.camel.model.language.ExpressionDefinition", required = true, description = "Expression to use for re-ordering the messages, such as a header with a sequence number.", displayName = "Expression", oneOf = "expression"),
                     @YamlProperty(name = "id", type = "string", description = "The id of this node", displayName = "Id"),
                     @YamlProperty(name = "note", type = "string", description = "The note for this node", displayName = "Note"),
                     @YamlProperty(name = "steps", type = "array:org.apache.camel.model.ProcessorDefinition"),
@@ -16153,7 +16153,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "disabled", type = "boolean", defaultValue = "false", description = "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime.", displayName = "Disabled"),
                     @YamlProperty(name = "id", type = "string", description = "The id of this node", displayName = "Id"),
                     @YamlProperty(name = "note", type = "string", description = "The note for this node", displayName = "Note"),
-                    @YamlProperty(name = "pattern", type = "enum:InOnly,InOut", description = "The new exchange pattern to use from this point forward.", displayName = "Pattern")
+                    @YamlProperty(name = "pattern", type = "enum:InOnly,InOut", required = true, description = "The new exchange pattern to use from this point forward.", displayName = "Pattern")
             }
     )
     public static class SetExchangePatternDefinitionDeserializer extends YamlDeserializerBase<SetExchangePatternDefinition> {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json
index b255cbe5f0a2..5d39e4465d8b 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json
@@ -260,6 +260,9 @@
           "id" : {
             "type" : "string"
           },
+          "note" : {
+            "type" : "string"
+          },
           "parameters" : {
             "type" : "object"
           },
@@ -288,6 +291,9 @@
           "id" : {
             "type" : "string"
           },
+          "note" : {
+            "type" : "string"
+          },
           "parameters" : {
             "type" : "object"
           },
@@ -882,7 +888,8 @@
             "description" : "The claim check operation to use. Get=retrieve, GetAndRemove=retrieve and remove, Set=store with key, Push=store on stack, Pop=retrieve from stack.",
             "enum" : [ "Get", "GetAndRemove", "Set", "Push", "Pop" ]
           }
-        }
+        },
+        "required" : [ "operation" ]
       },
       "org.apache.camel.model.ContextScanDefinition" : {
         "title" : "Context Scan",
@@ -1872,9 +1879,15 @@
         "type" : "object",
         "additionalProperties" : false,
         "properties" : {
+          "description" : {
+            "type" : "string"
+          },
           "name" : {
             "type" : "string"
           },
+          "note" : {
+            "type" : "string"
+          },
           "parameters" : {
             "type" : "object"
           },
@@ -3077,7 +3090,7 @@
             "description" : "The property key."
           }
         },
-        "required" : [ "key" ]
+        "required" : [ "expression", "key" ]
       },
       "org.apache.camel.model.RecipientListDefinition" : {
         "title" : "Recipient List",
@@ -3584,7 +3597,8 @@
           "streamConfig" : {
             "$ref" : "#/items/definitions/org.apache.camel.model.config.StreamResequencerConfig"
           }
-        }
+        },
+        "required" : [ "expression" ]
       },
       "org.apache.camel.model.Resilience4jConfigurationDefinition" : {
         "title" : "Resilience4j Configuration",
@@ -3929,6 +3943,9 @@
               }
             }
           },
+          "note" : {
+            "type" : "string"
+          },
           "onCompletion" : {
             "type" : "array",
             "items" : {
@@ -4381,7 +4398,8 @@
             "description" : "The new exchange pattern to use from this point forward.",
             "enum" : [ "InOnly", "InOut" ]
           }
-        }
+        },
+        "required" : [ "pattern" ]
       },
       "org.apache.camel.model.SetHeaderDefinition" : {
         "title" : "Set Header",
@@ -6411,7 +6429,8 @@
             "description" : "When unmarshalling should a single instance be unwrapped and returned instead of wrapped in a java.util.List.",
             "default" : true
           }
-        }
+        },
+        "required" : [ "type" ]
       },
       "org.apache.camel.model.dataformat.CBORDataFormat" : {
         "title" : "CBOR",
@@ -10886,7 +10905,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.GetDefinition" : {
         "title" : "Get",
@@ -11029,7 +11049,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.HeadDefinition" : {
         "title" : "Head",
@@ -11172,7 +11193,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.MutualTLSDefinition" : {
         "title" : "Mutual TLS",
@@ -11398,7 +11420,7 @@
             "enum" : [ "body", "formData", "header", "path", "query" ]
           }
         },
-        "required" : [ "name" ]
+        "required" : [ "name", "type" ]
       },
       "org.apache.camel.model.rest.PatchDefinition" : {
         "title" : "Patch",
@@ -11541,7 +11563,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.PostDefinition" : {
         "title" : "Post",
@@ -11684,7 +11707,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.PutDefinition" : {
         "title" : "Put",
@@ -11827,7 +11851,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.ResponseHeaderDefinition" : {
         "title" : "Response Header",
@@ -12491,7 +12516,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jLineTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with line splitter",
@@ -12526,7 +12551,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jParagraphTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with paragraph splitter",
@@ -12561,7 +12586,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jSentenceTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with sentence splitter",
@@ -12596,7 +12621,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jTokenizerDefinition" : {
         "type" : "object",
@@ -12619,7 +12644,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jWordTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with word splitter",
@@ -12654,7 +12679,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.transformer.CustomTransformerDefinition" : {
         "title" : "Custom Transformer",
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index f97e7cb55df1..291c8c66db81 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -314,6 +314,9 @@
           "id" : {
             "type" : "string"
           },
+          "note" : {
+            "type" : "string"
+          },
           "parameters" : {
             "type" : "object"
           },
@@ -343,6 +346,9 @@
           "id" : {
             "type" : "string"
           },
+          "note" : {
+            "type" : "string"
+          },
           "parameters" : {
             "type" : "object"
           },
@@ -941,7 +947,8 @@
             "description" : "The claim check operation to use. Get=retrieve, GetAndRemove=retrieve and remove, Set=store with key, Push=store on stack, Pop=retrieve from stack.",
             "enum" : [ "Get", "GetAndRemove", "Set", "Push", "Pop" ]
           }
-        }
+        },
+        "required" : [ "operation" ]
       },
       "org.apache.camel.model.ContextScanDefinition" : {
         "title" : "Context Scan",
@@ -2691,9 +2698,15 @@
           "type" : "object",
           "additionalProperties" : false,
           "properties" : {
+            "description" : {
+              "type" : "string"
+            },
             "name" : {
               "type" : "string"
             },
+            "note" : {
+              "type" : "string"
+            },
             "parameters" : {
               "type" : "object"
             },
@@ -4638,8 +4651,6 @@
           }, {
             "not" : {
               "anyOf" : [ {
-                "required" : [ "expression" ]
-              }, {
                 "required" : [ "constant" ]
               }, {
                 "required" : [ "csimple" ]
@@ -5328,8 +5339,6 @@
           }, {
             "not" : {
               "anyOf" : [ {
-                "required" : [ "expression" ]
-              }, {
                 "required" : [ "constant" ]
               }, {
                 "required" : [ "csimple" ]
@@ -5839,6 +5848,9 @@
               }
             }
           },
+          "note" : {
+            "type" : "string"
+          },
           "onCompletion" : {
             "type" : "array",
             "items" : {
@@ -6592,7 +6604,8 @@
               "enum" : [ "InOnly", "InOut" ]
             }
           }
-        } ]
+        } ],
+        "required" : [ "pattern" ]
       },
       "org.apache.camel.model.SetHeaderDefinition" : {
         "title" : "Set Header",
@@ -9834,7 +9847,8 @@
             "description" : "When unmarshalling should a single instance be unwrapped and returned instead of wrapped in a java.util.List.",
             "default" : true
           }
-        }
+        },
+        "required" : [ "type" ]
       },
       "org.apache.camel.model.dataformat.CBORDataFormat" : {
         "title" : "CBOR",
@@ -14607,7 +14621,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.GetDefinition" : {
         "title" : "Get",
@@ -14750,7 +14765,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.HeadDefinition" : {
         "title" : "Head",
@@ -14893,7 +14909,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.MutualTLSDefinition" : {
         "title" : "Mutual TLS",
@@ -15119,7 +15136,7 @@
             "enum" : [ "body", "formData", "header", "path", "query" ]
           }
         },
-        "required" : [ "name" ]
+        "required" : [ "name", "type" ]
       },
       "org.apache.camel.model.rest.PatchDefinition" : {
         "title" : "Patch",
@@ -15262,7 +15279,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.PostDefinition" : {
         "title" : "Post",
@@ -15405,7 +15423,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.PutDefinition" : {
         "title" : "Put",
@@ -15548,7 +15567,8 @@
             "title" : "Type",
             "description" : "Sets the class name to use for binding from input to POJO for the incoming data. This option will override what may be configured on a parent level."
           }
-        }
+        },
+        "required" : [ "to" ]
       },
       "org.apache.camel.model.rest.ResponseHeaderDefinition" : {
         "title" : "Response Header",
@@ -16212,7 +16232,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jLineTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with line splitter",
@@ -16247,7 +16267,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jParagraphTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with paragraph splitter",
@@ -16282,7 +16302,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jSentenceTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with sentence splitter",
@@ -16317,7 +16337,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jTokenizerDefinition" : {
         "type" : "object",
@@ -16340,7 +16360,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.tokenizer.LangChain4jWordTokenizerDefinition" : {
         "title" : "LangChain4J Tokenizer with word splitter",
@@ -16375,7 +16395,7 @@
             "enum" : [ "OPEN_AI", "AZURE", "QWEN" ]
           }
         },
-        "required" : [ "maxOverlap", "maxTokens" ]
+        "required" : [ "maxOverlap", "maxTokens", "tokenizerType" ]
       },
       "org.apache.camel.model.transformer.CustomTransformerDefinition" : {
         "title" : "Custom Transformer",


(camel) 08/15: CAMEL-23988: camel-yaml-dsl - Flatten nested-map multiValue endpoint parameters when URI has a path

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 399441c7533cd91a7ab4b7f87ee2900cda971fb0
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:56:43 2026 +0200

    CAMEL-23988: camel-yaml-dsl - Flatten nested-map multiValue endpoint parameters when URI has a path
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../java/org/apache/camel/dsl/yaml/common/YamlSupport.java | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java
index ed59e13806fd..aebd4bbda4fd 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java
@@ -119,6 +119,20 @@ public final class YamlSupport {
                         }
                     }
 
+                    // flatten multiValue map parameters
+                    for (Map.Entry<String, String> multi : factory.multiValuePrefixes().entrySet()) {
+                        Object val = options.get(multi.getKey());
+                        if (val instanceof Map<?, ?> m) {
+                            String prefix = multi.getValue();
+                            for (var entry : m.entrySet()) {
+                                if (entry.getValue() != null) {
+                                    options.put(prefix + entry.getKey(), entry.getValue());
+                                }
+                            }
+                            options.remove(multi.getKey());
+                        }
+                    }
+
                     answer += "?" + URISupport.createQueryString(options, false);
                 }
             } else {


(camel) 01/15: CAMEL-23981: camel-yaml-dsl - Fix springTransactionErrorHandler constructing JtaTransactionErrorHandlerDefinition instead of SpringTransactionErrorHandlerDefinition

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit c69d561e0bb2efa5d2318d5860b3f3968d498aea
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:04:33 2026 +0200

    CAMEL-23981: camel-yaml-dsl - Fix springTransactionErrorHandler constructing JtaTransactionErrorHandlerDefinition instead of SpringTransactionErrorHandlerDefinition
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../camel/dsl/yaml/deserializers/ErrorHandlerDeserializer.java       | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ErrorHandlerDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ErrorHandlerDeserializer.java
index 8d76392b74d7..4aab6dafd507 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ErrorHandlerDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ErrorHandlerDeserializer.java
@@ -28,6 +28,7 @@ import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.RefErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
 import org.apache.camel.spi.CamelContextCustomizer;
 import org.apache.camel.spi.annotations.YamlIn;
 import org.apache.camel.spi.annotations.YamlProperty;
@@ -110,9 +111,11 @@ public class ErrorHandlerDeserializer implements ConstructNode {
                     factory = asType(val, DefaultErrorHandlerDefinition.class);
                     break;
                 case "jtaTransactionErrorHandler":
-                case "springTransactionErrorHandler":
                     factory = asType(val, JtaTransactionErrorHandlerDefinition.class);
                     break;
+                case "springTransactionErrorHandler":
+                    factory = asType(val, SpringTransactionErrorHandlerDefinition.class);
+                    break;
                 case "noErrorHandler":
                     factory = asType(val, NoErrorHandlerDefinition.class);
                     break;


(camel) 15/15: CAMEL-23985: camel-yaml-dsl - Add more unit tests for YAML DSL bug fixes

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 21f00c532f8516963e9e64ba9610e45a3230e2bd
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 10:41:01 2026 +0200

    CAMEL-23985: camel-yaml-dsl - Add more unit tests for YAML DSL bug fixes
    
    Tests added:
    - RouteConfigurationTest: note property is parsed (CAMEL-23987) and line number/location are set (CAMEL-23986)
    - KameletTest: note and description properties are parsed (CAMEL-23987)
    - PipeLoaderTest: unsupported ref kind throws clear error (CAMEL-23985)
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../org/apache/camel/dsl/yaml/KameletTest.groovy   | 39 ++++++++++++++
 .../apache/camel/dsl/yaml/PipeLoaderTest.groovy    | 31 ++++++++++++
 .../camel/dsl/yaml/RouteConfigurationTest.groovy   | 59 ++++++++++++++++++++++
 3 files changed, 129 insertions(+)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy
index 05b913beeebc..6bb97540ec6e 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy
@@ -21,6 +21,7 @@ import org.apache.camel.dsl.yaml.common.YamlDeserializationMode
 import org.apache.camel.dsl.yaml.support.YamlTestSupport
 import org.apache.camel.dsl.yaml.support.model.MySetBody
 import org.apache.camel.dsl.yaml.support.model.MyUppercaseProcessor
+import org.apache.camel.model.KameletDefinition
 import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy
 import org.apache.camel.spi.Resource
 
@@ -421,4 +422,42 @@ class KameletTest extends YamlTestSupport {
         then:
             MockEndpoint.assertIsSatisfied(context)
     }
+
+    def "kamelet (note property)"() {
+        setup:
+            addTemplate('setPayload') {
+                from('kamelet:source')
+                    .setBody().simple('${body}: {{payload}}')
+            }
+
+            loadRoutesNoValidate '''
+                - from:
+                    uri: "direct:start"
+                    steps:
+                      - kamelet:
+                          name: "setPayload"
+                          description: "calls setPayload template"
+                          note: "a developer note"
+                          parameters:
+                            payload: 1
+                      - to: "mock:kamelet"
+            '''
+
+            withMock('mock:kamelet') {
+                expectedMessageCount 1
+                expectedBodiesReceived 'a: 1'
+            }
+        when:
+            withTemplate {
+                to('direct:start').withBody('a').send()
+            }
+
+        then:
+            MockEndpoint.assertIsSatisfied(context)
+
+            with(context.routeDefinitions[0].outputs[0], KameletDefinition) {
+                description == 'calls setPayload template'
+                note == 'a developer note'
+            }
+    }
 }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy
index 66af9b152ab6..5087d7c2b0b4 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy
@@ -20,6 +20,7 @@ import org.apache.camel.dsl.yaml.support.YamlTestSupport
 import org.apache.camel.model.KameletDefinition
 import org.apache.camel.model.ToDefinition
 import org.apache.camel.model.TransformDataTypeDefinition
+import org.junit.jupiter.api.Assertions
 
 class PipeLoaderTest extends YamlTestSupport {
     @Override
@@ -823,4 +824,34 @@ class PipeLoaderTest extends YamlTestSupport {
         }
     }
 
+    def "Error: Pipe with unsupported ref kind"() {
+        when:
+        var pipe = '''
+                apiVersion: camel.apache.org/v1
+                kind: Pipe
+                metadata:
+                  name: bad-ref-pipe
+                spec:
+                  source:
+                    ref:
+                      kind: Kamelet
+                      apiVersion: camel.apache.org/v1
+                      name: timer-source
+                    properties:
+                      message: "Hello"
+                  sink:
+                    ref:
+                      kind: UnknownKind
+                      apiVersion: unknown/v1
+                      name: bad-sink
+            '''
+        then:
+        try {
+            loadBindings(pipe)
+            Assertions.fail("Should have thrown exception")
+        } catch (e) {
+            assert e.message.contains("Unsupported Pipe ref kind")
+        }
+    }
+
 }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy
index fb8ae9e65a5c..3e237f9024af 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy
@@ -26,6 +26,9 @@ import org.junit.jupiter.api.Assertions
 
 import static org.apache.camel.util.PropertiesHelper.asProperties
 
+import org.apache.camel.spi.Resource
+import org.apache.camel.support.PluginHelper
+
 class RouteConfigurationTest extends YamlTestSupport {
     def "routeConfiguration"() {
         setup:
@@ -401,4 +404,60 @@ class RouteConfigurationTest extends YamlTestSupport {
         MockEndpoint.assertIsSatisfied(context)
     }
 
+    def "routeConfiguration note"() {
+        when:
+        loadRoutesNoValidate """
+                - routeConfiguration:
+                    id: myConfig
+                    description: my route config
+                    note: a developer note
+                    onException:
+                      - onException:
+                          handled:
+                            constant: "true"
+                          exception:
+                            - ${MyException.name}
+                          steps:
+                            - transform:
+                                constant: "Sorry"
+                            - to: "mock:on-exception"
+            """
+        then:
+        context.routeConfigurationDefinitions.size() == 1
+
+        with(context.routeConfigurationDefinitions[0], RouteConfigurationDefinition) {
+            id == 'myConfig'
+            description == 'my route config'
+            note == 'a developer note'
+        }
+    }
+
+    def "routeConfiguration has line number"() {
+        when:
+        Resource res = asResource('route-config-line',
+            '''
+                - routeConfiguration:
+                    id: myConfig
+                    onException:
+                      - onException:
+                          handled:
+                            constant: "true"
+                          exception:
+                            - java.lang.Exception
+                          steps:
+                            - to: "mock:on-exception"
+            '''
+        )
+        PluginHelper.getRoutesLoader(context).loadRoutes(res)
+
+        then:
+        context.routeConfigurationDefinitions.size() == 1
+
+        with(context.routeConfigurationDefinitions[0], RouteConfigurationDefinition) {
+            id == 'myConfig'
+            lineNumber >= 0
+            location != null
+        }
+    }
+
 }


(camel) 14/15: CAMEL-23981: camel-yaml-dsl - Add unit tests for YAML DSL bug fixes

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e53f2dd3fba159cd127dc7b8d7af1e3b05ccf7c2
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 10:36:24 2026 +0200

    CAMEL-23981: camel-yaml-dsl - Add unit tests for YAML DSL bug fixes
    
    Tests added:
    - ErrorHandlerTest: springTransactionErrorHandler creates correct definition type (CAMEL-23981)
    - RoutesTest: from note property is parsed correctly (CAMEL-23987)
    - NodeAtTest: nodeAt() handles leading slash, multi-level paths, and missing segments (CAMEL-23989)
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../apache/camel/dsl/yaml/common/NodeAtTest.groovy | 107 +++++++++++++++++++++
 .../apache/camel/dsl/yaml/ErrorHandlerTest.groovy  |  16 +++
 .../org/apache/camel/dsl/yaml/RoutesTest.groovy    |  26 +++++
 3 files changed, 149 insertions(+)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/test/groovy/org/apache/camel/dsl/yaml/common/NodeAtTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/test/groovy/org/apache/camel/dsl/yaml/common/NodeAtTest.groovy
new file mode 100644
index 000000000000..9df80f30ca8a
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/test/groovy/org/apache/camel/dsl/yaml/common/NodeAtTest.groovy
@@ -0,0 +1,107 @@
+/*
+ * 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.
+ */
+package org.apache.camel.dsl.yaml.common
+
+import org.snakeyaml.engine.v2.common.FlowStyle
+import org.snakeyaml.engine.v2.common.ScalarStyle
+import org.snakeyaml.engine.v2.nodes.MappingNode
+import org.snakeyaml.engine.v2.nodes.NodeTuple
+import org.snakeyaml.engine.v2.nodes.ScalarNode
+import org.snakeyaml.engine.v2.nodes.Tag
+import spock.lang.Specification
+
+class NodeAtTest extends Specification {
+
+    private static ScalarNode scalar(String value) {
+        return new ScalarNode(Tag.STR, value, ScalarStyle.PLAIN)
+    }
+
+    private static MappingNode mapping(Map<String, Object> entries) {
+        def tuples = entries.collect { k, v ->
+            def valNode = v instanceof Map ? mapping(v as Map<String, Object>) : scalar(v.toString())
+            new NodeTuple(scalar(k), valNode)
+        }
+        return new MappingNode(Tag.MAP, tuples, FlowStyle.BLOCK)
+    }
+
+    def "nodeAt with leading slash"() {
+        given:
+            def root = mapping(foo: [bar: 'hello'])
+        when:
+            def result = YamlDeserializerSupport.nodeAt(root, "/foo/bar")
+        then:
+            result instanceof ScalarNode
+            (result as ScalarNode).value == 'hello'
+    }
+
+    def "nodeAt without leading slash"() {
+        given:
+            def root = mapping(foo: [bar: 'hello'])
+        when:
+            def result = YamlDeserializerSupport.nodeAt(root, "foo/bar")
+        then:
+            result instanceof ScalarNode
+            (result as ScalarNode).value == 'hello'
+    }
+
+    def "nodeAt single segment"() {
+        given:
+            def root = mapping(foo: 'hello')
+        when:
+            def result = YamlDeserializerSupport.nodeAt(root, "/foo")
+        then:
+            result instanceof ScalarNode
+            (result as ScalarNode).value == 'hello'
+    }
+
+    def "nodeAt returns null for missing path"() {
+        given:
+            def root = mapping(foo: [bar: 'hello'])
+        when:
+            def result = YamlDeserializerSupport.nodeAt(root, "/foo/missing")
+        then:
+            result == null
+    }
+
+    def "nodeAt with empty pointer returns root"() {
+        given:
+            def root = mapping(foo: 'hello')
+        when:
+            def result = YamlDeserializerSupport.nodeAt(root, "")
+        then:
+            result == root
+    }
+
+    def "nodeAt three levels deep"() {
+        given:
+            def root = mapping(a: [b: [c: 'deep']])
+        when:
+            def result = YamlDeserializerSupport.nodeAt(root, "/a/b/c")
+        then:
+            result instanceof ScalarNode
+            (result as ScalarNode).value == 'deep'
+    }
+
+    def "nodeAt stops at first missing segment"() {
+        given:
+            def root = mapping(a: [b: [c: 'deep']])
+        when:
+            def result = YamlDeserializerSupport.nodeAt(root, "/a/missing/c")
+        then:
+            result == null
+    }
+}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ErrorHandlerTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ErrorHandlerTest.groovy
index 0cbeaddfdf54..39cdaba9fda8 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ErrorHandlerTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ErrorHandlerTest.groovy
@@ -23,6 +23,7 @@ import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition
 import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition
 import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition
 import org.apache.camel.model.errorhandler.RefErrorHandlerDefinition
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition
 import org.junit.jupiter.api.Assertions
 
 class ErrorHandlerTest extends YamlTestSupport {
@@ -172,6 +173,21 @@ class ErrorHandlerTest extends YamlTestSupport {
         }
     }
 
+    def "errorHandler (springTransactionErrorHandler)"() {
+        setup:
+            loadRoutesNoValidate """
+                - errorHandler:
+                    springTransactionErrorHandler:
+                      transactedPolicyRef: "myTxPolicy"
+            """
+        when:
+            context.start()
+        then:
+            with(context.getCamelContextExtension().getErrorHandlerFactory(), SpringTransactionErrorHandlerDefinition) {
+                transactedPolicyRef == 'myTxPolicy'
+            }
+    }
+
     def "Error: duplicate errorHandler"() {
         when:
         var route = """
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy
index 9811203fe2bd..eadf95a40c0c 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy
@@ -365,6 +365,32 @@ class RoutesTest extends YamlTestSupport {
         }
     }
 
+    def "load from note"() {
+        when:
+        loadRoutes '''
+                - from:
+                    id: from-demo
+                    description: from something cool
+                    note: a developer note
+                    uri: "direct:info"
+                    steps:
+                      - log: "message"
+            '''
+        then:
+        context.routeDefinitions.size() == 1
+
+        with(context.routeDefinitions[0], RouteDefinition) {
+            input.id == 'from-demo'
+            input.description == 'from something cool'
+            input.note == 'a developer note'
+            input.endpointUri == 'direct:info'
+
+            with (outputs[0], LogDefinition) {
+                message == 'message'
+            }
+        }
+    }
+
     def "load route with from description"() {
         when:
         loadRoutes '''


(camel) 12/15: CAMEL-23992: camel-yaml-dsl - Fix inverted $ref check in extractRequiredFromComposition

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 8b595a7ce400a0e1ecf2ae7a20e039d36bc93807
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 10:20:02 2026 +0200

    CAMEL-23992: camel-yaml-dsl - Fix inverted $ref check in extractRequiredFromComposition
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java
index 3ddafcf93a06..2fd42f59817f 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java
@@ -578,7 +578,7 @@ public class GenerateYamlSchemaMojo extends GenerateYamlSupportMojo {
         }
 
         composition.forEach(compositionEntry -> {
-            if (!compositionEntry.has("$ref")) {
+            if (compositionEntry.has("$ref")) {
                 String parentName = StringHelper.after(compositionEntry.get("$ref").asText(), "/definitions/");
                 ObjectNode referredObject = definitions.withObject("/" + parentName);
                 extractRequiredFromComposition(negations, referredObject);


(camel) 07/15: CAMEL-23987: camel-yaml-dsl - Add missing note property to OutputAwareFromDefinition, RouteConfiguration, and Kamelet deserializers

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 00c17d754e8f1de8e28c36f772026a6bf55cdd89
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:54:33 2026 +0200

    CAMEL-23987: camel-yaml-dsl - Add missing note property to OutputAwareFromDefinition, RouteConfiguration, and Kamelet deserializers
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../apache/camel/dsl/yaml/deserializers/KameletDeserializer.java  | 8 ++++++++
 .../yaml/deserializers/OutputAwareFromDefinitionDeserializer.java | 8 ++++++++
 .../deserializers/RouteConfigurationDefinitionDeserializer.java   | 4 ++++
 3 files changed, 20 insertions(+)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/KameletDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/KameletDeserializer.java
index 59bf9a8dda12..04821dac494c 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/KameletDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/KameletDeserializer.java
@@ -37,6 +37,8 @@ import org.snakeyaml.engine.v2.nodes.NodeTuple;
           nodes = "kamelet",
           properties = {
                   @YamlProperty(name = "name", type = "string", required = true),
+                  @YamlProperty(name = "description", type = "string"),
+                  @YamlProperty(name = "note", type = "string"),
                   @YamlProperty(name = "parameters", type = "object"),
                   @YamlProperty(name = "steps", type = "array:org.apache.camel.model.ProcessorDefinition")
           })
@@ -76,6 +78,12 @@ public class KameletDeserializer extends YamlDeserializerBase<KameletDefinition>
                 case "id":
                     target.setId(asText(val));
                     break;
+                case "description":
+                    target.setDescription(asText(val));
+                    break;
+                case "note":
+                    target.setNote(asText(val));
+                    break;
                 case "name":
                     name = asText(val);
                     break;
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java
index e587b71ef4a0..12850af756e0 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java
@@ -40,6 +40,7 @@ import org.snakeyaml.engine.v2.nodes.NodeTuple;
                   @YamlProperty(name = "variableReceive", type = "string"),
                   @YamlProperty(name = "id", type = "string"),
                   @YamlProperty(name = "description", type = "string"),
+                  @YamlProperty(name = "note", type = "string"),
                   @YamlProperty(name = "parameters", type = "object"),
                   @YamlProperty(name = "steps", type = "array:org.apache.camel.model.ProcessorDefinition", required = true)
           })
@@ -71,6 +72,7 @@ public class OutputAwareFromDefinitionDeserializer extends YamlDeserializerBase<
         String uri = null;
         String id = null;
         String desc = null;
+        String note = null;
         String variableReceive = null;
         Map<String, Object> parameters = null;
 
@@ -88,6 +90,9 @@ public class OutputAwareFromDefinitionDeserializer extends YamlDeserializerBase<
                 case "description":
                     desc = asText(val);
                     break;
+                case "note":
+                    note = asText(val);
+                    break;
                 case "uri":
                     uri = asText(val);
                     break;
@@ -120,6 +125,9 @@ public class OutputAwareFromDefinitionDeserializer extends YamlDeserializerBase<
             if (desc != null) {
                 from.setDescription(desc);
             }
+            if (note != null) {
+                from.setNote(note);
+            }
             if (variableReceive != null) {
                 from.setVariableReceive(variableReceive);
             }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java
index 28d8b53ab87b..e6614cc28909 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java
@@ -44,6 +44,7 @@ import org.snakeyaml.engine.v2.nodes.NodeTuple;
           properties = {
                   @YamlProperty(name = "id", type = "string"),
                   @YamlProperty(name = "description", type = "string"),
+                  @YamlProperty(name = "note", type = "string"),
                   @YamlProperty(name = "precondition", type = "string"),
                   @YamlProperty(name = "errorHandler", type = "object:org.apache.camel.model.ErrorHandlerDefinition"),
                   @YamlProperty(name = "intercept", wrapItem = true,
@@ -94,6 +95,9 @@ public class RouteConfigurationDefinitionDeserializer extends YamlDeserializerBa
                 case "description":
                     target.setDescription(asText(val));
                     break;
+                case "note":
+                    target.setNote(asText(val));
+                    break;
                 case "precondition":
                     target.setPrecondition(asText(val));
                     break;


(camel) 10/15: CAMEL-23990: camel-yaml-dsl-validator - Fix MessageFormat crash when error messages contain curly braces

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ec5a94d4046fe846ca4e358d5e3556a6a15d782c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 10:01:22 2026 +0200

    CAMEL-23990: camel-yaml-dsl-validator - Fix MessageFormat crash when error messages contain curly braces
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java     | 4 +++-
 .../src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java | 4 +++-
 .../main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java  | 4 +++-
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
index e396aa06e5e1..9977323b38f3 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
@@ -98,9 +98,11 @@ public class CamelYamlParser {
                 return Collections.emptyList();
             }
         } catch (Exception e) {
+            String msg = e.getClass().getName() + ": " + e.getMessage();
             Error error = Error.builder()
                     .messageKey("parser")
-                    .format(new MessageFormat(e.getClass().getName() + ": " + e.getMessage()))
+                    .format(new MessageFormat("{0}"))
+                    .arguments(msg)
                     .build();
             return List.of(error);
         }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java
index 16142ce61b62..6b0753c0c8b1 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java
@@ -40,9 +40,11 @@ public class YamlParser {
             mapper.readTree(file);
             return Collections.emptyList();
         } catch (Exception e) {
+            String msg = e.getClass().getName() + ": " + e.getMessage();
             Error error = Error.builder()
                     .messageKey("parser")
-                    .format(new MessageFormat(e.getClass().getName() + ": " + e.getMessage()))
+                    .format(new MessageFormat("{0}"))
+                    .arguments(msg)
                     .build();
             return List.of(error);
         }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
index a55c58e10a13..91770407d318 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
@@ -66,9 +66,11 @@ public class YamlValidator {
             var target = mapper.readTree(file);
             return new ArrayList<>(schema.validate(target));
         } catch (Exception e) {
+            String msg = e.getClass().getName() + ": " + e.getMessage();
             Error error = Error.builder()
                     .messageKey("parser")
-                    .format(new MessageFormat(e.getClass().getName() + ": " + e.getMessage()))
+                    .format(new MessageFormat("{0}"))
+                    .arguments(msg)
                     .build();
             return List.of(error);
         }


(camel) 06/15: CAMEL-23986: camel-yaml-dsl - Fix routeConfiguration losing line number, source location, and resource

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 68021874bcfc7ecc816fe6e4d86527fa935bede9
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:53:00 2026 +0200

    CAMEL-23986: camel-yaml-dsl - Fix routeConfiguration losing line number, source location, and resource
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../deserializers/RouteConfigurationDefinitionDeserializer.java     | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java
index 45f0dbdab21c..28d8b53ab87b 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteConfigurationDefinitionDeserializer.java
@@ -76,6 +76,12 @@ public class RouteConfigurationDefinitionDeserializer extends YamlDeserializerBa
         final MappingNode bn = asMappingNode(node);
         setDeserializationContext(node, dc);
 
+        int line = -1;
+        if (node.getStartMark().isPresent()) {
+            line = node.getStartMark().get().getLine();
+        }
+        onNewTarget(node, target, line);
+
         for (NodeTuple tuple : bn.getValue()) {
             String key = asText(tuple.getKeyNode());
             Node val = tuple.getValueNode();


(camel) 11/15: CAMEL-23991: camel-yaml-dsl-validator - Fix application.yaml ignore check and make yamlFiles cache per-instance

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit eac1519fb1825f3568bc605043156917602540a2
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 10:02:17 2026 +0200

    CAMEL-23991: camel-yaml-dsl-validator - Fix application.yaml ignore check and make yamlFiles cache per-instance
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java     | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java
index a9e239972926..4cac71a01fb7 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java
@@ -45,7 +45,7 @@ public class ValidateMojo extends AbstractMojo {
 
     private final YamlValidator validator = new YamlValidator();
 
-    private static final String IGNORE_FILE = "application.yml";
+    private static final String IGNORE_FILE = "application";
 
     /**
      * The maven project.
@@ -103,10 +103,7 @@ public class ValidateMojo extends AbstractMojo {
     @Parameter(property = "camel.excludes")
     private String excludes;
 
-    /**
-     * yamlFiles in memory cache, useful for multi modules maven projects
-     */
-    private static final Set<File> yamlFiles = new LinkedHashSet<>();
+    private final Set<File> yamlFiles = new LinkedHashSet<>();
 
     private final RepositorySystem repositorySystem;
 


(camel) 05/15: CAMEL-23985: camel-yaml-dsl - Add validation in Pipe handling for unsupported ref kinds, missing sink endpoint, and empty errorHandler

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a5311e5553f6c883321e82fe1703520500ff9122
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:52:00 2026 +0200

    CAMEL-23985: camel-yaml-dsl - Add validation in Pipe handling for unsupported ref kinds, missing sink endpoint, and empty errorHandler
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java   | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index 197284b6cd11..de4298dc917b 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -520,7 +520,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
 
                 // is there any error handler?
                 MappingNode errorHandler = asMappingNode(nodeAt(root, "/spec/errorHandler"));
-                if (errorHandler != null) {
+                if (errorHandler != null && !errorHandler.getValue().isEmpty()) {
                     // there are 5 different error handlers, which one is it
                     NodeTuple nt = errorHandler.getValue().get(0);
                     String ehName = asText(nt.getKeyNode());
@@ -530,6 +530,10 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                         // a sink is a dead letter queue
                         DeadLetterChannelDefinition dlcd = new DeadLetterChannelDefinition();
                         MappingNode endpoint = asMappingNode(nodeAt(nt.getValueNode(), "/endpoint"));
+                        if (endpoint == null) {
+                            throw new IllegalArgumentException(
+                                    "Pipe errorHandler sink must have an endpoint defined");
+                        }
                         String dlq = extractCamelEndpointUri(endpoint);
                         dlcd.setDeadLetterUri(dlq);
                         ehf = dlcd;
@@ -604,6 +608,12 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
             uri = extractTupleValue(mn.getValue(), "name");
         } else {
             uri = extractTupleValue(node.getValue(), "uri");
+            if (uri == null && mn != null) {
+                String kind = extractTupleValue(mn.getValue(), "kind");
+                String apiVersion = extractTupleValue(mn.getValue(), "apiVersion");
+                throw new IllegalArgumentException(
+                        "Unsupported Pipe ref kind: " + kind + " (apiVersion: " + apiVersion + ")");
+            }
         }
 
         // properties


(camel) 02/15: CAMEL-23982: camel-yaml-dsl - Only clear bean cache when all pre-parsed resources have completed configure

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch worktree-snazzy-petting-map
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a26d225317bb752c2b9c847600307c6fc1bd8e8a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jul 11 09:34:02 2026 +0200

    CAMEL-23982: camel-yaml-dsl - Only clear bean cache when all pre-parsed resources have completed configure
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 .../main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java  | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index feab814755ab..0c2edbc71c92 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -171,7 +171,9 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                 if (resource != null) {
                     preparseDone.remove(resource.getLocation());
                 }
-                beansDeserializer.clearCache();
+                if (preparseDone.isEmpty()) {
+                    beansDeserializer.clearCache();
+                }
             }
 
             private boolean doConfigure(Object item) throws Exception {