You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by "davsclaus (via GitHub)" <gi...@apache.org> on 2026/09/23 06:19:36 UTC

[PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

davsclaus opened a new pull request, #26758:
URL: https://github.com/apache/camel/pull/26758

   ```yaml
   - to:
       uri: "http://localhost:8080/stock/${header.sku}"
   ```
   
   The endpoint of a `to:` is resolved once when the route starts, so the placeholder is sent as the text it is β€” url-encoded into the path β€” and every call fails. In the AI route benchmark two runs spent themselves on `http://localhost:8080/stock/$%7Bbody.sku%7D`, hundreds of redeliveries deep, before anything said why. The validator now says it, so `camel validate` and the camel-jbang MCP write/edit tools catch it before the route ever runs:
   
   > to: the uri holds an expression (${header.sku}) but the endpoint of a to: is fixed when the route starts, so it is sent as text: write toD: to build the uri for each message
   
   **Where it deliberately stays quiet** β€” the check is narrow on purpose:
   
   - only the path, never the options after the `?`, so the file component's `fileName=${date:now:yyyyMMdd}` is fine on a plain `to:`
   - `:#${...}`, the parameter the sql family binds per message
   - components that read their path as a script or a statement: `language`, `sql`, `sql-stored`, `elsql`, `jdbc`, `spring-jdbc`, `mybatis`, `xquery`, `xslt`
   - `{{property.placeholders}}`, which are resolved at startup and are not expressions
   
   The check ran against every YAML example in the EIP pages, the component pages and the user manual (the doc-example tests). After the exclusions above, exactly one block was flagged: the one on the to-eip page that the page itself introduces with "This snippet is not valid code" to explain why `toD` exists. A block can now carry `// yaml-validator: skip` to stay out of the validation and out of the samples, which also takes that invalid route out of `eip-samples.json` β€” the samples `camel_catalog_sample` hands to an agent as examples.
   
   Tests: `YamlValidatorDynamicUriTest` (the mistake in both forms, `toD` accepted, and the sql, language, file-option and property-placeholder cases), plus the doc-example suites. Full validator module: 140 green. Full reactor build green.
   
   πŸ€– Generated with [Claude Code](https://claude.com/claude-code)
   
   https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #26758:
URL: https://github.com/apache/camel/pull/26758#discussion_r4080492807


##########
dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/EipDocExamplesTest.java:
##########
@@ -141,6 +141,9 @@ private static DocExamples validate(List<String> pages) throws Exception {
                 if (skipped != null && yaml.contains(skipped)) {
                     continue;
                 }
+                if (DocBlocks.markedToSkip(doc, m.start())) {

Review Comment:
   ⚠️ **Incomplete consolidation β€” `EipDocExamplesTest` should call `DocBlocks.examples()`, not inline its own extraction.**
   
   This test (and `CatalogDocExamplesTest`) only borrow `markedToSkip()` from `DocBlocks` but still maintain their own block-extraction loop. Two concrete gaps:
   
   1. **No callout stripping** β€” `DocBlocks.examples()` runs `CALLOUT.matcher(m.group(1)).replaceAll("")` before returning each YAML block; these tests just do `m.group(1).stripTrailing()`. If any doc page has an AsciiDoc callout marker (`# <1>`) inside a YAML block, the plugin produces clean YAML while the test validates the raw annotated text β€” different behaviour from the same source.
   
   2. **Different `YAML_BLOCK` pattern** β€” `DocBlocks` uses `\[source,yaml\]\s*\n----\n` (tolerates trailing whitespace after the attribute list); this test uses `\[source,yaml\]\n-{4}\n` (no `\s*`, so a block preceded by e.g. `[source,yaml,options=...]` is matched by the plugin but missed by the test).
   
   The whole point of extracting `DocBlocks` was to have one canonical implementation. The fix is straightforward: replace the inline `YAML_BLOCK` loop in `EipDocExamplesTest.validate()` with `DocBlocks.examples(doc)` and iterate over that. The `EXAMPLES_SKIPPED` guard moves outside: check `yaml.contains(skipped)` on the already-filtered list. Same treatment for `CatalogDocExamplesTest`.



##########
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocExamplesTest.java:
##########
@@ -106,6 +107,10 @@ private static DocExamples validate(List<String> pages) {
                 if (skipped != null && yaml.contains(skipped)) {
                     continue;
                 }
+                if (DocBlocks.markedToSkip(doc, m.start())) {

Review Comment:
   Same issue as `EipDocExamplesTest`: this test calls `DocBlocks.markedToSkip()` but retains its own `YAML_BLOCK` pattern and skips callout stripping. Replace the `Matcher m = YAML_BLOCK.matcher(doc)` loop with `DocBlocks.examples(doc)` for consistency with `GenerateDocSamplesMojo`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #26758:
URL: https://github.com/apache/camel/pull/26758#discussion_r4080316773


##########
dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/DocBlocks.java:
##########
@@ -0,0 +1,67 @@
+/*
+ * 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.validator;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * The YAML route examples of an AsciiDoc page, for everything that reads the documentation: the doc-samples plugin and
+ * the tests that validate every example in the repository.
+ * <p/>
+ * A page that shows what to avoid - the to-eip page shows a {@code to:} with an expression in its uri to say why
+ * {@code toD} exists - marks the block with {@value #SKIP_MARKER} on a line before it, and it is then neither validated
+ * nor offered as a sample (CAMEL-24917).
+ */
+public final class DocBlocks {
+
+    /** The AsciiDoc comment that keeps a block out of the examples. */
+    public static final String SKIP_MARKER = "// yaml-validator: skip";
+
+    private static final Pattern YAML_BLOCK = Pattern.compile("\\[source,yaml\\]\\s*\\n----\\n(.*?)\\n----",
+            Pattern.DOTALL);
+
+    /** How far back the marker is looked for, enough for the tabs and titles between it and the block. */
+    private static final int MARKER_LOOKBEHIND = 200;
+
+    private DocBlocks() {
+    }
+
+    /** The route examples of the page: the YAML blocks that start with a top-level list entry, markers honoured. */
+    public static List<String> examples(String doc) {
+        List<String> answer = new ArrayList<>();
+        if (doc == null) {
+            return answer;
+        }
+        Matcher m = YAML_BLOCK.matcher(doc);
+        while (m.find()) {
+            String yaml = m.group(1).stripTrailing() + "\n";
+            if (yaml.stripLeading().startsWith("- ") && !markedToSkip(doc, m.start())) {
+                answer.add(yaml);
+            }
+        }
+        return answer;

Review Comment:
   ⚠️ **`DocBlocks.examples()` is public but never called β€” and it cannot be adopted as-is.**
   
   All three consumers (`GenerateDocSamplesMojo.examples()`, `EipDocExamplesTest`, `CatalogDocExamplesTest`) inline their own `YAML_BLOCK` matching and call only `markedToSkip()`. None of them call `DocBlocks.examples()`.
   
   Worse: `GenerateDocSamplesMojo.examples()` strips AsciiDoc callout markers (`# <1>`) from the YAML before storing it, whereas `DocBlocks.examples()` does not. If a future caller switches to `DocBlocks.examples()`, generated samples will contain callout noise that breaks YAML parsing.
   
   Either:
   - Remove `examples()` from `DocBlocks` (it is unused dead API) and leave the three callers as they are; or
   - Have the three callers use `DocBlocks.examples()` and move the callout-stripping into it, making the API actually shared.
   
   As written, the method promises reuse (`"for everything that reads the documentation"`) but silently diverges from two of the three callers the moment callouts appear in a page.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #26758:
URL: https://github.com/apache/camel/pull/26758#discussion_r4081056139


##########
dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/EipDocExamplesTest.java:
##########
@@ -141,6 +141,9 @@ private static DocExamples validate(List<String> pages) throws Exception {
                 if (skipped != null && yaml.contains(skipped)) {
                     continue;
                 }
+                if (DocBlocks.markedToSkip(doc, m.start())) {

Review Comment:
   Fair - I argued the tests needed their own loop to report *which* example failed, and that was wrong: `DocBlocks.examples()` returns the route examples in order, so the index in that list is the number the message wants.
   
   Both tests now read their blocks with `DocBlocks.examples(doc)` and their `YAML_BLOCK` patterns are gone. They gain the callout stripping, and one place is left that knows what a YAML route example is and which blocks are marked to be left out.
   
   One behaviour note: a marked block is no longer counted, so a page that has one shifts the numbering of the examples after it by one. Only to-eip has a marked block today.



##########
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocExamplesTest.java:
##########
@@ -106,6 +107,10 @@ private static DocExamples validate(List<String> pages) {
                 if (skipped != null && yaml.contains(skipped)) {
                     continue;
                 }
+                if (DocBlocks.markedToSkip(doc, m.start())) {

Review Comment:
   Done in the same change: `CatalogDocExamplesTest` reads `DocBlocks.examples(doc)` as well, and its own pattern is gone. Verified against the catalog after a rebuild - 2 tests green.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #26758:
URL: https://github.com/apache/camel/pull/26758#discussion_r4080274521


##########
dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java:
##########
@@ -668,6 +669,87 @@ void checkSimpleSyntaxInScripts(JsonNode node, NodePath path, List<Error> errors
         }
     }
 
+    /**
+     * to: http://host/stock/${header.sku}: the endpoint of a to: is resolved once when the route starts, so an
+     * expression in its path is never evaluated - it is sent as the text it is, url-encoded. That is what toD: is for
+     * (CAMEL-24917).
+     * <p/>
+     * Only the path is checked, never the options after the {@code ?}: an option such as the file component's
+     * {@code fileName=${date:now:yyyyMMdd}} is evaluated by the producer and is correct on a plain to:.
+     */
+    void checkDynamicUri(JsonNode node, NodePath path, List<Error> errors) {
+        if (node == null) {
+            return;
+        }
+        if (node.isArray()) {
+            for (int i = 0; i < node.size(); i++) {
+                checkDynamicUri(node.get(i), path.append(i), errors);
+            }
+            return;
+        }
+        if (!node.isObject()) {
+            return;
+        }
+        var fields = node.fieldNames();
+        while (fields.hasNext()) {
+            String name = fields.next();
+            JsonNode value = node.get(name);
+            if ("to".equals(name)) {
+                String uri = null;
+                NodePath at = path.append(name);
+                if (value.isTextual()) {
+                    uri = value.asText();
+                } else if (value.isObject() && value.has("uri") && value.get("uri").isTextual()) {
+                    uri = value.get("uri").asText();
+                    at = at.append("uri");
+                }
+                String expression = expressionInPath(uri);
+                if (expression != null) {
+                    errors.add(Error.builder()
+                            .keyword("type")
+                            .instanceLocation(at)
+                            .messageKey("type")
+                            .format(new MessageFormat("{0}"))
+                            .arguments("to: the uri holds an expression (" + expression + ") but the endpoint of a to:"
+                                       + " is fixed when the route starts, so it is sent as text: write toD: to build"
+                                       + " the uri for each message")
+                            .build());
+                }
+            }
+            checkDynamicUri(value, path.append(name), errors);
+        }
+    }
+
+    /**
+     * The first simple expression in the path of the uri (what comes before the options), or null when there is none.
+     */
+    private static String expressionInPath(String uri) {
+        if (uri == null) {
+            return null;
+        }
+        int scheme = uri.indexOf(':');
+        if (scheme > 0 && EVALUATED_PATH.contains(uri.substring(0, scheme))) {
+            return null;
+        }
+        String head = uri.indexOf('?') > 0 ? uri.substring(0, uri.indexOf('?')) : uri;
+        int start = head.indexOf("${");
+        if (start < 0) {
+            return null;
+        }
+        if (start >= 2 && head.startsWith(":#", start - 2)) {
+            return null; // :#${...} is a parameter the component binds per message, not part of the address
+        }
+        int end = head.indexOf('}', start);
+        return end > 0 ? head.substring(start, end + 1) : head.substring(start);
+    }
+
+    /**
+     * Components that read their path as a script, a statement or a template name and evaluate it for each message,
+     * where an expression in the path is what the component is for.
+     */
+    private static final Set<String> EVALUATED_PATH = Set.of("language", "sql", "sql-stored", "elsql", "jdbc",
+            "spring-jdbc", "mybatis", "xquery", "xslt");

Review Comment:
   Confirmed, and you are right about the reason: I put xslt and xquery in that list on a guess, not on reading them. Both resolve their resource once when the route starts, and a stylesheet per message is what `toD` and `allowTemplateFromHeader` are for - so a `${...}` in their path is exactly the mistake this check is meant to report. Same for `mybatis` and the jdbc family, which I had also added without verifying.
   
   The list is now the three I did read in their own producer: `language` (its path is a script in another language), `micrometer` and `opentelemetry-metrics` (both evaluate the metric name per message in `AbstractMicrometerProducer.process` / `AbstractOpenTelemetryProducer.process`). A test now locks the xslt case as reported.
   
   The list itself is the wrong mechanism though, so I filed CAMEL-24918: a `@Metadata(supportSimpleExpression = true)` flag that reaches the catalog, derived automatically for options typed `Expression` or `Predicate`, so the validator asks the component instead of me guessing. That follow-up removes the hardcoded pair as well.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #26758:
URL: https://github.com/apache/camel/pull/26758#issuecomment-5790089531

   :star2: Thank you for your contribution to the Apache Camel project! :star2:
     :robot: CI automation will test this PR automatically.
   
     :camel: Apache Camel Committers, please review the following items:
   
     * First-time contributors **require MANUAL approval** for the GitHub Actions to run
     * You can use the command `/component-test (camel-)component-name1 (camel-)component-name2..` to request a test from the test bot although they are normally detected and executed by CI.
     * You can label PRs using `skip-tests` and `test-dependents` to fine-tune the checks executed by this PR.
     * Build and test logs are available in the summary page. **Only** [Apache Camel committers](https://camel.apache.org/community/team/#committers) have access to the summary.
     
     :warning: Be careful when sharing logs. Review their contents before sharing them publicly.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #26758:
URL: https://github.com/apache/camel/pull/26758#discussion_r4079682637


##########
dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java:
##########
@@ -668,6 +669,87 @@ void checkSimpleSyntaxInScripts(JsonNode node, NodePath path, List<Error> errors
         }
     }
 
+    /**
+     * to: http://host/stock/${header.sku}: the endpoint of a to: is resolved once when the route starts, so an
+     * expression in its path is never evaluated - it is sent as the text it is, url-encoded. That is what toD: is for
+     * (CAMEL-24917).
+     * <p/>
+     * Only the path is checked, never the options after the {@code ?}: an option such as the file component's
+     * {@code fileName=${date:now:yyyyMMdd}} is evaluated by the producer and is correct on a plain to:.
+     */
+    void checkDynamicUri(JsonNode node, NodePath path, List<Error> errors) {
+        if (node == null) {
+            return;
+        }
+        if (node.isArray()) {
+            for (int i = 0; i < node.size(); i++) {
+                checkDynamicUri(node.get(i), path.append(i), errors);
+            }
+            return;
+        }
+        if (!node.isObject()) {
+            return;
+        }
+        var fields = node.fieldNames();
+        while (fields.hasNext()) {
+            String name = fields.next();
+            JsonNode value = node.get(name);
+            if ("to".equals(name)) {
+                String uri = null;
+                NodePath at = path.append(name);
+                if (value.isTextual()) {
+                    uri = value.asText();
+                } else if (value.isObject() && value.has("uri") && value.get("uri").isTextual()) {
+                    uri = value.get("uri").asText();
+                    at = at.append("uri");
+                }
+                String expression = expressionInPath(uri);
+                if (expression != null) {
+                    errors.add(Error.builder()
+                            .keyword("type")
+                            .instanceLocation(at)
+                            .messageKey("type")
+                            .format(new MessageFormat("{0}"))
+                            .arguments("to: the uri holds an expression (" + expression + ") but the endpoint of a to:"
+                                       + " is fixed when the route starts, so it is sent as text: write toD: to build"
+                                       + " the uri for each message")
+                            .build());
+                }
+            }
+            checkDynamicUri(value, path.append(name), errors);
+        }
+    }
+
+    /**
+     * The first simple expression in the path of the uri (what comes before the options), or null when there is none.
+     */
+    private static String expressionInPath(String uri) {
+        if (uri == null) {
+            return null;
+        }
+        int scheme = uri.indexOf(':');
+        if (scheme > 0 && EVALUATED_PATH.contains(uri.substring(0, scheme))) {
+            return null;
+        }
+        String head = uri.indexOf('?') > 0 ? uri.substring(0, uri.indexOf('?')) : uri;
+        int start = head.indexOf("${");
+        if (start < 0) {
+            return null;
+        }
+        if (start >= 2 && head.startsWith(":#", start - 2)) {
+            return null; // :#${...} is a parameter the component binds per message, not part of the address
+        }
+        int end = head.indexOf('}', start);
+        return end > 0 ? head.substring(start, end + 1) : head.substring(start);
+    }
+
+    /**
+     * Components that read their path as a script, a statement or a template name and evaluate it for each message,
+     * where an expression in the path is what the component is for.
+     */
+    private static final Set<String> EVALUATED_PATH = Set.of("language", "sql", "sql-stored", "elsql", "jdbc",
+            "spring-jdbc", "mybatis", "xquery", "xslt");

Review Comment:
   ⚠️ **`xslt` and `xquery` do not belong in `EVALUATED_PATH`.**
   
   The Javadoc says these components "read their path as a script, a statement or a template name and evaluate it for each message" β€” but that is not what they do. Both `XsltEndpoint` and `XQueryEndpoint` resolve their `resourceUri` **once at startup** and load the stylesheet/query from that fixed path. They never evaluate a `${...}` in the URI path per-message; dynamic template selection in `xslt` is done via `allowTemplateFromHeader` (a message header, not a path expression).
   
   Consequence: a user who writes
   ```yaml
   - to:
       uri: "xslt:my-${header.type}.xsl"
   ```
   gets no warning. The expression is sent as literal text at startup β€” the exact runtime-silent bug this PR guards against β€” and the validator lets it pass.
   
   Remove both from the set. Add two test cases in `YamlValidatorDynamicUriTest` asserting that `xslt:my-${header.type}.xsl` and `xquery:my-${header.type}.xq` **are** flagged.
   
   ```suggestion
       private static final Set<String> EVALUATED_PATH = Set.of("language", "sql", "sql-stored", "elsql", "jdbc",
               "spring-jdbc", "mybatis");
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #26758:
URL: https://github.com/apache/camel/pull/26758#discussion_r4080452142


##########
dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/DocBlocks.java:
##########
@@ -0,0 +1,67 @@
+/*
+ * 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.validator;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * The YAML route examples of an AsciiDoc page, for everything that reads the documentation: the doc-samples plugin and
+ * the tests that validate every example in the repository.
+ * <p/>
+ * A page that shows what to avoid - the to-eip page shows a {@code to:} with an expression in its uri to say why
+ * {@code toD} exists - marks the block with {@value #SKIP_MARKER} on a line before it, and it is then neither validated
+ * nor offered as a sample (CAMEL-24917).
+ */
+public final class DocBlocks {
+
+    /** The AsciiDoc comment that keeps a block out of the examples. */
+    public static final String SKIP_MARKER = "// yaml-validator: skip";
+
+    private static final Pattern YAML_BLOCK = Pattern.compile("\\[source,yaml\\]\\s*\\n----\\n(.*?)\\n----",
+            Pattern.DOTALL);
+
+    /** How far back the marker is looked for, enough for the tabs and titles between it and the block. */
+    private static final int MARKER_LOOKBEHIND = 200;
+
+    private DocBlocks() {
+    }
+
+    /** The route examples of the page: the YAML blocks that start with a top-level list entry, markers honoured. */
+    public static List<String> examples(String doc) {
+        List<String> answer = new ArrayList<>();
+        if (doc == null) {
+            return answer;
+        }
+        Matcher m = YAML_BLOCK.matcher(doc);
+        while (m.find()) {
+            String yaml = m.group(1).stripTrailing() + "\n";
+            if (yaml.stripLeading().startsWith("- ") && !markedToSkip(doc, m.start())) {
+                answer.add(yaml);
+            }
+        }
+        return answer;

Review Comment:
   Right on both counts - I pulled `markedToSkip` out for sharing and left `examples()` behind as an unused copy that had already drifted (the callout stripping).
   
   Fixed the other way round: `DocBlocks.examples()` is now the one implementation, callout stripping included, and `GenerateDocSamplesMojo.examples(File)` is a one-liner that calls it. Its own `YAML_BLOCK` and `CALLOUT` patterns are gone, so there is nothing left to drift.
   
   The two tests keep their own matching on purpose: they count examples per page and report *which* one failed ("to-eip example 2"), which the list `examples()` returns cannot express. They share the marker through `markedToSkip`, which is the part that must agree.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #26758:
URL: https://github.com/apache/camel/pull/26758#issuecomment-5790255928

   <!-- ci-tested-modules -->
   :test_tube: **CI tested the following changed modules:**
   
   - `catalog/camel-catalog`
   - `core/camel-core-engine`
   - `dsl/camel-jbang/camel-jbang-core`
   - `dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin`
   - `dsl/camel-yaml-dsl/camel-yaml-dsl-validator`
   
   > :information_source: Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the `test-dependents` label to force testing all dependents.
   
   ---
   
   <details><summary>:microscope: Scalpel shadow comparison β€” Scalpel: 493 of 693 tested, 26 compile-only β€” current: 493 all tested</summary>
   
   [Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **521 affected modules** (current approach: 493).
   
   **Skip-tests mode would test 493 modules** (5 direct + 490 downstream), **skip tests for 26** (generated code, meta-modules)
   
   <details><summary>:warning: Modules only in Scalpel (28)</summary>
   
   - `apache-camel`
   - `camel-allcomponents`
   - `camel-catalog`
   - `camel-catalog-console`
   - `camel-catalog-maven`
   - `camel-catalog-suggest`
   - `camel-componentdsl`
   - `camel-endpointdsl`
   - `camel-endpointdsl-support`
   - `camel-itest`
   - `camel-jbang-core`
   - `camel-jbang-it`
   - `camel-jbang-main`
   - `camel-jbang-plugin-edit`
   - `camel-jbang-plugin-generate`
   - `camel-jbang-plugin-kubernetes`
   - `camel-jbang-plugin-test`
   - `camel-kamelet-main`
   - `camel-launcher`
   - `camel-report-maven-plugin`
   - `camel-route-parser`
   - `camel-salesforce-maven-plugin`
   - `camel-yaml-dsl`
   - `camel-yaml-dsl-deserializers`
   - `camel-yaml-dsl-maven-plugin`
   - `coverage`
   - `docs`
   - `dummy-component`
   
   </details>
   
   
   <details><summary>Modules Scalpel would test (493)</summary>
   
   - `archetypes` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-a2a` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-activemq` ← downstream of org.apache.camel:camel-test-infra-core
   - `camel-activemq6` ← downstream of org.apache.camel:camel-test-infra-core
   - `camel-ai-observability` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ai-observability-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ai-resource` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ai-tool` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-eventbridge` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-fc` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-kms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-mns` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-oss` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-ots` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-sls` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-sms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-amqp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-api-component-maven-plugin` ← downstream of org.apache.camel:camel-core
   - `camel-arangodb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-api-component` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-component` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-dataformat` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-java` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-main` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-as2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-as2-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-asn1` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-asterisk` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-atmosphere-websocket` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-atom` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-attachments` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-avro-rpc` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-aws-bedrock` ← downstream of org.apache.camel:camel-jackson
   - `camel-aws-cloudtrail` ← downstream of org.apache.camel:camel-health
   - `camel-aws-config` ← downstream of org.apache.camel:camel-health
   - `camel-aws-parameter-store` ← downstream of org.apache.camel:camel-health
   - `camel-aws-secrets-manager` ← downstream of org.apache.camel:camel-health
   - `camel-aws-security-hub` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-athena` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-comprehend` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-cw` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-ddb` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-ec2` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-ecs` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-eks` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-eventbridge` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-iam` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-kinesis` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-kms` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-lambda` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-mq` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-msk` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-polly` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-redshift` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-rekognition` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-s3` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-s3-vectors` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-ses` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-sns` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-sqs` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-step-functions` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-sts` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-textract` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-timestream` ← downstream of org.apache.camel:camel-health
   - `camel-aws2-transcribe` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-aws2-translate` ← downstream of org.apache.camel:camel-health
   - `camel-azure-cosmosdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-eventgrid` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-eventhubs` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-files` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-functions` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-key-vault` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-schema-registry` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-servicebus` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-storage-blob` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-storage-datalake` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-storage-queue` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-barcode` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-base64` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-bean-validator` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-beanio` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-bindy` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-bonita` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-box` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-braintree` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-caffeine` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-camunda` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cassandraql` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-catalog` ← catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/to-eip.adoc
   - `camel-cbor` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-chatscript` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-chunk` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cli-connector` ← downstream of org.apache.camel:camel-health
   - `camel-cli-debug` ← downstream of org.apache.camel:camel-cli-connector
   - `camel-clickhouse` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-clickup` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cloudevents` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cm-sms` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-coap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cometd` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-console` ← downstream of org.apache.camel:camel-core
   - `camel-consul` ← downstream of org.apache.camel:camel-file
   - `camel-core` ← downstream of org.apache.camel:camel-core-engine
   - `camel-core-all` ← downstream of org.apache.camel:camel-core-engine
   - `camel-core-engine` ← core/camel-core-engine/src/main/docs/modules/eips/pages/to-eip.adoc
   - `camel-core-xml` ← downstream of org.apache.camel:camel-core-engine
   - `camel-couchbase` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-couchdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cron` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-crypto` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-crypto-pgp` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-csv` ← downstream of org.apache.camel:camel-main
   - `camel-cxf-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-rest` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-soap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-spring-common` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-cxf-spring-rest` ← downstream of org.apache.camel:camel-core-xml
   - `camel-cxf-spring-soap` ← downstream of org.apache.camel:camel-spring
   - `camel-cxf-spring-transport` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-transport` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cyberark-vault` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dapr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-datasonnet` ← downstream of org.apache.camel:camel-xml-jaxb
   - `camel-debezium-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-db2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-maven-plugin` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-mongodb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-mysql` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-oracle` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-postgres` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-sqlserver` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debug` ← downstream of org.apache.camel:camel-xml-io
   - `camel-dfdl` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dhis2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dhis2-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dhis2-parent` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-diagram` ← downstream of org.apache.camel:camel-management
   - `camel-disruptor` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-djl` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dns` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-docker` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-docling` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-drill` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dropbox` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dsl-modeline` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-duckdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dynamic-router` ← downstream of org.apache.camel:camel-management
   - `camel-ehcache` ← downstream of org.apache.camel:camel-xml-jaxb
   - `camel-elasticsearch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-elasticsearch-rest-client` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-event` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-exec` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-fastjson` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-fhir` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-file` ← downstream of org.apache.camel:camel-core-engine
   - `camel-file-watch` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-flatpack` ← downstream of org.apache.camel:camel-core-engine
   - `camel-flink` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-flowable` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-fop` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-fory` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-freemarker` ← downstream of org.apache.camel:camel-management
   - `camel-ftp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ftp-common` ← downstream of org.apache.camel:camel-file
   - `camel-geocoder` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-git` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-github2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-bigquery` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-calendar` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-common` ← downstream of org.apache.camel:camel-core
   - `camel-google-drive` ← downstream of org.apache.camel:camel-file
   - `camel-google-firestore` ← downstream of org.apache.camel:camel-health
   - `camel-google-functions` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-mail` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-pubsub` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-secret-manager` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-sheets` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-speech-to-text` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-storage` ← downstream of org.apache.camel:camel-health
   - `camel-google-text-to-speech` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-vertexai` ← downstream of org.apache.camel:camel-health
   - `camel-google-vision` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-graphql` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-grok` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-groovy` ← downstream of org.apache.camel:camel-core
   - `camel-grpc` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-gson` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-hashicorp-vault` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-hazelcast` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-health` ← downstream of org.apache.camel:camel-core-engine
   - `camel-hivemq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-hl7` ← downstream of org.apache.camel:camel-core-engine
   - `camel-http` ← downstream of org.apache.camel:camel-file
   - `camel-http-base` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-http-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-dms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-frs` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-huaweicloud-functiongraph` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-iam` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-imagerecognition` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-huaweicloud-obs` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-smn` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-huggingface` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-cos` ← downstream of org.apache.camel:camel-health
   - `camel-ibm-secrets-manager` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-discovery` ← downstream of org.apache.camel:camel-health
   - `camel-ibm-watson-language` ← downstream of org.apache.camel:camel-health
   - `camel-ibm-watson-speech-to-text` ← downstream of org.apache.camel:camel-health
   - `camel-ibm-watson-text-to-speech` ← downstream of org.apache.camel:camel-health
   - `camel-ibm-watsonx-ai` ← downstream of org.apache.camel:camel-health
   - `camel-ibm-watsonx-data` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ical` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-iggy` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ignite` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-infinispan` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-infinispan-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-infinispan-embedded` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-influxdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-influxdb2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-iso8583` ← downstream of org.apache.camel:camel-jackson
   - `camel-jackson` ← downstream of org.apache.camel:camel-core-engine
   - `camel-jackson-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson-protobuf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson3` ← downstream of org.apache.camel:camel-core-engine
   - `camel-jackson3-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson3-protobuf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson3xml` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jacksonxml` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jactl` ← downstream of org.apache.camel:camel-core
   - `camel-jandex` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jasypt` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-java-io` ← downstream of org.apache.camel:camel-core-engine
   - `camel-java-joor-dsl` ← downstream of org.apache.camel:camel-rest
   - `camel-javascript` ← downstream of org.apache.camel:camel-core
   - `camel-jaxb` ← downstream of org.apache.camel:camel-xml-jaxb
   - `camel-jbang-console` ← downstream of org.apache.camel:camel-management
   - `camel-jbang-core` ← dsl/camel-jbang/camel-jbang-core/src/generated/resources/org/apache/camel/dsl/jbang/core/commands/ai/eip-samples.json
   - `camel-jbang-mcp` ← downstream of org.apache.camel:camel-catalog
   - `camel-jbang-plugin-mcp` ← downstream of org.apache.camel:camel-jbang-core
   - `camel-jbang-plugin-route-parser` ← downstream of org.apache.camel:camel-jbang-core
   - `camel-jbang-plugin-tui` ← downstream of org.apache.camel:camel-catalog
   - `camel-jbang-plugin-validate` ← downstream of org.apache.camel:camel-jbang-core
   - `camel-jcache` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jcr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jdbc` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jetty` ← downstream of org.apache.camel:camel-management
   - `camel-jetty-common` ← downstream of org.apache.camel:camel-jackson
   - `camel-jev` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jfr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jgroups` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jgroups-raft` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jira` ← downstream of org.apache.camel:camel-file
   - `camel-jms` ← downstream of org.apache.camel:camel-management
   - `camel-jmx` ← downstream of org.apache.camel:camel-management
   - `camel-jolt` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jooq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-joor` ← downstream of org.apache.camel:camel-core
   - `camel-jpa` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jq` ← downstream of org.apache.camel:camel-core
   - `camel-jsch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jslt` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-json-validator` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jsonapi` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jsonata` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jsonb` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jsonpath` ← downstream of org.apache.camel:camel-file
   - `camel-jsoup` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jt400` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jta` ← downstream of org.apache.camel:camel-core-engine
   - `camel-jte` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kafka` ← downstream of org.apache.camel:camel-health
   - `camel-kamelet` ← downstream of org.apache.camel:camel-xml-jaxb
   - `camel-kamelet-main-support` ← downstream of org.apache.camel:camel-main
   - `camel-keycloak` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-knative` ← downstream of org.apache.camel:camel-health
   - `camel-knative-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-knative-http` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kserve` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kubernetes` ← downstream of org.apache.camel:camel-http
   - `camel-kudu` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-agent` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-chat` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-core` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-embeddings` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-embeddingstore` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-ingest` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-tokenizer` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-web-search` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-launcher-container` ← downstream of org.apache.camel:camel-launcher
   - `camel-ldap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ldif` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-lra` ← downstream of org.apache.camel:camel-core-engine
   - `camel-lucene` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-lumberjack` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-lzf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mail` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-mail-microsoft-oauth` ← downstream of org.apache.camel:camel-mail
   - `camel-main` ← downstream of org.apache.camel:camel-core-engine
   - `camel-management` ← downstream of org.apache.camel:camel-core-engine
   - `camel-mapstruct` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-master` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-maven-plugin` ← downstream of org.apache.camel:camel-core
   - `camel-mcp-server` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mcp-server-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mdc` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-metrics` ← downstream of org.apache.camel:camel-management
   - `camel-micrometer` ← downstream of org.apache.camel:camel-management
   - `camel-micrometer-observability` ← downstream of org.apache.camel:camel-undertow
   - `camel-micrometer-prometheus` ← downstream of org.apache.camel:camel-platform-http-main
   - `camel-microprofile-config` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-microprofile-fault-tolerance` ← downstream of org.apache.camel:camel-management
   - `camel-microprofile-health` ← downstream of org.apache.camel:camel-health
   - `camel-milo` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-milvus` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mina` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-mina-sftp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-minio` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-mllp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mongodb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mongodb-gridfs` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mustache` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mvel` ← downstream of org.apache.camel:camel-core
   - `camel-mybatis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-nats` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-neo4j` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-netty` ← downstream of org.apache.camel:camel-management
   - `camel-netty-http` ← downstream of org.apache.camel:camel-management
   - `camel-oaipmh` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-oauth` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-observability-services` ← downstream of org.apache.camel:camel-health
   - `camel-observation` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-ocsf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ognl` ← downstream of org.apache.camel:camel-core
   - `camel-olingo2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-olingo2-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-olingo4` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-olingo4-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-once` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-opa` ← downstream of org.apache.camel:camel-health
   - `camel-openai` ← downstream of org.apache.camel:camel-file
   - `camel-openapi-java` ← downstream of org.apache.camel:camel-core-engine
   - `camel-openapi-rest-dsl-generator` ← downstream of org.apache.camel:camel-core-engine
   - `camel-openapi-validator` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-opensearch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-openstack` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-opentelemetry` ← downstream of org.apache.camel:camel-undertow
   - `camel-opentelemetry-metrics` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-opentelemetry2` ← downstream of org.apache.camel:camel-undertow
   - `camel-optaplanner` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-paho` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-paho-mqtt5` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-parquet-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pdf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pg-replication-slot` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pgevent` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pgvector` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pinecone` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-platform-http` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-platform-http-jolokia` ← downstream of org.apache.camel:camel-core
   - `camel-platform-http-main` ← downstream of org.apache.camel:camel-health
   - `camel-platform-http-vertx` ← downstream of org.apache.camel:camel-file
   - `camel-plc4x` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pqc` ← downstream of org.apache.camel:camel-health
   - `camel-printer` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-protobuf` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-pubnub` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pulsar` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-python` ← downstream of org.apache.camel:camel-core
   - `camel-python3` ← downstream of org.apache.camel:camel-core
   - `camel-qdrant` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-quartz` ← downstream of org.apache.camel:camel-management
   - `camel-quickfix` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-quickjs` ← downstream of org.apache.camel:camel-core
   - `camel-reactive-streams` ← downstream of org.apache.camel:camel-core-engine
   - `camel-reactor` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-redis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-resilience4j` ← downstream of org.apache.camel:camel-management
   - `camel-resilience4j-micrometer` ← downstream of org.apache.camel:camel-management
   - `camel-resourceresolver-github` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rest` ← downstream of org.apache.camel:camel-core-engine
   - `camel-rest-openapi` ← downstream of org.apache.camel:camel-rest
   - `camel-rest-postman` ← downstream of org.apache.camel:camel-rest
   - `camel-restdsl-openapi-plugin` ← downstream of org.apache.camel:camel-openapi-rest-dsl-generator
   - `camel-robotframework` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rocketmq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rss` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rxjava` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-salesforce` ← downstream of org.apache.camel:camel-core-engine
   - `camel-salesforce-codegen` ← downstream of org.apache.camel:camel-salesforce
   - `camel-sap-netweaver` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-saxon` ← downstream of org.apache.camel:camel-core
   - `camel-schematron` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-servicenow` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-servicenow-maven-plugin` ← downstream of org.apache.camel:camel-core-engine
   - `camel-servlet` ← downstream of org.apache.camel:camel-management
   - `camel-shell` ← downstream of org.apache.camel:camel-test-junit5
   - `camel-shiro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-sjms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-sjms2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-slack` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-smb` ← downstream of org.apache.camel:camel-file
   - `camel-smooks` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-smpp` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-snakeyaml` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-snmp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-soap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-solr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spiffe` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-splunk-hec` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring` ← downstream of org.apache.camel:camel-core-engine
   - `camel-spring-ai-chat` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-ai-embeddings` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-ai-image` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-ai-vector-store` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-batch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-cloud-config` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-jdbc` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-ldap` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-main` ← downstream of org.apache.camel:camel-spring
   - `camel-spring-rabbitmq` ← downstream of org.apache.camel:camel-http
   - `camel-spring-redis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-security` ← downstream of org.apache.camel:camel-core-engine
   - `camel-spring-ws` ← downstream of org.apache.camel:camel-spring
   - `camel-spring-xml` ← downstream of org.apache.camel:camel-xml-io
   - `camel-sql` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-ssh` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-state-store` ← downstream of org.apache.camel:camel-test-main-junit5
   - `camel-stax` ← downstream of org.apache.camel:camel-core
   - `camel-stitch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-stream` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-streamcaching-test` ← downstream of org.apache.camel:camel-core
   - `camel-stringtemplate` ← downstream of org.apache.camel:camel-management
   - `camel-stripe` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-swift` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-syslog` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-tahu` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-tarfile` ← downstream of org.apache.camel:camel-file
   - `camel-telegram` ← downstream of org.apache.camel:camel-health
   - `camel-telemetry` ← downstream of org.apache.camel:camel-undertow
   - `camel-telemetry-dev` ← downstream of org.apache.camel:camel-undertow
   - `camel-tensorflow-serving` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-infra-all` ← downstream of org.apache.camel:camel-test-infra-artemis
   - `camel-test-infra-artemis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-infra-core` ← downstream of org.apache.camel:camel-core
   - `camel-test-infra-smb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-junit5` ← downstream of org.apache.camel:camel-core-engine
   - `camel-test-junit6` ← downstream of org.apache.camel:camel-core-engine
   - `camel-test-main-junit5` ← downstream of org.apache.camel:camel-xml-jaxb
   - `camel-test-main-junit6` ← downstream of org.apache.camel:camel-xml-jaxb
   - `camel-test-spring-junit5` ← downstream of org.apache.camel:camel-management
   - `camel-test-spring-junit6` ← downstream of org.apache.camel:camel-management
   - `camel-thrift` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-thymeleaf` ← downstream of org.apache.camel:camel-management
   - `camel-tika` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-toon` ← downstream of org.apache.camel:camel-test-junit5
   - `camel-tracing` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-twilio` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-twitter` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ubl` ← downstream of org.apache.camel:camel-test-junit5
   - `camel-undertow` ← downstream of org.apache.camel:camel-rest
   - `camel-undertow-spring-security` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-univocity-parsers` ← downstream of org.apache.camel:camel-core-xml
   - `camel-velocity` ← downstream of org.apache.camel:camel-management
   - `camel-vertx` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-vertx-http` ← downstream of org.apache.camel:camel-rest
   - `camel-vertx-websocket` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-wasm` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-weather` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-weaviate` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-web3j` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-webhook` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-whatsapp` ← downstream of org.apache.camel:camel-health
   - `camel-wordpress` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-workday` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xchange` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xj` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xml-io` ← downstream of org.apache.camel:camel-core-engine
   - `camel-xml-io-dsl` ← downstream of org.apache.camel:camel-core-engine
   - `camel-xml-jaxb` ← downstream of org.apache.camel:camel-core-engine
   - `camel-xml-jaxb-dsl` ← downstream of org.apache.camel:camel-rest
   - `camel-xml-jaxb-dsl-test-definition` ← downstream of org.apache.camel:camel-rest
   - `camel-xml-jaxb-dsl-test-spring` ← downstream of org.apache.camel:camel-rest
   - `camel-xmlsecurity` ← downstream of org.apache.camel:camel-xml-jaxb
   - `camel-xmpp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xslt-saxon` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-yaml-dsl-common` ← downstream of org.apache.camel:camel-core-engine
   - `camel-yaml-dsl-validator` ← dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java, dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/EipDocExamplesTest.java, dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/YamlValidatorDynamicUriTest.java
   - `camel-yaml-dsl-validator-maven-plugin` ← dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/GenerateDocSamplesMojo.java
   - `camel-yaml-io` ← downstream of org.apache.camel:camel-core-engine
   - `camel-zendesk` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-zip-deflater` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-zipfile` ← downstream of org.apache.camel:camel-file
   - `camel-zookeeper` ← downstream of org.apache.camel:camel-file
   - `camel-zookeeper-master` ← downstream of org.apache.camel:camel-test-junit6
   
   </details>
   
   <details><summary>Modules with tests skipped (26)</summary>
   
   - `apache-camel`
   - `camel-allcomponents`
   - `camel-catalog-console`
   - `camel-catalog-maven`
   - `camel-catalog-suggest`
   - `camel-componentdsl`
   - `camel-endpointdsl`
   - `camel-endpointdsl-support`
   - `camel-itest`
   - `camel-jbang-it`
   - `camel-jbang-main`
   - `camel-jbang-plugin-edit`
   - `camel-jbang-plugin-generate`
   - `camel-jbang-plugin-kubernetes`
   - `camel-jbang-plugin-test`
   - `camel-kamelet-main`
   - `camel-launcher`
   - `camel-report-maven-plugin`
   - `camel-route-parser`
   - `camel-salesforce-maven-plugin`
   - `camel-yaml-dsl`
   - `camel-yaml-dsl-deserializers`
   - `camel-yaml-dsl-maven-plugin`
   - `coverage`
   - `docs`
   - `dummy-component`
   
   </details>
   
   > :information_source: Shadow mode β€” Scalpel observes but does not affect test execution. [Learn more](https://github.com/maveniverse/scalpel)
   
   </details>
   
   :warning: **Some tests are disabled on GitHub Actions** (`@DisabledIfSystemProperty(named = "ci.env.name")`) and require manual verification:
   
   - `dsl/camel-jbang/camel-jbang-core`: 2 test(s) disabled on GitHub Actions
   
   :bulb: **Manual integration tests recommended:**
   
   > You modified `dsl/camel-jbang/camel-jbang-core`. The related integration tests in `dsl/camel-jbang/camel-jbang-it` are excluded from CI. Consider running them manually:
   > ```
   > mvn verify -f dsl/camel-jbang/camel-jbang-it -Djbang-it-test
   > ```
   
   <details><summary>Build reactor β€” dependencies compiled but only changed modules were tested (5 modules, 21.4s total)</summary>
   
   **Total reactor time:** 21.4s
   
   | Module | Duration | Status |
   | --- | --- | --- |
   | Camel :: Catalog :: Camel Catalog | 11.1s | SUCCESS |
   | Camel :: YAML DSL :: Validator | 4.4s | SUCCESS |
   | Camel :: Core Engine | 4.1s | SUCCESS |
   | Camel :: YAML DSL :: Validator Maven Plugin | 1.8s | SUCCESS |
   | Camel :: JBang :: Core | n/a |  |
   
   **Top 20 slowest modules:**
   - `Camel :: Catalog :: Camel Catalog` (11.1s)
   - `Camel :: YAML DSL :: Validator` (4.4s)
   - `Camel :: Core Engine` (4.1s)
   - `Camel :: YAML DSL :: Validator Maven Plugin` (1.8s)
   
   </details>
   
   ---
   :gear: [View full build and test results](https://github.com/apache/camel/actions/runs/35826229319)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on PR #26758:
URL: https://github.com/apache/camel/pull/26758#issuecomment-5792655538

   **Re-review after `CHANGES_REQUESTED` β€” all findings resolved.**
   
   **Finding 1 β€” `EVALUATED_PATH` entries: βœ… Addressed**
   `xslt`, `xquery`, `mybatis`, `sql`, `elsql`, `jdbc`, and `spring-jdbc` are gone. The remaining three (`language`, `micrometer`, `opentelemetry-metrics`) are correct β€” their producer evaluates the path per message. The new `testAComponentWhosePathIsAnAddressIsReported` test confirms that `xslt:styles/${header.style}.xsl` is now flagged correctly (xslt resolves its stylesheet once, so a path expression needs `toD:`).
   
   **Finding 2 β€” `DocBlocks.examples()` consolidation: βœ… Addressed**
   Both `EipDocExamplesTest` and `CatalogDocExamplesTest` now delegate to `DocBlocks.examples()`. Local `YAML_BLOCK` patterns and `Matcher` loops are gone from both test classes. The `\s*` in the consolidated pattern is a correct generalisation that handles both the strict `\n----` and the whitespace-tolerant `\s*\n----` variants.
   
   **Finding 3 β€” Example counter 0-indexed: βœ… Addressed**
   Old code: `"example " + n` where `n` started at 0 β†’ first route was "example 0". New code: `"example " + (n + 1)` β†’ first route is "example 1". Fixed consistently in both test classes.
   
   **Additional checks (new code):**
   - `MARKER_LOOKBEHIND = 200`: the marker appears 1–2 lines before `[source,yaml]`, so 200 chars of context is more than sufficient.
   - `:#${...}` SQL-parameter exemption: verified arithmetically β€” `head.startsWith(":#", start - 2)` correctly catches `sql:SELECT … :#${body.itemId}` and returns `null`.
   - Cross-module access: `camel-yaml-dsl-validator` is already a compile-scope dependency of `camel-jbang-core`, so `DocBlocks` is accessible without a pom change.
   - `checkDynamicUri` placement inside `if (errors.isEmpty())` is intentional and consistent with `checkSimpleSyntaxInScripts` β€” don't emit the `toD:` hint when the YAML already has schema errors.
   
   _This review was generated by an AI agent, Hermès on behalf of @gnodet._
   
   <!-- reviewer: gnodet-bot -->


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24917: camel-yaml-dsl-validator - a to: uri that holds an expression says to use toD: [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus merged PR #26758:
URL: https://github.com/apache/camel/pull/26758


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org