Skip to content

CAMEL-24988: Add scalar Switch EIP - #27079

Merged
luigidemasi merged 7 commits into
apache:mainfrom
luigidemasi:feature/CAMEL-24988-switch
Sep 30, 2026
Merged

luigidemasi merged 7 commits into
apache:mainfrom
luigidemasi:feature/CAMEL-24988-switch

Conversation

@luigidemasi

@luigidemasi luigidemasi commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Description

Add a scalar Switch EIP that evaluates a selector once per entry and maps its value to one fixed endpoint. Cases are literal strings matched case-insensitively with Locale.ENGLISH; duplicate values are rejected at startup. Null or unmatched results use the optional fallback, while selector failures follow normal Camel error handling. Destinations support property placeholders and reject Simple expressions.

Java, XML and YAML DSLs, endpoint discovery, tracing/JMX, documentation, and generated metadata are included. The selector can use any Camel expression language. Map, collection and array results fail explicitly through Camel error handling. Composite matching is outside this PR's scope, and Choice is unchanged.

The fallback is an explicit endpoint element: XML uses <otherwise uri="direct:review"/>, YAML uses otherwise: {uri: direct:review}, and Java uses .otherwise("direct:review"). Keeping the element lets both cases and the fallback use standard YAML uri plus parameters. A case literal named otherwise remains an ordinary literal.

  • Case and fallback URIs in the JMX table honor the management mask setting, including its default.
  • Selector and destination getters are read-only. Destination preparation is explicit during reification and management setup. Setters and JAXB callback keep the fallback URI, parent, and ID correct for endpoint discovery and duplicate-ID validation before startup.
  • YAML export preserves case values as strings, including numeric-looking and boolean-looking literals. The branch retains the leading-zero regression test while using main's YAML 1.2 number quoting implementation.

The documentation example includes equivalent Java, XML and YAML routes, sample inputs, expected destinations, and destination routes.

Validation

Before rebasing onto the latest main, 341 focused/exporter tests passed across the Switch model, routing, management, JAXB, XML/YAML DSLs, schemas, and the complete Java IO and YAML IO module suites. The 1,085 catalog tests passed on Java 17, including XML documentation schema validation. The full 695-module root build passed with tests skipped; focused tests were run separately.

The branch is rebased onto upstream/main at c3632125; all seven PR commits retain their GPG signatures and Signed-off-by trailers. The rebase range-diff confirms the original patches are preserved, with main's YAML number-pattern implementation retained. Signed follow-up commits restore side-effect-free destination getters, explicitly prepare destinations during reification and before JMX performance-counter traversal, and include regression coverage for both paths. CI is running against the corrected head.

Target

  • Targets apache/camel:main and incorporates current main.
  • Tracked by CAMEL-24988.

Apache Camel coding standards and style

  • Generated metadata, parsers, writers, schemas, catalog documentation and JBang samples are regenerated and committed.
  • Formatting, import sorting and git diff --check passed.

AI-assisted contributions

  • Commits include AI co-authorship, cryptographic signatures and Signed-off-by trailers.

Generated by Codex on behalf of @luigidemasi.

@github-actions

Copy link
Copy Markdown
Contributor

🌟 Thank you for your contribution to the Apache Camel project! 🌟
🤖 CI automation will test this PR automatically.

🐫 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 have access to the summary.

⚠️ Be careful when sharing logs. Review their contents before sharing them publicly.

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid implementation of the Switch EIP. Thread-safe processor (immutable table + AtomicLongArray counters), comprehensive startup validation in SwitchReifier (duplicate detection, mode mixing, dynamic URI rejection), and type-strict composite matching with correct BigDecimal normalization. All DSL round-trips (Java, XML, YAML, JAXB) preserve types and namespaces. Test coverage is thorough — scalar/composite matching, error handling, stream cache rewinding, locale independence, redelivery semantics, nested switches, and JMX management.

No issues found.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after 4902568: the follow-up commit corrects the XML namespace in the "Connect the example destinations" doc section (camel-spring → xml-io). Doc-only, no code change. Previous APPROVE still stands.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@github-actions

github-actions Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • catalog/camel-catalog
  • components/camel-spring-parent/camel-spring-xml
  • core/camel-core-engine
  • core/camel-core-model
  • core/camel-core-processor
  • core/camel-core-reifier
  • core/camel-core
  • core/camel-java-io
  • core/camel-management-api
  • core/camel-management
  • core/camel-xml-io
  • core/camel-xml-jaxb
  • core/camel-yaml-io
  • dsl/camel-jbang/camel-jbang-core
  • dsl/camel-xml-io-dsl
  • dsl/camel-yaml-dsl/camel-yaml-dsl
  • dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers
  • dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin
  • dsl/camel-yaml-dsl/camel-yaml-dsl-validator
  • dsl/camel-yaml-dsl/camel-yaml-dsl
  • tooling/maven/camel-package-maven-plugin

ℹ️ 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.


🔬 Scalpel shadow comparison — Scalpel: 584 of 697 tested, 0 compile-only — current: 76 all tested

Maveniverse Scalpel detected 584 affected modules (current approach: 76).

Skip-tests mode would test 584 modules (20 direct + 48 downstream), skip tests for 0 (generated code, meta-modules)

⚠️ Modules only in Scalpel (584)
  • archetypes
  • camel-a2a
  • camel-activemq
  • camel-activemq6
  • camel-ai-observability
  • camel-ai-observability-api
  • camel-ai-parent
  • camel-ai-resource
  • camel-ai-tool
  • camel-alibaba-common
  • camel-alibaba-eventbridge
  • camel-alibaba-fc
  • camel-alibaba-kms
  • camel-alibaba-mns
  • camel-alibaba-oss
  • camel-alibaba-ots
  • camel-alibaba-parent
  • camel-alibaba-sls
  • camel-alibaba-sms
  • camel-amqp
  • camel-api
  • camel-api-component-maven-plugin
  • camel-arangodb
  • camel-archetype-api-component
  • camel-archetype-component
  • camel-archetype-dataformat
  • camel-archetype-java
  • camel-archetype-main
  • camel-as2
  • camel-as2-api
  • camel-as2-parent
  • camel-asn1
  • camel-asterisk
  • camel-atmosphere-websocket
  • camel-atom
  • camel-attachments
  • camel-avro
  • camel-avro-rpc
  • camel-avro-rpc-jetty
  • camel-avro-rpc-parent
  • camel-avro-rpc-spi
  • camel-aws-bedrock
  • camel-aws-cloudtrail
  • camel-aws-common
  • camel-aws-config
  • camel-aws-parameter-store
  • camel-aws-parent
  • camel-aws-secrets-manager
  • camel-aws-security-hub
  • camel-aws2-athena
  • camel-aws2-comprehend
  • camel-aws2-cw
  • camel-aws2-ddb
  • camel-aws2-ec2
  • camel-aws2-ecs
  • camel-aws2-eks
  • camel-aws2-eventbridge
  • camel-aws2-iam
  • camel-aws2-kinesis
  • camel-aws2-kms
  • camel-aws2-lambda
  • camel-aws2-mq
  • camel-aws2-msk
  • camel-aws2-polly
  • camel-aws2-redshift
  • camel-aws2-rekognition
  • camel-aws2-s3
  • camel-aws2-s3-vectors
  • camel-aws2-ses
  • camel-aws2-sns
  • camel-aws2-sqs
  • camel-aws2-step-functions
  • camel-aws2-sts
  • camel-aws2-textract
  • camel-aws2-timestream
  • camel-aws2-transcribe
  • camel-aws2-translate
  • camel-azure-common
  • camel-azure-cosmosdb
  • camel-azure-eventgrid
  • camel-azure-eventhubs
  • camel-azure-files
  • camel-azure-functions
  • camel-azure-key-vault
  • camel-azure-parent
  • camel-azure-schema-registry
  • camel-azure-servicebus
  • camel-azure-storage-blob
  • camel-azure-storage-datalake
  • camel-azure-storage-queue
  • camel-barcode
  • camel-base
  • camel-base-engine
  • camel-base64
  • camel-bean
  • camel-bean-validator
  • camel-beanio
  • camel-bindy
  • camel-bonita
  • camel-box
  • camel-box-api
  • camel-box-parent
  • camel-braintree
  • camel-browse
  • camel-caffeine
  • camel-camunda
  • camel-cassandraql
  • camel-catalog-common
  • camel-cbor
  • camel-chatscript
  • camel-chunk
  • camel-cli-connector
  • camel-cli-debug
  • camel-clickhouse
  • camel-clickup
  • camel-cloudevents
  • camel-cluster
  • camel-cm-sms
  • camel-coap
  • camel-cometd
  • camel-component-maven-plugin
  • camel-console
  • camel-consul
  • camel-controlbus
  • camel-core
  • camel-core-all
  • camel-core-catalog
  • camel-core-engine
  • camel-core-languages
  • camel-core-model
  • camel-core-processor
  • camel-core-reifier
  • camel-core-xml
  • camel-couchbase
  • camel-couchdb
  • camel-cron
  • camel-crypto
  • camel-crypto-pgp
  • camel-csv
  • camel-cxf-common
  • camel-cxf-parent
  • camel-cxf-rest
  • camel-cxf-soap
  • camel-cxf-spring-common
  • camel-cxf-spring-rest
  • camel-cxf-spring-soap
  • camel-cxf-spring-transport
  • camel-cxf-transport
  • camel-cyberark-vault
  • camel-dapr
  • camel-dataformat
  • camel-dataset
  • camel-datasonnet
  • camel-dataweave
  • camel-debezium-common
  • camel-debezium-common-parent
  • camel-debezium-db2
  • camel-debezium-maven-plugin
  • camel-debezium-mongodb
  • camel-debezium-mysql
  • camel-debezium-oracle
  • camel-debezium-parent
  • camel-debezium-postgres
  • camel-debezium-sqlserver
  • camel-debug
  • camel-dependencies
  • camel-dfdl
  • camel-dhis2
  • camel-dhis2-api
  • camel-dhis2-parent
  • camel-diagram
  • camel-direct
  • camel-disruptor
  • camel-djl
  • camel-dns
  • camel-docker
  • camel-docling
  • camel-drill
  • camel-dropbox
  • camel-dsl-modeline
  • camel-dsl-support
  • camel-duckdb
  • camel-dynamic-router
  • camel-ehcache
  • camel-eip-documentation-enricher-maven-plugin
  • camel-elasticsearch
  • camel-elasticsearch-rest-client
  • camel-event
  • camel-exec
  • camel-fastjson
  • camel-fhir
  • camel-fhir-api
  • camel-fhir-parent
  • camel-file
  • camel-file-watch
  • camel-flatpack
  • camel-flink
  • camel-flowable
  • camel-fop
  • camel-fory
  • camel-freemarker
  • camel-ftp
  • camel-ftp-common
  • camel-geocoder
  • camel-git
  • camel-github2
  • camel-google-bigquery
  • camel-google-calendar
  • camel-google-common
  • camel-google-drive
  • camel-google-firestore
  • camel-google-functions
  • camel-google-mail
  • camel-google-parent
  • camel-google-pubsub
  • camel-google-secret-manager
  • camel-google-sheets
  • camel-google-speech-to-text
  • camel-google-storage
  • camel-google-text-to-speech
  • camel-google-vertexai
  • camel-google-vision
  • camel-graphql
  • camel-grok
  • camel-groovy
  • camel-grpc
  • camel-gson
  • camel-hashicorp-vault
  • camel-hazelcast
  • camel-health
  • camel-hivemq
  • camel-hl7
  • camel-http
  • camel-http-base
  • camel-http-common
  • camel-huawei-parent
  • camel-huaweicloud-common
  • camel-huaweicloud-dms
  • camel-huaweicloud-frs
  • camel-huaweicloud-functiongraph
  • camel-huaweicloud-iam
  • camel-huaweicloud-imagerecognition
  • camel-huaweicloud-obs
  • camel-huaweicloud-smn
  • camel-huggingface
  • camel-ibm-cos
  • camel-ibm-parent
  • camel-ibm-secrets-manager
  • camel-ibm-watson-discovery
  • camel-ibm-watson-language
  • camel-ibm-watson-speech-to-text
  • camel-ibm-watson-text-to-speech
  • camel-ibm-watsonx-ai
  • camel-ibm-watsonx-data
  • camel-ical
  • camel-iggy
  • camel-ignite
  • camel-infinispan
  • camel-infinispan-common
  • camel-infinispan-embedded
  • camel-infinispan-parent
  • camel-influxdb
  • camel-influxdb2
  • camel-iso8583
  • camel-jackson
  • camel-jackson-avro
  • camel-jackson-protobuf
  • camel-jackson3
  • camel-jackson3-avro
  • camel-jackson3-protobuf
  • camel-jackson3xml
  • camel-jacksonxml
  • camel-jactl
  • camel-jandex
  • camel-jasypt
  • camel-java-io
  • camel-java-joor-dsl
  • camel-javascript
  • camel-jaxb
  • camel-jbang-console
  • camel-jbang-mcp
  • camel-jbang-parent
  • camel-jbang-plugin-mcp
  • camel-jbang-plugin-route-parser
  • camel-jbang-plugin-tui
  • camel-jbang-plugin-validate
  • camel-jcache
  • camel-jcr
  • camel-jdbc
  • camel-jetty
  • camel-jetty-common
  • camel-jfr
  • camel-jgroups
  • camel-jgroups-raft
  • camel-jira
  • camel-jms
  • camel-jmx
  • camel-jolt
  • camel-jooq
  • camel-joor
  • camel-jpa
  • camel-jq
  • camel-jsch
  • camel-jslt
  • camel-json-validator
  • camel-jsonapi
  • camel-jsonata
  • camel-jsonb
  • camel-jsonpath
  • camel-jsoup
  • camel-jt400
  • camel-jta
  • camel-jte
  • camel-kafka
  • camel-kamelet
  • camel-kamelet-main-support
  • camel-keycloak
  • camel-knative
  • camel-knative-api
  • camel-knative-http
  • camel-knative-parent
  • camel-kserve
  • camel-kubernetes
  • camel-kudu
  • camel-langchain4j-agent
  • camel-langchain4j-agent-api
  • camel-langchain4j-chat
  • camel-langchain4j-core
  • camel-langchain4j-embeddings
  • camel-langchain4j-embeddingstore
  • camel-langchain4j-embeddingstore-api
  • camel-langchain4j-ingest
  • camel-langchain4j-tokenizer
  • camel-langchain4j-web-search
  • camel-language
  • camel-launcher-container
  • camel-ldap
  • camel-ldif
  • camel-log
  • camel-lra
  • camel-lucene
  • camel-lumberjack
  • camel-lzf
  • camel-mail
  • camel-mail-microsoft-oauth
  • camel-main
  • camel-management
  • camel-management-api
  • camel-mapstruct
  • camel-master
  • camel-maven-plugin
  • camel-mcp-server
  • camel-mcp-server-api
  • camel-mdc
  • camel-metrics
  • camel-micrometer
  • camel-micrometer-observability
  • camel-micrometer-prometheus
  • camel-microprofile-config
  • camel-microprofile-fault-tolerance
  • camel-microprofile-health
  • camel-microprofile-parent
  • camel-milo
  • camel-milvus
  • camel-mina
  • camel-mina-sftp
  • camel-minio
  • camel-mllp
  • camel-mock
  • camel-mongodb
  • camel-mongodb-gridfs
  • camel-mustache
  • camel-mvel
  • camel-mybatis
  • camel-nats
  • camel-neo4j
  • camel-netty
  • camel-netty-http
  • camel-oaipmh
  • camel-oauth
  • camel-observability-services
  • camel-observation
  • camel-ocsf
  • camel-ognl
  • camel-olingo2
  • camel-olingo2-api
  • camel-olingo2-parent
  • camel-olingo4
  • camel-olingo4-api
  • camel-olingo4-parent
  • camel-once
  • camel-opa
  • camel-openai
  • camel-openapi-java
  • camel-openapi-rest-dsl-generator
  • camel-openapi-validator
  • camel-openfga
  • camel-opensearch
  • camel-openstack
  • camel-opentelemetry
  • camel-opentelemetry-metrics
  • camel-opentelemetry2
  • camel-optaplanner
  • camel-package-maven-plugin
  • camel-paho
  • camel-paho-mqtt5
  • camel-parquet-avro
  • camel-pdf
  • camel-pg-replication-slot
  • camel-pgevent
  • camel-pgvector
  • camel-pinecone
  • camel-platform-http
  • camel-platform-http-jolokia
  • camel-platform-http-main
  • camel-platform-http-vertx
  • camel-plc4x
  • camel-pqc
  • camel-printer
  • camel-protobuf
  • camel-pubnub
  • camel-pulsar
  • camel-python
  • camel-python3
  • camel-qdrant
  • camel-quartz
  • camel-quickfix
  • camel-quickjs
  • camel-reactive-streams
  • camel-reactor
  • camel-redis
  • camel-ref
  • camel-resilience4j
  • camel-resilience4j-micrometer
  • camel-resourceresolver-github
  • camel-rest
  • camel-rest-openapi
  • camel-rest-postman
  • camel-restdsl-openapi-plugin
  • camel-robotframework
  • camel-rocketmq
  • camel-rss
  • camel-rxjava
  • camel-saga
  • camel-salesforce
  • camel-salesforce-codegen
  • camel-salesforce-parent
  • camel-sap-netweaver
  • camel-saxon
  • camel-scheduler
  • camel-schematron
  • camel-seda
  • camel-semantic
  • camel-servicenow
  • camel-servicenow-maven-plugin
  • camel-servicenow-parent
  • camel-servlet
  • camel-shell
  • camel-shiro
  • camel-sjms
  • camel-sjms2
  • camel-slack
  • camel-smb
  • camel-smooks
  • camel-smpp
  • camel-snakeyaml
  • camel-snmp
  • camel-soap
  • camel-solr
  • camel-spiffe
  • camel-splunk-hec
  • camel-spring
  • camel-spring-ai-chat
  • camel-spring-ai-embeddings
  • camel-spring-ai-image
  • camel-spring-ai-parent
  • camel-spring-ai-vector-store
  • camel-spring-batch
  • camel-spring-cloud-config
  • camel-spring-jdbc
  • camel-spring-ldap
  • camel-spring-main
  • camel-spring-parent
  • camel-spring-rabbitmq
  • camel-spring-redis
  • camel-spring-security
  • camel-spring-ws
  • camel-spring-xml
  • camel-sql
  • camel-ssh
  • camel-state-store
  • camel-state-store-parent
  • camel-stax
  • camel-stitch
  • camel-stream
  • camel-streamcaching-test
  • camel-stringtemplate
  • camel-stripe
  • camel-stub
  • camel-support
  • camel-swift
  • camel-syslog
  • camel-tahu
  • camel-tarfile
  • camel-telegram
  • camel-telemetry
  • camel-telemetry-dev
  • camel-tensorflow-serving
  • camel-test-infra-all
  • camel-test-infra-artemis
  • camel-test-infra-cli
  • camel-test-infra-core
  • camel-test-infra-jetty
  • camel-test-infra-qdrant
  • camel-test-infra-smb
  • camel-test-junit5
  • camel-test-junit6
  • camel-test-main-junit5
  • camel-test-main-junit6
  • camel-test-parent
  • camel-test-spring-junit5
  • camel-test-spring-junit6
  • camel-thrift
  • camel-thymeleaf
  • camel-tika
  • camel-timer
  • camel-tooling-maven
  • camel-toon
  • camel-tracing
  • camel-twilio
  • camel-twitter
  • camel-typesafe-ai
  • camel-ubl
  • camel-undertow
  • camel-undertow-spring-security
  • camel-univocity-parsers
  • camel-util
  • camel-validator
  • camel-velocity
  • camel-vertx
  • camel-vertx-common
  • camel-vertx-http
  • camel-vertx-parent
  • camel-vertx-websocket
  • camel-wal
  • camel-wasm
  • camel-weather
  • camel-weaviate
  • camel-web3j
  • camel-webhook
  • camel-whatsapp
  • camel-wordpress
  • camel-workday
  • camel-xchange
  • camel-xj
  • camel-xml-io
  • camel-xml-io-dsl
  • camel-xml-io-util
  • camel-xml-jaxb
  • camel-xml-jaxb-dsl
  • camel-xml-jaxb-dsl-test
  • camel-xml-jaxb-dsl-test-definition
  • camel-xml-jaxb-dsl-test-spring
  • camel-xml-jaxp
  • camel-xml-jaxp-util
  • camel-xmlsecurity
  • camel-xmpp
  • camel-xpath
  • camel-xslt
  • camel-xslt-saxon
  • camel-yaml-dsl-common
  • camel-yaml-dsl-parent
  • camel-yaml-dsl-validator
  • camel-yaml-dsl-validator-maven-plugin
  • camel-yaml-io
  • camel-zendesk
  • camel-zip-deflater
  • camel-zipfile
  • camel-zookeeper
  • camel-zookeeper-master
  • components
  • core
  • dsl
  • sync-properties-maven-plugin
Modules only in current approach (76)
  • [ERROR]
  • [ERROR]
  • [ERROR] Command execution failed.
  • [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.6.4:exec (default-cli) on project camel-package-maven-plugin: Command execution failed. Process exited with an error: 127 (Exit value: 127) -> [Help 1]
  • [ERROR] For more information about the errors and possible solutions, please read the following articles:
  • [ERROR] Re-run Maven using the -X switch to enable full debug logging.
  • [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
  • [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
  • at com.gradle.maven.cache.extension.c.a.a (SourceFile:46)
  • at com.gradle.maven.cache.extension.c.a.a (SourceFile:46)
  • at com.gradle.maven.cache.extension.c.b.a (SourceFile:62)
  • at com.gradle.maven.cache.extension.c.b.c (SourceFile:118)
  • at com.gradle.maven.cache.extension.c.c.a (SourceFile:26)
  • at com.gradle.maven.cache.extension.c.d.a (SourceFile:27)
  • at com.gradle.maven.cache.extension.c.g.a (SourceFile:27)
  • at com.gradle.maven.cache.extension.c.h$1.run (SourceFile:35)
  • at com.gradle.maven.cache.extension.c.h.a (SourceFile:31)
  • at com.gradle.maven.cache.extension.c.j.a (SourceFile:28)
  • at com.gradle.maven.cache.extension.c.m.a (SourceFile:80)
  • at com.gradle.maven.cache.extension.c.n.a (SourceFile:53)
  • at com.gradle.maven.cache.extension.c.o.a (SourceFile:18)
  • at com.gradle.maven.cache.extension.c.p.a (SourceFile:27)
  • at com.gradle.maven.cache.extension.c.q.a (SourceFile:23)
  • at com.gradle.maven.cache.extension.g.b.lambda$createProxy$0 (SourceFile:77)
  • at com.gradle.maven.scan.extension.internal.e.b.executeMojo (SourceFile:116)
  • at java.lang.reflect.Method.invoke (Method.java:569)
  • at java.lang.reflect.Method.invoke (Method.java:569)
  • at java.lang.reflect.Method.invoke (Method.java:569)
  • at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
  • at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
  • at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
  • at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)
  • at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)
  • at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)
  • at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
  • at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
  • at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
  • at jdk.proxy5.$Proxy70.execute (Unknown Source)
  • at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:306)
  • at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:408)
  • at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
  • at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
  • at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
  • at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
  • at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
  • at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
  • at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
  • at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
  • at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
  • at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
  • at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
  • at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
  • at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
  • at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
  • at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
  • at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
  • at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
  • at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
  • at org.apache.maven.wrapper.BootstrapMainStarter.start (BootstrapMainStarter.java:52)
  • at org.apache.maven.wrapper.MavenWrapperMain.main (MavenWrapperMain.java:73)
  • at org.apache.maven.wrapper.WrapperExecutor.execute (WrapperExecutor.java:161)
  • at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:464)
  • at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:873)
  • at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:913)
  • at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
  • at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
  • at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
  • at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
  • at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute (SourceFile:27)
  • at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute (SourceFile:30)
  • at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute (SourceFile:60)
  • at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute (SourceFile:67)
  • at org.gradle.internal.operations.DefaultBuildOperationRunner.execute (SourceFile:167)
  • at org.gradle.internal.operations.DefaultBuildOperationRunner.execute (SourceFile:60)
  • at org.gradle.internal.operations.DefaultBuildOperationRunner.run (SourceFile:48)
  • org.apache.commons.exec.ExecuteException: Process exited with an error: 127 (Exit value: 127)
Modules Scalpel would test (584)
  • archetypes ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-a2a ← depends on affected reactor module org.apache.camel:camel-platform-http-vertx
  • camel-activemq ← depends on affected reactor module org.apache.camel:camel-test-infra-artemis
  • camel-activemq6 ← depends on affected reactor module org.apache.camel:camel-test-infra-artemis
  • camel-ai-observability ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ai-observability-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ai-parent ← downstream of org.apache.camel:camel-core-model
  • camel-ai-resource ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ai-tool ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-common ← depends on affected reactor module org.apache.camel:camel-support
  • camel-alibaba-eventbridge ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-fc ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-kms ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-mns ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-oss ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-ots ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-parent ← downstream of org.apache.camel:camel-core-model
  • camel-alibaba-sls ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-alibaba-sms ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-amqp ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-api ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-api-component-maven-plugin ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-arangodb ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-archetype-api-component ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-archetype-component ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-archetype-dataformat ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-archetype-java ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-archetype-main ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-as2 ← depends on affected reactor module org.apache.camel:camel-jetty
  • camel-as2-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-as2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-asn1 ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-asterisk ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-atmosphere-websocket ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-atom ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-attachments ← depends on affected reactor module org.apache.camel:camel-bean
  • camel-avro ← depends on affected reactor module org.apache.camel:camel-spring-xml
  • camel-avro-rpc ← depends on affected reactor module org.apache.camel:camel-spring-xml
  • camel-avro-rpc-jetty ← downstream of org.apache.camel:camel-core-model
  • camel-avro-rpc-parent ← downstream of org.apache.camel:camel-core-model
  • camel-avro-rpc-spi ← downstream of org.apache.camel:camel-core-model
  • camel-aws-bedrock ← depends on affected reactor module org.apache.camel:camel-base64
  • camel-aws-cloudtrail ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws-common ← depends on affected reactor module org.apache.camel:camel-support
  • camel-aws-config ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-aws-parameter-store ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws-parent ← downstream of org.apache.camel:camel-core-model
  • camel-aws-secrets-manager ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws-security-hub ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-athena ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-comprehend ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-cw ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ddb ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ec2 ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ecs ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-eks ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-eventbridge ← depends on affected reactor module org.apache.camel:camel-aws2-sqs
  • camel-aws2-iam ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-kinesis ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-kms ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-lambda ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-mq ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-msk ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-polly ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-redshift ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-rekognition ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-s3 ← depends on affected reactor module org.apache.camel:camel-zip-deflater
  • camel-aws2-s3-vectors ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ses ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-sns ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-sqs ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-step-functions ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-sts ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-textract ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-timestream ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-aws2-transcribe ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-aws2-translate ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-azure-common ← downstream of org.apache.camel:camel-core-model
  • camel-azure-cosmosdb ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-azure-eventgrid ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-azure-eventhubs ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-azure-files ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-azure-functions ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-azure-key-vault ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-azure-parent ← downstream of org.apache.camel:camel-core-model
  • camel-azure-schema-registry ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-azure-servicebus ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-azure-storage-blob ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-azure-storage-datalake ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-azure-storage-queue ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-barcode ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-base ← depends on affected reactor module org.apache.camel:camel-support
  • camel-base-engine ← depends on affected reactor module org.apache.camel:camel-support
  • camel-base64 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-bean ← depends on affected reactor module org.apache.camel:camel-support
  • camel-bean-validator ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-beanio ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-bindy ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-bonita ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-box ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-box-api ← downstream of org.apache.camel:camel-core-model
  • camel-box-parent ← downstream of org.apache.camel:camel-core-model
  • camel-braintree ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-browse ← depends on affected reactor module org.apache.camel:camel-support
  • camel-caffeine ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-camunda ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cassandraql ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-catalog-common ← depends on affected reactor module org.apache.camel:camel-support
  • camel-cbor ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-chatscript ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-chunk ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cli-connector ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cli-debug ← depends on affected reactor module org.apache.camel:camel-cli-connector
  • camel-clickhouse ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-clickup ← depends on affected reactor module org.apache.camel:camel-netty-http
  • camel-cloudevents ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cluster ← depends on affected reactor module org.apache.camel:camel-support
  • camel-cm-sms ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-coap ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cometd ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-component-maven-plugin ← depends on affected reactor module org.apache.camel:camel-package-maven-plugin
  • camel-console ← depends on affected reactor module org.apache.camel:camel-management
  • camel-consul ← depends on affected reactor module org.apache.camel:camel-spring-main
  • camel-controlbus ← depends on affected reactor module org.apache.camel:camel-support
  • camel-core ← core/camel-core/src/test/java/org/apache/camel/processor/SwitchEndpointTest.java, core/camel-core/src/test/java/org/apache/camel/processor/SwitchTest.java, core/camel-core/src/test/java/org/apache/camel/processor/SwitchValidationTest.java
  • camel-core-all ← depends on affected reactor module org.apache.camel:camel-xml-jaxp
  • camel-core-catalog ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-core-engine ← core/camel-core-engine/src/main/docs/modules/eips/examples/json/switch.json, core/camel-core-engine/src/main/docs/modules/eips/nav.adoc, core/camel-core-engine/src/main/docs/modules/eips/pages/switch-eip.adoc
  • camel-core-languages ← depends on affected reactor module org.apache.camel:camel-support
  • camel-core-model ← core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/a2aSubTask.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/aggregate.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/cache.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/case.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/circuitBreaker.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/doCatch.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/doFinally.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/doTry.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/filter.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/idempotentConsumer.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/intercept.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptFrom.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptSendToEndpoint.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/kamelet.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/loadBalance.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/loop.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/multicast.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/onCompletion.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/onException.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/onFallback.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/otherwise.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/pipeline.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/resequence.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/route.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/saga.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/split.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/step.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/switch.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/switchOtherwise.json, core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/when.json, core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties, core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index, core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java, core/camel-core-model/src/main/java/org/apache/camel/model/SwitchCaseDefinition.java, core/camel-core-model/src/main/java/org/apache/camel/model/SwitchDefinition.java, core/camel-core-model/src/main/java/org/apache/camel/model/SwitchOtherwiseDefinition.java, core/camel-core-model/src/test/java/org/apache/camel/model/SwitchDefinitionTest.java
  • camel-core-processor ← core/camel-core-processor/src/main/java/org/apache/camel/processor/SwitchProcessor.java
  • camel-core-reifier ← core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java, core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SwitchReifier.java
  • camel-core-xml ← depends on affected reactor module org.apache.camel:camel-core-engine
  • camel-couchbase ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-couchdb ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cron ← depends on affected reactor module org.apache.camel:camel-timer
  • camel-crypto ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-crypto-pgp ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-csv ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-cxf-common ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cxf-parent ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-rest ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-cxf-soap ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-cxf-spring-common ← depends on affected reactor module org.apache.camel:camel-http-base
  • camel-cxf-spring-rest ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-cxf-spring-soap ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-cxf-spring-transport ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cxf-transport ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-cyberark-vault ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dapr ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dataformat ← depends on affected reactor module org.apache.camel:camel-support
  • camel-dataset ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-datasonnet ← depends on affected reactor module org.apache.camel:camel-core
  • camel-dataweave ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-common ← depends on affected reactor module org.apache.camel:camel-support
  • camel-debezium-common-parent ← depends on affected reactor module org.apache.camel:camel-support
  • camel-debezium-db2 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-debezium-maven-plugin ← depends on affected reactor module org.apache.camel:camel-support
  • camel-debezium-mongodb ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-debezium-mysql ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-debezium-oracle ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-debezium-parent ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-postgres ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-debezium-sqlserver ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-debug ← depends on affected reactor module org.apache.camel:camel-xml-io
  • camel-dependencies ← downstream of org.apache.camel:sync-properties-maven-plugin
  • camel-dfdl ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dhis2 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dhis2-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dhis2-parent ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-diagram ← depends on affected reactor module org.apache.camel:camel-management
  • camel-direct ← depends on affected reactor module org.apache.camel:camel-support
  • camel-disruptor ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-djl ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dns ← depends on affected reactor module org.apache.camel:camel-log
  • camel-docker ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-docling ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-drill ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dropbox ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dsl-modeline ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dsl-support ← depends on affected reactor module org.apache.camel:camel-core-model
  • camel-duckdb ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-dynamic-router ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-ehcache ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-eip-documentation-enricher-maven-plugin ← downstream of org.apache.camel:camel-util
  • camel-elasticsearch ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-elasticsearch-rest-client ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-event ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-exec ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-fastjson ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-fhir ← depends on affected reactor module org.apache.camel:camel-hl7
  • camel-fhir-api ← depends on affected reactor module org.apache.camel:camel-support
  • camel-fhir-parent ← downstream of org.apache.camel:camel-core-model
  • camel-file ← depends on affected reactor module org.apache.camel:camel-core-engine
  • camel-file-watch ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-flatpack ← depends on affected reactor module org.apache.camel:camel-direct
  • camel-flink ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-flowable ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-fop ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-fory ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-freemarker ← depends on affected reactor module org.apache.camel:camel-management
  • camel-ftp ← depends on affected reactor module org.apache.camel:camel-spring-xml
  • camel-ftp-common ← depends on affected reactor module org.apache.camel:camel-health
  • camel-geocoder ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-git ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-github2 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-bigquery ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-calendar ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-common ← depends on affected reactor module org.apache.camel:camel-core
  • camel-google-drive ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-firestore ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-functions ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-mail ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-parent ← downstream of org.apache.camel:camel-core-model
  • camel-google-pubsub ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-secret-manager ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-sheets ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-google-speech-to-text ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-storage ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-text-to-speech ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-vertexai ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-google-vision ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-graphql ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-grok ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-groovy ← depends on affected reactor module org.apache.camel:camel-main
  • camel-grpc ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-gson ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-hashicorp-vault ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-hazelcast ← depends on affected reactor module org.apache.camel:camel-spring-main
  • camel-health ← depends on affected reactor module org.apache.camel:camel-support
  • camel-hivemq ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-hl7 ← depends on affected reactor module org.apache.camel:camel-core
  • camel-http ← depends on affected reactor module org.apache.camel:camel-rest
  • camel-http-base ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-http-common ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-huawei-parent ← downstream of org.apache.camel:camel-core-model
  • camel-huaweicloud-common ← depends on affected reactor module org.apache.camel:camel-support
  • camel-huaweicloud-dms ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-huaweicloud-frs ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-huaweicloud-functiongraph ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-huaweicloud-iam ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-huaweicloud-imagerecognition ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-huaweicloud-obs ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-huaweicloud-smn ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-huggingface ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ibm-cos ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ibm-parent ← downstream of org.apache.camel:camel-core-model
  • camel-ibm-secrets-manager ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ibm-watson-discovery ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ibm-watson-language ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ibm-watson-speech-to-text ← depends on affected reactor module org.apache.camel:camel-ibm-watson-text-to-speech
  • camel-ibm-watson-text-to-speech ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ibm-watsonx-ai ← depends on affected reactor module org.apache.camel:camel-vertx-websocket
  • camel-ibm-watsonx-data ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ical ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-iggy ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-ignite ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-infinispan ← depends on affected reactor module org.apache.camel:camel-stub
  • camel-infinispan-common ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-infinispan-embedded ← depends on affected reactor module org.apache.camel:camel-log
  • camel-infinispan-parent ← downstream of org.apache.camel:camel-core-model
  • camel-influxdb ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-influxdb2 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-iso8583 ← depends on affected reactor module org.apache.camel:camel-groovy
  • camel-jackson ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-jackson-avro ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jackson-protobuf ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jackson3 ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-jackson3-avro ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jackson3-protobuf ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jackson3xml ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-jacksonxml ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-jactl ← depends on affected reactor module org.apache.camel:camel-core
  • camel-jandex ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-jasypt ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-java-io ← core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java, core/camel-java-io/src/main/java/org/apache/camel/java/out/JavaDslModelWriterSupport.java, core/camel-java-io/src/test/java/org/apache/camel/java/out/JavaDslModelWriterTest.java, core/camel-java-io/src/test/resources/switchLiteral.xml
  • camel-java-joor-dsl ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-javascript ← depends on affected reactor module org.apache.camel:camel-core
  • camel-jaxb ← depends on affected reactor module org.apache.camel:camel-spring-xml
  • camel-jbang-console ← depends on affected reactor module org.apache.camel:camel-management
  • camel-jbang-mcp ← depends on affected reactor module org.apache.camel:camel-java-joor-dsl
  • camel-jbang-parent ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-jbang-plugin-mcp ← depends on affected reactor module org.apache.camel:camel-jbang-core
  • camel-jbang-plugin-route-parser ← depends on affected reactor module org.apache.camel:camel-route-parser
  • camel-jbang-plugin-tui ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jbang-plugin-validate ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jcache ← depends on affected reactor module org.apache.camel:camel-core-languages
  • camel-jcr ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jdbc ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-jetty ← depends on affected reactor module org.apache.camel:camel-main
  • camel-jetty-common ← depends on affected reactor module org.apache.camel:camel-jaxb
  • camel-jfr ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-jgroups ← depends on affected reactor module org.apache.camel:camel-master
  • camel-jgroups-raft ← depends on affected reactor module org.apache.camel:camel-master
  • camel-jira ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jms ← depends on affected reactor module org.apache.camel:camel-test-infra-artemis
  • camel-jmx ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jolt ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jooq ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-joor ← depends on affected reactor module org.apache.camel:camel-core
  • camel-jpa ← depends on affected reactor module org.apache.camel:camel-spring-xml
  • camel-jq ← depends on affected reactor module org.apache.camel:camel-core
  • camel-jsch ← depends on affected reactor module org.apache.camel:camel-ssh
  • camel-jslt ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-json-validator ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jsonapi ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-jsonata ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jsonb ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-jsonpath ← depends on affected reactor module org.apache.camel:camel-core
  • camel-jsoup ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-jt400 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-jta ← depends on affected reactor module org.apache.camel:camel-sql
  • camel-jte ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-kafka ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-kamelet ← depends on affected reactor module org.apache.camel:camel-main
  • camel-kamelet-main-support ← depends on affected reactor module org.apache.camel:camel-main
  • camel-keycloak ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-knative ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-knative-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-knative-http ← depends on affected reactor module org.apache.camel:camel-http
  • camel-knative-parent ← downstream of org.apache.camel:camel-core-model
  • camel-kserve ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-kubernetes ← depends on affected reactor module org.apache.camel:camel-log
  • camel-kudu ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-langchain4j-agent ← depends on affected reactor module org.apache.camel:camel-telemetry
  • camel-langchain4j-agent-api ← downstream of org.apache.camel:camel-core-model
  • camel-langchain4j-chat ← depends on affected reactor module org.apache.camel:camel-telemetry
  • camel-langchain4j-core ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-langchain4j-embeddings ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-langchain4j-embeddingstore ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-langchain4j-embeddingstore-api ← downstream of org.apache.camel:camel-core-model
  • camel-langchain4j-ingest ← depends on affected reactor module org.apache.camel:camel-docling
  • camel-langchain4j-tokenizer ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-langchain4j-web-search ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-language ← depends on affected reactor module org.apache.camel:camel-support
  • camel-launcher-container ← depends on affected reactor module org.apache.camel:camel-launcher
  • camel-ldap ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ldif ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-log ← depends on affected reactor module org.apache.camel:camel-support
  • camel-lra ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-lucene ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-lumberjack ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-lzf ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-mail ← depends on affected reactor module org.apache.camel:camel-quartz
  • camel-mail-microsoft-oauth ← depends on affected reactor module org.apache.camel:camel-mail
  • camel-main ← depends on affected reactor module org.apache.camel:camel-seda
  • camel-management ← core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java, core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java, core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedSwitch.java, core/camel-management/src/test/java/org/apache/camel/management/ManagedSwitchTest.java
  • camel-management-api ← core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java, core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedSwitchMBean.java
  • camel-mapstruct ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-master ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-maven-plugin ← depends on affected reactor module org.apache.camel:camel-spring-main
  • camel-mcp-server ← depends on affected reactor module org.apache.camel:camel-openai
  • camel-mcp-server-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-mdc ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-metrics ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-micrometer ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-micrometer-observability ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-micrometer-prometheus ← depends on affected reactor module org.apache.camel:camel-platform-http-main
  • camel-microprofile-config ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-microprofile-fault-tolerance ← depends on affected reactor module org.apache.camel:camel-management
  • camel-microprofile-health ← depends on affected reactor module org.apache.camel:camel-main
  • camel-microprofile-parent ← downstream of org.apache.camel:camel-core-model
  • camel-milo ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-milvus ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-mina ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-mina-sftp ← depends on affected reactor module org.apache.camel:camel-core-languages
  • camel-minio ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-mllp ← depends on affected reactor module org.apache.camel:camel-test-infra-artemis
  • camel-mock ← depends on affected reactor module org.apache.camel:camel-support
  • camel-mongodb ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-mongodb-gridfs ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-mustache ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-mvel ← depends on affected reactor module org.apache.camel:camel-core
  • camel-mybatis ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-nats ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-neo4j ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-netty ← depends on affected reactor module org.apache.camel:camel-main
  • camel-netty-http ← depends on affected reactor module org.apache.camel:camel-jetty
  • camel-oaipmh ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-oauth ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-observability-services ← depends on affected reactor module org.apache.camel:camel-management
  • camel-observation ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-ocsf ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ognl ← depends on affected reactor module org.apache.camel:camel-core
  • camel-olingo2 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-olingo2-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-olingo2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-olingo4 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-olingo4-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-olingo4-parent ← downstream of org.apache.camel:camel-core-model
  • camel-once ← depends on affected reactor module org.apache.camel:camel-groovy
  • camel-opa ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-openai ← depends on affected reactor module org.apache.camel:camel-jackson
  • camel-openapi-java ← depends on affected reactor module org.apache.camel:camel-management
  • camel-openapi-rest-dsl-generator ← depends on affected reactor module org.apache.camel:camel-core-engine
  • camel-openapi-validator ← depends on affected reactor module org.apache.camel:camel-platform-http-vertx
  • camel-openfga ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-opensearch ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-openstack ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-opentelemetry ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-opentelemetry-metrics ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-opentelemetry2 ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-optaplanner ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-package-maven-plugin ← tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/model-java-dsl-writer.vm, tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/model-yaml-writer.vm
  • camel-paho ← depends on affected reactor module org.apache.camel:camel-test-infra-artemis
  • camel-paho-mqtt5 ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-parquet-avro ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-pdf ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-pg-replication-slot ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-pgevent ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-pgvector ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-pinecone ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-platform-http ← depends on affected reactor module org.apache.camel:camel-http
  • camel-platform-http-jolokia ← depends on affected reactor module org.apache.camel:camel-core
  • camel-platform-http-main ← depends on affected reactor module org.apache.camel:camel-openapi-java
  • camel-platform-http-vertx ← depends on affected reactor module org.apache.camel:camel-vertx-http
  • camel-plc4x ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-pqc ← depends on affected reactor module org.apache.camel:camel-crypto
  • camel-printer ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-protobuf ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-pubnub ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-pulsar ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-python ← depends on affected reactor module org.apache.camel:camel-core
  • camel-python3 ← depends on affected reactor module org.apache.camel:camel-core
  • camel-qdrant ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-quartz ← depends on affected reactor module org.apache.camel:camel-management
  • camel-quickfix ← depends on affected reactor module org.apache.camel:camel-jetty
  • camel-quickjs ← depends on affected reactor module org.apache.camel:camel-core
  • camel-reactive-streams ← depends on affected reactor module org.apache.camel:camel-management
  • camel-reactor ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-redis ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-ref ← depends on affected reactor module org.apache.camel:camel-support
  • camel-resilience4j ← depends on affected reactor module org.apache.camel:camel-management
  • camel-resilience4j-micrometer ← depends on affected reactor module org.apache.camel:camel-management
  • camel-resourceresolver-github ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-rest ← depends on affected reactor module org.apache.camel:camel-core-languages
  • camel-rest-openapi ← depends on affected reactor module org.apache.camel:camel-vertx-http
  • camel-rest-postman ← depends on affected reactor module org.apache.camel:camel-vertx-http
  • camel-restdsl-openapi-plugin ← depends on affected reactor module org.apache.camel:camel-jetty
  • camel-robotframework ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-rocketmq ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-rss ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-rxjava ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-saga ← depends on affected reactor module org.apache.camel:camel-support
  • camel-salesforce ← depends on affected reactor module org.apache.camel:camel-csv
  • camel-salesforce-codegen ← depends on affected reactor module org.apache.camel:camel-salesforce
  • camel-salesforce-parent ← downstream of org.apache.camel:camel-core-model
  • camel-sap-netweaver ← depends on affected reactor module org.apache.camel:camel-velocity
  • camel-saxon ← depends on affected reactor module org.apache.camel:camel-core
  • camel-scheduler ← depends on affected reactor module org.apache.camel:camel-support
  • camel-schematron ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-seda ← depends on affected reactor module org.apache.camel:camel-support
  • camel-semantic ← depends on affected reactor module org.apache.camel:camel-main
  • camel-servicenow ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-servicenow-maven-plugin ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-servicenow-parent ← downstream of org.apache.camel:camel-core-model
  • camel-servlet ← depends on affected reactor module org.apache.camel:camel-gson
  • camel-shell ← depends on affected reactor module org.apache.camel:camel-test-junit5
  • camel-shiro ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-sjms ← depends on affected reactor module org.apache.camel:camel-test-infra-artemis
  • camel-sjms2 ← depends on affected reactor module org.apache.camel:camel-test-infra-artemis
  • camel-slack ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-smb ← depends on affected reactor module org.apache.camel:camel-test-infra-smb
  • camel-smooks ← depends on affected reactor module org.apache.camel:camel-attachments
  • camel-smpp ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-snakeyaml ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-snmp ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-soap ← depends on affected reactor module org.apache.camel:camel-cxf-soap
  • camel-solr ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-spiffe ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-splunk-hec ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-spring ← depends on affected reactor module org.apache.camel:camel-cron
  • camel-spring-ai-chat ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-spring-ai-embeddings ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-spring-ai-image ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-spring-ai-parent ← downstream of org.apache.camel:camel-core-model
  • camel-spring-ai-vector-store ← depends on affected reactor module org.apache.camel:camel-spring-ai-embeddings
  • camel-spring-batch ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-spring-cloud-config ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-spring-jdbc ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-spring-ldap ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-spring-main ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-spring-parent ← downstream of org.apache.camel:camel-core-model
  • camel-spring-rabbitmq ← depends on affected reactor module org.apache.camel:camel-http
  • camel-spring-redis ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-spring-security ← depends on affected reactor module org.apache.camel:camel-core-xml
  • camel-spring-ws ← depends on affected reactor module org.apache.camel:camel-jaxb
  • camel-spring-xml ← components/camel-spring-parent/camel-spring-xml/src/test/java/org/apache/camel/spring/SwitchJaxbTest.java
  • camel-sql ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-ssh ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-state-store ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-state-store-parent ← downstream of org.apache.camel:camel-core-model
  • camel-stax ← depends on affected reactor module org.apache.camel:camel-jaxb
  • camel-stitch ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-stream ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-streamcaching-test ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-stringtemplate ← depends on affected reactor module org.apache.camel:camel-management
  • camel-stripe ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-stub ← depends on affected reactor module org.apache.camel:camel-seda
  • camel-support ← depends on affected reactor module org.apache.camel:camel-management-api
  • camel-swift ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-syslog ← depends on affected reactor module org.apache.camel:camel-mina
  • camel-tahu ← depends on affected reactor module org.apache.camel:camel-test-infra-core
  • camel-tarfile ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-telegram ← depends on affected reactor module org.apache.camel:camel-netty-http
  • camel-telemetry ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-telemetry-dev ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-tensorflow-serving ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-test-infra-all ← depends on affected reactor module org.apache.camel:camel-test-infra-smb
  • camel-test-infra-artemis ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-test-infra-cli ← depends on affected reactor module org.apache.camel:camel-support
  • camel-test-infra-core ← depends on affected reactor module org.apache.camel:camel-core
  • camel-test-infra-jetty ← downstream of org.apache.camel:camel-util
  • camel-test-infra-qdrant ← downstream of org.apache.camel:camel-util
  • camel-test-infra-smb ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-test-junit5 ← depends on affected reactor module org.apache.camel:camel-xml-jaxb
  • camel-test-junit6 ← depends on affected reactor module org.apache.camel:camel-xml-jaxb
  • camel-test-main-junit5 ← depends on affected reactor module org.apache.camel:camel-yaml-io
  • camel-test-main-junit6 ← depends on affected reactor module org.apache.camel:camel-yaml-io
  • camel-test-parent ← downstream of org.apache.camel:camel-core-model
  • camel-test-spring-junit5 ← depends on affected reactor module org.apache.camel:camel-management
  • camel-test-spring-junit6 ← depends on affected reactor module org.apache.camel:camel-management
  • camel-thrift ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-thymeleaf ← depends on affected reactor module org.apache.camel:camel-management
  • camel-tika ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-timer ← depends on affected reactor module org.apache.camel:camel-support
  • camel-tooling-maven ← depends on affected reactor module org.apache.camel:camel-support
  • camel-toon ← depends on affected reactor module org.apache.camel:camel-test-junit5
  • camel-tracing ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-twilio ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-twitter ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-typesafe-ai ← depends on affected reactor module org.apache.camel:camel-xml-io-dsl
  • camel-ubl ← depends on affected reactor module org.apache.camel:camel-test-junit5
  • camel-undertow ← depends on affected reactor module org.apache.camel:camel-openapi-java
  • camel-undertow-spring-security ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-univocity-parsers ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-util ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-validator ← depends on affected reactor module org.apache.camel:camel-xml-jaxp
  • camel-velocity ← depends on affected reactor module org.apache.camel:camel-management
  • camel-vertx ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-vertx-common ← depends on affected reactor module org.apache.camel:camel-support
  • camel-vertx-http ← depends on affected reactor module org.apache.camel:camel-undertow
  • camel-vertx-parent ← downstream of org.apache.camel:camel-core-model
  • camel-vertx-websocket ← depends on affected reactor module org.apache.camel:camel-main
  • camel-wal ← depends on affected reactor module org.apache.camel:camel-support
  • camel-wasm ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-weather ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-weaviate ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-web3j ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-webhook ← depends on affected reactor module org.apache.camel:camel-netty-http
  • camel-whatsapp ← depends on affected reactor module org.apache.camel:camel-netty-http
  • camel-wordpress ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-workday ← depends on affected reactor module org.apache.camel:camel-mock
  • camel-xchange ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xj ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xml-io ← core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java, core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java, core/camel-xml-io/src/main/java/org/apache/camel/xml/LwModelToXMLDumper.java
  • camel-xml-io-dsl ← dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlSwitchTest.java
  • camel-xml-io-util ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-xml-jaxb ← core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
  • camel-xml-jaxb-dsl ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xml-jaxb-dsl-test ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-xml-jaxb-dsl-test-definition ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xml-jaxb-dsl-test-spring ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xml-jaxp ← depends on affected reactor module org.apache.camel:camel-support
  • camel-xml-jaxp-util ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-xmlsecurity ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xmpp ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xpath ← depends on affected reactor module org.apache.camel:camel-xml-jaxp
  • camel-xslt ← depends on affected reactor module org.apache.camel:camel-xml-jaxp
  • camel-xslt-saxon ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-yaml-dsl-common ← depends on affected reactor module org.apache.camel:camel-core-engine
  • camel-yaml-dsl-parent ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-yaml-dsl-validator ← dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/SwitchSchemaTest.java
  • camel-yaml-dsl-validator-maven-plugin ← depends on affected reactor module org.apache.camel:camel-yaml-dsl-validator
  • camel-yaml-io ← core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java, core/camel-yaml-io/src/main/java/org/apache/camel/yaml/LwModelToYAMLDumper.java, core/camel-yaml-io/src/test/java/org/apache/camel/yaml/io/YamlPrinterTest.java
  • camel-zendesk ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-zip-deflater ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-zipfile ← depends on affected reactor module org.apache.camel:camel-test-spring-junit6
  • camel-zookeeper ← depends on affected reactor module org.apache.camel:camel-master
  • camel-zookeeper-master ← depends on affected reactor module org.apache.camel:camel-ftp
  • components ← downstream of org.apache.camel:camel-core-model
  • core ← downstream of org.apache.camel:camel-package-maven-plugin
  • dsl ← downstream of org.apache.camel:camel-package-maven-plugin
  • sync-properties-maven-plugin ← downstream of org.apache.camel:camel-util

ℹ️ Shadow mode — Scalpel observes but does not affect test execution. Learn more

⚠️ 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
  • core/camel-core: 4 test(s) disabled on GitHub Actions

💡 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
Build reactor — dependencies compiled but only changed modules were tested (20 modules, 2m 11s total)

Total reactor time: 2m 11s

Module Duration Status
Camel :: Java DSL IO 19.8s SUCCESS
Camel :: Catalog :: Camel Catalog 19.0s SUCCESS
Camel :: XML IO 15.5s SUCCESS
Camel :: Maven Plugins :: Camel Maven Package 14.9s SUCCESS
Camel :: YAML DSL 13.0s SUCCESS
Camel :: Core Model 8.9s SUCCESS
Camel :: XML DSL with camel-xml-io 8.5s SUCCESS
Camel :: YAML DSL :: Validator 7.7s SUCCESS
Camel :: YAML IO 7.5s SUCCESS
Camel :: YAML DSL :: Deserializers 4.2s SUCCESS
Camel :: Core Processor 4.0s SUCCESS
Camel :: Core Reifier 2.6s SUCCESS
Camel :: Management API 2.3s SUCCESS
Camel :: Core Engine 1.4s SUCCESS
Camel :: YAML DSL :: Maven Plugins 1.1s SUCCESS
Camel :: XML JAXB 0.8s SUCCESS
Camel :: Core n/a
Camel :: JBang :: Core n/a
Camel :: Management n/a
Camel :: Spring XML n/a

Top 20 slowest modules:

  • Camel :: Java DSL IO (19.8s)
  • Camel :: Catalog :: Camel Catalog (19.0s)
  • Camel :: XML IO (15.5s)
  • Camel :: Maven Plugins :: Camel Maven Package (14.9s)
  • Camel :: YAML DSL (13.0s)
  • Camel :: Core Model (8.9s)
  • Camel :: XML DSL with camel-xml-io (8.5s)
  • Camel :: YAML DSL :: Validator (7.7s)
  • Camel :: YAML IO (7.5s)
  • Camel :: YAML DSL :: Deserializers (4.2s)
  • Camel :: Core Processor (4.0s)
  • Camel :: Core Reifier (2.6s)
  • Camel :: Management API (2.3s)
  • Camel :: Core Engine (1.4s)
  • Camel :: YAML DSL :: Maven Plugins (1.1s)
  • Camel :: XML JAXB (0.8s)

⚙️ View full build and test results

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after efd4219: otherwise promoted from a plain String attribute to a first-class SwitchOtherwiseDefinition element. All call sites updated consistently (SwitchReifier, ManagedSwitch, JavaDslModelWriterSupport, ModelParser, ModelWriter, YamlModelWriter). Deep-copy via copyDefinition() is correct (test verifies independence). getOtherwiseDefinition() re-reads otherwise.getUri() on each call, so mutating the model element is picked up by endpoint discovery — intentional and tested. New SwitchSchemaTest validates the element-object constraint in both canonical and regular YAML schemas. Solid refactoring, no issues.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after efd4219: otherwise promoted from a String @XmlAttribute to a proper SwitchOtherwiseDefinition @XmlElement. This is a clean structural improvement:

  • New SwitchOtherwiseDefinition implements EndpointRequiredDefinition, deep-copy safe via copyDefinition()
  • Lazy ToDefinition sync in getOtherwiseDefinition() re-reads the URI on every call — correct for mutable source-of-truth pattern, verified by the new endpoint discovery test
  • SwitchReifier, ManagedSwitch, JavaDslModelWriterSupport all updated to .getOtherwise().getUri()
  • Generated parsers/writers (XML-IO, YAML-IO, YAML deserializer) consistent
  • XSD/JSON schemas updated: otherwise moves from attribute to child element with required uri attribute
  • Docs (AsciiDoc) updated across all three examples (scalar, composite, semantic) — XML uses <otherwise uri="..."/>, YAML uses otherwise: {uri: ...}
  • New tests: fallback URI blank rejection, dynamic fallback URI rejection, schema validation, YAML round-trip assertion, deep-copy independence

No issues found.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@luigidemasi
luigidemasi marked this pull request as ready for review September 29, 2026 15:03

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Luigi, the scalar Switch is very well done and closely follows the CAMEL-24988 plan: a decision table with value/uri attributes, case-insensitive Locale.ENGLISH matching, duplicates rejected at startup, doSwitch/doCase, the EndpointRequiredDefinition route for YAML uri+parameters, static-URI enforcement, JMX/tracing ids per case, and good test coverage across all DSLs.

As decided on the JIRA, the first release is scalar only. Please remove the composite form (keys, values, SwitchValueDefinition, typed boolean/number literals), together with the hand-written YAML deserializer, the schema/writer special-cases it needs, and the camel-semantic test and doc additions. If composite comes back later it will be a separate proposal, and strings only (typed literals don't fit XML attributes).

One must-fix: ManagedSwitch.extendedInformation() exposes case and otherwise URIs without masking. Please mask them the same way ManagedSendProcessor does.

Open question: the fallback was planned as an otherwise attribute on <switch>. The element form does allow YAML parameters on the fallback, which is a fair reason to keep it. Let's decide explicitly.

Minor: the @Metadata description and the docs' :description: still say "scalar or composite".

Claude Code on behalf of davsclaus

This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying.

Comment thread core/camel-core-model/src/main/java/org/apache/camel/model/SwitchDefinition.java Outdated
Comment thread core/camel-core-engine/src/main/docs/modules/eips/pages/switch-eip.adoc Outdated
Comment thread core/camel-core-model/src/main/java/org/apache/camel/model/SwitchDefinition.java Outdated
@luigidemasi luigidemasi changed the title CAMEL-24988: Add Switch EIP with scalar and composite literal cases CAMEL-24988: Add scalar Switch EIP Sep 30, 2026

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after df2a08b: all davsclaus CHANGES_REQUESTED findings addressed in this commit.

Composite form fully removed:

  • SwitchValueDefinition class + JSON metadata + JAXB index entry deleted
  • keys field, keys() method, doCase(Map), CaseBuilder.value() removed from SwitchDefinition
  • values field removed from SwitchCaseDefinition; value attribute now required = true
  • Hand-written SwitchValueDefinitionDeserializer + CustomResolver entry + pom.xml banned-definition entry all removed
  • GenerateYamlSchemaMojo switchValue special-case and model-yaml-writer.vm override removed
  • SwitchProcessor.normalizeLiteral() / compositeKey() removed; table simplified to Map<String, Integer>
  • SwitchReifier composite validation branches removed
  • Entire "Composite selectors" doc section + semantic batch example removed from switch-eip.adoc
  • SemanticEipTest.batchDecisionsSelectOneSwitchDestination + Switch row in semantic-language.adoc removed

URI masking in ManagedSwitch (must-fix):

  • init(ManagementStrategy) reads the mask setting; URISupport.sanitizeUri() applied to both case and fallback URIs
  • New parameterized test masksCaseAndFallbackUris verifies null (default=masked), true, and false

getSelector() side-effect-free:

  • preCreateProcessor() removed from getSelector(); now called explicitly in SwitchReifier.createProcessor(), LwModelToXMLDumper, LwModelToYAMLDumper, JaxbHelper, and JavaDslModelWriterSupport
  • New test fluentSelectorSurvivesDumpBeforeStartup verifies dump before startup works

All descriptions updated: "scalar or composite" → "scalar" across @Metadata, JSON models, XSD schemas, YAML schemas.

Tests updated consistently: composite tests replaced with scalar equivalents, structured-result rejection tests added (Map, List, array→IllegalArgumentException`), error-handling test for map selector result. CI green.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, the rework addresses my earlier comments: the composite form is gone, JMX masks the case/otherwise URIs, getSelector() is a plain getter, the docs say scalar only, and Choice is untouched.

  1. Merge conflict in core/camel-yaml-io/.../YamlPrinter.java against CAMEL-25079 (#54836b9), so CI has not run on this head. Main's YAML 1.2 NUMBER_PATTERN already quotes leading-zero numbers like 007, so drop the PR's regex change, take main's, and keep the new needsQuoting("001") test.
  2. The open question about otherwise staying an element (SwitchDefinition.java:51) still needs an answer. Keeping it as an element is fine by me if the reason is YAML uri + parameters; please reply on the thread.
  3. Minor: getOtherwiseDefinition() still creates and mutates the transient ToDefinition inside a getter, the same pattern I objected to for getSelector().

Claude Code on behalf of davsclaus

@davsclaus

Copy link
Copy Markdown
Contributor

A few doc/discoverability additions so users find Switch next to Choice:

  1. EIP index: add a Switch row to the Message Routing table in core/camel-core-engine/src/main/docs/modules/eips/pages/enterprise-integration-patterns.adoc, right after the xref:choice-eip.adoc[Content-Based Router] row (the ContentBasedRouterIcon.gif image fits). For example: How do we route a message to a fixed endpoint by the literal value of a single selector, like a decision table?

  2. AI patterns page (eips/pages/ai-patterns.adoc):

    • Add xref:switch-eip.adoc[Switch] to the Router / Dispatch row next to Choice and Dynamic Router.
    • In the AI and Agent Integration table, add a row like Classify / Intent routing. A semantic choice question returns a category string, which Switch dispatches by literal case. That is the natural pairing with camel-semantic. A short YAML example in switch-eip.adoc showing a semantic selector would help too.
  3. Cross-linking Choice ↔ Switch:

    • switch-eip.adoc already points to Choice, but choice-eip.adoc has no link back. Please add a short "Use Switch when you dispatch on the literal value of one expression" note.
    • Catalog term lookup uses the aliases on the model @Metadata. Choice has aliases = { "router", "dispatch" }, while SwitchDefinition has none. Suggest something like aliases = { "decision-table", "lookup-table", "case" }, so a search for those terms finds Switch instead of only Choice.

Claude Code on behalf of davsclaus

@luigidemasi

Copy link
Copy Markdown
Contributor Author

Addressed the remaining points from this review in 7147494eb882:

  • Merged main and kept its CAMEL-25079 YAML number-quoting implementation, retaining the needsQuoting("001") regression test.
  • Made both getOtherwiseDefinition() and SwitchCaseDefinition.getToDefinition() read-only. Node preparation is explicit, and regression tests cover prepared IDs/URIs, fallback discovery before startup, independent copies, and fallback-ID collisions regardless of DSL call order.
  • Confirmed on the original thread that otherwise remains an endpoint element so the fallback supports YAML uri plus parameters. Matching and error-handling behavior are unchanged.

Validation passed: 341 focused/exporter tests, 1,085 Java 17 catalog tests against the final regenerated catalog, and the full 695-module clean build with -DskipTests.

Comment written by Codex on behalf of @luigidemasi.

@davsclaus

Copy link
Copy Markdown
Contributor

Following up on the Choice ↔ Switch cross-linking: please add a TIP block near the top of each page (before the Options section), so readers who land on one immediately learn the other exists and how the two differ in design.

switch-eip.adoc — the intro paragraph mentions direct: in passing; a TIP makes the design intent explicit:

TIP: Switch has no inlined sub-routes: each case sends to a single endpoint. This fosters a
design where each branch is its own route, linked via xref:ROOT:direct-component.adoc[Direct]
or xref:ROOT:seda-component.adoc[SEDA], keeping the dispatch table flat and each branch
independently readable and testable. If you need predicates, ranges, or inlined processing
steps in the branches, use the xref:choice-eip.adoc[Choice] EIP instead.

choice-eip.adoc:

TIP: If you route on the literal value of a single expression (a decision table), consider the
xref:switch-eip.adoc[Switch] EIP. Unlike Choice, Switch does not have inlined sub-routes; each
case sends to one endpoint, typically another route linked via
xref:ROOT:direct-component.adoc[Direct] or xref:ROOT:seda-component.adoc[SEDA].

(Remember to regenerate the catalog doc mirrors afterwards.)

Claude Code on behalf of davsclaus

@davsclaus

Copy link
Copy Markdown
Contributor

Two more areas before this is complete: round-trip test coverage across all the DSLs, and making the new EIP discoverable by AI tooling.

Tests: DSL parsers and round trip

Already covered: core SwitchTest, yaml-dsl SwitchTest + SwitchYamlDumpTest, xml-io-dsl XmlSwitchTest, java-io switchLiteral.xml, and a JAXB model round trip in SwitchJaxbTest. Missing:

  • camel-xml-io: ModelWriterTest.testRoutes round-trips every routes file under core/camel-xml-io/src/test/resources (parse → write → parse → deep equals). Please add a switch.xml fixture there with a selector, a few cases (including ids), switchOtherwise, and an xpath selector with namespaces. That covers the generated ModelParser/ModelWriter.
  • camel-yaml-io: add a yaml-route-switch.yaml fixture with a YamlModelWriterTest case, like yaml-route-choice.yaml. Also add a Switch route to XmlToYamlTest and YamlPrinterRoundTripTest.
  • camel-spring-xml: SwitchJaxbTest builds the model in Java and dumps it. It never loads a route from a Spring XML file, so the camel-spring.xsd schema and the namespace handler are untested. Please add processor/SpringSwitchTest + SpringSwitchTest.xml, following SpringChoiceTest. Ideally it extends the core SwitchTest, like the other Spring EIP tests do.
  • yaml-dsl: also load at least one route from a .camel.yaml resource file through the routes loader (not only an inline string), and assert that the camel-yaml-dsl JSON schema accepts and rejects the expected shapes. SwitchSchemaTest in the validator does part of this.

AI discoverability

The generated eip-samples.json already picks up the doc samples, so camel_catalog_sample works. But nothing routes a user's words to Switch:

  • Catalog aliases: add aliases on SwitchDefinition @Metadata (e.g. decision-table, dispatch-table, case). camel_catalog_find kind=eip matches on these.
  • CatalogSamples.INTENTS (camel-jbang-core/.../commands/ai/CatalogSamples.java): add intents such as route by value, switch case and decision table → switch. Leave route by content/if → choice. Watch lookup, which already maps to enrich.
  • CatalogSamples.PART_OF: add case → switch and switchOtherwise → switch, so asking for a part returns the parent sample, like when/otherwise → choice.
  • Prompt/tool text: PromptDefinitions step 2 (camel-jbang-mcp) and ToolRegistry (the "e.g. split, aggregate, filter, choice" lists) could mention switch, so models know it exists when they plan a route.
  • Sample content: models copy samples closely. The first switch-eip.adoc sample should show the intended design, one case per direct: route, with the TIP about no inlined sub-routes right next to it.

Claude Code on behalf of davsclaus

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after 7147494: all three items from the previous davsclaus review are addressed.

1. Merge conflict with CAMEL-25079 (YAML quoting) — resolved. Main's NUMBER_PATTERN is kept; the needsQuoting("001") regression test is retained in YamlPrinterTest.

2. otherwise element question — confirmed on the thread. SwitchOtherwiseDefinition stays as a first-class @XmlElement so YAML uri plus parameters works on the fallback, matching the case endpoint pattern. A case literal named "otherwise" remains an ordinary literal.

3. getOtherwiseDefinition() / getToDefinition() side-effect-free — fixed. SwitchCaseDefinition.getToDefinition() now returns null until prepareToDefinition() is explicitly called by the reifier. SwitchOtherwiseDefinition.getToDefinition() returns a pre-allocated field that is initialized via setUri() or afterUnmarshal(), with no lazy mutation in the getter. SwitchDefinition.getOtherwiseDefinition() delegates through cleanly. New SwitchDefinitionTest.readingDestinationsDoesNotOverwritePreparedNodes() confirms the prepared-node stability. copiedFallbackHasIndependentDestinationAndParent() confirms deep-copy independence.

Code is solid. The SwitchReifier.createProcessor() flow is now explicit: validate → idOrCreate → prepareToDefinition/prepareOtherwiseDefinition → createSend. No hidden side effects in getters.

Note: davsclaus posted two follow-up doc/discoverability requests (EIP index row, AI patterns page, Choice↔Switch cross-linking, TIP blocks, @Metadata aliases) after this commit. Those are not yet addressed and will need a follow-up commit.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@davsclaus

Copy link
Copy Markdown
Contributor

To keep this PR moving: the doc additions (EIP index, AI patterns page, the TIPs on the Choice/Switch pages), the extra round-trip tests (xml-io, yaml-io, spring-xml, yaml-dsl) and the AI discoverability items (aliases, CatalogSamples intents/parts, prompt text) can all go in a follow-up PR if that is easier. For this PR, only the merge conflict and the open otherwise question need to be resolved.

Claude Code on behalf of davsclaus

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks @luigidemasi. The merge conflict is resolved, otherwise stays an element (for YAML uri + parameters), the getters no longer mutate the model, and selector namespaces survive the XML/YAML/JAXB dumps. Approving; please merge once CI is green.

Please follow up with a second PR right after this one (and open a JIRA for it so it is not forgotten), covering the items from the earlier comments:

  1. Docs (comment, TIP):
    • A Switch row next to Choice in the EIP index.
    • Switch on the AI patterns page (Router / Dispatch, plus a classify/intent-routing row with camel-semantic).
    • TIP blocks on both the Choice and Switch pages: Switch has no inlined sub-routes and fosters branches as separate routes linked via direct:/seda:.
  2. Round-trip tests (comment):
    • camel-xml-io switch.xml fixture.
    • camel-yaml-io yaml-route-switch.yaml + XmlToYamlTest/YamlPrinterRoundTripTest.
    • camel-spring-xml SpringSwitchTest + XML.
    • yaml-dsl loading from a .camel.yaml file.
  3. AI discoverability (same comment):
    • aliases on SwitchDefinition.
    • CatalogSamples INTENTS/PART_OF entries.
    • switch in the MCP prompt/ToolRegistry EIP lists.
    • A first doc sample showing one direct: route per case.

Claude Code on behalf of davsclaus

@luigidemasi

Copy link
Copy Markdown
Contributor Author

Thanks, Claus. I opened CAMEL-25178 to track the documentation, AI discoverability, and DSL round-trip follow-up. The semantic Switch example will use a single reference with a scalar result; refs:department,urgent stays in the batched semantic results documentation.\n\n_Codex on behalf of @luigidemasi_

luigidemasi and others added 5 commits September 30, 2026 12:38
Evaluate a Camel expression once and select one static endpoint using a
literal lookup table. Support named, typed composite keys, including
semantic batch results, without coupling core routing to a language.

Add Java, XML and YAML DSL support, model round trips, case instrumentation,
startup validation, documentation and generated metadata.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Luigi De Masi <ldemasi@redhat.com>
Show header, map-header and semantic batch routes in Java, XML and YAML,
including question registration, example inputs and expected destinations.
Provide logging routes for trying the examples and regenerate the catalog
documentation and JBang samples.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Luigi De Masi <ldemasi@redhat.com>
Use the XML IO namespace for the standalone routes document so the catalog documentation schema checks validate it.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Luigi De Masi <ldemasi@redhat.com>
Use an otherwise child with a required uri in XML and an otherwise URI object in YAML. Preserve the Java fluent API and literal matching rules, and regenerate DSL metadata, schemas, and documentation samples.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Luigi De Masi <ldemasi@redhat.com>
Remove composite keys, typed values, and their DSL and semantic additions.
Preserve the structured otherwise endpoint and existing fallback rules.

Reject structured selector results through normal Camel error handling,
honor management URI masking, and prepare fluent selectors explicitly
during reification and export instead of mutating them in the getter.

Preserve literal strings when exporting YAML, including leading zeros,
and regenerate the model metadata, schemas, writers, and documentation.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Luigi De Masi <ldemasi@redhat.com>
@luigidemasi
luigidemasi force-pushed the feature/CAMEL-24988-switch branch from 7147494 to e590a5a Compare September 30, 2026 10:40
@luigidemasi luigidemasi added the enhancement New feature or request label Sep 30, 2026
@luigidemasi luigidemasi self-assigned this Sep 30, 2026
@luigidemasi luigidemasi added this to the 4.23.0 milestone Sep 30, 2026

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after force-push (commit restructuring). The five commits are a clean squash of the previously reviewed progression.

Key delta from the last reviewed SHA (7147494): the explicit prepareToDefinition() / prepareOtherwiseDefinition() pattern was replaced with lazy initialization inside getToDefinition() and getOtherwiseDefinition(). This removes SwitchDefinitionTest.java (which tested the explicit-prepare contract) and drops the prepareToDefinition / prepareOtherwiseDefinition calls from SwitchReifier. The lazy-init approach is simpler and functionally equivalent — the reifier immediately overwrites the URI with the resolved value anyway, so the getter's sync is a no-op in that path. ManagedSwitch.extendedInformation() reads c.getUri() / c.getId() directly, so it's unaffected.

Note: getOtherwiseDefinition() and getToDefinition() now set URI/ID/metadata on every call (side-effectful getters). davsclaus's previous review asked for side-effect-free getters, and the 7147494 commit addressed that. This force-push reverts to lazy mutation. Given davsclaus's final APPROVE was based on the side-effect-free version, he may want to confirm this simplification is acceptable — but the code is functionally correct either way.

No new issues found.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

Keep the model getters side-effect-free and prepare endpoint nodes during reification. Restore regression coverage for stable prepared nodes and independent copies.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Luigi De Masi <ldemasi@redhat.com>
@luigidemasi

Copy link
Copy Markdown
Contributor Author

Thanks for catching this, Gnodet. The rebase had dropped the side-effect-free getter changes that were carried in the original merge commit. Commit d5deafb restores explicit destination preparation during reification, read-only getters, and the SwitchDefinitionTest regression coverage. The focused model tests pass; CI is rerunning on this corrected head.\n\n_Codex on behalf of @luigidemasi_

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after d5deafb: this commit restores the explicit prepareToDefinition() / prepareOtherwiseDefinition() pattern that davsclaus requested. The lazy-mutation getters from the previous force-push are gone.

  • SwitchCaseDefinition.getToDefinition() is now a plain field getter; mutation is in prepareToDefinition()
  • SwitchOtherwiseDefinition pre-allocates toDefinition as a final field, syncs URI in setUri(), and uses afterUnmarshal() for JAXB
  • SwitchDefinition.getOtherwiseDefinition() delegates to otherwise.getToDefinition() — no side effects
  • SwitchReifier.createProcessor() calls prepareToDefinition() / prepareOtherwiseDefinition() explicitly before getting the nodes
  • New SwitchDefinitionTest verifies prepared-node stability and deep-copy independence

This aligns with the 7147494 version that davsclaus approved. No issues found.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after d5deafb: explicit prepareToDefinition() / prepareOtherwiseDefinition() pattern restored, addressing davsclaus's feedback about side-effectful getters.

  • getToDefinition() and getOtherwiseDefinition() are now pure getters — no state mutation
  • Preparation is explicit: SwitchReifier.createProcessor() calls prepareToDefinition() / prepareOtherwiseDefinition() before reading the nodes
  • SwitchOtherwiseDefinition.toDefinition is final — initialized at construction, synced via setUri() and afterUnmarshal()
  • setOtherwise(), setId(), setGeneratedId() propagate preparation to keep the otherwise ID in sync with the switch ID
  • Copy constructor routes through setOtherwise() to trigger preparation on the copy
  • Tests verify: prepared-node stability across getChildren() calls, and deep-copy independence

No issues found.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

Prepare literal destination nodes before JMX performance-counter traversal. This keeps model getters side-effect-free while making each Switch destination available to management instrumentation.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Luigi De Masi <ldemasi@redhat.com>
@luigidemasi

luigidemasi commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor Author

Follow-up: the first correction exposed one more required call site. JMX performance-counter traversal also prepares the case and fallback destinations before reading them. Commit 449a6a9 includes that fix; all four ManagedSwitchTest cases pass locally. CI is rerunning on this head.

Codex on behalf of @luigidemasi

@luigidemasi
luigidemasi merged commit 5098f08 into apache:main Sep 30, 2026
7 checks passed
@luigidemasi
luigidemasi deleted the feature/CAMEL-24988-switch branch September 30, 2026 12:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants