This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit f0f7dc1e7e32e84b52fcad0b1a68f1b1e60e3d0b Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Jan 21 16:04:37 2021 +0100 CAMEL-15759: SendDynamicAware should not rely on RuntimeCamelCatalog. --- .../file/GenericFileSendDynamicAware.java | 5 -- .../camel/http/base/HttpSendDynamicAware.java | 6 -- .../camel/component/jms/JmsSendDynamicAware.java | 4 - .../component/kafka/KafkaSendDynamicAware.java | 4 - .../paho/mqtt5/PahoMqtt5SendDynamicAware.java | 5 -- .../camel/component/paho/PahoSendDynamicAware.java | 5 -- .../rabbitmq/RabbitMQSendDynamicAware.java | 5 -- .../camel/component/sjms/SjmsSendDynamicAware.java | 5 -- .../SpringRabbitMQSendDynamicAware.java | 5 -- .../vertx/kafka/VertxKafkaSendDynamicAware.java | 5 -- .../org/apache/camel/spi/SendDynamicAware.java | 8 -- .../camel/component/bar/BarSendDynamicAware.java | 5 -- .../processor/ToDynamicSendDynamicAwareTest.java | 46 +++++++++++ .../interceptor/AdviceWithLambdaTest.java | 3 +- .../support/component/SendDynamicAwareSupport.java | 96 +++++++++------------- .../ROOT/pages/camel-3x-upgrade-guide-3_8.adoc | 5 +- 16 files changed, 93 insertions(+), 119 deletions(-) diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileSendDynamicAware.java b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileSendDynamicAware.java index 0c5a210..0ca4dbf 100644 --- a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileSendDynamicAware.java +++ b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileSendDynamicAware.java @@ -26,11 +26,6 @@ import org.apache.camel.util.URISupport; public abstract class GenericFileSendDynamicAware extends SendDynamicAwareSupport { @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } - - @Override public boolean isLenientProperties() { return false; } diff --git a/components/camel-http-base/src/main/java/org/apache/camel/http/base/HttpSendDynamicAware.java b/components/camel-http-base/src/main/java/org/apache/camel/http/base/HttpSendDynamicAware.java index bb69860..8247708 100644 --- a/components/camel-http-base/src/main/java/org/apache/camel/http/base/HttpSendDynamicAware.java +++ b/components/camel-http-base/src/main/java/org/apache/camel/http/base/HttpSendDynamicAware.java @@ -39,12 +39,6 @@ public class HttpSendDynamicAware extends SendDynamicAwareSupport { private final Processor postProcessor = new HttpSendDynamicPostProcessor(); @Override - public boolean isOnlyDynamicQueryParameters() { - // we compute our own host:port/path so its okay so say true here - return true; - } - - @Override public boolean isLenientProperties() { return true; } diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsSendDynamicAware.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsSendDynamicAware.java index 11eab1c..0342893 100644 --- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsSendDynamicAware.java +++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsSendDynamicAware.java @@ -56,10 +56,6 @@ public class JmsSendDynamicAware extends ServiceSupport implements SendDynamicAw this.camelContext = camelContext; } - @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } @Override public boolean isLenientProperties() { diff --git a/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaSendDynamicAware.java b/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaSendDynamicAware.java index 0dfc46d..404f804 100644 --- a/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaSendDynamicAware.java +++ b/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaSendDynamicAware.java @@ -56,10 +56,6 @@ public class KafkaSendDynamicAware extends ServiceSupport implements SendDynamic this.camelContext = camelContext; } - @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } @Override public boolean isLenientProperties() { diff --git a/components/camel-paho-mqtt5/src/main/java/org/apache/camel/component/paho/mqtt5/PahoMqtt5SendDynamicAware.java b/components/camel-paho-mqtt5/src/main/java/org/apache/camel/component/paho/mqtt5/PahoMqtt5SendDynamicAware.java index a067420..caae4b7 100644 --- a/components/camel-paho-mqtt5/src/main/java/org/apache/camel/component/paho/mqtt5/PahoMqtt5SendDynamicAware.java +++ b/components/camel-paho-mqtt5/src/main/java/org/apache/camel/component/paho/mqtt5/PahoMqtt5SendDynamicAware.java @@ -57,11 +57,6 @@ public class PahoMqtt5SendDynamicAware extends ServiceSupport implements SendDyn } @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } - - @Override public boolean isLenientProperties() { return false; } diff --git a/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoSendDynamicAware.java b/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoSendDynamicAware.java index 3645399..31555c4 100644 --- a/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoSendDynamicAware.java +++ b/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoSendDynamicAware.java @@ -57,11 +57,6 @@ public class PahoSendDynamicAware extends ServiceSupport implements SendDynamicA } @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } - - @Override public boolean isLenientProperties() { return false; } diff --git a/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQSendDynamicAware.java b/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQSendDynamicAware.java index 7b54881..93cdc63 100644 --- a/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQSendDynamicAware.java +++ b/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQSendDynamicAware.java @@ -57,11 +57,6 @@ public class RabbitMQSendDynamicAware extends ServiceSupport implements SendDyna } @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } - - @Override public boolean isLenientProperties() { return false; } diff --git a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsSendDynamicAware.java b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsSendDynamicAware.java index 5e87b88..fd3697c 100644 --- a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsSendDynamicAware.java +++ b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsSendDynamicAware.java @@ -57,11 +57,6 @@ public class SjmsSendDynamicAware extends ServiceSupport implements SendDynamicA } @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } - - @Override public boolean isLenientProperties() { return false; } diff --git a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQSendDynamicAware.java b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQSendDynamicAware.java index a79bfe0..9bc330a 100644 --- a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQSendDynamicAware.java +++ b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQSendDynamicAware.java @@ -60,11 +60,6 @@ public class SpringRabbitMQSendDynamicAware extends ServiceSupport implements Se } @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } - - @Override public boolean isLenientProperties() { return false; } diff --git a/components/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaSendDynamicAware.java b/components/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaSendDynamicAware.java index 73adccd..db901d6 100644 --- a/components/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaSendDynamicAware.java +++ b/components/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaSendDynamicAware.java @@ -57,11 +57,6 @@ public class VertxKafkaSendDynamicAware extends ServiceSupport implements SendDy } @Override - public boolean isOnlyDynamicQueryParameters() { - return true; - } - - @Override public boolean isLenientProperties() { return false; } diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/SendDynamicAware.java b/core/camel-api/src/main/java/org/apache/camel/spi/SendDynamicAware.java index 17723d7..09e374d 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/SendDynamicAware.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/SendDynamicAware.java @@ -45,14 +45,6 @@ public interface SendDynamicAware extends Service, CamelContextAware { String getScheme(); /** - * Whether only the query parameters can be dynamic and the context-path must be static. - * - * If true then Camel can restructure endpoint uri using a simple and faster parser. On the other hand if the - * context-path and authority part of the URI can be dynamic then Camel has to use a more complex and slower parser. - */ - boolean isOnlyDynamicQueryParameters(); - - /** * Whether to traverses the given parameters, and resolve any parameter values which uses the RAW token syntax: * <tt>key=RAW(value)</tt>. And then remove the RAW tokens, and replace the content of the value, with just the * value. diff --git a/core/camel-core/src/test/java/org/apache/camel/component/bar/BarSendDynamicAware.java b/core/camel-core/src/test/java/org/apache/camel/component/bar/BarSendDynamicAware.java index 2df2959..171c996 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/bar/BarSendDynamicAware.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/bar/BarSendDynamicAware.java @@ -42,11 +42,6 @@ public class BarSendDynamicAware extends SendDynamicAwareSupport { } @Override - public boolean isOnlyDynamicQueryParameters() { - return false; - } - - @Override public boolean resolveRawParameterValues() { return true; } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ToDynamicSendDynamicAwareTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ToDynamicSendDynamicAwareTest.java index c8e95ae..b377a7d 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/ToDynamicSendDynamicAwareTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/ToDynamicSendDynamicAwareTest.java @@ -16,16 +16,30 @@ */ package org.apache.camel.processor; +import java.net.URISyntaxException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.bar.BarComponent; import org.apache.camel.component.bar.BarConstants; +import org.apache.camel.support.component.EndpointUriFactorySupport; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; public class ToDynamicSendDynamicAwareTest extends ContextTestSupport { + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + context.getRegistry().bind("myFactory", new BarEndpointUriFactory()); + return context; + } + @Test public void testToDynamic() throws Exception { getMockEndpoint("mock:bar").expectedBodiesReceived("Hello Camel ordered beer", "Hello World ordered wine"); @@ -53,4 +67,36 @@ public class ToDynamicSendDynamicAwareTest extends ContextTestSupport { } }; } + + private class BarEndpointUriFactory extends EndpointUriFactorySupport { + + @Override + public boolean isEnabled(String scheme) { + return "bar".equals(scheme); + } + + @Override + public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException { + // not in use for this test + return null; + } + + @Override + public Set<String> propertyNames() { + Set<String> answer = new HashSet<>(); + answer.add("name"); + answer.add("drink"); + return answer; + } + + @Override + public Set<String> secretPropertyNames() { + return null; + } + + @Override + public boolean isLenientProperties() { + return false; + } + } } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithLambdaTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithLambdaTest.java index d61d5ce..0c7eafe 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithLambdaTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithLambdaTest.java @@ -56,7 +56,8 @@ public class AdviceWithLambdaTest extends ContextTestSupport { @Test public void testAdvisedSimple() throws Exception { AdviceWith.adviceWith(context, null, a -> { - a.interceptSendToEndpoint("mock:foo").skipSendToOriginalEndpoint().transform(a.simple("Hello ${body}")).to("log:foo").to("mock:advised"); + a.interceptSendToEndpoint("mock:foo").skipSendToOriginalEndpoint().transform(a.simple("Hello ${body}")) + .to("log:foo").to("mock:advised"); }); getMockEndpoint("mock:foo").expectedMessageCount(0); diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/SendDynamicAwareSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/component/SendDynamicAwareSupport.java index d01c906..a868dcd 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/component/SendDynamicAwareSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/component/SendDynamicAwareSupport.java @@ -23,7 +23,6 @@ import java.util.Set; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.ExtendedCamelContext; -import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.spi.EndpointUriFactory; import org.apache.camel.spi.SendDynamicAware; import org.apache.camel.support.service.ServiceSupport; @@ -36,7 +35,6 @@ public abstract class SendDynamicAwareSupport extends ServiceSupport implements private CamelContext camelContext; private Set<String> knownProperties; - private RuntimeCamelCatalog catalog; private String scheme; @Override @@ -66,86 +64,74 @@ public abstract class SendDynamicAwareSupport extends ServiceSupport implements @Override protected void doInit() throws Exception { - if (isOnlyDynamicQueryParameters()) { + if (knownProperties == null) { // optimize to eager load the list of known properties EndpointUriFactory factory = getCamelContext().adapt(ExtendedCamelContext.class).getEndpointUriFactory(getScheme()); if (factory == null) { throw new IllegalStateException("Cannot find EndpointUriFactory for component: " + getScheme()); } knownProperties = factory.propertyNames(); - } else { - catalog = getCamelContext().adapt(ExtendedCamelContext.class).getRuntimeCamelCatalog(); } } public Map<String, Object> endpointProperties(Exchange exchange, String uri) throws Exception { Map<String, Object> properties; - if (isOnlyDynamicQueryParameters()) { - // optimize as we know its only query parameters that can be dynamic - Map<String, Object> map = URISupport.parseQuery(URISupport.extractQuery(uri)); - if (map != null && !map.isEmpty() && isLenientProperties()) { - if (resolveRawParameterValues()) { - // parameters using raw syntax: RAW(value) - // should have the token removed, so its only the value we have in parameters, as we are about to create - // an endpoint and want to have the parameter values without the RAW tokens - URISupport.resolveRawParameterValues(map); - } - // okay so only add the known properties as they are the non lenient properties - properties = new LinkedHashMap<>(); - map.forEach((k, v) -> { - if (knownProperties.contains(k)) { - properties.put(k, v); - } - }); - } else { - properties = map; + // optimize as we know its only query parameters that can be dynamic + Map<String, Object> map = URISupport.parseQuery(URISupport.extractQuery(uri)); + if (map != null && !map.isEmpty() && isLenientProperties()) { + if (resolveRawParameterValues()) { + // parameters using raw syntax: RAW(value) + // should have the token removed, so its only the value we have in parameters, as we are about to create + // an endpoint and want to have the parameter values without the RAW tokens + URISupport.resolveRawParameterValues(map); } + // okay so only add the known properties as they are the non lenient properties + properties = new LinkedHashMap<>(); + map.forEach((k, v) -> { + if (knownProperties.contains(k)) { + properties.put(k, v); + } + }); } else { - properties = new LinkedHashMap<>(catalog.endpointProperties(uri)); + properties = map; } + return properties; } public Map<String, Object> endpointLenientProperties(Exchange exchange, String uri) throws Exception { Map<String, Object> properties; - if (isOnlyDynamicQueryParameters()) { - // optimize as we know its only query parameters that can be dynamic - Map<String, Object> map = URISupport.parseQuery(URISupport.extractQuery(uri)); - if (map != null && !map.isEmpty()) { - if (resolveRawParameterValues()) { - // parameters using raw syntax: RAW(value) - // should have the token removed, so its only the value we have in parameters, as we are about to create - // an endpoint and want to have the parameter values without the RAW tokens - URISupport.resolveRawParameterValues(map); - } - properties = new LinkedHashMap<>(); - map.forEach((k, v) -> { - if (!knownProperties.contains(k)) { - properties.put(k, v.toString()); - } - }); - } else { - properties = map; + // optimize as we know its only query parameters that can be dynamic + Map<String, Object> map = URISupport.parseQuery(URISupport.extractQuery(uri)); + if (map != null && !map.isEmpty()) { + if (resolveRawParameterValues()) { + // parameters using raw syntax: RAW(value) + // should have the token removed, so its only the value we have in parameters, as we are about to create + // an endpoint and want to have the parameter values without the RAW tokens + URISupport.resolveRawParameterValues(map); } + properties = new LinkedHashMap<>(); + map.forEach((k, v) -> { + if (!knownProperties.contains(k)) { + properties.put(k, v.toString()); + } + }); } else { - properties = new LinkedHashMap<>(catalog.endpointLenientProperties(uri)); + properties = map; } return properties; } public String asEndpointUri(Exchange exchange, String uri, Map<String, Object> properties) throws Exception { - if (isOnlyDynamicQueryParameters()) { - String answer; - String query = URISupport.createQueryString(properties, false); - int pos = uri.indexOf('?'); - if (pos != -1) { - answer = uri.substring(0, pos) + "?" + query; - } else { - answer = uri + "?" + query; - } - return answer; + String answer; + String query = URISupport.createQueryString(properties, false); + int pos = uri.indexOf('?'); + if (pos != -1) { + answer = uri.substring(0, pos) + "?" + query; } else { - return catalog.asEndpointUri(getScheme(), new LinkedHashMap(properties), false); + answer = uri + "?" + query; } + return answer; } + } diff --git a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_8.adoc b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_8.adoc index c65b180..170fdd2 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_8.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_8.adoc @@ -6,7 +6,7 @@ from both 3.0 to 3.1 and 3.1 to 3.2. == Upgrading Camel 3.7 to 3.8 -=== API changes in Camel events +=== API changes The following type names are renamed in `CamelEvent.Type` enum: @@ -15,6 +15,9 @@ The following type names are renamed in `CamelEvent.Type` enum: - `CamelContextRoutesStopping` to `RoutesStopping` - `CamelContextRoutesStopped` to `RoutesStopped` +The method `isOnlyDynamicQueryParameters` is removed from `org.apache.camel.spi.SendDynamicAware` and +`org.apache.camel.support.component.SendDynamicAwareSupport` classes. + === OnCompletion EIP The `onCompletion` EIP has fixed it could trigger multiple completions for a given `Exchange`