You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/10/12 11:24:51 UTC

[camel] 03/03: 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

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 <cl...@gmail.com>
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);
         }
     }