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/06/22 12:46:17 UTC
[camel] 01/16: CAMEL-15224: camel-api-component - Avoid reflection
when configured nested configuration classes
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch CAMEL-15224
in repository https://gitbox.apache.org/repos/asf/camel.git
commit b4abddce191db7f4d4ce60ddb2b06023d4e28816
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jun 22 09:38:35 2020 +0200
CAMEL-15224: camel-api-component - Avoid reflection when configured nested configuration classes
---
.../support/component/AbstractApiComponent.java | 21 +++++++++++++++++++--
.../component/ApiMethodPropertiesHelper.java | 17 +++++++++++++----
2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java b/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java
index ae94410..93ece35 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java
@@ -25,6 +25,8 @@ import org.apache.camel.CamelException;
import org.apache.camel.Endpoint;
import org.apache.camel.ExtendedCamelContext;
import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.PropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
import org.apache.camel.support.DefaultComponent;
import org.apache.camel.support.PropertyBindingSupport;
@@ -104,12 +106,27 @@ public abstract class AbstractApiComponent<E extends Enum<E> & ApiName, T, S ext
final Map<String, Object> componentProperties = new HashMap<>();
// copy component configuration, if set
if (configuration != null) {
- getCamelContext().adapt(ExtendedCamelContext.class).getBeanIntrospection().getProperties(configuration, componentProperties, null, false);
+ PropertyConfigurer configurer = getCamelContext().adapt(ExtendedCamelContext.class).getConfigurerResolver().resolvePropertyConfigurer(configuration.getClass().getSimpleName(), getCamelContext());
+ // use reflection free configurer (if possible)
+ if (configurer instanceof PropertyConfigurerGetter) {
+ PropertyConfigurerGetter getter = (PropertyConfigurerGetter) configuration;
+ for (String key : getter.getAllOptions(configuration).keySet()) {
+ Object value = getter.getOptionValue(configuration, key, true);
+ if (value != null) {
+ componentProperties.put(key, value);
+ }
+ }
+ } else {
+ getCamelContext().adapt(ExtendedCamelContext.class).getBeanIntrospection().getProperties(configuration, componentProperties, null, false);
+ }
}
// create endpoint configuration with component properties
final T endpointConfiguration = collection.getEndpointConfiguration(name);
- PropertyBindingSupport.build().bind(getCamelContext(), endpointConfiguration, componentProperties);
+ PropertyConfigurer configurer = getCamelContext().adapt(ExtendedCamelContext.class).getConfigurerResolver().resolvePropertyConfigurer(endpointConfiguration.getClass().getSimpleName(), getCamelContext());
+ PropertyBindingSupport.build()
+ .withConfigurer(configurer)
+ .bind(getCamelContext(), endpointConfiguration, componentProperties);
return endpointConfiguration;
}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java
index 0893303..36ec21d 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java
@@ -26,6 +26,8 @@ import java.util.Set;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.spi.PropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -90,12 +92,19 @@ public abstract class ApiMethodPropertiesHelper<C> {
}
public void getEndpointProperties(CamelContext context, Object endpointConfiguration, Map<String, Object> properties) {
- Set<String> names = null;
- if (context.adapt(ExtendedCamelContext.class).getBeanIntrospection().getProperties(endpointConfiguration, properties, null, false)) {
+ Set<String> names;
+
+ PropertyConfigurer configurer = context.adapt(ExtendedCamelContext.class).getConfigurerResolver().resolvePropertyConfigurer(endpointConfiguration.getClass().getSimpleName(), context);
+ // use reflection free configurer (if possible)
+ if (configurer instanceof PropertyConfigurerGetter) {
+ PropertyConfigurerGetter getter = (PropertyConfigurerGetter) endpointConfiguration;
+ names = getter.getAllOptions(endpointConfiguration).keySet();
+ } else {
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().getProperties(endpointConfiguration, properties, null, false);
names = properties.keySet();
- // remove component config properties so we only have endpoint properties
- names.removeAll(componentConfigFields);
}
+ // remove component config properties so we only have endpoint properties
+ names.removeAll(componentConfigFields);
LOG.debug("Found endpoint properties {}", names);
}