Skip to content

CAMEL-24377: Add JSON support to CamelEvent - #25495

Open
atiaomar1978-hub wants to merge 7 commits into
apache:mainfrom
atiaomar1978-hub:feature/CAMEL-24377-camel-event-json
Open

CAMEL-24377: Add JSON support to CamelEvent#25495
atiaomar1978-hub wants to merge 7 commits into
apache:mainfrom
atiaomar1978-hub:feature/CAMEL-24377-camel-event-json

Conversation

@atiaomar1978-hub

Copy link
Copy Markdown
Contributor

Description

Implements CAMEL-24377: structured JSON serialization for CamelEvent, similar to the existing BacklogEventMessage API used by Error Registry and Backlog Tracer.

API

Added to org.apache.camel.spi.CamelEvent:

  • Map<String, Object> asJSon() — structured event metadata as a JSON-compatible map
  • String toJSon(int indent) — pretty-printed JSON string

Implementation

  • CamelEventJsonSupport in camel-base builds JSON for all standard event types (context, route, exchange, step, service, failure)
  • Abstract event base classes and service failure events delegate to the support class
  • EventConsole now uses event.asJSon() instead of ad hoc toString() fields

JSON fields (examples)

Event category Fields
All events type, eventClass, timestamp, message
Context contextName
Route routeId, routeGroup, fromEndpointUri
Exchange exchangeId, fromRouteId, routeId
Sent/Sending endpointUri, timeTaken (sent)
Failure exception (type, message, stackTrace)
Redelivery attempt, exception
Step stepId
Service failure service, contextName

Tests

CamelEventJsonTest covers context, exchange failed/sent/failure-handling/redelivery, route reloaded/restarting failure, step failed, and service startup failure events.

./mvnw -pl core/camel-core -am test -Dtest=CamelEventJsonTest -Dsurefire.failIfNoSpecifiedTests=false

Documentation

Updated docs/user-manual/modules/ROOT/pages/event-notifier.adoc with JSON serialization section.

Tracking

AI-assisted contributions

AI-generated PR on behalf of atiaomar1978-hub (Cursor Agent)

@atiaomar1978-hub

Copy link
Copy Markdown
Contributor Author

Bugbot / Grok self-review — findings addressed

AI-generated comment on behalf of atiaomar1978-hub (Cursor Agent)

Review summary

Severity Finding Status
Medium ExchangeRedeliveryEvent omitted exception in JSON Fixed in c916abe — includes exchange exception
Low appendException lacked defensive try/catch Fixed in c916abe — fallback to exceptionMessage
Medium Empty docs/yarn.lock in repo Not in this PR — file is untracked locally, not committed
High Unrelated scripts/post-pr-25433-inline-replies.sh Not in this PR — untracked locally, not committed

Test coverage (CamelEventJsonTest)

  • Context started event (asJSon + toJSon)
  • Exchange failed (via EventNotifier, exception fields)
  • Exchange sent (endpointUri, timeTaken)
  • Exchange failure handling (DLQ metadata)
  • Exchange redelivery (attempt + exception)
  • Route reloaded / restarting failure
  • Step failed
  • Service startup failure
  • JsonObject compatibility

Tests

./mvnw -pl core/camel-core -am test -Dtest=CamelEventJsonTest -Dsurefire.failIfNoSpecifiedTests=false

All 10 tests passing locally. Ready for human review.

@atiaomar1978-hub
atiaomar1978-hub marked this pull request as ready for review August 14, 2026 15:55
@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.

@atiaomar1978-hub

Copy link
Copy Markdown
Contributor Author

CI fix — unresolved documentation xref

Checked CI run 31732539144: failure was from this PR.

Root cause

docs module xref-check failed:

Unresolved xrefs:
  manual:ROOT:event-notifier.adoc line 154:
  xref:components::others/backlog-tracer.adoc[Backlog Tracer]

backlog-tracer.adoc lives in the user manual (manual::), not under components::others.

Fix

Commit: d28e2f97633 — changed to xref:backlog-tracer.adoc[Backlog Tracer] (same pattern as tracer.adoc, index.adoc, etc.)

Verification (local)

./mvnw -pl docs -Psourcecheck generate-resources -DskipTests   # xref-check: green
./mvnw -pl core/camel-core -am -Dtest=CamelEventJsonTest test  # green

Pushed to feature/CAMEL-24377-camel-event-json — CI re-run should pass the docs xref-check step.


Composer on behalf of atiaomar1978-hub (AI-generated)

@davsclaus

Copy link
Copy Markdown
Contributor

@atiaomar1978-hub can you continue this work

@atiaomar1978-hub

Copy link
Copy Markdown
Contributor Author

Let me rebase @davsclaus

cursoragent and others added 4 commits September 2, 2026 18:30
- Add asJSon() and toJSon(int) to CamelEvent SPI
- Implement structured JSON serialization in CamelEventJsonSupport
- Wire JSON methods through abstract event base classes and service events
- Use structured JSON in EventConsole instead of ad hoc toString fields
- Add CamelEventJsonTest with coverage for context, exchange, route, step,
  service, and failure event types
- Document JSON serialization in event-notifier.adoc

Co-authored-by: Cursor Agent <noreply@cursor.com>
- Include exception details on ExchangeRedeliveryEvent JSON
- Guard exception JSON serialization with defensive fallback
- Add redelivery event JSON test coverage

Co-authored-by: Cursor Agent <noreply@cursor.com>
Use manual-local xref:backlog-tracer.adoc link so docs xref-check passes.

Co-authored-by: Omar Atie <atiaomar1978-hub@users.noreply.github.com>
Co-authored-by: Cursor Agent <noreply@cursor.com>
@cursor
cursor Bot force-pushed the feature/CAMEL-24377-camel-event-json branch from d28e2f9 to 92d3def Compare September 2, 2026 18:33
@github-actions

github-actions Bot commented Sep 2, 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.

Co-authored-by: Cursor Agent <noreply@cursor.com>

@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 for this contribution, Omar — it's well-scoped and nicely tested, and I want to call out one thing you got right: the exception/stacktrace serialization reuses MessageHelper.dumpExceptionAsJSonObject, the same helper the developer consoles use (backlog tracer, error registry). That JSON-escapes the trace and exception message so embedded quotes, newlines and JSON survive round-tripping. That's the correct "special care" for stacktraces — good call not rolling your own.

A few things to address before this can go in:

🔴 Blocking

  1. Generated dev-console descriptor not regenerated. Adding the details field to the EventEntry record changes the event console's response schema, but core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/event.json still lists only type/timestamp/exchangeId/message. CI's uncommitted-generated-files check will fail. Please regenerate and commit the descriptor. (The EventConsoleConfigurer only covers the capacity property, so it's unaffected — descriptor only.)

🟠 Major

  1. New non-default methods on the public SPI CamelEvent — see inline comment. Adding abstract methods to a published SPI is a source/binary break for external implementers; the project requires maintaining public-API backwards compatibility.

🟡 Minor

  1. Upgrade-guide entry. Per the contributor guidelines, API/SPI signature changes should be noted in docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc. The event-notifier.adoc addition documents the feature nicely, but the SPI change also warrants a short migration note (especially if the methods stay non-default).
  2. details duplicates the flat fields (type/timestamp/exchangeId/message) that already exist on EventEntry. Harmless, just flagging it as a conscious design choice.

Note: this is a rules-and-conventions review and does not replace specialized tools such as CodeRabbit/Sourcery or SonarCloud static analysis.

Claude Code on behalf of davsclaus

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

Comment thread core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java Outdated
Convert asJSon() and toJSon(int) to default methods with a minimal
type/timestamp/message fallback so external CamelEvent implementers
remain source- and binary-compatible.

Document the SPI addition and Event console details field in the
4.23 upgrade guide.

Co-authored-by: Cursor Agent <noreply@cursor.com>
@atiaomar1978-hub

Copy link
Copy Markdown
Contributor Author

Review feedback addressed

Composer on behalf of atiaomar1978-hub (AI-generated)

Thanks @davsclaus — all review items are now addressed in 6c7b7bc:

Priority Item Status
Blocking Regenerate dev-console descriptor for details field Done in ad1b12d
Major Make asJSon() / toJSon() default methods on CamelEvent SPI Done in 6c7b7bc — minimal type/timestamp/message fallback; built-in events still override with rich JSON via CamelEventJsonSupport
Minor Upgrade guide entry Done in 6c7b7bccamel-4x-upgrade-guide-4_23.adoc
Minor details duplicates flat fields Intentional — flat fields kept for backwards compatibility; details holds the full structured JSON payload

CI / regen check

Re-ran locally after the latest changes:

mvn install -pl core/camel-console,catalog/camel-catalog -am -DskipTests
mvn test -pl core/camel-core -am -Dtest=CamelEventJsonTest -Dsurefire.failIfNoSpecifiedTests=false

No uncommitted generated files — dev-console metadata from the earlier regen commit is still current.

Ready for re-review.

@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 for iterating on this, Omar — the previous round of feedback is nicely addressed: the SPI methods are now default (so external implementers stay source/binary compatible), the event dev-console descriptor is regenerated, the upgrade-guide entry is in place, and reusing MessageHelper.dumpExceptionAsJSonObject for exception/stacktrace serialization is exactly right. The ExchangeFailedEvent/ExchangeFailureHandlingEvent split is also handled correctly. Nice work.

One blocking correctness issue remains, plus a couple of minor points.

🟠 Blocking

Default CamelEvent.toJSon(int) can emit invalid JSON (see inline comment). StringQuoteHelper.doubleQuote(...) only wraps a string in quotes; it does not JSON-escape. Since the default asJSon() puts message = toString() (which routinely contains endpoint URIs and exception text, i.e. characters like ", \, newlines), the default toJSon produces malformed JSON for those values.

Blast radius is the default/fallback path only — all built-in events override and delegate to CamelEventJsonSupportJsoner, which escapes correctly, so the dev console and shipped events are fine. The issue affects external CamelEvent implementers that rely on the default. Worth noting: camel-api depends on camel-util but not camel-util-json, and camel-util has no JSON escaper (which is presumably why this was hand-rolled), so the fix likely needs a minimal manual escape of ", \, and control characters in the default toJSon rather than pulling in Jsoner.

🟡 Minor (non-blocking)

  1. The default (non-overridden) SPI path is untested. testContextStartedEventAsJson calls toJSon(2) on a built-in event, which takes the overridden Jsoner path — so nothing exercises the default toJSon/asJSon. A test with a bare custom CamelEvent (ideally with a " in its toString()) would have caught the issue above and guards it going forward.
  2. Cosmetic path divergence. The default asJSon() omits eventClass (the built-in support class adds it) and the default toJSon formatting differs from Jsoner.prettyPrint, so the two code paths yield slightly different JSON. Harmless, just flagging.

Also note CI was still pending when I reviewed — please make sure it goes green (it will catch any formatting / generated-file drift).

This is a rules-and-conventions and diff review; it does not replace specialized tools such as CodeRabbit/Sourcery or SonarCloud static analysis.

Claude Code on behalf of davsclaus

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

Comment thread core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java Outdated
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • catalog/camel-catalog
  • core/camel-api
  • core/camel-base
  • core/camel-console
  • core/camel-core
  • core/camel-util
  • docs

ℹ️ 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: 573 tested, 25 compile-only — current: 571 all tested

Maveniverse Scalpel detected 598 affected modules (current approach: 571).

⚠️ Modules only in Scalpel (27)
  • apache-camel
  • camel-allcomponents
  • camel-catalog
  • camel-catalog-console
  • camel-catalog-maven
  • camel-catalog-suggest
  • camel-componentdsl
  • camel-endpointdsl
  • camel-endpointdsl-support
  • camel-itest
  • camel-jbang-core
  • camel-jbang-it
  • camel-jbang-main
  • camel-jbang-plugin-edit
  • camel-jbang-plugin-generate
  • camel-jbang-plugin-kubernetes
  • camel-jbang-plugin-test
  • camel-kamelet-main
  • camel-launcher
  • camel-report-maven-plugin
  • camel-route-parser
  • camel-yaml-dsl
  • camel-yaml-dsl-deserializers
  • camel-yaml-dsl-maven-plugin
  • coverage
  • docs
  • dummy-component

Skip-tests mode would test 573 modules (7 direct + 566 downstream), skip tests for 25 (generated code, meta-modules)

Modules Scalpel would test (573)
  • archetypes
  • camel-a2a
  • camel-activemq
  • camel-activemq6
  • camel-ai-observability
  • camel-ai-observability-api
  • camel-ai-parent
  • camel-ai-resource
  • camel-ai-tool
  • camel-alibaba-common
  • camel-alibaba-eventbridge
  • camel-alibaba-fc
  • camel-alibaba-kms
  • camel-alibaba-mns
  • camel-alibaba-oss
  • camel-alibaba-ots
  • camel-alibaba-parent
  • camel-alibaba-sls
  • camel-alibaba-sms
  • camel-amqp
  • camel-api
  • camel-api-component-maven-plugin
  • camel-arangodb
  • camel-archetype-api-component
  • camel-archetype-component
  • camel-archetype-dataformat
  • camel-archetype-java
  • camel-archetype-main
  • camel-as2
  • camel-as2-api
  • camel-as2-parent
  • camel-asn1
  • camel-asterisk
  • camel-atmosphere-websocket
  • camel-atom
  • camel-attachments
  • camel-avro
  • camel-avro-rpc
  • camel-avro-rpc-jetty
  • camel-avro-rpc-parent
  • camel-avro-rpc-spi
  • camel-aws-bedrock
  • camel-aws-cloudtrail
  • camel-aws-common
  • camel-aws-config
  • camel-aws-parameter-store
  • camel-aws-parent
  • camel-aws-secrets-manager
  • camel-aws-security-hub
  • camel-aws2-athena
  • camel-aws2-comprehend
  • camel-aws2-cw
  • camel-aws2-ddb
  • camel-aws2-ec2
  • camel-aws2-ecs
  • camel-aws2-eks
  • camel-aws2-eventbridge
  • camel-aws2-iam
  • camel-aws2-kinesis
  • camel-aws2-kms
  • camel-aws2-lambda
  • camel-aws2-mq
  • camel-aws2-msk
  • camel-aws2-polly
  • camel-aws2-redshift
  • camel-aws2-rekognition
  • camel-aws2-s3
  • camel-aws2-s3-vectors
  • camel-aws2-ses
  • camel-aws2-sns
  • camel-aws2-sqs
  • camel-aws2-step-functions
  • camel-aws2-sts
  • camel-aws2-textract
  • camel-aws2-timestream
  • camel-aws2-transcribe
  • camel-aws2-translate
  • camel-azure-common
  • camel-azure-cosmosdb
  • camel-azure-eventgrid
  • camel-azure-eventhubs
  • camel-azure-files
  • camel-azure-functions
  • camel-azure-key-vault
  • camel-azure-parent
  • camel-azure-schema-registry
  • camel-azure-servicebus
  • camel-azure-storage-blob
  • camel-azure-storage-datalake
  • camel-azure-storage-queue
  • camel-barcode
  • camel-base
  • camel-base-engine
  • camel-base64
  • camel-bean
  • camel-bean-validator
  • camel-beanio
  • camel-bindy
  • camel-bonita
  • camel-box
  • camel-box-api
  • camel-box-parent
  • camel-braintree
  • camel-browse
  • camel-caffeine
  • camel-camunda
  • camel-cassandraql
  • camel-catalog
  • 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-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-plugin-mcp
  • camel-jbang-plugin-route-parser
  • camel-jbang-plugin-tui
  • camel-jbang-plugin-validate
  • camel-jcache
  • camel-jcr
  • camel-jdbc
  • camel-jetty
  • camel-jetty-common
  • camel-jfr
  • camel-jgroups
  • camel-jgroups-raft
  • camel-jira
  • camel-jms
  • camel-jmx
  • camel-jolt
  • camel-jooq
  • camel-joor
  • camel-jpa
  • camel-jq
  • camel-jsch
  • camel-jslt
  • camel-json-validator
  • camel-jsonapi
  • camel-jsonata
  • camel-jsonb
  • camel-jsonpath
  • camel-jsoup
  • camel-jt400
  • camel-jta
  • camel-jte
  • camel-kafka
  • camel-kamelet
  • camel-kamelet-main-support
  • camel-keycloak
  • camel-knative
  • camel-knative-api
  • camel-knative-http
  • camel-knative-parent
  • camel-kserve
  • camel-kubernetes
  • camel-kudu
  • camel-langchain4j-agent
  • camel-langchain4j-agent-api
  • camel-langchain4j-chat
  • camel-langchain4j-core
  • camel-langchain4j-embeddings
  • camel-langchain4j-embeddingstore
  • camel-langchain4j-embeddingstore-api
  • camel-langchain4j-tokenizer
  • camel-langchain4j-web-search
  • camel-language
  • camel-launcher-container
  • camel-ldap
  • camel-ldif
  • camel-log
  • camel-lra
  • camel-lucene
  • camel-lumberjack
  • camel-lzf
  • camel-mail
  • camel-mail-microsoft-oauth
  • camel-main
  • camel-management
  • camel-management-api
  • camel-mapstruct
  • camel-master
  • camel-maven-plugin
  • camel-mcp-server
  • camel-mcp-server-api
  • camel-mdc
  • camel-metrics
  • camel-micrometer
  • camel-micrometer-observability
  • camel-micrometer-prometheus
  • camel-microprofile-config
  • camel-microprofile-fault-tolerance
  • camel-microprofile-health
  • camel-microprofile-parent
  • camel-milo
  • camel-milvus
  • camel-mina
  • camel-mina-sftp
  • camel-minio
  • camel-mllp
  • camel-mock
  • camel-mongodb
  • camel-mongodb-gridfs
  • camel-mustache
  • camel-mvel
  • camel-mybatis
  • camel-nats
  • camel-neo4j
  • camel-netty
  • camel-netty-http
  • camel-oaipmh
  • camel-oauth
  • camel-observability-services
  • camel-observation
  • camel-ocsf
  • camel-ognl
  • camel-olingo2
  • camel-olingo2-api
  • camel-olingo2-parent
  • camel-olingo4
  • camel-olingo4-api
  • camel-olingo4-parent
  • camel-once
  • camel-openai
  • camel-openapi-java
  • camel-openapi-rest-dsl-generator
  • camel-openapi-validator
  • camel-opensearch
  • camel-openstack
  • camel-opentelemetry
  • camel-opentelemetry-metrics
  • camel-opentelemetry2
  • camel-optaplanner
  • 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-maven-plugin
  • camel-salesforce-parent
  • camel-sap-netweaver
  • camel-saxon
  • camel-scheduler
  • camel-schematron
  • camel-seda
  • camel-servicenow
  • camel-servicenow-maven-plugin
  • camel-servicenow-parent
  • camel-servlet
  • camel-shell
  • camel-shiro
  • camel-sjms
  • camel-sjms2
  • camel-slack
  • camel-smb
  • camel-smooks
  • camel-smpp
  • camel-snakeyaml
  • camel-snmp
  • camel-soap
  • camel-solr
  • camel-spiffe
  • camel-splunk-hec
  • camel-spring
  • camel-spring-ai-chat
  • camel-spring-ai-embeddings
  • camel-spring-ai-image
  • camel-spring-ai-parent
  • camel-spring-ai-vector-store
  • camel-spring-batch
  • camel-spring-cloud-config
  • camel-spring-jdbc
  • camel-spring-ldap
  • camel-spring-main
  • camel-spring-parent
  • camel-spring-rabbitmq
  • camel-spring-redis
  • camel-spring-security
  • camel-spring-ws
  • camel-spring-xml
  • camel-sql
  • camel-ssh
  • camel-state-store
  • camel-state-store-parent
  • camel-stax
  • camel-stitch
  • camel-stream
  • camel-streamcaching-test
  • camel-stringtemplate
  • camel-stripe
  • camel-stub
  • camel-support
  • camel-swift
  • camel-syslog
  • camel-tahu
  • camel-tarfile
  • camel-telegram
  • camel-telemetry
  • camel-telemetry-dev
  • camel-tensorflow-serving
  • camel-test-infra-all
  • camel-test-infra-artemis
  • camel-test-infra-cli
  • camel-test-infra-core
  • camel-test-infra-jetty
  • camel-test-infra-qdrant
  • camel-test-infra-smb
  • camel-test-junit5
  • camel-test-junit6
  • camel-test-main-junit5
  • camel-test-main-junit6
  • camel-test-parent
  • camel-test-spring-junit5
  • camel-test-spring-junit6
  • camel-thrift
  • camel-thymeleaf
  • camel-tika
  • camel-timer
  • camel-tooling-maven
  • camel-toon
  • camel-tracing
  • camel-twilio
  • camel-twitter
  • camel-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-jaxb
  • camel-xml-jaxb-dsl
  • camel-xml-jaxb-dsl-test-definition
  • camel-xml-jaxb-dsl-test-spring
  • camel-xml-jaxp
  • camel-xmlsecurity
  • camel-xmpp
  • camel-xpath
  • camel-xslt
  • camel-xslt-saxon
  • camel-yaml-dsl-common
  • 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
  • docs
  • sync-properties-maven-plugin
Modules with tests skipped (25)
  • apache-camel
  • camel-allcomponents
  • camel-catalog-console
  • camel-catalog-maven
  • camel-catalog-suggest
  • camel-componentdsl
  • camel-endpointdsl
  • camel-endpointdsl-support
  • camel-itest
  • camel-jbang-core
  • camel-jbang-it
  • camel-jbang-main
  • camel-jbang-plugin-edit
  • camel-jbang-plugin-generate
  • camel-jbang-plugin-kubernetes
  • camel-jbang-plugin-test
  • camel-kamelet-main
  • camel-launcher
  • camel-report-maven-plugin
  • camel-route-parser
  • camel-yaml-dsl
  • camel-yaml-dsl-deserializers
  • camel-yaml-dsl-maven-plugin
  • coverage
  • dummy-component

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

⚠️ Some tests are disabled on GitHub Actions (@DisabledIfSystemProperty(named = "ci.env.name")) and require manual verification:

  • core/camel-core: 2 test(s) disabled on GitHub Actions
Build reactor — dependencies compiled but only changed modules were tested (7 modules)
  • Camel :: API
  • Camel :: Base
  • Camel :: Catalog :: Camel Catalog
  • Camel :: Console
  • Camel :: Core
  • Camel :: Docs
  • Camel :: Util

⚙️ View full build and test results

gnodet added a commit to gnodet/camel that referenced this pull request Sep 3, 2026

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

The StringQuoteHelper.doubleQuote() JSON-escaping issue flagged in the previous review remains unaddressed in the current head (6c7b7bc).

StringQuoteHelper.doubleQuote(text) is "\"" + text + "\"" — it wraps in quotes but does not escape \, ", or control characters inside text. The default CamelEvent.toJSon(int) method therefore emits invalid JSON whenever a value contains any of those characters. This affects external CamelEvent implementers relying on the default path — built-in events are safe because they override and route through CamelEventJsonSupportJsoner.

Concrete scenario: a custom event whose toString() returns Route "my-route" failed produces {"message":"Route "my-route" failed"} — broken JSON.

Since camel-api cannot depend on camel-util-json (Jsoner), the fix needs a minimal manual escape in the default toJSon — at minimum escaping \, ", \n, \r, \t before wrapping in quotes. Alternatively, add a jsonEscape method to StringQuoteHelper in camel-util.

Additionally, the default (non-overridden) SPI path is untested — all tests use built-in events that take the CamelEventJsonSupportJsoner path. A test with a bare custom CamelEvent (especially one with special characters in toString()) would catch this and guard against future regressions.

This review was generated by an AI agent.

Hermès on behalf of @gnodet

Comment thread core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java Outdated
Add StringQuoteHelper.jsonQuote for proper escaping of quotes,
backslashes and control characters. Use it in the default CamelEvent
toJSon implementation instead of doubleQuote.

Add tests for the helper and for a custom CamelEvent using the default
SPI path with special characters in toString().

Co-authored-by: Cursor <cursoragent@cursor.com>
@atiaomar1978-hub

Copy link
Copy Markdown
Contributor Author

Addressed the blocking JSON-escaping review in c32249aeb05:

  • Added StringQuoteHelper.jsonQuote() in camel-util with proper escaping of \", \\, control characters
  • Default CamelEvent.toJSon() now uses jsonQuote for keys and string values (replacing doubleQuote)
  • Added CamelEventJsonTest.testDefaultCamelEventToJsonEscapesSpecialCharacters for the default SPI path

Built-in events unchanged (still delegate to CamelEventJsonSupportJsoner).

Cursor Agent on behalf of atiaomar1978-hub

@atiaomar1978-hub atiaomar1978-hub left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks @davsclaus @gnodet — the JSON-escaping issue is fixed in c32249aeb05. Default SPI path now uses StringQuoteHelper.jsonQuote(); built-in events still use CamelEventJsonSupportJsoner. Tests added for the default path with special characters.

Cursor Agent on behalf of atiaomar1978-hub

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