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:01:39 UTC

[PR] CAMEL-24916: simple - a dot reads a Map key when there is no such method [camel]

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

   `${body.sku}` on a map body threw `Method with name: sku not found on bean: {sku=CAMEL-MUG, qty=42}`. It is the loudest runtime failure in the AI route benchmark β€” 3582 occurrences in one 5-run series, more than every other runtime error together β€” and a frequent question, because jq, JavaScript and Groovy all read a map with a dot.
   
   A map now answers the key when it has no method of that name:
   
   ```
   ${body.sku}    // the sku entry, the same value ${body[sku]} gives
   ```
   
   The change is additive β€” only the path that throws today can now return a value:
   
   - **a method still wins**: `${body.size}` on a `Map` calls `size()` exactly as before, so nothing that works today changes
   - **an unknown name still fails**: the key must be present, so a misspelled field is still reported with the existing hint rather than silently answered with null
   - only a `MethodNotFoundException` triggers it, so a method that exists and throws is still a real error
   
   Tests in `SimpleSyntaxHintsTest`: the dot reads the key, a nested map reads through (`${body.item.sku}`), `size` still calls the method, and a missing key still carries the hint. `*Simple*Test` (615), `*Bean*Test` (481), `*Ognl*Test` (18) and the camel-bean module suite are green. Docs and the 4.23 upgrade guide updated.
   
   πŸ€– 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-24916: simple - a dot reads a Map key when there is no such method [camel]

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

   :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-24916: simple - a dot reads a Map key when there is no such method [camel]

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

   <!-- regen-patch -->
   ### :warning: Generated files are out of date
   
   The [CI build](https://github.com/apache/camel/actions/runs/35824879085) regenerated files that are not committed on this PR.
   
   If *Allow edits from maintainers* is enabled, a maintainer bot will automatically
   push a "Regen" commit to this branch shortly.
   
   Otherwise, you can apply the patch manually β€” the missing changes are available
   as the `regen-patch` artifact of that run:
   
   ```bash
   gh pr checkout 26757 --repo apache/camel
   gh run download 35824879085 --repo apache/camel -n regen-patch
   git apply --index regen.patch && rm regen.patch pr-number
   git commit -m "Regen" && git push
   ```
   
   Alternatively, run `./etc/scripts/regen.sh` locally and commit the resulting changes.
   If the patch does not apply cleanly, update the branch from the base branch first β€”
   the patch was generated against the merge with the base branch.


-- 
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-24916: simple - a dot reads a Map key when there is no such method [camel]

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

   <!-- ci-tested-modules -->
   :test_tube: **CI tested the following changed modules:**
   
   - `catalog/camel-catalog`
   - `components/camel-bean`
   - `core/camel-core-languages`
   - `core/camel-core`
   - `docs`
   
   > :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: 482 of 693 tested, 26 compile-only β€” current: 484 all tested</summary>
   
   [Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **510 affected modules** (current approach: 484).
   
   **Skip-tests mode would test 482 modules** (5 direct + 479 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 only in current approach (2)</summary>
   
   - `camel-google-common`
   - `camel-test-infra-core`
   
   </details>
   
   
   <details><summary>Modules Scalpel would test (482)</summary>
   
   - `archetypes` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-a2a` ← downstream of org.apache.camel:camel-core-languages
   - `camel-activemq` ← downstream of org.apache.camel:camel-jms
   - `camel-activemq6` ← downstream of org.apache.camel:camel-jms
   - `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-test-junit6
   - `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-bean
   - `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-base64
   - `camel-aws-cloudtrail` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws-config` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-aws-parameter-store` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws-secrets-manager` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws-security-hub` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-athena` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-comprehend` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-cw` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ddb` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ec2` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ecs` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-eks` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-eventbridge` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-iam` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-kinesis` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-kms` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-lambda` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-mq` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-msk` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-polly` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-redshift` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-rekognition` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-s3` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-s3-vectors` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ses` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-sns` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-sqs` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-step-functions` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-sts` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-textract` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-timestream` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-transcribe` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-aws2-translate` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `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-core-languages
   - `camel-bean` ← components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
   - `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/simple-ognl.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-management
   - `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-bean
   - `camel-core` ← core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleSyntaxHintsTest.java
   - `camel-core-all` ← downstream of org.apache.camel:camel-core-languages
   - `camel-core-languages` ← core/camel-core-languages/src/main/docs/modules/languages/pages/simple-ognl.adoc
   - `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-spring-xml
   - `camel-cxf-spring-soap` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `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-test-spring-junit6
   - `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-management
   - `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-test-junit6
   - `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-watch` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-flatpack` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `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-core-languages
   - `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-drive` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-firestore` ← downstream of org.apache.camel:camel-test-junit6
   - `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-test-junit6
   - `camel-google-text-to-speech` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-vertexai` ← downstream of org.apache.camel:camel-test-junit6
   - `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-main
   - `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-hivemq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-hl7` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-http` ← downstream of org.apache.camel:camel-management
   - `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-test-junit6
   - `camel-ibm-secrets-manager` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-discovery` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-language` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-speech-to-text` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-text-to-speech` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watsonx-ai` ← downstream of org.apache.camel:camel-test-junit6
   - `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-test-spring-junit6
   - `camel-jackson` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `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-test-spring-junit6
   - `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-test-junit6
   - `camel-jandex` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jasypt` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-java-joor-dsl` ← downstream of org.apache.camel:camel-bean
   - `camel-javascript` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jaxb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jbang-console` ← downstream of org.apache.camel:camel-management
   - `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-route-parser
   - `camel-jbang-plugin-tui` ← downstream of org.apache.camel:camel-catalog
   - `camel-jbang-plugin-validate` ← downstream of org.apache.camel:camel-yaml-dsl-validator
   - `camel-jcache` ← downstream of org.apache.camel:camel-core-languages
   - `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-spring-xml
   - `camel-jev` ← downstream of org.apache.camel:camel-core-languages
   - `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-test-junit6
   - `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-test-junit6
   - `camel-jpa` ← downstream of org.apache.camel:camel-core-languages
   - `camel-jq` ← downstream of org.apache.camel:camel-test-junit6
   - `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-test-spring-junit6
   - `camel-jsoup` ← downstream of org.apache.camel:camel-core-languages
   - `camel-jt400` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jta` ← downstream of org.apache.camel:camel-sql
   - `camel-jte` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kafka` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kamelet` ← downstream of org.apache.camel:camel-management
   - `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-test-junit6
   - `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-test-spring-junit6
   - `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-test-junit6
   - `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-attachments
   - `camel-mail-microsoft-oauth` ← downstream of org.apache.camel:camel-mail
   - `camel-main` ← downstream of org.apache.camel:camel-bean
   - `camel-management` ← downstream of org.apache.camel:camel-bean
   - `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-spring-main
   - `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-test-spring-junit6
   - `camel-micrometer-prometheus` ← downstream of org.apache.camel:camel-micrometer
   - `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-test-junit6
   - `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-core-languages
   - `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-test-junit6
   - `camel-mybatis` ← downstream of org.apache.camel:camel-bean
   - `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-management
   - `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-test-junit6
   - `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-test-junit6
   - `camel-openai` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-openapi-java` ← downstream of org.apache.camel:camel-management
   - `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-test-spring-junit6
   - `camel-opentelemetry-metrics` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-opentelemetry2` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `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-platform-http
   - `camel-platform-http-main` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-platform-http-vertx` ← downstream of org.apache.camel:camel-management
   - `camel-plc4x` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pqc` ← downstream of org.apache.camel:camel-test-junit6
   - `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-test-junit6
   - `camel-python3` ← downstream of org.apache.camel:camel-test-junit6
   - `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-test-junit6
   - `camel-reactive-streams` ← downstream of org.apache.camel:camel-management
   - `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-languages
   - `camel-rest-openapi` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rest-postman` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-restdsl-openapi-plugin` ← downstream of org.apache.camel:camel-openapi-java
   - `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-test-junit6
   - `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-test-spring-junit6
   - `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-test-junit6
   - `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-test-junit6
   - `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-cron
   - `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-main
   - `camel-spring-rabbitmq` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-redis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-security` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-ws` ← downstream of org.apache.camel:camel-attachments
   - `camel-spring-xml` ← downstream of org.apache.camel:camel-bean
   - `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-test-spring-junit6
   - `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-test-junit6
   - `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-test-junit6
   - `camel-telegram` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-telemetry` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-telemetry-dev` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `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-smb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-junit5` ← downstream of org.apache.camel:camel-bean
   - `camel-test-junit6` ← downstream of org.apache.camel:camel-bean
   - `camel-test-main-junit5` ← downstream of org.apache.camel:camel-management
   - `camel-test-main-junit6` ← downstream of org.apache.camel:camel-management
   - `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-management
   - `camel-undertow-spring-security` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-univocity-parsers` ← downstream of org.apache.camel:camel-spring-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-test-junit6
   - `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-test-junit6
   - `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-dsl` ← downstream of org.apache.camel:camel-bean
   - `camel-xml-jaxb-dsl` ← downstream of org.apache.camel:camel-bean
   - `camel-xml-jaxb-dsl-test-definition` ← downstream of org.apache.camel:camel-bean
   - `camel-xml-jaxb-dsl-test-spring` ← downstream of org.apache.camel:camel-bean
   - `camel-xmlsecurity` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xmpp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xslt-saxon` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-yaml-dsl-validator` ← downstream of org.apache.camel:camel-catalog
   - `camel-yaml-dsl-validator-maven-plugin` ← downstream of org.apache.camel:camel-yaml-dsl-validator
   - `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-test-junit6
   - `camel-zookeeper` ← downstream of org.apache.camel:camel-bean
   - `camel-zookeeper-master` ← downstream of org.apache.camel:camel-test-junit6
   - `docs` ← docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
   
   </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-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`
   - `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:
   
   - `core/camel-core`: 3 test(s) disabled on GitHub Actions
   
   <details><summary>Build reactor β€” dependencies compiled but only changed modules were tested (5 modules, 1m 16s total)</summary>
   
   **Total reactor time:** 1m 16s
   
   | Module | Duration | Status |
   | --- | --- | --- |
   | Camel :: Catalog :: Camel Catalog | 31.5s | SUCCESS |
   | Camel :: Docs | 24.1s | SUCCESS |
   | Camel :: Bean | 11.0s | SUCCESS |
   | Camel :: Core Languages | 9.0s | SUCCESS |
   | Camel :: Core | n/a |  |
   
   **Top 20 slowest modules:**
   - `Camel :: Catalog :: Camel Catalog` (31.5s)
   - `Camel :: Docs` (24.1s)
   - `Camel :: Bean` (11.0s)
   - `Camel :: Core Languages` (9.0s)
   
   </details>
   
   ---
   :gear: [View full build and test results](https://github.com/apache/camel/actions/runs/35827372492)


-- 
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-24916: simple - a dot reads a Map key when there is no such method [camel]

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


##########
components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java:
##########
@@ -535,6 +542,40 @@ exchange, describeBean(holder, beanName, exchange),
         return newResult;
     }
 
+    /** Says that the bean is not a Map with that key, as null is a value a key can hold. */
+    private static final Object NO_SUCH_KEY = new Object();
+
+    /**
+     * The value of the key on a Map bean when the method of that name does not exist, so that ${body.sku} reads the sku
+     * of a map the way ${body[sku]} does - what a map means in jq, JavaScript and Groovy too (CAMEL-24916).
+     * <p/>
+     * A method still wins: ${body.size} on a Map calls size() as before. A name that is not a key still fails, so a
+     * misspelled field is still reported.
+     *
+     * @return the value of the key, or {@link #NO_SUCH_KEY} when this is not that case

Review Comment:
   πŸ’‘ **Nit: incomplete Javadoc `@param` coverage**
   
   The Javadoc documents `@return` but none of the four parameters. `mapValue()` is private, so this is low-stakes, but the contract of each parameter is non-obvious β€” particularly `cause` (why is it passed instead of inspecting `resultExchange` internally?) and `holder` (why nullable?). Add four `@param` tags before the `@return`:
   
   ```suggestion
        * @param holder   the bean holder; may be null (treated as no bean)
        * @param exchange the current exchange, forwarded to {@link BeanHolder#getBean(Exchange)}
        * @param methodName the OGNL segment that failed as a method call (i.e. the candidate key name)
        * @param cause    the exception thrown by the failed method invocation
        * @return the value of the key, or {@link #NO_SUCH_KEY} when this is not that case
   ```



##########
core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleSyntaxHintsTest.java:
##########
@@ -144,16 +144,42 @@ public void testOgnlRuntimeMessages() {
     }
 
     @Test
-    public void testOgnlDotOnAMapSaysToUseAKey() {
+    public void testOgnlDotOnAMapReadsTheKey() {
+        // CAMEL-24916: a map has no method type, so the key is what the dot can mean
         exchange.getIn().setBody(new java.util.LinkedHashMap<>(java.util.Map.of("type", "order")));
-        Exception e = assertThrows(Exception.class,
-                () -> context.resolveLanguage("simple").createExpression("${body.type}").evaluate(exchange,
-                        String.class));
-        assertThat(e.getMessage()).contains("the value is a Map: a key is read with [type], as in ${body[type]}");
+        assertEquals("order", context.resolveLanguage("simple").createExpression("${body.type}").evaluate(exchange,
+                String.class));
         assertEquals("order", context.resolveLanguage("simple").createExpression("${body[type]}").evaluate(exchange,
                 String.class));
     }
 
+    @Test
+    public void testOgnlDotOnAMapWithoutThatKeySaysToUseAKey() {
+        exchange.getIn().setBody(new java.util.LinkedHashMap<>(java.util.Map.of("type", "order")));
+        Exception e = assertThrows(Exception.class,
+                () -> context.resolveLanguage("simple").createExpression("${body.typo}").evaluate(exchange,
+                        String.class));
+        assertThat(e.getMessage()).contains("the value is a Map: a key is read with [typo], as in ${body[typo]}");
+    }
+
+    @Test
+    public void testAMethodOfAMapStillWins() {
+        exchange.getIn().setBody(new java.util.LinkedHashMap<>(java.util.Map.of("size", "not the size")));
+        assertEquals("1", context.resolveLanguage("simple").createExpression("${body.size}").evaluate(exchange,
+                String.class), "size() is a method of Map, so it still answers before the key");
+    }
+
+    @Test
+    public void testOgnlDotOnANestedMapReadsTheKey() {
+        java.util.Map<String, Object> item = new java.util.LinkedHashMap<>();
+        item.put("sku", "CAMEL-MUG");
+        java.util.Map<String, Object> body = new java.util.LinkedHashMap<>();
+        body.put("item", item);
+        exchange.getIn().setBody(body);
+        assertEquals("CAMEL-MUG", context.resolveLanguage("simple").createExpression("${body.item.sku}")
+                .evaluate(exchange, String.class));
+    }

Review Comment:
   πŸ’‘ **Missing test: null-valued map entry**
   
   The new `containsKey`/`get` path in `mapValue()` has one subtle branch not covered: a map that *has* the key but maps it to `null`. The sentinel `NO_SUCH_KEY` is needed precisely to distinguish "key absent" from "key present with value null", and the correctness of that distinction (`value != NO_SUCH_KEY` in the caller) deserves a test.
   
   Suggested addition after `testOgnlDotOnANestedMapReadsTheKey`:
   
   ```java
   @Test
   public void testOgnlDotOnAMapWithNullValueReturnsNull() {
       java.util.HashMap<String, Object> m = new java.util.HashMap<>();
       m.put("sku", null);
       exchange.getIn().setBody(m);
       assertNull(context.resolveLanguage("simple").createExpression("${body.sku}").evaluate(exchange, Object.class),
               "a null value is a valid map entry; the expression must return null, not throw");
   }
   ```



-- 
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-24916: simple - a dot reads a Map key when there is no such method [camel]

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


##########
components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java:
##########
@@ -535,6 +542,40 @@ exchange, describeBean(holder, beanName, exchange),
         return newResult;
     }
 
+    /** Says that the bean is not a Map with that key, as null is a value a key can hold. */
+    private static final Object NO_SUCH_KEY = new Object();
+
+    /**
+     * The value of the key on a Map bean when the method of that name does not exist, so that ${body.sku} reads the sku
+     * of a map the way ${body[sku]} does - what a map means in jq, JavaScript and Groovy too (CAMEL-24916).
+     * <p/>
+     * A method still wins: ${body.size} on a Map calls size() as before. A name that is not a key still fails, so a
+     * misspelled field is still reported.
+     *
+     * @return the value of the key, or {@link #NO_SUCH_KEY} when this is not that case

Review Comment:
   πŸ’‘ **[Re-raise] Javadoc `@param` tags still missing**
   
   The prior review asked for four `@param` tags on `mapValue()`. Still absent after this push. The contract of `cause` (why pass the exception rather than inspecting `resultExchange`?) and `holder` (why nullable?) is non-obvious for future readers.
   
   ```suggestion
        * @param holder     the bean holder; may be null (treated as no bean)
        * @param exchange   the current exchange, forwarded to {@link BeanHolder#getBean(Exchange)}
        * @param methodName the OGNL segment that failed as a method call (i.e. the candidate key name)
        * @param cause      the exception thrown by the failed method invocation
        * @return the value of the key, or {@link #NO_SUCH_KEY} when this is not that case
   ```



-- 
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-24916: simple - a dot reads a Map key when there is no such method [camel]

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


##########
components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java:
##########
@@ -535,6 +542,40 @@ exchange, describeBean(holder, beanName, exchange),
         return newResult;
     }
 
+    /** Says that the bean is not a Map with that key, as null is a value a key can hold. */
+    private static final Object NO_SUCH_KEY = new Object();
+
+    /**
+     * The value of the key on a Map bean when the method of that name does not exist, so that ${body.sku} reads the sku
+     * of a map the way ${body[sku]} does - what a map means in jq, JavaScript and Groovy too (CAMEL-24916).
+     * <p/>
+     * A method still wins: ${body.size} on a Map calls size() as before. A name that is not a key still fails, so a
+     * misspelled field is still reported.
+     *
+     * @return the value of the key, or {@link #NO_SUCH_KEY} when this is not that case

Review Comment:
   They are there β€” `BeanExpression.java` lines 555-559 on the branch tip (e9d45e6):
   
   ```
    * @param  holder     the bean the OGNL step is called on; null when there is none
    * @param  exchange   the exchange the bean is resolved against
    * @param  methodName the name that failed as a method call, and is tried as a key
    * @param  cause      the failure of that call, so that only a missing method is read as a key
    * @return            the value of the key, or {@link #NO_SUCH_KEY} when this is not that case
   ```
   
   This review looks to have run against the state before that push. To the two questions in it: `cause` is passed because the method must tell a missing method from a method that exists and threw - only `MethodNotFoundException` may be read as a key, anything else is a real error that must keep propagating. `holder` is nullable because the OGNL chain can reach a step with no bean resolved, and `getBean` is then not called at all.



-- 
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-24916: simple - a dot reads a Map key when there is no such method [camel]

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


-- 
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-24916: simple - a dot reads a Map key when there is no such method [camel]

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

   **[Re-raise] Missing test: null-valued map entry** β€” still not added after this push.
   
   The `containsKey`/`get` path in `mapValue()` correctly uses `NO_SUCH_KEY` to distinguish "key absent" from "key present with null value", but this distinction is untested. Please add after `testOgnlDotOnANestedMapReadsTheKey`:
   
   ```java
   @Test
   public void testOgnlDotOnAMapWithNullValueReturnsNull() {
       java.util.HashMap<String, Object> m = new java.util.HashMap<>();
       m.put("sku", null);
       exchange.getIn().setBody(m);
       assertNull(context.resolveLanguage("simple").createExpression("${body.sku}").evaluate(exchange, Object.class),
               "a null value is a valid map entry; the expression must return null, not throw");
   }
   ```
   
   _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-24916: simple - a dot reads a Map key when there is no such method [camel]

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


##########
components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java:
##########
@@ -535,6 +542,40 @@ exchange, describeBean(holder, beanName, exchange),
         return newResult;
     }
 
+    /** Says that the bean is not a Map with that key, as null is a value a key can hold. */
+    private static final Object NO_SUCH_KEY = new Object();
+
+    /**
+     * The value of the key on a Map bean when the method of that name does not exist, so that ${body.sku} reads the sku
+     * of a map the way ${body[sku]} does - what a map means in jq, JavaScript and Groovy too (CAMEL-24916).
+     * <p/>
+     * A method still wins: ${body.size} on a Map calls size() as before. A name that is not a key still fails, so a
+     * misspelled field is still reported.
+     *
+     * @return the value of the key, or {@link #NO_SUCH_KEY} when this is not that case

Review Comment:
   Added the four @param tags.



##########
core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleSyntaxHintsTest.java:
##########
@@ -144,16 +144,42 @@ public void testOgnlRuntimeMessages() {
     }
 
     @Test
-    public void testOgnlDotOnAMapSaysToUseAKey() {
+    public void testOgnlDotOnAMapReadsTheKey() {
+        // CAMEL-24916: a map has no method type, so the key is what the dot can mean
         exchange.getIn().setBody(new java.util.LinkedHashMap<>(java.util.Map.of("type", "order")));
-        Exception e = assertThrows(Exception.class,
-                () -> context.resolveLanguage("simple").createExpression("${body.type}").evaluate(exchange,
-                        String.class));
-        assertThat(e.getMessage()).contains("the value is a Map: a key is read with [type], as in ${body[type]}");
+        assertEquals("order", context.resolveLanguage("simple").createExpression("${body.type}").evaluate(exchange,
+                String.class));
         assertEquals("order", context.resolveLanguage("simple").createExpression("${body[type]}").evaluate(exchange,
                 String.class));
     }
 
+    @Test
+    public void testOgnlDotOnAMapWithoutThatKeySaysToUseAKey() {
+        exchange.getIn().setBody(new java.util.LinkedHashMap<>(java.util.Map.of("type", "order")));
+        Exception e = assertThrows(Exception.class,
+                () -> context.resolveLanguage("simple").createExpression("${body.typo}").evaluate(exchange,
+                        String.class));
+        assertThat(e.getMessage()).contains("the value is a Map: a key is read with [typo], as in ${body[typo]}");
+    }
+
+    @Test
+    public void testAMethodOfAMapStillWins() {
+        exchange.getIn().setBody(new java.util.LinkedHashMap<>(java.util.Map.of("size", "not the size")));
+        assertEquals("1", context.resolveLanguage("simple").createExpression("${body.size}").evaluate(exchange,
+                String.class), "size() is a method of Map, so it still answers before the key");
+    }
+
+    @Test
+    public void testOgnlDotOnANestedMapReadsTheKey() {
+        java.util.Map<String, Object> item = new java.util.LinkedHashMap<>();
+        item.put("sku", "CAMEL-MUG");
+        java.util.Map<String, Object> body = new java.util.LinkedHashMap<>();
+        body.put("item", item);
+        exchange.getIn().setBody(body);
+        assertEquals("CAMEL-MUG", context.resolveLanguage("simple").createExpression("${body.item.sku}")
+                .evaluate(exchange, String.class));
+    }

Review Comment:
   Good catch - that is the case the sentinel exists for, and it had no test. Added `testOgnlDotOnAMapWithANullValueAnswersNull`: a map with `sku` mapped to null answers null instead of throwing, which is what tells "the key is there and holds null" apart from "there is no such key".



-- 
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