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 e3c1e5ee1b5f934216908cb7d43f90dbe36298b6 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Oct 12 13:24:14 2020 +0200 CAMEL-15622: Prefer bean instance in endpoint DSL. Do not search in registry using wrong string representation of a bean, return the bean directly instead --- .../org/apache/camel/support/DefaultComponent.java | 50 ++++++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java index 0161c32..bd73c59 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java @@ -514,13 +514,27 @@ public abstract class DefaultComponent extends ServiceSupport implements Compone */ public <T> T getAndRemoveOrResolveReferenceParameter( Map<String, Object> parameters, String key, Class<T> type, T defaultValue) { - String value = getAndRemoveParameter(parameters, key, String.class); - if (value == null) { + // the parameter may be the the type already (such as from endpoint-dsl) + Object value = parameters.remove(key); + if (type.isInstance(value)) { + // special for string references + if (String.class == type) { + String str = value.toString(); + if (EndpointHelper.isReferenceParameter(str)) { + value = EndpointHelper.resolveReferenceParameter(getCamelContext(), str, type); + } + } + return type.cast(value); + } else if (value == null) { return defaultValue; - } else if (EndpointHelper.isReferenceParameter(value)) { - return EndpointHelper.resolveReferenceParameter(getCamelContext(), value, type); } else { - return getCamelContext().getTypeConverter().convertTo(type, value); + // okay so it may be a reference so value should be string + String str = getCamelContext().getTypeConverter().tryConvertTo(String.class, value); + if (EndpointHelper.isReferenceParameter(str)) { + return EndpointHelper.resolveReferenceParameter(getCamelContext(), str, type); + } else { + return getCamelContext().getTypeConverter().convertTo(type, value); + } } } @@ -551,14 +565,16 @@ public abstract class DefaultComponent extends ServiceSupport implements Compone * @throws IllegalArgumentException if referenced object was not found in registry. */ public <T> T resolveAndRemoveReferenceParameter(Map<String, Object> parameters, String key, Class<T> type, T defaultValue) { - if (parameters.containsKey(key) && type.isInstance(parameters.get(key).getClass())) { - return type.cast(parameters.remove(key)); - } - String value = getAndRemoveParameter(parameters, key, String.class); - if (value == null) { + // the parameter may be the the type already (such as from endpoint-dsl) + Object value = parameters.remove(key); + if (type.isInstance(value)) { + return type.cast(value); + } else if (value == null) { return defaultValue; } else { - return EndpointHelper.resolveReferenceParameter(getCamelContext(), value, type); + // okay so it may be a reference so value should be string + String str = getCamelContext().getTypeConverter().tryConvertTo(String.class, value); + return EndpointHelper.resolveReferenceParameter(getCamelContext(), str, type); } } @@ -589,14 +605,20 @@ public abstract class DefaultComponent extends ServiceSupport implements Compone * @throws IllegalArgumentException if any of the referenced objects was not found in registry. * @see EndpointHelper#resolveReferenceListParameter(CamelContext, String, Class) */ + @SuppressWarnings("unchecked") public <T> List<T> resolveAndRemoveReferenceListParameter( Map<String, Object> parameters, String key, Class<T> elementType, List<T> defaultValue) { - String value = getAndRemoveParameter(parameters, key, String.class); - + // the value may already be a list such as when using endpoint-dsl + Object value = getAndRemoveParameter(parameters, key, Object.class); + if (value instanceof List) { + return (List<T>) value; + } if (value == null) { return defaultValue; } else { - return EndpointHelper.resolveReferenceListParameter(getCamelContext(), value, elementType); + // okay so it may be a reference so value should be string + String str = getCamelContext().getTypeConverter().tryConvertTo(String.class, value); + return EndpointHelper.resolveReferenceListParameter(getCamelContext(), str, elementType); } }
