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 9ff036334e80e8df9f65116b04d2da4efe437adf Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Sep 27 11:00:36 2020 +0200 CAMEL-14499: Optimize to avoid using camel-core-catalog for SendDynamicAware for camel-file/camel-ftp. --- .../file/GenericFileSendDynamicAware.java | 3 +- .../support/component/SendDynamicAwareSupport.java | 42 +++++++++++----------- .../java/org/apache/camel/util/URISupport.java | 18 ++++++++++ .../java/org/apache/camel/util/URISupportTest.java | 10 ++++++ 4 files changed, 51 insertions(+), 22 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 71566b9..0c5a210 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 @@ -55,8 +55,7 @@ public abstract class GenericFileSendDynamicAware extends SendDynamicAwareSuppor if (fileName || tempFileName || idempotentKey || move || moveFailed || preMove || moveExisting) { Map<String, Object> params = entry.getProperties(); - // TODO: parseQuery should only have the query part, this is not correct - Map<String, Object> originalParams = URISupport.parseQuery(entry.getOriginalUri()); + Map<String, Object> originalParams = URISupport.parseQuery(URISupport.extractQuery(entry.getOriginalUri())); if (fileName) { Object val = originalParams.get("fileName"); if (val != null) { 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 485e7a4..c68b303 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 @@ -16,7 +16,6 @@ */ package org.apache.camel.support.component; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; @@ -25,6 +24,7 @@ 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; import org.apache.camel.util.URISupport; @@ -61,25 +61,23 @@ public abstract class SendDynamicAwareSupport extends ServiceSupport implements @Override protected void doInit() throws Exception { if (isOnlyDynamicQueryParameters()) { - knownProperties = getCamelContext().adapt(ExtendedCamelContext.class).getEndpointUriFactory(getScheme()).propertyNames(); + // 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(); } } 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, and that there are no lenient properties - Map<String, Object> map; - int pos = uri.indexOf('?'); - if (pos != -1) { - String query = uri.substring(pos + 1); - map = URISupport.parseQuery(query); - } else { - map = Collections.EMPTY_MAP; - } - if (map != null && isLenientProperties()) { - properties = new LinkedHashMap<>(map.size()); + // 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()) { // 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); @@ -99,13 +97,17 @@ public abstract class SendDynamicAwareSupport extends ServiceSupport implements Map<String, Object> properties; if (isOnlyDynamicQueryParameters()) { // optimize as we know its only query parameters that can be dynamic - Map<String, Object> map = URISupport.parseQuery(uri); - properties = new LinkedHashMap<>(); - map.forEach((k, v) -> { - if (!knownProperties.contains(k)) { - properties.put(k, v.toString()); - } - }); + Map<String, Object> map = URISupport.parseQuery(URISupport.extractQuery(uri)); + if (map != null && !map.isEmpty()) { + properties = new LinkedHashMap<>(); + map.forEach((k, v) -> { + if (!knownProperties.contains(k)) { + properties.put(k, v.toString()); + } + }); + } else { + properties = map; + } } else { RuntimeCamelCatalog catalog = exchange.getContext().adapt(ExtendedCamelContext.class).getRuntimeCamelCatalog(); properties = new LinkedHashMap<>(catalog.endpointLenientProperties(uri)); diff --git a/core/camel-util/src/main/java/org/apache/camel/util/URISupport.java b/core/camel-util/src/main/java/org/apache/camel/util/URISupport.java index 179753e..983c0df 100644 --- a/core/camel-util/src/main/java/org/apache/camel/util/URISupport.java +++ b/core/camel-util/src/main/java/org/apache/camel/util/URISupport.java @@ -116,6 +116,24 @@ public final class URISupport { } /** + * Extracts the query part of the given uri + * + * @param uri the uri + * @return the query parameters or <tt>null</tt> if the uri has no query + */ + public static String extractQuery(String uri) { + if (uri == null) { + return null; + } + int pos = uri.indexOf('?'); + if (pos != -1) { + return uri.substring(pos + 1); + } else { + return null; + } + } + + /** * Parses the query part of the uri (eg the parameters). * <p/> * The URI parameters will by default be URI encoded. However you can define a parameter values with the syntax: diff --git a/core/camel-util/src/test/java/org/apache/camel/util/URISupportTest.java b/core/camel-util/src/test/java/org/apache/camel/util/URISupportTest.java index 19d5384..2fd7e46 100644 --- a/core/camel-util/src/test/java/org/apache/camel/util/URISupportTest.java +++ b/core/camel-util/src/test/java/org/apache/camel/util/URISupportTest.java @@ -567,4 +567,14 @@ public class URISupportTest { assertThat(URISupport.joinPaths("/a/", null, null, null)).isEqualTo("/a/"); assertThat(URISupport.joinPaths("a/", "/b", null, null)).isEqualTo("a/b"); } + + @Test + public void testExtractQuery() throws Exception { + assertEquals(null, URISupport.extractQuery(null)); + assertEquals(null, URISupport.extractQuery("")); + assertEquals(null, URISupport.extractQuery("file:foo")); + assertEquals("recursive=true", URISupport.extractQuery("file:foo?recursive=true")); + assertEquals("recursive=true&delete=true", URISupport.extractQuery("file:foo?recursive=true&delete=true")); + } + }