Skip to content

CAMEL-25378: Add camel-test-citrus component for Citrus message validation - #27792

Merged
christophd merged 17 commits into
apache:mainfrom
christophd:feature/CAMEL-25378-test-citrus
Oct 16, 2026
Merged

christophd merged 17 commits into
apache:mainfrom
christophd:feature/CAMEL-25378-test-citrus

Conversation

@christophd

@christophd christophd commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Adds a new camel-test-citrus component that integrates the Citrus integration test framework for message validation in Camel route tests.

Architecture

CitrusEndpoint extends MockEndpoint, inheriting all standard mock features:

  • assertIsSatisfied() / resetMocks() / expectedMessageCount() work out of the box
  • Context-wide MockEndpoint.assertIsSatisfied(context) picks up Citrus endpoints transparently
  • Processor dispatch via whenExchangeReceived() / whenAnyExchangeReceived()

Validation is performed by CitrusValidationProcessor (a Processor, not a Producer), which:

  • Resolves TestContext lazily via Supplier<TestContext> for isUseAdviceWith() compatibility
  • Handles StreamCache bodies (convert to String + reset)
  • Propagates exchange variables/properties to Citrus test context
  • Writes back extracted variables (filtered to exclude Citrus internals)
  • Uses case-insensitive header validation matching Camel's CaseInsensitiveMap

Features

  • validate operation — pass-through validation (body, headers, JsonPath, XPath); exceptions captured, not thrown
  • receive operation — request/response simulation with Gherkin-style API (when().receive().body().then().respond().body()); exceptions propagate to onException
  • Per-exchange specs — validate(index) for sequential validation with auto-incrementing index
  • Fallback specs — validateAll() / receiveAll() as default for unmatched exchanges
  • Implied minimum count — indexed specs auto-set expectedMinimumMessageCount
  • Citrus validation matchers — @ignore@, @greaterThan()@, @variable()@, etc.
  • Variable extraction — Citrus @variable('name')@ writes back to exchange variables

Test coverage

  • CitrusValidateJsonTest — JSON body/header validation, ignore expressions, validation matchers
  • CitrusValidateXmlTest — XML body validation with namespace handling
  • CitrusSequentialValidationTest — per-exchange specs, fallback, implied minimum count failure
  • CitrusReceiveResponseTest — request/response simulation with Gherkin API
  • CitrusReceiveErrorHandlingTest — validate clears exception (no onException), receive keeps it (onException fires)
  • CitrusVariableTest — exchange variable propagation, extraction via @variable()@, overwrite semantics
  • CitrusValidateStreamCacheTest, CitrusValidatePlainTextTest, CitrusValidateYamlTest

Review feedback addressed

  • name field restored with @UriPath and own description; getName()/setName() overrides keep it in sync with MockEndpoint
  • Null guard in createTestContext() supplier to prevent NPE after doStop()
  • firstVersion = "4.24.0" with all generated artifacts matching
  • Case-insensitive header validation via HeaderValidationContext.Builder().ignoreCase(true)
  • validate() returns covariant WhenMessageValidationSpec for method chaining
  • nextSpecIndex is final AtomicInteger with null guard in reset()
  • Variable write-back allows overwrite and filters citrus./CITRUS_ prefixes
  • StreamCache handled with String conversion + reset
  • performAssertions() captures processor exceptions into failures list
  • Implied minimum count via applyImpliedMinimumCount(index) with test and documentation
  • Double registration in receive(int) documented with code comment
  • Error handling behavior documented in new "Error handling and redelivery" doc section

Still open (minor, can be follow-up)

  • StreamCache body is converted to String — byte[] may be safer for binary/gzip message types
  • CitrusContext ownership (component-level vs endpoint-level) — tracked as follow-up

🤖 Generated with Claude Code

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

Testing auth - ignore

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

Test with one inline comment

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

Test range comment

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

Test

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

Test

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

Test

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

Test

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

Test fixed line

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

This PR introduces a well-structured camel-test-citrus component with a clean fluent API and good test coverage. A few issues to address:

  1. operation parameter not validated — invalid URIs silently produce non-functional endpoints
  2. resolveValidationSpec returning null causes silent pass-through — no validation, no warning
  3. expectedMessageCount() doesn't reset counters — stale receivedCount causes false assertion failures on reuse
  4. @UriPath on operation missing enums — valid values not enforced at the metadata level
  5. Shared mutable state fields not volatile — cross-thread visibility issues in test scenarios
  6. CitrusContext created in doStart() but never closed — resource leak when the Camel context stops

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

@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

✅ Generated files are up to date

An earlier CI run reported uncommitted generated changes; the latest run no longer does.

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

Following up on my earlier review — 0 of 6 issues have been addressed. The new commit (6ba771c) is a pure DSL regeneration and does not touch any of the reported files.

Findings outstanding:

  1. ⚠️ operation not validated — invalid values silently produce non-functional endpoints (CitrusComponent.java)
  2. ⚠️ resolveValidationSpec returning null causes silent pass-through — no validation, no warning (CitrusProducer.java)
  3. ⚠️ expectedMessageCount() does not reset counters — stale receivedCount causes false assertion failures on reuse (CitrusEndpoint.java)
  4. 💡 @UriPath on operation missing enums — valid values not enforced at metadata level (CitrusEndpoint.java)
  5. ⚠️ Mutable state fields allMessagesSpec, allMessagesResponseSpec not volatile — cross-thread visibility issues (CitrusEndpoint.java)
  6. ⚠️ CitrusContext created in doStart() but never closed — resource leak on Camel context stop (CitrusProducer.java)

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.

Following up on my earlier review — 0 of 6 issues have been addressed. The new commit (6ba771c) is a pure DSL regeneration and does not touch any of the reported files.

Findings outstanding:

  1. ⚠️ operation not validated — invalid values silently produce non-functional endpoints (CitrusComponent.java)
  2. ⚠️ resolveValidationSpec returning null causes silent pass-through — no validation, no warning (CitrusProducer.java)
  3. ⚠️ expectedMessageCount() does not reset counters — stale receivedCount causes false assertion failures on reuse (CitrusEndpoint.java)
  4. 💡 @UriPath on operation missing enums — valid values not enforced at metadata level (CitrusEndpoint.java)
  5. ⚠️ Mutable state fields allMessagesSpec, allMessagesResponseSpec not volatile — cross-thread visibility issues (CitrusEndpoint.java)
  6. ⚠️ CitrusContext created in doStart() but never closed — resource leak on Camel context stop (CitrusProducer.java)

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

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • bom/camel-bom
  • catalog/camel-allcomponents
  • catalog/camel-catalog
  • components/camel-test
  • components/camel-test/camel-test-citrus
  • core/camel-main
  • core/camel-util
  • docs
  • dsl/camel-componentdsl
  • dsl/camel-endpointdsl
  • dsl/camel-kamelet-main
  • parent
  • 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: 592 of 706 tested, 0 compile-only — current: 70 all tested

Maveniverse Scalpel detected 592 affected modules (current approach: 70).

Skip-tests mode would test 592 modules (12 direct + 37 downstream), skip tests for 0 (generated code, meta-modules)

⚠️ Modules only in Scalpel (592)
  • 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-bom
  • 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-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-kafka-common
  • camel-kafka-share
  • 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-odata
  • 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-openfeature
  • 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-semantic-openai
  • camel-semantic-typesafe-ai
  • camel-semantic-wolf-defender
  • 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-citrus
  • 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 (70)
  • [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:565)
  • at java.lang.reflect.Method.invoke (Method.java:565)
  • at java.lang.reflect.Method.invoke (Method.java:565)
  • at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
  • at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
  • at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
  • 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 (592)
  • 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-package-maven-plugin
  • 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-package-maven-plugin
  • 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 ← depends on affected reactor module org.apache.camel:camel-util
  • 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-package-maven-plugin
  • 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-infra-jetty
  • camel-atom ← depends on affected reactor module org.apache.camel:camel-test-infra-jetty
  • 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 ← depends on affected reactor module org.apache.camel:camel-api
  • camel-avro-rpc-parent ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-avro-rpc-spi ← downstream of org.apache.camel:camel-package-maven-plugin
  • 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-package-maven-plugin
  • 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-core-catalog
  • camel-aws2-kms ← depends on affected reactor module org.apache.camel:camel-core-catalog
  • 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-core-catalog
  • 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-package-maven-plugin
  • 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-package-maven-plugin
  • 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-util
  • camel-base-engine ← depends on affected reactor module org.apache.camel:camel-util
  • 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-bom ← own pom bom/camel-bom/pom.xml changed
  • 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 ← depends on affected reactor module org.apache.camel:camel-api
  • camel-box-parent ← downstream of org.apache.camel:camel-package-maven-plugin
  • 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-util
  • 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 ← depends on affected reactor module org.apache.camel:camel-core-catalog
  • camel-core-all ← depends on affected reactor module org.apache.camel:camel-xml-jaxp
  • camel-core-catalog ← depends on affected reactor module org.apache.camel:camel-util
  • camel-core-engine ← depends on affected reactor module org.apache.camel:camel-util
  • camel-core-languages ← depends on affected reactor module org.apache.camel:camel-util
  • camel-core-model ← depends on affected reactor module org.apache.camel:camel-util
  • camel-core-processor ← depends on affected reactor module org.apache.camel:camel-util
  • camel-core-reifier ← depends on affected reactor module org.apache.camel:camel-util
  • 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-package-maven-plugin
  • 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-package-maven-plugin
  • 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-package-maven-plugin
  • 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 ← depends on affected reactor module org.apache.camel:camel-util
  • camel-elasticsearch ← depends on affected reactor module org.apache.camel:camel-core-catalog
  • camel-elasticsearch-rest-client ← depends on affected reactor module org.apache.camel:camel-core-catalog
  • 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-package-maven-plugin
  • 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-core-catalog
  • 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-package-maven-plugin
  • 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-util
  • 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-test-infra-jetty
  • 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-package-maven-plugin
  • 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-package-maven-plugin
  • 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-package-maven-plugin
  • 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 ← depends on affected reactor module org.apache.camel:camel-xml-io
  • 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-xml-io-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-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 ← effective property camel.surefire.fork.additional-vmargs
  • 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-kafka-common ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-kafka-share ← 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-package-maven-plugin
  • 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 ← depends on affected reactor module org.apache.camel:camel-api
  • 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-infra-qdrant
  • camel-langchain4j-embeddingstore ← depends on affected reactor module org.apache.camel:camel-test-infra-qdrant
  • camel-langchain4j-embeddingstore-api ← depends on affected reactor module org.apache.camel:camel-api
  • camel-langchain4j-ingest ← depends on affected reactor module org.apache.camel:camel-test-infra-qdrant
  • 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 ← core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
  • camel-management ← depends on affected reactor module org.apache.camel:camel-core
  • camel-management-api ← depends on affected reactor module org.apache.camel:camel-util
  • 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-package-maven-plugin
  • 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-core-catalog
  • 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-odata ← 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-infra-jetty
  • camel-olingo2-api ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-olingo2-parent ← downstream of org.apache.camel:camel-package-maven-plugin
  • 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-package-maven-plugin
  • 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-openfeature ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • 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/java/org/apache/camel/maven/packaging/MojoHelper.java
  • 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-infra-qdrant
  • 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-infra-jetty
  • 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-core-catalog
  • camel-salesforce-codegen ← depends on affected reactor module org.apache.camel:camel-salesforce
  • camel-salesforce-parent ← downstream of org.apache.camel:camel-package-maven-plugin
  • 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-management
  • camel-semantic-openai ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-semantic-typesafe-ai ← depends on affected reactor module org.apache.camel:camel-xml-io-dsl
  • camel-semantic-wolf-defender ← 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-package-maven-plugin
  • 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-package-maven-plugin
  • camel-spring-ai-vector-store ← depends on affected reactor module org.apache.camel:camel-test-infra-qdrant
  • 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-package-maven-plugin
  • 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 ← depends on affected reactor module org.apache.camel:camel-cron
  • 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-package-maven-plugin
  • 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-util
  • 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-citrus ← components/camel-test/camel-test-citrus/src/generated/java/org/apache/camel/component/citrus/CitrusComponentConfigurer.java, components/camel-test/camel-test-citrus/src/generated/java/org/apache/camel/component/citrus/CitrusEndpointConfigurer.java, components/camel-test/camel-test-citrus/src/generated/java/org/apache/camel/component/citrus/CitrusEndpointUriFactory.java, components/camel-test/camel-test-citrus/src/generated/resources/META-INF/org/apache/camel/component/citrus/citrus.json, components/camel-test/camel-test-citrus/src/generated/resources/META-INF/services/org/apache/camel/component.properties, components/camel-test/camel-test-citrus/src/generated/resources/META-INF/services/org/apache/camel/component/citrus, components/camel-test/camel-test-citrus/src/generated/resources/META-INF/services/org/apache/camel/configurer/citrus-component, components/camel-test/camel-test-citrus/src/generated/resources/META-INF/services/org/apache/camel/configurer/citrus-endpoint, components/camel-test/camel-test-citrus/src/generated/resources/META-INF/services/org/apache/camel/urifactory/citrus-endpoint, components/camel-test/camel-test-citrus/src/main/docs/citrus-component.adoc, components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusComponent.java, components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java, components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java, components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/MessageResponseSpec.java, components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/MessageValidationSpec.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusMultipleEndpointsTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusReceiveErrorHandlingTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusReceiveTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusSequentialValidationTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusValidateJsonTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusValidatePlainTextTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusValidateXmlTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusValidateYamlTest.java, components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java, components/camel-test/camel-test-citrus/src/test/resources/log4j2-test.properties, own pom components/camel-test/camel-test-citrus/pom.xml changed
  • camel-test-infra-all ← depends on affected reactor module org.apache.camel:camel-test-infra-qdrant
  • 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 ← depends on affected reactor module org.apache.camel:camel-util
  • camel-test-infra-qdrant ← depends on affected reactor module 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-package-maven-plugin
  • 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 ← core/camel-util/src/main/java/org/apache/camel/util/ArtifactUtils.java
  • 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-package-maven-plugin
  • 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 ← depends on affected reactor module org.apache.camel:camel-util
  • camel-xml-io-dsl ← depends on affected reactor module org.apache.camel:camel-test-junit6
  • camel-xml-io-util ← downstream of org.apache.camel:camel-package-maven-plugin
  • camel-xml-jaxb ← depends on affected reactor module org.apache.camel:camel-core-model
  • 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-util
  • 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 ← depends on affected reactor module org.apache.camel:camel-xml-io
  • camel-yaml-dsl-validator-maven-plugin ← depends on affected reactor module org.apache.camel:camel-yaml-dsl-validator
  • camel-yaml-io ← depends on affected reactor module org.apache.camel:camel-xml-io
  • 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-package-maven-plugin
  • core ← downstream of org.apache.camel:camel-package-maven-plugin
  • dsl ← downstream of org.apache.camel:camel-package-maven-plugin
  • sync-properties-maven-plugin ← depends on affected reactor module org.apache.camel:camel-util

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

Build reactor — dependencies compiled but only changed modules were tested (13 modules, 3m 2s total)

Total reactor time: 3m 2s

Module Duration Status
Camel :: Component DSL 50.7s SUCCESS
Camel :: Main 33.2s SUCCESS
Camel :: Catalog :: Camel Catalog 22.5s SUCCESS
Camel :: Test :: Citrus 19.1s SUCCESS
Camel :: Docs 14.8s SUCCESS
Camel :: Maven Plugins :: Camel Maven Package 12.9s SUCCESS
Camel :: Kamelet Main 11.7s SUCCESS
Camel :: Util 9.4s SUCCESS
Camel :: All Components Sync point 5.0s SUCCESS
Camel :: Parent 1.3s SUCCESS
Camel :: Test :: Parent 0.8s SUCCESS
Camel :: BOM 0.2s SUCCESS
Camel :: Endpoint DSL n/a

Top 20 slowest modules:

  • Camel :: Component DSL (50.7s)
  • Camel :: Main (33.2s)
  • Camel :: Catalog :: Camel Catalog (22.5s)
  • Camel :: Test :: Citrus (19.1s)
  • Camel :: Docs (14.8s)
  • Camel :: Maven Plugins :: Camel Maven Package (12.9s)
  • Camel :: Kamelet Main (11.7s)
  • Camel :: Util (9.4s)
  • Camel :: All Components Sync point (5.0s)
  • Camel :: Parent (1.3s)
  • Camel :: Test :: Parent (0.8s)
  • Camel :: BOM (0.2s)

⚙️ View full build and test results

@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 @christophd. It is good to see Citrus validation inside Camel route tests.

What I checked

  • CI is green (build on JDK 17 and 25, license check, dependency review), and the generated files are up to date.
  • Build integration is complete: the module is in the camel-test parent pom, the camel-test list in MojoHelper, parent/pom.xml, camel-bom, camel-allcomponents, the catalog (components.properties, docs.properties, citrus.json), nav.adoc and the docs symlinks. The ArtifactUtils and kamelet-main entries are generated.
  • citrus-version (5.0.2) is already managed in parent/pom.xml and used by camel-jbang-plugin-test. The PR adds no new version property.
  • I read the source, the docs page, all 33 tests and the open gnodet-bot threads. I checked the Citrus 5.0.2 API in the local Maven repo where noted below.

On the gnodet-bot findings

I agree with all six. The most important ones are the silent pass when no spec is configured and the CitrusContext that is never closed. On the volatile point, the LinkedHashMap spec maps are written by the test thread and read by the routing thread too, so a ConcurrentHashMap matters more than the field modifiers. enums would also help on messageType. I do not repeat these below.

Must fix

  1. firstVersion is wrong. 4.23.0 is tagged and camel-4.23.x is branched, so this ships in 4.24.0. Change firstVersion in the pom and in @UriEndpoint, and :since: in the docs page to 4.24, then regenerate.

Design questions (these matter most to me, as the API is hard to change after release)

  1. A validation failure is thrown into the route. This means the route's own error handling runs on a test assertion. onException or a dead letter channel can swallow the failure, and with redelivery the producer runs again. Each retry moves the exchange index and the received count, so message(1) is applied to a retry of the first exchange. MockEndpoint records failures and reports them in assertIsSatisfied(), and route behaviour does not change. For validate I would record failures and not throw by default, perhaps with a fail-fast option. For receive, throwing makes sense, because it simulates a service that rejects a bad request. Either way, please document it and add a test with redelivery or onException.
  2. The endpoint is not part of the existing camel-test helpers. MockEndpoint.assertIsSatisfied(context) and MockEndpoint.resetMocks(context) only see MockEndpoint instances. So a test that uses the context-wide assert skips the Citrus endpoints and passes. Did you consider extending MockEndpoint? That gives the context-wide assert and reset, and all the existing expected* methods, with Citrus validation added on top. The other option is a static assertIsSatisfied(CamelContext) for Citrus endpoints.
  3. assertIsSatisfied() passes when expectedMessageCount() was never called, even if specs are configured and no exchange arrived. This is a different case from gnodet-bot's null-spec finding. I suggest defaulting the expected count to the number of indexed specs, or failing when specs exist and nothing arrived.
  4. CitrusContext lifecycle. Each producer creates its own CitrusContext, which does the Citrus registry lookups each time. The component could own one context (created in doStart, closed in doStop) and accept an existing one from the registry. With an existing context, a test that runs under the Citrus JUnit extension can share its context and variables. This also fixes the leak gnodet-bot reported.
  5. The received message is built from the raw body and a plain copy of the headers. An InputStream or StreamCache body is read by Citrus' DefaultTypeConverter and not reset afterwards. So the next step in the route may see an empty body, although the docs say validate does not modify the exchange. POJO or Map bodies also go through Citrus' converter, not Camel's. Camel headers are case-insensitive, but the copy into a LinkedHashMap loses that. Citrus 5.0.2 has HeaderValidationContext.Builder#ignoreCase(true) for this. Details are in the inline comments.
  6. Only exchange properties become Citrus variables. Camel 4 exchange variables (setVariable) seem a closer match for Citrus test variables. Also, @variable()@ extraction is lost after each exchange, because the TestContext is created per exchange. Within one exchange it can only feed the receive response.

Docs

  1. The docs page has no Maven dependency snippet. This matters more than usual here, because the artifactId (camel-test-citrus) differs from the scheme and the dependency should use test scope.
  2. The "Path validation" section describes automatic classification of $ and / expressions, but this component does not do that. The real API, allMessages().validate(new DefaultValidations().jsonPath()...), is not shown anywhere on the page. The JSON and XML tests have good examples to use instead.
  3. The docs say a missing spec fails with an error. That is only true when some indexed spec exists. See gnodet-bot's null-spec finding.

Tests and conventions

  1. New components use camel-test-junit6. Every component pom added in the last four months does. The explicit junit-jupiter dependency is redundant, and the assertj-core version is already managed in parent/pom.xml.
  2. There is a fully qualified class name in CitrusValidateJsonTest (inline comment).
  3. The PR description lists tests that do not exist: XML namespace-aware validation, plain text ignore expressions and YAML ignore expressions. There are 33 tests, not 34. The positional @ignore(n)@ plain text section in the docs has no test. There are no tests for the assertIsSatisfied() failure paths (count mismatch, timeout, collected failures). Please add the missing tests or correct the description.
  4. Minor: toUpperCase() without Locale.ROOT in resolveMessageType.

Not blocking, for later

The expectations can only be set through the Java fluent API, so YAML and XML routes and the Camel CLI (camel test) cannot use them. The JIRA says Java DSL comes first, which is fine. A follow-up that loads expected templates from a resource, for example citrus:validate?expected=classpath:order.json, would make this usable outside Java tests.

I am leaving a comment rather than a change request, since gnodet-bot's change request is still open. Item 1 is a real must-fix. Items 2 to 4 are what I would like to settle before merge.

Checked against the project conventions in CLAUDE.md. This is a rules-and-conventions review and does not replace CodeRabbit, Sourcery or SonarCloud.

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 components/camel-test/camel-test-citrus/pom.xml Outdated

@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 latest commits — 4 issues found, of which the previous concerns have been addressed.

The new commits brought good fixes (validated operation guard, expectedMessageCount counter management, @UriPath enum annotation, volatile fields, CitrusContext lifecycle). What remains are four new or remaining concerns with the updated code.

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 latest commits — all prior findings have been addressed ✅

Summary of addressed issues:

  • name field restored in CitrusEndpoint with proper getName()/setName() overrides that keep the local field in sync with the parent MockEndpoint field
  • Catalog JSON corrected: name parameter now shows required: false (matching @UriPath without @Metadata(required = true))
  • Empty section comments (--- Validation spec ---, --- Response spec ---) removed
  • Error handling documented in citrus-component.adoc with a dedicated "Error handling and redelivery" section
  • CitrusReceiveErrorHandlingTest added with two tests covering the error swallowing vs propagation semantics
  • writeBackExtractedVariables containsKey guard removed; CitrusVariableTest extended with 3 tests (propagation, extraction, extraction-when-property-exists)

No new issues found in the latest commits. The implementation is clean — good job addressing all review feedback.

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

@christophd

Copy link
Copy Markdown
Contributor Author

@davsclaus ready to merge when you say "go" 😄

@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 @christophd for working through all of this. I compared 9b9a117..0929ff0 (1 new commit) and went through my earlier points:

  • name path option: fixed. The field is back with its own @UriPath description, and getName()/setName() are overridden. citrus.json, the catalog copy, CitrusEndpointUriFactory and the endpoint DSL all say required: false with the Citrus description now.
  • Implied minimum count: fixed and tested. shouldFailWhenImpliedMinimumCountNotMet covers it, and the docs explain it.
  • Variable tests: added. CitrusVariableTest covers a variable set before the endpoint, a value extracted with @variable()@ after it, and an extracted value that overwrites a variable while the property keeps its value.
  • onException test: added. CitrusReceiveErrorHandlingTest pins that validate clears the exception and receive keeps it, and the new "Error handling and redelivery" section explains it.
  • Minor: the empty section comments are gone, the double registration in receive() has a comment, and the PR description is up to date.

New finding, from the write-back change: every exchange property now becomes an exchange variable (inline). propagateExchangeVariables copies all exchange properties into the TestContext, and writeBackExtractedVariables now writes every context variable back with exchange.setVariable(...), so after citrus:validate a property foo also exists as a variable foo (and so does any global Citrus variable). That goes against "validate validates exchanges without modifying them" in the docs and the operation option. Writing back only the keys that are new or changed since the propagation keeps shouldExtractVariableEvenWhenPropertyExists passing. Please add a test that an unrelated property does not show up as a variable.

Non-blocking:

  • The new error-handling section says redelivery fires for receive, but not that each retry counts as a new exchange in the mock counter, so receive(2) applies to the retry of the first exchange. One sentence would cover it.
  • The thread on the operation list (line 43) is still open: the failure behaviour of validate is not stated up front. The new section covers it further down, so this is a nit.

CI is green on 0929ff0. I am keeping the change request only for the property-to-variable side effect, and will approve once that is fixed and tested.

Claude Code on behalf of @davsclaus.

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

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

Following up on my earlier review — all outstanding issues are resolved.

✅ Fixed in 0929ff0d:

  • Dead name field — getName() / setName() override now correctly delegate to the CitrusEndpoint field.
  • Lambda NPE risk — createTestContext() guards against a null citrusContext with an explicit IllegalStateException.

✅ Fixed in c09d53df (this commit):

  • writeBackExtractedVariables property leakage — the snapshot-and-diff approach is correct. Taking a HashMap snapshot of testContext.getVariables() after propagateExchangeVariables() and then writing back only new or changed entries cleanly prevents exchange properties from leaking into exchange variables while preserving all Citrus extraction semantics. All three code paths are covered by existing tests: the new shouldNotWriteBackPropagatedPropertiesAsVariables test covers the fix directly, shouldExtractVariableFromBody validates new extractions still work, and shouldExtractVariableEvenWhenPropertyExists covers the changed-value write-back path.

Re: double registration in WhenSpec.receive() / ThenSpec.respond() — the previous concern was a design misread. The initial registration in receive(int) is intentional and necessary: it ensures receive() alone (without then().respond()) still performs validation. ThenSpec.respond() replaces it with a processor that adds a response. The comment in the code documents this correctly.

LGTM.

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.

Following up on my earlier review — 4 of 4 issues have been addressed. The refactoring to extend MockEndpoint is well-executed. Three new concerns emerge from the current architecture, one of which is a correctness bug in performAssertions().

1. performAssertions() adds failures in receive mode — breaks assertIsSatisfied() for handled errors

In performAssertions(), the exception is added to getFailures() unconditionally for both validate and receive modes. In receive mode, the intent is that Camel's onException handles the error — the exception correctly stays on the exchange. But because it also lands in the failures list, any subsequent call to citrus.assertIsSatisfied() will throw AssertionError even when the route's error handler fully managed the failure.

The test receiveOperationTriggersOnException() masks this: it never calls citrus.assertIsSatisfied() after the handled failure. If a user calls MockEndpoint.assertIsSatisfied(context) (the documented idiom for multi-endpoint test teardown), all CitrusEndpoint instances are checked — including ones in receive mode where an error was already handled. The test coverage gap lets the bug go undetected.

Fix: only add to getFailures() in validate mode; let receive-mode errors propagate without polluting the failure list.

2. Spec is mutable after processor registration (documentation gap, async risk)

validate(), validateAll(), and when().receive() create and register the processor immediately, then return the mutable MessageValidationSpec for fluent .body()/.header() chaining. The processor holds a direct reference to the spec. MessageValidationSpec fields (body, bodyBuilder, headers) have no synchronization.

With a DirectComponent consumer this is safe because spec setup happens-before template.send(). With an async consumer (SEDA, timer, or any multi-threaded route), an exchange can arrive and the processor can read spec fields mid-setup. This is at minimum a documentation gap — users of async routes will hit intermittent test failures with no clear cause.

3. Shared nextSpecIndex between validate() and when().receive() — collision risk when mixing explicit and auto-indexed calls

Both validate() and WhenSpec.receive() call nextSpecIndex.incrementAndGet(). Calling citrus.validate(2) explicitly then citrus.validate() auto-increments to 1 — the counter doesn't track which explicit indices are already occupied. Mixing validate(N) and validate() auto-indexed calls can silently overwrite registrations. The documentation doesn't warn about this constraint.


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 @christophd. I re-read c09d53d:

  • The property-to-variable side effect is fixed. process() now copies the context variables right after the propagation, and writeBackExtractedVariables writes back only the keys that are new or changed. So an exchange property (or a global Citrus variable) no longer turns into an exchange variable, while an extracted value that differs from an existing property is still written, as shouldExtractVariableEvenWhenPropertyExists checks.
  • shouldNotWriteBackPropagatedPropertiesAsVariables covers it.

Optional, for here or a follow-up: the operation list near the top of the docs could say that a validate failure only shows up through assertIsSatisfied() (the open thread), and the error-handling section could mention that each redelivery counts as a new exchange in the mock counter, so receive(2) applies to the retry of the first exchange.

CI is still running on c09d53d.

Thanks for working through all the rounds on this one.

Claude Code on behalf of @davsclaus.

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

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

Following up on my earlier review — all 3 open issues have been addressed.

The new commits (13 commits since the previous review) bring a clean architectural refactoring: CitrusEndpoint now extends MockEndpoint, CitrusProducer became CitrusValidationProcessor (a Processor), and CitrusComponent extends MockComponent. This correctly leverages MockEndpoint's processor dispatch, locking, exchange recording, and assertion infrastructure.

All concerns verified as non-issues:

  • name field shadowing: CitrusEndpoint.setName() correctly calls super.setName(), and MockEndpoint.getName() uses the getter — no desync.
  • performAssertions() flow: super.performAssertions() calls tryProcessing() which catches processor exceptions and sets them on the exchange; CitrusEndpoint.performAssertions() then correctly handles them by mode (validate collects + clears, receive leaves on exchange for onException).
  • WhenSpec.receive(index) double registration: MockEndpoint.whenExchangeReceived() uses processors.put() which replaces — the validation-only processor is atomically overwritten by the validation+response processor when then().respond() is called. No race.
  • CitrusContext thread safety: MockEndpoint.onExchange() runs under ReentrantLock — only one exchange is processed at a time per endpoint. createTestContext() is never called concurrently.
  • writeBackExtractedVariables filter: Fresh CitrusContext.createTestContext() starts with only GlobalVariables (empty by default) — no pre-populated Citrus internals to filter. The citrus. / CITRUS_ filter is a correct defensive safeguard.

Maven dependency section, docs error-handling section, and firstVersion are all correct.

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.

Claude Code on behalf of davsclaus

Thanks @christophd. I compared c09d53d..a3b3b02 (1 new commit) and the code changes look good:

  • Docs, failure behaviour up front: fixed. The operation list now says where validate and receive failures show up. I resolved my thread on it.
  • Redelivery note: added. The NOTE explains that a retry counts as a new exchange in the mock counter.
  • receive no longer records failures. This matches what MockEndpoint does when a whenExchangeReceived processor throws (tryProcessing sets the exception on the exchange and adds nothing to the failures), and receiveOperationTriggersOnException now pins it. The changes also answer the three open @gnodet-bot threads (the receive failure recording, the async setup note and the index-mixing Javadoc).

CI fails, and the failure is caused by this PR (must fix). Both build (17, false) and build (25, false) fail in mvn -Pregen:

Non-resolvable parent POM for org.apache.camel:camel-test-citrus:4.23.0-SNAPSHOT:
Could not find artifact org.apache.camel:camel-test-parent:pom:4.23.0-SNAPSHOT

main moved to 4.24.0-SNAPSHOT today (#27901), and CI builds the PR merged with main. The new module's pom still says 4.23.0-SNAPSHOT (inline suggestion). Please rebase on main and bump the parent version. Merging as it is would break the main build.

The catalog copy of the docs page is stale (must fix). catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/citrus-component.adoc does not have the three doc changes from a3b3b02 (the two operation-list sentences and the two NOTEs). After the rebase, a build of the module and the catalog regenerates it. CI's uncommitted-changes check fails without it, and the regen step does not get that far today.

Non-blocking: one more sentence for the redelivery NOTE (inline). Now that receive failures are not recorded, a failed first attempt is not reported anywhere if the retry reaches an index with no spec.

I am requesting changes only for the version bump and the catalog copy. Both are mechanical, and I will approve again once CI is green.

Checked against the project conventions in CLAUDE.md. This is a rules-and-conventions review and does not replace CodeRabbit, Sourcery or SonarCloud.

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

Comment thread components/camel-test/camel-test-citrus/pom.xml Outdated
Comment thread components/camel-test/camel-test-citrus/src/main/docs/citrus-component.adoc Outdated
christophd and others added 17 commits October 15, 2026 19:44
…ation

Introduces a new camel-test-citrus component that integrates with the
Citrus integration test framework for message validation in Camel route
tests.

Validate operation:
- Template-based message validation using Citrus validation modules
  (JSON, XML, YAML, plain text, binary, Hamcrest)
- Fluent API: allMessages() for uniform validation, message(index)
  for per-exchange sequential validation with automatic fallback
- Support for Citrus ignore expressions, validation matchers, and
  test variable resolution via exchange properties
- Path validation (JsonPath/XPath) through Citrus validation contexts
- Auto-detection of message type from body content

Receive operation (request/response simulation):
- Gherkin-style fluent API: when().message(n).receive() for expected
  request validation, then().message(n).respond() for simulated
  response definition
- Response bodies support Citrus test variables and functions
- Per-exchange and allMessages() fallback for both request validation
  and response specs
- send() alias for respond()
- Response-only mode (no request validation)

Message payload builders:
- body(MessagePayloadBuilder) overload on both validation and response
  specs, accepting Citrus payload builders (GroovyScriptPayloadBuilder,
  marshalling builders, custom implementations) and lambdas

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Validate operation errors: record failures instead of throwing,
  reported via assertIsSatisfied() (MockEndpoint pattern)
- Receive operation: still throws on validation failure
- Add operation validation in CitrusComponent (reject invalid ops)
- Add volatile to shared mutable fields for thread safety
- Reset counters in expectedMessageCount()
- Auto-derive expected count from indexed specs
- Add CitrusContext lifecycle management (doStop)
- Propagate exchange variables (both directions) between Camel/Citrus
- Use Locale.ROOT for case conversions
- Switch test dependency to camel-test-junit6
- Update firstVersion to 4.24.0
- Add operation enum constraint
- Improve documentation: Maven dependency snippet, path validation
  API usage, missing spec error behavior, exchange variables
- Regenerate catalog and endpoint DSL artifacts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…idation

Leverage whenExchangeReceived() and whenAnyExchangeReceived() from
MockEndpoint to dispatch Citrus validation and response logic via
CitrusValidationProcessor. This replaces the previous custom spec
resolution and indexing approach.

Benefits:
- Eliminates custom spec resolution, indexing and state tracking
- Reuses MockEndpoint's built-in processor dispatch (indexed and
  default) for both validation and response handling
- Simplifies the Gherkin-style API with a fluent
  when().receive().body().then().respond().body() chain
- Failure reporting uses performAssertions() to capture processor
  exceptions from the exchange and add them to the failures list;
  for validate mode the exception is cleared so it does not
  propagate through the route

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e build

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Handle StreamCache body in buildReceivedMessage to prevent stream
  drain on pass-through validate operation
- Filter Citrus-internal variables (citrus.*, CITRUS_*) in
  writeBackExtractedVariables to avoid polluting exchange variables
- Fix documentation to use 1-based indexing (matching MockEndpoint)
- Rewrite receive operation docs to match actual chained API

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Camel uses CaseInsensitiveMap for exchange headers, so Citrus header
validation should ignore case to match Camel's behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix WhenMessageValidationSpec.validate() to return the correct
  covariant type so .validate(...).then().respond() chains compile
- Fix docs: unmatched exchanges pass through silently, not as failures

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Make nextSpecIndex field final with set(0) in reset() instead of
  replacing the AtomicInteger reference
- Allow Citrus-extracted variables to overwrite existing exchange
  variables so @variable()@ extractions are not silently dropped

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Override @UriPath name with Citrus-specific description to prevent
  inheriting MockEndpoint's metadata
- Inject Supplier<TestContext> into CitrusValidationProcessor so specs
  configured before doStart() (e.g. isUseAdviceWith tests) work correctly
- Indexed specs imply a minimum expected message count when the test
  has not set one explicitly

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove shadowing `name` field from CitrusEndpoint — MockEndpoint
  already declares @UriPath name, and the inherited getName()/setName()
  handle the runtime value. The local field was never written to.
- Extract createTestContext() method with null guard to prevent NPE
  if the supplier is invoked after doStop() nulls citrusContext.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ng tests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lidation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@christophd
christophd force-pushed the feature/CAMEL-25378-test-citrus branch from a3b3b02 to ac01829 Compare October 15, 2026 17:57

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

Following up on my earlier review — all prior findings are resolved.

✅ Issues from my 08:55 review (addressed before this commit):

  • Dead name field — getName()/setName() overrides now correctly delegate to both CitrusEndpoint's own field and super.setName(), keeping both fields in sync. The catalog required: false on name is correct.
  • Lambda NPE after doStop() — createTestContext() now captures CitrusContext ctx = citrusContext as a local before using it, throws IllegalStateException (not NPE) when the endpoint is stopped. Race-safe.
  • Double registration in receive(index).then().respond() — acknowledged by design (first registration ensures receive() without .respond() still validates; the overwrite is intentional and documented in the comment). The wasted allocation is minor and acceptable.

✅ davsclaus's "must fix" issues (addressed in this commit ac018291):

  • Parent POM version — bumped from 4.23.0-SNAPSHOT → 4.24.0-SNAPSHOT in camel-test-citrus/pom.xml and all generated artifacts (citrus.json, component.properties). CI mvn -Pregen failure resolved.
  • Stale catalog copy — catalog/camel-catalog/src/generated/resources/.../citrus-component.adoc now matches the source doc with the two operation-list sentences and both NOTEs. Uncommitted-changes CI check will pass.
  • Redelivery NOTE extended — the additional sentence ("If no spec exists for the retry, it passes without validation and the earlier failure is not recorded, so set expectedMessageCount(...) to catch the extra exchange") is present in both the source and catalog copies.

CI is still running on this commit. No new issues introduced.

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.

Claude Code on behalf of davsclaus

Thanks @christophd. I compared a3b3b02..ac01829 (rebased on main, plus one new commit). The parent and BOM now use 4.24.0-SNAPSHOT, the catalog copy of the docs page matches the source page again, and the redelivery NOTE has the extra sentence. CI is green on ac01829, including the regen check and the doc validation. The remaining @gnodet-bot threads are addressed by the earlier commits, so all my points are settled.

This review does not replace specialized AI review tools or static analysis such as SonarCloud.

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

@christophd
christophd merged commit 2907675 into apache:main Oct 16, 2026
7 checks passed
@christophd
christophd deleted the feature/CAMEL-25378-test-citrus branch October 16, 2026 05:24
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.

4 participants