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);
}
}