This is an automated email from the ASF dual-hosted git repository. fmariani pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 277930876b2a1b1d8dd74e095465e161b6f6c83c Author: Croway <[email protected]> AuthorDate: Mon Jul 7 15:53:02 2025 +0200 Interceptor EIPs should include more information where the interception happened --- .../org/apache/camel/catalog/models/intercept.json | 5 + .../apache/camel/catalog/models/interceptFrom.json | 5 +- .../catalog/models/interceptSendToEndpoint.json | 5 +- .../org/apache/camel/ExchangeConstantProvider.java | 5 +- .../src/main/java/org/apache/camel/Exchange.java | 10 ++ .../java/org/apache/camel/ExchangePropertyKey.java | 9 ++ .../META-INF/org/apache/camel/model/intercept.json | 5 + .../org/apache/camel/model/interceptFrom.json | 5 +- .../camel/model/interceptSendToEndpoint.json | 5 +- .../apache/camel/reifier/InterceptFromReifier.java | 4 + .../org/apache/camel/reifier/InterceptReifier.java | 17 +++- .../reifier/InterceptSendToEndpointReifier.java | 13 ++- .../camel/processor/InterceptPropertiesTest.java | 111 +++++++++++++++++++++ 13 files changed, 190 insertions(+), 9 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/intercept.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/intercept.json index d40e3711a15..796125e30d7 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/intercept.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/intercept.json @@ -17,5 +17,10 @@ "disabled": { "index": 2, "kind": "attribute", "displayName": "Disabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "onWhen": { "index": 3, "kind": "element", "displayName": "On When", "group": "common", "required": false, "type": "object", "javaType": "org.apache.camel.model.OnWhenDefinition", "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "To use an expression to only trigger intercepting in specific situations" }, "outputs": { "index": 4, "kind": "element", "displayName": "Outputs", "group": "common", "required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", "convertHeaderTo", "convertVariableTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop", "mar [...] + }, + "exchangeProperties": { + "CamelInterceptedNodeId": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Node Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's node ID" }, + "CamelInterceptedParentEndpointUri": { "index": 1, "kind": "exchangeProperty", "displayName": "Intercepted Parent Endpoint Uri", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The parent's endpoint URI that was intercepted" }, + "CamelInterceptedRouteId": { "index": 2, "kind": "exchangeProperty", "displayName": "Intercepted Route Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's ID" } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptFrom.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptFrom.json index 3b4c57b949e..317d68daff6 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptFrom.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptFrom.json @@ -20,6 +20,9 @@ "outputs": { "index": 5, "kind": "element", "displayName": "Outputs", "group": "common", "required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", "convertHeaderTo", "convertVariableTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop", "mar [...] }, "exchangeProperties": { - "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" } + "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" }, + "CamelInterceptedNodeId": { "index": 1, "kind": "exchangeProperty", "displayName": "Intercepted Node Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's node ID" }, + "CamelInterceptedParentEndpointUri": { "index": 2, "kind": "exchangeProperty", "displayName": "Intercepted Parent Endpoint Uri", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The parent's endpoint URI that was intercepted" }, + "CamelInterceptedRouteId": { "index": 3, "kind": "exchangeProperty", "displayName": "Intercepted Route Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's ID" } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptSendToEndpoint.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptSendToEndpoint.json index aa27dcb67a4..cb440512326 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptSendToEndpoint.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/interceptSendToEndpoint.json @@ -22,6 +22,9 @@ "outputs": { "index": 7, "kind": "element", "displayName": "Outputs", "group": "common", "required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", "convertHeaderTo", "convertVariableTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop", "mar [...] }, "exchangeProperties": { - "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" } + "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" }, + "CamelInterceptedNodeId": { "index": 1, "kind": "exchangeProperty", "displayName": "Intercepted Node Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's node ID" }, + "CamelInterceptedParentEndpointUri": { "index": 2, "kind": "exchangeProperty", "displayName": "Intercepted Parent Endpoint Uri", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The parent's endpoint URI that was intercepted" }, + "CamelInterceptedRouteId": { "index": 3, "kind": "exchangeProperty", "displayName": "Intercepted Route Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's ID" } } } diff --git a/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java b/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java index f38cc8019f8..c8a0bec481c 100644 --- a/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java +++ b/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java @@ -13,7 +13,7 @@ public class ExchangeConstantProvider { private static final Map<String, String> MAP; static { - Map<String, String> map = new HashMap<>(158); + Map<String, String> map = new HashMap<>(161); map.put("ACCEPT_CONTENT_TYPE", "CamelAcceptContentType"); map.put("AGGREGATED_COLLECTION_GUARD", "CamelAggregatedCollectionGuard"); map.put("AGGREGATED_COMPLETED_BY", "CamelAggregatedCompletedBy"); @@ -99,6 +99,9 @@ public class ExchangeConstantProvider { map.put("HTTP_URL", "CamelHttpUrl"); map.put("INTERCEPT_SEND_TO_ENDPOINT_WHEN_MATCHED", "CamelInterceptSendToEndpointWhenMatched"); map.put("INTERCEPTED_ENDPOINT", "CamelInterceptedEndpoint"); + map.put("INTERCEPTED_NODE_ID", "CamelInterceptedNodeId"); + map.put("INTERCEPTED_PARENT_ENDPOINT_URI", "CamelInterceptedParentEndpointUri"); + map.put("INTERCEPTED_ROUTE_ID", "CamelInterceptedRouteId"); map.put("INTERRUPTED", "CamelInterrupted"); map.put("LANGUAGE_SCRIPT", "CamelLanguageScript"); map.put("LOG_DEBUG_BODY_MAX_CHARS", "CamelLogDebugBodyMaxChars"); diff --git a/core/camel-api/src/main/java/org/apache/camel/Exchange.java b/core/camel-api/src/main/java/org/apache/camel/Exchange.java index 44060c1ff51..ea9cba6ffc9 100644 --- a/core/camel-api/src/main/java/org/apache/camel/Exchange.java +++ b/core/camel-api/src/main/java/org/apache/camel/Exchange.java @@ -203,6 +203,16 @@ public interface Exchange extends VariableAware { @Metadata(label = "interceptFrom,interceptSendToEndpoint", description = "The endpoint URI that was intercepted", javaType = "String") String INTERCEPTED_ENDPOINT = "CamelInterceptedEndpoint"; + @Metadata(label = "intercept,interceptFrom,interceptSendToEndpoint", description = "The intercepted route's node ID", + javaType = "String") + String INTERCEPTED_NODE_ID = "CamelInterceptedNodeId"; + @Metadata(label = "intercept,interceptFrom,interceptSendToEndpoint", + description = "The parent's endpoint URI that was intercepted", + javaType = "String") + String INTERCEPTED_PARENT_ENDPOINT_URI = "CamelInterceptedParentEndpointUri"; + @Metadata(label = "intercept,interceptFrom,interceptSendToEndpoint", description = "The intercepted route's ID", + javaType = "String") + String INTERCEPTED_ROUTE_ID = "CamelInterceptedRouteId"; String INTERCEPT_SEND_TO_ENDPOINT_WHEN_MATCHED = "CamelInterceptSendToEndpointWhenMatched"; @Deprecated(since = "3.1.0") String INTERRUPTED = "CamelInterrupted"; diff --git a/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java b/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java index 182ea087eaf..695b4c47604 100644 --- a/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java +++ b/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java @@ -57,6 +57,9 @@ public enum ExchangePropertyKey { FILE_EXCHANGE_FILE(Exchange.FILE_EXCHANGE_FILE), GROUPED_EXCHANGE(Exchange.GROUPED_EXCHANGE), INTERCEPTED_ENDPOINT(Exchange.INTERCEPTED_ENDPOINT), + INTERCEPTED_NODE_ID(Exchange.INTERCEPTED_NODE_ID), + INTERCEPTED_PARENT_ENDPOINT_URI(Exchange.INTERCEPTED_PARENT_ENDPOINT_URI), + INTERCEPTED_ROUTE_ID(Exchange.INTERCEPTED_ROUTE_ID), INTERCEPT_SEND_TO_ENDPOINT_WHEN_MATCHED(Exchange.INTERCEPT_SEND_TO_ENDPOINT_WHEN_MATCHED), LOOP_INDEX(Exchange.LOOP_INDEX), LOOP_SIZE(Exchange.LOOP_SIZE), @@ -160,6 +163,12 @@ public enum ExchangePropertyKey { return GROUPED_EXCHANGE; case Exchange.INTERCEPTED_ENDPOINT: return INTERCEPTED_ENDPOINT; + case Exchange.INTERCEPTED_NODE_ID: + return INTERCEPTED_NODE_ID; + case Exchange.INTERCEPTED_PARENT_ENDPOINT_URI: + return INTERCEPTED_PARENT_ENDPOINT_URI; + case Exchange.INTERCEPTED_ROUTE_ID: + return INTERCEPTED_ROUTE_ID; case Exchange.INTERCEPT_SEND_TO_ENDPOINT_WHEN_MATCHED: return INTERCEPT_SEND_TO_ENDPOINT_WHEN_MATCHED; case Exchange.LOOP_INDEX: diff --git a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/intercept.json b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/intercept.json index d40e3711a15..796125e30d7 100644 --- a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/intercept.json +++ b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/intercept.json @@ -17,5 +17,10 @@ "disabled": { "index": 2, "kind": "attribute", "displayName": "Disabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "onWhen": { "index": 3, "kind": "element", "displayName": "On When", "group": "common", "required": false, "type": "object", "javaType": "org.apache.camel.model.OnWhenDefinition", "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "To use an expression to only trigger intercepting in specific situations" }, "outputs": { "index": 4, "kind": "element", "displayName": "Outputs", "group": "common", "required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", "convertHeaderTo", "convertVariableTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop", "mar [...] + }, + "exchangeProperties": { + "CamelInterceptedNodeId": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Node Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's node ID" }, + "CamelInterceptedParentEndpointUri": { "index": 1, "kind": "exchangeProperty", "displayName": "Intercepted Parent Endpoint Uri", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The parent's endpoint URI that was intercepted" }, + "CamelInterceptedRouteId": { "index": 2, "kind": "exchangeProperty", "displayName": "Intercepted Route Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's ID" } } } diff --git a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptFrom.json b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptFrom.json index 3b4c57b949e..317d68daff6 100644 --- a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptFrom.json +++ b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptFrom.json @@ -20,6 +20,9 @@ "outputs": { "index": 5, "kind": "element", "displayName": "Outputs", "group": "common", "required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", "convertHeaderTo", "convertVariableTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop", "mar [...] }, "exchangeProperties": { - "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" } + "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" }, + "CamelInterceptedNodeId": { "index": 1, "kind": "exchangeProperty", "displayName": "Intercepted Node Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's node ID" }, + "CamelInterceptedParentEndpointUri": { "index": 2, "kind": "exchangeProperty", "displayName": "Intercepted Parent Endpoint Uri", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The parent's endpoint URI that was intercepted" }, + "CamelInterceptedRouteId": { "index": 3, "kind": "exchangeProperty", "displayName": "Intercepted Route Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's ID" } } } diff --git a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptSendToEndpoint.json b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptSendToEndpoint.json index aa27dcb67a4..cb440512326 100644 --- a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptSendToEndpoint.json +++ b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/interceptSendToEndpoint.json @@ -22,6 +22,9 @@ "outputs": { "index": 7, "kind": "element", "displayName": "Outputs", "group": "common", "required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", "convertHeaderTo", "convertVariableTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop", "mar [...] }, "exchangeProperties": { - "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" } + "CamelInterceptedEndpoint": { "index": 0, "kind": "exchangeProperty", "displayName": "Intercepted Endpoint", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The endpoint URI that was intercepted" }, + "CamelInterceptedNodeId": { "index": 1, "kind": "exchangeProperty", "displayName": "Intercepted Node Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's node ID" }, + "CamelInterceptedParentEndpointUri": { "index": 2, "kind": "exchangeProperty", "displayName": "Intercepted Parent Endpoint Uri", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The parent's endpoint URI that was intercepted" }, + "CamelInterceptedRouteId": { "index": 3, "kind": "exchangeProperty", "displayName": "Intercepted Route Id", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "autowired": false, "secret": false, "description": "The intercepted route's ID" } } } diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptFromReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptFromReifier.java index c4fe62d0e8e..26eb2882bf6 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptFromReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptFromReifier.java @@ -42,7 +42,11 @@ public class InterceptFromReifier extends ProcessorReifier<InterceptFromDefiniti when = e -> true; } // set property before processing the child + Processor p = exchange -> { + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_ROUTE_ID, route.getId()); + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_PARENT_ENDPOINT_URI, route.getEndpoint().getEndpointUri()); + if (exchange.getFromEndpoint() != null) { exchange.setProperty(ExchangePropertyKey.INTERCEPTED_ENDPOINT, exchange.getFromEndpoint().getEndpointUri()); } diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptReifier.java index ae57c7b39fc..96a0b4efbba 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptReifier.java @@ -17,12 +17,14 @@ package org.apache.camel.reifier; import org.apache.camel.CamelContext; +import org.apache.camel.ExchangePropertyKey; import org.apache.camel.NamedNode; import org.apache.camel.Predicate; import org.apache.camel.Processor; import org.apache.camel.Route; import org.apache.camel.model.InterceptDefinition; import org.apache.camel.model.ProcessorDefinition; +import org.apache.camel.model.ProcessorDefinitionHelper; import org.apache.camel.model.RouteDefinition; import org.apache.camel.processor.FilterProcessor; import org.apache.camel.processor.Pipeline; @@ -61,11 +63,20 @@ public class InterceptReifier extends ProcessorReifier<InterceptDefinition> { // store the target we are intercepting this.interceptedTarget = target; + Processor p = exchange -> { + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_ROUTE_ID, + ProcessorDefinitionHelper.getRouteId(definition.getParent())); + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_NODE_ID, definition.getId()); + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_PARENT_ENDPOINT_URI, + route.getEndpoint().getEndpointUri()); + }; + + // wrap in a pipeline so we continue routing to the next if (interceptedTarget != null) { - // wrap in a pipeline so we continue routing to the next - return Pipeline.newInstance(context, output, interceptedTarget); + return Pipeline.newInstance(context, p, output, interceptedTarget); } else { - return output; + return Pipeline.newInstance(context, + p, output); } } diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java index af55a688d37..fb900905d24 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java @@ -29,6 +29,7 @@ import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.ToDefinition; import org.apache.camel.processor.InterceptSendToEndpointCallback; +import org.apache.camel.processor.Pipeline; import org.apache.camel.support.PluginHelper; public class InterceptSendToEndpointReifier extends ProcessorReifier<InterceptSendToEndpointDefinition> { @@ -63,10 +64,20 @@ public class InterceptSendToEndpointReifier extends ProcessorReifier<InterceptSe when = new OnWhenPredicate(createPredicate(definition.getOnWhen().getExpression())); } + Processor p = exchange -> { + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_ROUTE_ID, route.getId()); + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_NODE_ID, definition.getId()); + exchange.setProperty(ExchangePropertyKey.INTERCEPTED_PARENT_ENDPOINT_URI, route.getEndpoint().getEndpointUri()); + }; + // register endpoint callback so we can proxy the endpoint camelContext.getCamelContextExtension() .registerEndpointCallback( - new InterceptSendToEndpointCallback(camelContext, before, after, matchURI, skip, when)); + new InterceptSendToEndpointCallback( + camelContext, + Pipeline.newInstance(camelContext, p, before), + after, + matchURI, skip, when)); // remove the original intercepted route from the outputs as we do not // intercept as the regular interceptor diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/InterceptPropertiesTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/InterceptPropertiesTest.java new file mode 100644 index 00000000000..d7d4d523817 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/processor/InterceptPropertiesTest.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.processor; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.ExchangePropertyKey; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class InterceptPropertiesTest extends ContextTestSupport { + + @Test + public void testInterceptProperties() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + intercept() + .to("mock:intercept"); + + from("direct:start") + .routeId("intercept-test") + .process(exchange -> { + }) + .setBody(constant("Test")) + .to("log:body"); + } + }); + + getMockEndpoint("mock:intercept").expectedMessageCount(3); + getMockEndpoint("mock:intercept") + .expectedPropertyReceived(ExchangePropertyKey.INTERCEPTED_ROUTE_ID.getName(), "intercept-test"); + getMockEndpoint("mock:intercept") + .expectedPropertyReceived(ExchangePropertyKey.INTERCEPTED_PARENT_ENDPOINT_URI.getName(), "direct://start"); + // Node IDs are not always the same + // getMockEndpoint("mock:intercept") + // .expectedPropertyValuesReceivedInAnyOrder(ExchangePropertyKey.INTERCEPTED_NODE_ID.getName(), "to2", "process1", + // "setBody1"); + + template.sendBody("direct:start", ""); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testInterceptFromProperties() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + interceptFrom("direct:startInterceptFrom") + .to("mock:interceptFrom"); + + from("direct:startInterceptFrom") + .routeId("intercept-from-test") + .setBody(constant("Test")) + .to("log:test"); + } + }); + getMockEndpoint("mock:interceptFrom").expectedMessageCount(1); + getMockEndpoint("mock:interceptFrom") + .expectedPropertyReceived(ExchangePropertyKey.INTERCEPTED_ROUTE_ID.getName(), "intercept-from-test"); + getMockEndpoint("mock:interceptFrom") + .expectedPropertyReceived(ExchangePropertyKey.INTERCEPTED_PARENT_ENDPOINT_URI.getName(), + "direct://startInterceptFrom"); + + template.sendBody("direct:startInterceptFrom", ""); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testInterceptSendToEndpointProperties() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + interceptSendToEndpoint("log:body") + .to("mock:interceptSendToEndpoint"); + + from("direct:start") + .routeId("intercept-test") + .process(exchange -> { + }) + .setBody(constant("Test")) + .to("log:body"); + } + }); + getMockEndpoint("mock:interceptSendToEndpoint").expectedMessageCount(1); + getMockEndpoint("mock:interceptSendToEndpoint") + .expectedPropertyReceived(ExchangePropertyKey.INTERCEPTED_ROUTE_ID.getName(), "intercept-test"); + getMockEndpoint("mock:interceptSendToEndpoint") + .expectedPropertyReceived(ExchangePropertyKey.INTERCEPTED_PARENT_ENDPOINT_URI.getName(), "direct://start"); + + template.sendBody("direct:start", ""); + + assertMockEndpointsSatisfied(); + } + +}
