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 2022/03/15 10:02:49 UTC
[camel] branch main updated: CAMEL-17793: camel-core - EIPs better support for ref beans with #bean #class #type syntax
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 4c904aa CAMEL-17793: camel-core - EIPs better support for ref beans with #bean #class #type syntax
4c904aa is described below
commit 4c904aa0a0ab7acb00b53ff4e6c88bcdbec4fd6a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Mar 15 11:01:35 2022 +0100
CAMEL-17793: camel-core - EIPs better support for ref beans with #bean #class #type syntax
---
.../hystrix/processor/HystrixReifier.java | 3 +-
.../faulttolerance/FaultToleranceReifier.java | 4 +-
.../component/resilience4j/ResilienceReifier.java | 4 +-
.../spring/spi/TransactionErrorHandlerReifier.java | 2 +-
.../camel/reifier/AbstractPolicyReifier.java | 2 +-
.../org/apache/camel/reifier/AbstractReifier.java | 112 +++------------------
.../org/apache/camel/reifier/AggregateReifier.java | 3 +-
.../apache/camel/reifier/ClaimCheckReifier.java | 2 +-
.../java/org/apache/camel/reifier/LogReifier.java | 2 +-
.../org/apache/camel/reifier/MulticastReifier.java | 2 +-
.../org/apache/camel/reifier/ProcessorReifier.java | 8 +-
.../apache/camel/reifier/RecipientListReifier.java | 2 +-
.../org/apache/camel/reifier/SplitReifier.java | 2 +-
.../camel/reifier/ThrowExceptionReifier.java | 2 +-
.../errorhandler/DefaultErrorHandlerReifier.java | 2 +-
.../reifier/errorhandler/ErrorHandlerReifier.java | 2 +-
.../transformer/CustomTransformeReifier.java | 2 +-
.../transformer/EndpointTransformeReifier.java | 2 +-
.../reifier/validator/CustomValidatorReifier.java | 2 +-
.../validator/EndpointValidatorReifier.java | 2 +-
.../camel/processor/ProcessRefBeanIdTest.java | 47 +++++++++
.../camel/processor/ProcessRefBeanTypeTest.java | 47 +++++++++
.../apache/camel/processor/ProcessRefHashTest.java | 47 +++++++++
.../org/apache/camel/support/EndpointHelper.java | 53 +++++++++-
24 files changed, 233 insertions(+), 123 deletions(-)
diff --git a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java
index c9e3b75..979cf70 100644
--- a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java
+++ b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java
@@ -235,7 +235,8 @@ public class HystrixReifier extends ProcessorReifier<CircuitBreakerDefinition> {
// camel context takes the precedence over those in the registry
loadProperties(properties, Suppliers.firstNotNull(
() -> camelContext.getExtension(Model.class).getHystrixConfiguration(null),
- () -> lookup(HystrixConstants.DEFAULT_HYSTRIX_CONFIGURATION_ID, HystrixConfigurationDefinition.class)),
+ () -> lookupByNameAndType(HystrixConstants.DEFAULT_HYSTRIX_CONFIGURATION_ID,
+ HystrixConfigurationDefinition.class)),
configurer);
// Extract properties from referenced configuration, the one configured
diff --git a/components/camel-microprofile/camel-microprofile-fault-tolerance/src/main/java/org/apache/camel/component/microprofile/faulttolerance/FaultToleranceReifier.java b/components/camel-microprofile/camel-microprofile-fault-tolerance/src/main/java/org/apache/camel/component/microprofile/faulttolerance/FaultToleranceReifier.java
index 9a6c4fe..866a6ac 100644
--- a/components/camel-microprofile/camel-microprofile-fault-tolerance/src/main/java/org/apache/camel/component/microprofile/faulttolerance/FaultToleranceReifier.java
+++ b/components/camel-microprofile/camel-microprofile-fault-tolerance/src/main/java/org/apache/camel/component/microprofile/faulttolerance/FaultToleranceReifier.java
@@ -116,7 +116,7 @@ public class FaultToleranceReifier extends ProcessorReifier<CircuitBreakerDefini
if (config.getBulkheadExecutorService() != null) {
String ref = config.getBulkheadExecutorService();
boolean shutdownThreadPool = false;
- ExecutorService executorService = lookup(ref, ExecutorService.class);
+ ExecutorService executorService = lookupByNameAndType(ref, ExecutorService.class);
if (executorService == null) {
executorService = lookupExecutorServiceRef("CircuitBreaker", definition, ref);
shutdownThreadPool = true;
@@ -141,7 +141,7 @@ public class FaultToleranceReifier extends ProcessorReifier<CircuitBreakerDefini
// camel context takes the precedence over those in the registry
loadProperties(properties, Suppliers.firstNotNull(
() -> camelContext.getExtension(Model.class).getFaultToleranceConfiguration(null),
- () -> lookup(FaultToleranceConstants.DEFAULT_FAULT_TOLERANCE_CONFIGURATION_ID,
+ () -> lookupByNameAndType(FaultToleranceConstants.DEFAULT_FAULT_TOLERANCE_CONFIGURATION_ID,
FaultToleranceConfigurationDefinition.class)),
configurer);
diff --git a/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java
index 780f490..ecdbccd 100644
--- a/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java
+++ b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java
@@ -153,7 +153,7 @@ public class ResilienceReifier extends ProcessorReifier<CircuitBreakerDefinition
if (config.getTimeoutExecutorService() != null) {
String ref = config.getTimeoutExecutorService();
boolean shutdownThreadPool = false;
- ExecutorService executorService = lookup(ref, ExecutorService.class);
+ ExecutorService executorService = lookupByNameAndType(ref, ExecutorService.class);
if (executorService == null) {
executorService = lookupExecutorServiceRef("CircuitBreaker", definition, ref);
shutdownThreadPool = true;
@@ -178,7 +178,7 @@ public class ResilienceReifier extends ProcessorReifier<CircuitBreakerDefinition
// camel context takes the precedence over those in the registry
loadProperties(properties, Suppliers.firstNotNull(
() -> camelContext.getExtension(Model.class).getResilience4jConfiguration(null),
- () -> lookup(ResilienceConstants.DEFAULT_RESILIENCE_CONFIGURATION_ID,
+ () -> lookupByNameAndType(ResilienceConstants.DEFAULT_RESILIENCE_CONFIGURATION_ID,
Resilience4jConfigurationDefinition.class)),
configurer);
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
index d9253a9..763a1b6 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
@@ -55,7 +55,7 @@ public class TransactionErrorHandlerReifier extends DefaultErrorHandlerReifier<T
}
if (transactionTemplate == null) {
- TransactedPolicy policy = lookup(PROPAGATION_REQUIRED, TransactedPolicy.class);
+ TransactedPolicy policy = lookupByNameAndType(PROPAGATION_REQUIRED, TransactedPolicy.class);
if (policy instanceof SpringTransactionPolicy) {
transactionTemplate = ((SpringTransactionPolicy) policy).getTransactionTemplate();
}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java
index 8eebc2a..1850949 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java
@@ -73,7 +73,7 @@ public abstract class AbstractPolicyReifier<T extends ProcessorDefinition<?>> ex
// for transacted routing try the default REQUIRED name
if (type == TransactedPolicy.class) {
// still not found try with the default name PROPAGATION_REQUIRED
- answer = lookup(PROPAGATION_REQUIRED, TransactedPolicy.class);
+ answer = lookupByNameAndType(PROPAGATION_REQUIRED, TransactedPolicy.class);
}
// this logic only applies if we are a transacted policy
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
index 0e10011..518184d 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
@@ -27,15 +27,13 @@ import org.apache.camel.NoSuchBeanException;
import org.apache.camel.NoSuchEndpointException;
import org.apache.camel.Predicate;
import org.apache.camel.Route;
-import org.apache.camel.RuntimeCamelException;
import org.apache.camel.model.ExpressionSubElementDefinition;
import org.apache.camel.model.language.ExpressionDefinition;
import org.apache.camel.reifier.language.ExpressionReifier;
import org.apache.camel.spi.BeanRepository;
import org.apache.camel.support.CamelContextHelper;
-import org.apache.camel.support.PropertyBindingSupport;
+import org.apache.camel.support.EndpointHelper;
import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.StringHelper;
public abstract class AbstractReifier implements BeanRepository {
@@ -141,48 +139,34 @@ public abstract class AbstractReifier implements BeanRepository {
return camelContext.getRegistry();
}
- public <T> T mandatoryLookup(String name, Class<T> beanType) {
- // lookup in registry first
- Object obj = CamelContextHelper.lookup(camelContext, name, beanType);
+ public <T> T mandatoryLookup(String name, Class<T> type) {
+ Object obj = lookupByNameAndType(name, type);
if (obj == null) {
- // fallback in case the name uses #class #type or other syntax
- obj = lookupByName(name);
+ throw new NoSuchBeanException(name, type.getName());
}
- if (obj != null) {
- obj = camelContext.getTypeConverter().convertTo(beanType, obj);
- }
- if (obj == null) {
- throw new NoSuchBeanException(name, beanType.getName());
- }
- return beanType.cast(obj);
+ return type.cast(obj);
}
@Override
public Object lookupByName(String name) {
- if (name != null && name.startsWith("#class:")) {
- return createBean(name, Object.class);
- } else if (name != null && name.startsWith("#type:")) {
- return lookupBean(name, Object.class);
- } else {
- return getRegistry().lookupByName(name);
+ if (name == null) {
+ return null;
}
- }
- public <T> T lookup(String name, Class<T> type) {
- if (name != null && name.startsWith("#class:")) {
- return createBean(name, type);
- } else if (name != null && name.startsWith("#type:")) {
- return lookupBean(name, type);
+ if (EndpointHelper.isReferenceParameter(name)) {
+ return EndpointHelper.resolveReferenceParameter(camelContext, name, Object.class, false);
} else {
- return lookupByNameAndType(name, type);
+ return getRegistry().lookupByName(name);
}
}
public <T> T lookupByNameAndType(String name, Class<T> type) {
- if (name != null && name.startsWith("#class:")) {
- return createBean(name, type);
- } else if (name != null && name.startsWith("#type:")) {
- return lookupBean(name, type);
+ if (name == null) {
+ return null;
+ }
+
+ if (EndpointHelper.isReferenceParameter(name)) {
+ return EndpointHelper.resolveReferenceParameter(camelContext, name, type, false);
} else {
return getRegistry().lookupByNameAndType(name, type);
}
@@ -207,68 +191,4 @@ public abstract class AbstractReifier implements BeanRepository {
return CamelContextHelper.getMandatoryEndpoint(camelContext, uri);
}
- private <T> T createBean(String name, Class<T> type) {
- try {
- return doCreateBean(name, type);
- } catch (Exception e) {
- throw RuntimeCamelException.wrapRuntimeException(e);
- }
- }
-
- private <T> T doCreateBean(String name, Class<T> type) throws Exception {
- Object answer;
-
- // if there is a factory method then the class/bean should be created in a different way
- String className;
- String factoryMethod = null;
- String parameters = null;
- className = name.substring(7);
- if (className.endsWith(")") && className.indexOf('(') != -1) {
- parameters = StringHelper.after(className, "(");
- parameters = parameters.substring(0, parameters.length() - 1); // clip last )
- className = StringHelper.before(className, "(");
- }
- if (className != null && className.indexOf('#') != -1) {
- factoryMethod = StringHelper.after(className, "#");
- className = StringHelper.before(className, "#");
- }
- Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(className);
-
- if (factoryMethod != null && parameters != null) {
- answer = PropertyBindingSupport.newInstanceFactoryParameters(camelContext, clazz, factoryMethod, parameters);
- } else if (factoryMethod != null) {
- answer = camelContext.getInjector().newInstance(type, factoryMethod);
- } else if (parameters != null) {
- answer = PropertyBindingSupport.newInstanceConstructorParameters(camelContext, clazz, parameters);
- } else {
- answer = camelContext.getInjector().newInstance(clazz);
- }
- if (answer == null) {
- throw new IllegalStateException("Cannot create bean: " + name);
- }
- return type.cast(answer);
- }
-
- private <T> T lookupBean(String name, Class<T> type) {
- try {
- return doLookupBean(name, type);
- } catch (Exception e) {
- throw RuntimeCamelException.wrapRuntimeException(e);
- }
- }
-
- private <T> T doLookupBean(String name, Class<T> type) throws ClassNotFoundException {
- Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(name.substring(6));
- Set<?> found = getRegistry().findByType(clazz);
- if (found == null || found.isEmpty()) {
- throw new NoSuchBeanException(null, clazz.getName());
- } else if (found.size() > 1) {
- throw new NoSuchBeanException(
- "Found " + found.size() + " beans of type: " + clazz + ". Only one bean expected.");
- } else {
- Object answer = found.iterator().next();
- return type.cast(answer);
- }
- }
-
}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AggregateReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AggregateReifier.java
index 925de6c..8ee1e11 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AggregateReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AggregateReifier.java
@@ -93,7 +93,8 @@ public class AggregateReifier extends ProcessorReifier<AggregateDefinition> {
ScheduledExecutorService timeoutThreadPool = definition.getTimeoutCheckerExecutorServiceBean();
if (timeoutThreadPool == null && definition.getTimeoutCheckerExecutorService() != null) {
// lookup existing thread pool
- timeoutThreadPool = lookup(definition.getTimeoutCheckerExecutorService(), ScheduledExecutorService.class);
+ timeoutThreadPool
+ = lookupByNameAndType(definition.getTimeoutCheckerExecutorService(), ScheduledExecutorService.class);
if (timeoutThreadPool == null) {
// then create a thread pool assuming the ref is a thread pool
// profile id
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ClaimCheckReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ClaimCheckReifier.java
index d1888da..55c1569 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ClaimCheckReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ClaimCheckReifier.java
@@ -114,7 +114,7 @@ public class ClaimCheckReifier extends ProcessorReifier<ClaimCheckDefinition> {
AggregationStrategy strategy = definition.getAggregationStrategyBean();
String ref = parseString(definition.getAggregationStrategy());
if (strategy == null && ref != null) {
- Object aggStrategy = lookup(ref, Object.class);
+ Object aggStrategy = lookupByName(ref);
if (aggStrategy instanceof AggregationStrategy) {
strategy = (AggregationStrategy) aggStrategy;
} else if (aggStrategy instanceof BiFunction) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java
index 96b6b14..9354cef 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java
@@ -115,7 +115,7 @@ public class LogReifier extends ProcessorReifier<LogDefinition> {
private MaskingFormatter getMaskingFormatter() {
if (route.isLogMask()) {
- MaskingFormatter formatter = lookup(MaskingFormatter.CUSTOM_LOG_MASK_REF, MaskingFormatter.class);
+ MaskingFormatter formatter = lookupByNameAndType(MaskingFormatter.CUSTOM_LOG_MASK_REF, MaskingFormatter.class);
if (formatter == null) {
formatter = new DefaultMaskingFormatter();
}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java
index 674cd05..2f638e8 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java
@@ -85,7 +85,7 @@ public class MulticastReifier extends ProcessorReifier<MulticastDefinition> {
AggregationStrategy strategy = definition.getAggregationStrategyBean();
String ref = parseString(definition.getAggregationStrategy());
if (strategy == null && ref != null) {
- Object aggStrategy = lookup(ref, Object.class);
+ Object aggStrategy = lookupByName(ref);
if (aggStrategy instanceof AggregationStrategy) {
strategy = (AggregationStrategy) aggStrategy;
} else if (aggStrategy instanceof BiFunction) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
index 1f6a3fe..55d3710 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
@@ -334,7 +334,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends
// no there is a custom thread pool configured
return false;
} else if (definition.getExecutorServiceRef() != null) {
- ExecutorService answer = lookup(definition.getExecutorServiceRef(), ExecutorService.class);
+ ExecutorService answer = lookupByNameAndType(definition.getExecutorServiceRef(), ExecutorService.class);
// if no existing thread pool, then we will have to create a new
// thread pool
return answer == null;
@@ -470,7 +470,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends
ObjectHelper.notNull(executorServiceRef, "executorServiceRef");
// lookup in registry first and use existing thread pool if exists
- ScheduledExecutorService answer = lookup(executorServiceRef, ScheduledExecutorService.class);
+ ScheduledExecutorService answer = lookupByNameAndType(executorServiceRef, ScheduledExecutorService.class);
if (answer == null) {
// then create a thread pool assuming the ref is a thread pool
// profile id
@@ -502,7 +502,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends
ObjectHelper.notNull(executorServiceRef, "executorServiceRef");
// lookup in registry first and use existing thread pool if exists
- ExecutorService answer = lookup(executorServiceRef, ExecutorService.class);
+ ExecutorService answer = lookupByNameAndType(executorServiceRef, ExecutorService.class);
if (answer == null) {
// then create a thread pool assuming the ref is a thread pool
// profile id
@@ -899,7 +899,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends
public AggregationStrategy getConfiguredAggregationStrategy(AggregationStrategyAwareDefinition definition) {
AggregationStrategy strategy = definition.getAggregationStrategyBean();
if (strategy == null && definition.getAggregationStrategyRef() != null) {
- Object aggStrategy = lookup(definition.getAggregationStrategyRef(), Object.class);
+ Object aggStrategy = lookupByName(definition.getAggregationStrategyRef());
if (aggStrategy instanceof AggregationStrategy) {
strategy = (AggregationStrategy) aggStrategy;
} else if (aggStrategy instanceof BiFunction) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
index 4d114a1..bfc3ad6 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
@@ -114,7 +114,7 @@ public class RecipientListReifier extends ProcessorReifier<RecipientListDefiniti
AggregationStrategy strategy = definition.getAggregationStrategyBean();
String ref = parseString(definition.getAggregationStrategy());
if (strategy == null && ref != null) {
- Object aggStrategy = lookup(ref, Object.class);
+ Object aggStrategy = lookupByName(ref);
if (aggStrategy instanceof AggregationStrategy) {
strategy = (AggregationStrategy) aggStrategy;
} else if (aggStrategy instanceof BiFunction) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java
index c223480..471beee 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java
@@ -82,7 +82,7 @@ public class SplitReifier extends ExpressionReifier<SplitDefinition> {
private AggregationStrategy createAggregationStrategy() {
AggregationStrategy strategy = definition.getAggregationStrategyBean();
if (strategy == null && definition.getAggregationStrategy() != null) {
- Object aggStrategy = lookup(definition.getAggregationStrategy(), Object.class);
+ Object aggStrategy = lookupByName(definition.getAggregationStrategy());
if (aggStrategy instanceof AggregationStrategy) {
strategy = (AggregationStrategy) aggStrategy;
} else if (aggStrategy instanceof BiFunction) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ThrowExceptionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ThrowExceptionReifier.java
index 51e0924..7b68343 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ThrowExceptionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ThrowExceptionReifier.java
@@ -33,7 +33,7 @@ public class ThrowExceptionReifier extends ProcessorReifier<ThrowExceptionDefini
Exception exception = definition.getException();
String ref = parseString(definition.getRef());
if (exception == null && ref != null) {
- exception = lookup(ref, Exception.class);
+ exception = lookupByNameAndType(ref, Exception.class);
}
Class<? extends Exception> exceptionClass = definition.getExceptionClass();
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
index 2becbd3..445b69a 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
@@ -60,7 +60,7 @@ public class DefaultErrorHandlerReifier<T extends DefaultErrorHandlerProperties>
// camel context will shutdown the executor when it shutdown so no
// need to shut it down when stopping
if (executorServiceRef != null) {
- executorService = lookup(executorServiceRef, ScheduledExecutorService.class);
+ executorService = lookupByNameAndType(executorServiceRef, ScheduledExecutorService.class);
if (executorService == null) {
ExecutorServiceManager manager = camelContext.getExecutorServiceManager();
ThreadPoolProfile profile = manager.getThreadPoolProfile(executorServiceRef);
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
index 7ac9428..43e9e18 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
@@ -349,7 +349,7 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
protected <T> T getBean(Class<T> clazz, T bean, String ref) {
if (bean == null && ref != null) {
- bean = lookup(ref, clazz);
+ bean = lookupByNameAndType(ref, clazz);
}
return bean;
}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
index ae3531d..493d846 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
@@ -35,7 +35,7 @@ public class CustomTransformeReifier extends TransformerReifier<CustomTransforme
Transformer transformer;
String ref = parseString(definition.getRef());
if (ref != null) {
- transformer = lookup(ref, Transformer.class);
+ transformer = lookupByNameAndType(ref, Transformer.class);
if (transformer == null) {
throw new IllegalArgumentException("Cannot find transformer with ref:" + definition.getRef());
}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
index bb593ee..97d1521 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
@@ -35,7 +35,7 @@ public class EndpointTransformeReifier extends TransformerReifier<EndpointTransf
protected Transformer doCreateTransformer() {
Endpoint endpoint = definition.getUri() != null
? camelContext.getEndpoint(definition.getUri())
- : lookup(parseString(definition.getRef()), Endpoint.class);
+ : lookupByNameAndType(parseString(definition.getRef()), Endpoint.class);
SendProcessor processor = new SendProcessor(endpoint, ExchangePattern.InOut);
return new ProcessorTransformer(camelContext).setProcessor(processor)
.setModel(parseString(definition.getScheme()))
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
index 29bb6bc1..360329e3 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
@@ -34,7 +34,7 @@ public class CustomValidatorReifier extends ValidatorReifier<CustomValidatorDefi
}
Validator validator;
if (definition.getRef() != null) {
- validator = lookup(definition.getRef(), Validator.class);
+ validator = lookupByNameAndType(definition.getRef(), Validator.class);
if (validator == null) {
throw new IllegalArgumentException("Cannot find validator with ref:" + definition.getRef());
}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
index f4e4012..f550f32 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
@@ -34,7 +34,7 @@ public class EndpointValidatorReifier extends ValidatorReifier<EndpointValidator
@Override
protected Validator doCreateValidator() {
Endpoint endpoint = definition.getUri() != null
- ? camelContext.getEndpoint(definition.getUri()) : lookup(definition.getRef(), Endpoint.class);
+ ? camelContext.getEndpoint(definition.getUri()) : lookupByNameAndType(definition.getRef(), Endpoint.class);
SendProcessor processor = new SendProcessor(endpoint, ExchangePattern.InOut);
return new ProcessorValidator(camelContext).setProcessor(processor).setType(definition.getType());
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefBeanIdTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefBeanIdTest.java
new file mode 100644
index 0000000..0e0de69
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefBeanIdTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+public class ProcessRefBeanIdTest extends ContextTestSupport {
+
+ @Test
+ public void testProcessRefBeanId() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("CamelCamel");
+
+ template.sendBody("direct:start", "Camel");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ context.getRegistry().bind("myEcho", new EchoProcessor());
+
+ from("direct:start")
+ .process("#bean:myEcho")
+ .to("mock:result");
+ }
+ };
+ }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefBeanTypeTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefBeanTypeTest.java
new file mode 100644
index 0000000..23582c8
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefBeanTypeTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+public class ProcessRefBeanTypeTest extends ContextTestSupport {
+
+ @Test
+ public void testProcessRefBeanType() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("CamelCamel");
+
+ template.sendBody("direct:start", "Camel");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ context.getRegistry().bind("myEcho", new EchoProcessor());
+
+ from("direct:start")
+ .process("#type:org.apache.camel.Processor")
+ .to("mock:result");
+ }
+ };
+ }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefHashTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefHashTest.java
new file mode 100644
index 0000000..d7d8da4
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessRefHashTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+public class ProcessRefHashTest extends ContextTestSupport {
+
+ @Test
+ public void testProcessRefHash() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("CamelCamel");
+
+ template.sendBody("direct:start", "Camel");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ context.getRegistry().bind("myEcho", new EchoProcessor());
+
+ from("direct:start")
+ .process("#myEcho")
+ .to("mock:result");
+ }
+ };
+ }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
index d9ced10..2b85575 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
@@ -348,14 +348,24 @@ public final class EndpointHelper {
* @throws NoSuchBeanException if object was not found in registry and <code>mandatory</code> is <code>true</code>.
*/
public static <T> T resolveReferenceParameter(CamelContext context, String value, Class<T> type, boolean mandatory) {
- // it may refer to a type
- if (value.startsWith("#type:")) {
+ if (value.startsWith("#class:")) {
+ Object answer;
+ try {
+ answer = createBean(context, value, type);
+ } catch (Exception e) {
+ throw new NoSuchBeanException(value, e);
+ }
+ if (mandatory && answer == null) {
+ throw new NoSuchBeanException(value);
+ }
+ return type.cast(answer);
+ } else if (value.startsWith("#type:")) {
try {
Object answer = null;
String valueNoHash = value.substring(6);
Class<?> clazz = context.getClassResolver().resolveMandatoryClass(valueNoHash);
- Set<T> set = context.getRegistry().findByType(type);
+ Set<?> set = context.getRegistry().findByType(clazz);
if (set.size() == 1) {
answer = set.iterator().next();
} else if (set.size() > 1) {
@@ -365,6 +375,9 @@ public final class EndpointHelper {
if (mandatory && answer == null) {
throw new NoSuchBeanException(value);
}
+ if (answer != null) {
+ answer = context.getTypeConverter().convertTo(type, answer);
+ }
return type.cast(answer);
} catch (ClassNotFoundException e) {
throw new NoSuchBeanException(value, e);
@@ -380,6 +393,40 @@ public final class EndpointHelper {
}
}
+ private static <T> T createBean(CamelContext camelContext, String name, Class<T> type) throws Exception {
+ Object answer;
+
+ // if there is a factory method then the class/bean should be created in a different way
+ String className;
+ String factoryMethod = null;
+ String parameters = null;
+ className = name.substring(7);
+ if (className.endsWith(")") && className.indexOf('(') != -1) {
+ parameters = StringHelper.after(className, "(");
+ parameters = parameters.substring(0, parameters.length() - 1); // clip last )
+ className = StringHelper.before(className, "(");
+ }
+ if (className != null && className.indexOf('#') != -1) {
+ factoryMethod = StringHelper.after(className, "#");
+ className = StringHelper.before(className, "#");
+ }
+ Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(className);
+
+ if (factoryMethod != null && parameters != null) {
+ answer = PropertyBindingSupport.newInstanceFactoryParameters(camelContext, clazz, factoryMethod, parameters);
+ } else if (factoryMethod != null) {
+ answer = camelContext.getInjector().newInstance(type, factoryMethod);
+ } else if (parameters != null) {
+ answer = PropertyBindingSupport.newInstanceConstructorParameters(camelContext, clazz, parameters);
+ } else {
+ answer = camelContext.getInjector().newInstance(clazz);
+ }
+ if (answer == null) {
+ throw new IllegalStateException("Cannot create bean: " + name);
+ }
+ return type.cast(answer);
+ }
+
/**
* Resolves a reference list parameter by making lookups in the registry. The parameter value must be one of the
* following: