This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-24744 in repository https://gitbox.apache.org/repos/asf/camel-jbang-examples.git
commit 736aa8319a658be83f029fc85fae1d086ffbec09 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Sep 14 21:46:29 2026 +0200 CAMEL-24744: write the examples in the canonical YAML format, not the deprecated compact notation The compact notation (setBody: {simple: "..."}, log: "...", to: "...", a when item with - simple:, script: {groovy: ...}, toD: "...") is deprecated in Camel 4.23: camel run warns about it and camel validate yaml --canonical reports it. Every route file, and the YAML snippets in the READMEs, now use the canonical form with the expression under expression: and a step as a map of its options, so a user or an AI agent starting from an example starts from the recommended form. The three bundled examples (tui-hello-world, content-based-router, message-size) are byte-identical to the copies shipped in camel-jbang. AGENTS.md documents the convention and the validate command. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- AGENTS.md | 10 +- ai/docling-langchain4j-rag/README.md | 4 +- .../comprehensive-analysis.camel.yaml | 4 +- .../sentiment-analysis.camel.yaml | 4 +- .../text-analysis-api.camel.yaml | 12 +- beginner/tui-hello-world/tui-hello-world.yaml | 14 +- cloud/kubernetes-secrets/news-service.camel.yaml | 4 +- cloud/kubernetes-service/news-service.camel.yaml | 4 +- .../content-based-router.camel.yaml | 10 +- observability/message-size/orders.camel.yaml | 40 +++-- security/keycloak-introspection-rest/README.md | 10 +- .../rest-api.camel.yaml | 199 ++++++++++++--------- security/keycloak-security-rest/README.md | 16 +- .../keycloak-security-rest/rest-api.camel.yaml | 59 +++--- security/ocsf/README.md | 8 +- .../pqc-document-signing/pqc-document-signing.yaml | 96 ++++++---- 16 files changed, 308 insertions(+), 186 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6eef9e9..a651fc5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -85,6 +85,13 @@ example. If your example ships a `test/`, add it to that workflow. `<name>.citrus.it.yaml`; Java package `camel.example.*`. - **License headers**: required on `application.properties` and `*.java` (ASF header). YAML route files do not carry a header. +- **YAML format**: write routes in the canonical YAML DSL format — an expression + under `expression:` and a step as a map of its options + (`setBody: {expression: {simple: {expression: "..."}}}`, `log: {message: "..."}`, + `to: {uri: "..."}`). The compact notation (`setBody: {simple: "..."}`, + `log: "..."`, `- simple:` in a `when` item) is deprecated and `camel run` warns + about it. Check with `camel validate yaml --canonical <file>` (Camel 4.23+); + `camel validate normalize` rewrites a file but drops its comments. - **README**: follow the existing examples — title, description, install CLI, start infra, how to run, stop/cleanup, integration testing, community footer. @@ -95,7 +102,8 @@ example. If your example ships a `test/`, add it to that workflow. and a correct `metadata.json`. 3. Add `compose.yaml` if infra is required; add `test/` Citrus tests where it makes sense and wire them into `.github/workflows/build.yml`. -4. Run it locally with `camel run` and verify the README's expected output. +4. Run it locally with `camel run` and verify the README's expected output; + `camel validate yaml --canonical` must report nothing. 5. Open the PR from your fork, link the JIRA ticket, and request review from active committers. diff --git a/ai/docling-langchain4j-rag/README.md b/ai/docling-langchain4j-rag/README.md index 9f270b7..7d90f85 100644 --- a/ai/docling-langchain4j-rag/README.md +++ b/ai/docling-langchain4j-rag/README.md @@ -500,7 +500,9 @@ ollama.timeout=300 # Add to routes - setHeader: name: Authorization - constant: "Bearer ${env:API_TOKEN}" + expression: + constant: + expression: "Bearer ${env:API_TOKEN}" ``` **2. Input Validation** diff --git a/ai/ibm-watson-language/comprehensive-analysis.camel.yaml b/ai/ibm-watson-language/comprehensive-analysis.camel.yaml index 68313b0..7c8c4c8 100644 --- a/ai/ibm-watson-language/comprehensive-analysis.camel.yaml +++ b/ai/ibm-watson-language/comprehensive-analysis.camel.yaml @@ -23,7 +23,9 @@ repeatCount: "2" steps: - setBody: - constant: "Apple Inc. announced record-breaking profits in its latest quarterly earnings. The company's CEO praised the innovative team for their groundbreaking work on artificial intelligence and sustainable technology. Investors are optimistic about the future growth potential." + expression: + constant: + expression: "Apple Inc. announced record-breaking profits in its latest quarterly earnings. The company's CEO praised the innovative team for their groundbreaking work on artificial intelligence and sustainable technology. Investors are optimistic about the future growth potential." - log: message: "Analyzing comprehensive text: ${body}" - to: diff --git a/ai/ibm-watson-language/sentiment-analysis.camel.yaml b/ai/ibm-watson-language/sentiment-analysis.camel.yaml index bef390f..6b9b373 100644 --- a/ai/ibm-watson-language/sentiment-analysis.camel.yaml +++ b/ai/ibm-watson-language/sentiment-analysis.camel.yaml @@ -23,7 +23,9 @@ repeatCount: "3" steps: - setBody: - constant: "I love this product! It's absolutely amazing and exceeded all my expectations. The customer service was outstanding!" + expression: + constant: + expression: "I love this product! It's absolutely amazing and exceeded all my expectations. The customer service was outstanding!" - log: message: "Analyzing text: ${body}" - to: diff --git a/ai/ibm-watson-language/text-analysis-api.camel.yaml b/ai/ibm-watson-language/text-analysis-api.camel.yaml index e072fb5..af1f5f2 100644 --- a/ai/ibm-watson-language/text-analysis-api.camel.yaml +++ b/ai/ibm-watson-language/text-analysis-api.camel.yaml @@ -36,7 +36,9 @@ analyzeKeywords: "false" - setHeader: name: "Content-Type" - constant: "application/json" + expression: + constant: + expression: "application/json" - marshal: json: {} @@ -61,7 +63,9 @@ analyzeKeywords: "true" - setHeader: name: "Content-Type" - constant: "application/json" + expression: + constant: + expression: "application/json" - marshal: json: {} @@ -87,6 +91,8 @@ analyzeConcepts: "true" - setHeader: name: "Content-Type" - constant: "application/json" + expression: + constant: + expression: "application/json" - marshal: json: {} diff --git a/beginner/tui-hello-world/tui-hello-world.yaml b/beginner/tui-hello-world/tui-hello-world.yaml index 28db173..b5bce65 100644 --- a/beginner/tui-hello-world/tui-hello-world.yaml +++ b/beginner/tui-hello-world/tui-hello-world.yaml @@ -6,14 +6,20 @@ repeatCount: 1 steps: - setBody: - constant: "Welcome! Open the TUI (camel tui) and press F2 → Send Message to say hello." - - log: "${body}" + expression: + constant: + expression: "Welcome! Open the TUI (camel tui) and press F2 → Send Message to say hello." + - log: + message: "${body}" - route: id: greet from: uri: direct:greet steps: - - log: "Received: ${body}" + - log: + message: "Received: ${body}" - setBody: - simple: "Hello ${body}!" + expression: + simple: + expression: "Hello ${body}!" diff --git a/cloud/kubernetes-secrets/news-service.camel.yaml b/cloud/kubernetes-secrets/news-service.camel.yaml index 1705c4d..b5c4246 100644 --- a/cloud/kubernetes-secrets/news-service.camel.yaml +++ b/cloud/kubernetes-secrets/news-service.camel.yaml @@ -22,7 +22,9 @@ httpMethodRestrict: GET steps: - setBody: - constant: "{{news.headline}}" + expression: + constant: + expression: "{{news.headline}}" - to: uri: "log:info" parameters: diff --git a/cloud/kubernetes-service/news-service.camel.yaml b/cloud/kubernetes-service/news-service.camel.yaml index 289d0b1..0c7a9e6 100644 --- a/cloud/kubernetes-service/news-service.camel.yaml +++ b/cloud/kubernetes-service/news-service.camel.yaml @@ -22,7 +22,9 @@ httpMethodRestrict: GET steps: - setBody: - constant: "Hello from Camel" + expression: + constant: + expression: "Hello from Camel" - to: uri: "log:info" parameters: diff --git a/eip/content-based-router/content-based-router.camel.yaml b/eip/content-based-router/content-based-router.camel.yaml index 698c2b1..d451fcf 100644 --- a/eip/content-based-router/content-based-router.camel.yaml +++ b/eip/content-based-router/content-based-router.camel.yaml @@ -14,8 +14,9 @@ type: int - choice: when: - - simple: - expression: "${body} >= 30" + - expression: + simple: + expression: "${body} >= 30" steps: - setHeader: name: level @@ -24,8 +25,9 @@ expression: hot - log: message: "Hot alert: ${body} C" - - simple: - expression: "${body} >= 15" + - expression: + simple: + expression: "${body} >= 15" steps: - setHeader: name: level diff --git a/observability/message-size/orders.camel.yaml b/observability/message-size/orders.camel.yaml index 1093006..c7d84fa 100644 --- a/observability/message-size/orders.camel.yaml +++ b/observability/message-size/orders.camel.yaml @@ -8,10 +8,14 @@ steps: - setHeader: name: Content-Length - simple: "${random(100,1023)}" + expression: + simple: + expression: "${random(100,1023)}" - setHeader: name: source - simple: small-producer + expression: + simple: + expression: small-producer - to: uri: seda:small @@ -24,13 +28,19 @@ steps: - setHeader: name: Content-Length - simple: "${random(8192,18432)}" + expression: + simple: + expression: "${random(8192,18432)}" - setHeader: name: source - simple: medium-producer + expression: + simple: + expression: medium-producer - setHeader: name: tracking-id - simple: "TRK-${random(10000,99999)}" + expression: + simple: + expression: "TRK-${random(10000,99999)}" - to: uri: seda:medium @@ -43,19 +53,29 @@ steps: - setHeader: name: Content-Length - simple: "${random(10485760,20971520)}" + expression: + simple: + expression: "${random(10485760,20971520)}" - setHeader: name: source - simple: large-producer + expression: + simple: + expression: large-producer - setHeader: name: tracking-id - simple: "TRK-${random(10000,99999)}" + expression: + simple: + expression: "TRK-${random(10000,99999)}" - setHeader: name: batch-id - simple: "BATCH-${random(100,999)}" + expression: + simple: + expression: "BATCH-${random(100,999)}" - setHeader: name: priority - simple: "${random(1,5)}" + expression: + simple: + expression: "${random(1,5)}" - to: uri: seda:large diff --git a/security/keycloak-introspection-rest/README.md b/security/keycloak-introspection-rest/README.md index cb1381c..329d3e4 100644 --- a/security/keycloak-introspection-rest/README.md +++ b/security/keycloak-introspection-rest/README.md @@ -496,10 +496,12 @@ Routes are protected by referencing the appropriate policy: - policy: ref: keycloakIntrospectionPolicy - setBody: - simple: | - { - "message": "Protected with introspection" - } + expression: + simple: + expression: | + { + "message": "Protected with introspection" + } ``` ### Introspection Flow diff --git a/security/keycloak-introspection-rest/rest-api.camel.yaml b/security/keycloak-introspection-rest/rest-api.camel.yaml index a29fae2..93bfd22 100644 --- a/security/keycloak-introspection-rest/rest-api.camel.yaml +++ b/security/keycloak-introspection-rest/rest-api.camel.yaml @@ -23,22 +23,29 @@ exception: - "org.apache.camel.CamelAuthorizationException" handled: - constant: true + constant: + expression: true steps: - setHeader: name: CamelHttpResponseCode - constant: 403 + expression: + constant: + expression: 403 - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - setBody: - simple: | - { - "error": "Forbidden", - "message": "Access denied. ${exception.message}", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", - "status": 403 - } + expression: + simple: + expression: | + { + "error": "Forbidden", + "message": "Access denied. ${exception.message}", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", + "status": 403 + } - log: message: "Authorization failed: ${exception.message}" @@ -79,15 +86,19 @@ uri: "platform-http:/api/public" steps: - setBody: - simple: | - { - "message": "This is a public endpoint, no authentication required", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", - "security": "none" - } + expression: + simple: + expression: | + { + "message": "This is a public endpoint, no authentication required", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", + "security": "none" + } - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - log: message: "Public API called" @@ -102,22 +113,26 @@ - policy: ref: keycloakIntrospectionPolicy - setBody: - simple: | - { - "message": "This is a protected endpoint using Token Introspection (RFC 7662)", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", - "security": "introspection", - "role_required": "admin", - "validation": "real-time via Keycloak introspection endpoint", - "features": [ - "Detects revoked tokens before expiration", - "Centralized validation", - "Caching enabled (TTL: {{keycloak.introspection.cache.ttl}}s)" - ] - } + expression: + simple: + expression: | + { + "message": "This is a protected endpoint using Token Introspection (RFC 7662)", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", + "security": "introspection", + "role_required": "admin", + "validation": "real-time via Keycloak introspection endpoint", + "features": [ + "Detects revoked tokens before expiration", + "Centralized validation", + "Caching enabled (TTL: {{keycloak.introspection.cache.ttl}}s)" + ] + } - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - log: message: "Protected API with Introspection called successfully" @@ -131,22 +146,26 @@ - policy: ref: keycloakStandardPolicy - setBody: - simple: | - { - "message": "This is a protected endpoint using standard JWT validation", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", - "security": "local-jwt", - "role_required": "admin", - "validation": "local JWT signature verification", - "features": [ - "Fast offline validation", - "No network calls to Keycloak", - "Cannot detect revoked tokens before expiration" - ] - } + expression: + simple: + expression: | + { + "message": "This is a protected endpoint using standard JWT validation", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", + "security": "local-jwt", + "role_required": "admin", + "validation": "local JWT signature verification", + "features": [ + "Fast offline validation", + "No network calls to Keycloak", + "Cannot detect revoked tokens before expiration" + ] + } - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - log: message: "Protected API with standard JWT called successfully" @@ -157,51 +176,55 @@ uri: "platform-http:/api/info" steps: - setBody: - simple: | - { - "example": "Keycloak Token Introspection REST API", - "endpoints": { - "public": { - "path": "/api/public", - "security": "none", - "description": "Public endpoint, no authentication required" - }, - "protected_introspection": { - "path": "/api/protected-introspection", - "security": "token_introspection", - "role": "admin", - "description": "Real-time token validation via Keycloak introspection endpoint (RFC 7662)", - "features": [ - "Detects revoked tokens", - "Centralized validation", - "Caching enabled" - ] - }, - "protected_standard": { - "path": "/api/protected-standard", - "security": "local_jwt", - "role": "admin", - "description": "Local JWT signature verification without introspection", - "features": [ - "Fast offline validation", - "No network overhead", - "Cannot detect token revocation" - ] + expression: + simple: + expression: | + { + "example": "Keycloak Token Introspection REST API", + "endpoints": { + "public": { + "path": "/api/public", + "security": "none", + "description": "Public endpoint, no authentication required" + }, + "protected_introspection": { + "path": "/api/protected-introspection", + "security": "token_introspection", + "role": "admin", + "description": "Real-time token validation via Keycloak introspection endpoint (RFC 7662)", + "features": [ + "Detects revoked tokens", + "Centralized validation", + "Caching enabled" + ] + }, + "protected_standard": { + "path": "/api/protected-standard", + "security": "local_jwt", + "role": "admin", + "description": "Local JWT signature verification without introspection", + "features": [ + "Fast offline validation", + "No network overhead", + "Cannot detect token revocation" + ] + } + }, + "introspection_config": { + "enabled": "{{keycloak.introspection.enabled}}", + "cache_enabled": "{{keycloak.introspection.cache.enabled}}", + "cache_ttl_seconds": "{{keycloak.introspection.cache.ttl}}" + }, + "keycloak_config": { + "server_url": "{{keycloak.server.url}}", + "realm": "{{keycloak.realm}}", + "client_id": "{{keycloak.client.id}}" + } } - }, - "introspection_config": { - "enabled": "{{keycloak.introspection.enabled}}", - "cache_enabled": "{{keycloak.introspection.cache.enabled}}", - "cache_ttl_seconds": "{{keycloak.introspection.cache.ttl}}" - }, - "keycloak_config": { - "server_url": "{{keycloak.server.url}}", - "realm": "{{keycloak.realm}}", - "client_id": "{{keycloak.client.id}}" - } - } - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - log: message: "Info API called" diff --git a/security/keycloak-security-rest/README.md b/security/keycloak-security-rest/README.md index 987eb96..79af561 100644 --- a/security/keycloak-security-rest/README.md +++ b/security/keycloak-security-rest/README.md @@ -290,14 +290,18 @@ Routes are protected by adding a policy reference. The policy will validate the - policy: ref: keycloakPolicy - setBody: - simple: | - { - "message": "This is a protected endpoint, admin role required", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}" - } + expression: + simple: + expression: | + { + "message": "This is a protected endpoint, admin role required", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}" + } - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - log: message: "Protected API called" ``` diff --git a/security/keycloak-security-rest/rest-api.camel.yaml b/security/keycloak-security-rest/rest-api.camel.yaml index 55c1714..9d48099 100644 --- a/security/keycloak-security-rest/rest-api.camel.yaml +++ b/security/keycloak-security-rest/rest-api.camel.yaml @@ -23,22 +23,29 @@ exception: - "org.apache.camel.CamelAuthorizationException" handled: - constant: true + constant: + expression: true steps: - setHeader: name: CamelHttpResponseCode - constant: 403 + expression: + constant: + expression: 403 - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - setBody: - simple: | - { - "error": "Forbidden", - "message": "Access denied. ${exception.message}", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", - "status": 403 - } + expression: + simple: + expression: | + { + "error": "Forbidden", + "message": "Access denied. ${exception.message}", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}", + "status": 403 + } - log: message: "Authorization failed: ${exception.message}" @@ -60,14 +67,18 @@ uri: "platform-http:/api/public" steps: - setBody: - simple: | - { - "message": "This is a public endpoint, no authentication required", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}" - } + expression: + simple: + expression: | + { + "message": "This is a public endpoint, no authentication required", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}" + } - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - log: message: "Public API called" @@ -80,13 +91,17 @@ - policy: ref: keycloakPolicy - setBody: - simple: | - { - "message": "This is a protected endpoint, admin role required", - "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}" - } + expression: + simple: + expression: | + { + "message": "This is a protected endpoint, admin role required", + "timestamp": "${date:now:yyyy-MM-dd'T'HH:mm:ss}" + } - setHeader: name: Content-Type - constant: application/json + expression: + constant: + expression: application/json - log: message: "Protected API called" diff --git a/security/ocsf/README.md b/security/ocsf/README.md index ec5f3ca..0e451a2 100644 --- a/security/ocsf/README.md +++ b/security/ocsf/README.md @@ -208,10 +208,14 @@ After unmarshalling, you can access fields directly: ```yaml - setHeader: name: severity - simple: "${body.additionalProperties[severity]}" + expression: + simple: + expression: "${body.additionalProperties[severity]}" - setHeader: name: findingTitle - simple: "${body.findingInfo.title}" + expression: + simple: + expression: "${body.findingInfo.title}" ``` Some fields are direct properties on the Java class (like `findingInfo`, `vulnerabilities`), while others are in `additionalProperties` (like `severity`, `time_dt`). Check the generated model classes in `camel-ocsf` if you need to know which is which. diff --git a/security/pqc-document-signing/pqc-document-signing.yaml b/security/pqc-document-signing/pqc-document-signing.yaml index d1e680a..3b2c64f 100644 --- a/security/pqc-document-signing/pqc-document-signing.yaml +++ b/security/pqc-document-signing/pqc-document-signing.yaml @@ -62,12 +62,14 @@ - log: message: "PQC signing key initialized successfully" - script: - groovy: | - // Register the KeyPair bean - def keyManager = camelContext.registry.lookupByNameAndType('keyLifecycleManager', - org.apache.camel.component.pqc.lifecycle.HashicorpVaultKeyLifecycleManager.class) - def keyPair = keyManager.getKey('document-signing-key') - camelContext.registry.bind('signingKey', keyPair) + expression: + groovy: + expression: | + // Register the KeyPair bean + def keyManager = camelContext.registry.lookupByNameAndType('keyLifecycleManager', + org.apache.camel.component.pqc.lifecycle.HashicorpVaultKeyLifecycleManager.class) + def keyPair = keyManager.getKey('document-signing-key') + camelContext.registry.bind('signingKey', keyPair) - to: uri: direct:get-key-metadata @@ -83,15 +85,18 @@ expression: simple: expression: "${body}" - - toD: "pqc:sign?operation=sign&signatureAlgorithm=DILITHIUM&keyPair=#signingKey" + - toD: + uri: "pqc:sign?operation=sign&signatureAlgorithm=DILITHIUM&keyPair=#signingKey" - script: - groovy: | - // Convert binary signature to base64 - def signature = exchange.message.getHeader('CamelPQCSignature', byte[].class) - if (signature != null) { - def base64Signature = java.util.Base64.encoder.encodeToString(signature) - exchange.message.setHeader('CamelPQCSignature', base64Signature) - } + expression: + groovy: + expression: | + // Convert binary signature to base64 + def signature = exchange.message.getHeader('CamelPQCSignature', byte[].class) + if (signature != null) { + def base64Signature = java.util.Base64.encoder.encodeToString(signature) + exchange.message.setHeader('CamelPQCSignature', base64Signature) + } - log: message: "Document signed with quantum-resistant signature" - to: @@ -112,7 +117,9 @@ } - setHeader: name: Content-Type - constant: "application/json" + expression: + constant: + expression: "application/json" - log: message: "Response: ${body}" @@ -124,20 +131,23 @@ - log: message: "Received document verification request: ${body}" - script: - groovy: | - // Get signature from X-Signature header - def base64Signature = exchange.getIn().getHeader('X-Signature', String.class) - if (base64Signature == null || base64Signature.isEmpty()) { - throw new IllegalArgumentException('X-Signature header is missing or empty') - } - def signature = java.util.Base64.decoder.decode(base64Signature) - exchange.getIn().setHeader('CamelPQCSignature', signature) - exchange.getIn().setHeader('signatureLength', signature.length) + expression: + groovy: + expression: | + // Get signature from X-Signature header + def base64Signature = exchange.getIn().getHeader('X-Signature', String.class) + if (base64Signature == null || base64Signature.isEmpty()) { + throw new IllegalArgumentException('X-Signature header is missing or empty') + } + def signature = java.util.Base64.decoder.decode(base64Signature) + exchange.getIn().setHeader('CamelPQCSignature', signature) + exchange.getIn().setHeader('signatureLength', signature.length) - log: message: "Verifying signature of length: ${header.signatureLength} bytes" - doTry: steps: - - toD: "pqc:verify?operation=verify&signatureAlgorithm=DILITHIUM&keyPair=#signingKey" + - toD: + uri: "pqc:verify?operation=verify&signatureAlgorithm=DILITHIUM&keyPair=#signingKey" - log: message: "Verification completed. Result: ${header.CamelPQCVerification}" doCatch: @@ -148,7 +158,9 @@ message: "ERROR during verification: ${exception.message}" - setHeader: name: CamelPQCVerification - constant: false + expression: + constant: + expression: false - choice: when: - expression: @@ -181,7 +193,9 @@ } - setHeader: name: Content-Type - constant: "application/json" + expression: + constant: + expression: "application/json" - log: message: "Verification result: ${body}" @@ -214,7 +228,9 @@ } - setHeader: name: Content-Type - constant: "application/json" + expression: + constant: + expression: "application/json" - log: message: "Keys listed: ${body}" @@ -242,7 +258,9 @@ } - setHeader: name: Content-Type - constant: "application/json" + expression: + constant: + expression: "application/json" - route: id: check-rotation-schedule @@ -287,13 +305,15 @@ simple: expression: "${body}" - script: - groovy: | - // Update last used timestamp and increment usage count - def metadata = exchange.getProperty('metadata') - if (metadata != null) { - metadata.getClass().getMethod('updateLastUsed').invoke(metadata) - exchange.message.setBody(metadata) - } + expression: + groovy: + expression: | + // Update last used timestamp and increment usage count + def metadata = exchange.getProperty('metadata') + if (metadata != null) { + metadata.getClass().getMethod('updateLastUsed').invoke(metadata) + exchange.message.setBody(metadata) + } - bean: ref: keyLifecycleManager method: "updateKeyMetadata('document-signing-key', ${body})" @@ -327,7 +347,9 @@ } - setHeader: name: Content-Type - constant: "application/json" + expression: + constant: + expression: "application/json" - log: message: "Key metadata: ${body}"
