This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch 13557 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 05f40f2d6c24e3b9ffbfb75ded02eb90ffd88421 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu May 23 14:05:31 2019 +0200 CAMEL-13557: Add property binding support to make it convenient to configure components and whatnot. --- .../file/FileProducerChmodOptionTest.java | 9 +++++--- .../DefaultComponentReferencePropertiesTest.java | 4 ++-- .../org/apache/camel/support/EndpointHelper.java | 4 +++- .../apache/camel/support/IntrospectionSupport.java | 16 ++++++++++++-- .../camel/support/PropertyBindingSupport.java | 25 +++++++++++++++------- 5 files changed, 42 insertions(+), 16 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java index 3a018d6..31c8ceb 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java @@ -26,6 +26,8 @@ import java.util.Set; import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.FailedToCreateRouteException; +import org.apache.camel.PropertyBindingException; +import org.apache.camel.ResolveEndpointFailedException; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.junit.Before; @@ -99,9 +101,10 @@ public class FileProducerChmodOptionTest extends ContextTestSupport { } }); fail("Expected FailedToCreateRouteException"); - } catch (Exception e) { - assertTrue("Expected FailedToCreateRouteException, was " + e.getClass().getCanonicalName(), e instanceof FailedToCreateRouteException); - assertTrue("Message was [" + e.getMessage() + "]", e.getMessage().endsWith("conversion possible: chmod option [abc] is not valid")); + } catch (FailedToCreateRouteException e) { + assertIsInstanceOf(ResolveEndpointFailedException.class, e.getCause()); + PropertyBindingException pbe = assertIsInstanceOf(PropertyBindingException.class, e.getCause().getCause()); + assertEquals("chmod", pbe.getPropertyName()); } } diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentReferencePropertiesTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentReferencePropertiesTest.java index ecd1b6b..0ab463e 100644 --- a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentReferencePropertiesTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentReferencePropertiesTest.java @@ -199,8 +199,8 @@ public class DefaultComponentReferencePropertiesTest extends ContextTestSupport MyComponent component = new MyComponent(context); try { component.createEndpoint("foo://?special=#dummy"); - fail("Should have throw a IllegalArgumentException"); - } catch (IllegalArgumentException e) { + fail("Should have throw a ResolveEndpointFailedException"); + } catch (ResolveEndpointFailedException e) { // ok } } 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 d690bdd..adc82cd 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 @@ -157,7 +157,9 @@ public final class EndpointHelper { * @throws Exception is thrown if setting property fails */ public static void setProperties(CamelContext context, Object bean, Map<String, Object> parameters) throws Exception { - IntrospectionSupport.setProperties(context.getTypeConverter(), bean, parameters); + // TODO: Use more advanced bindingDefaultComponentReferencePropertiesTes + PropertyBindingSupport.bindProperties(context, bean, parameters); + //IntrospectionSupport.setProperties(context.getTypeConverter(), bean, parameters); } /** diff --git a/core/camel-support/src/main/java/org/apache/camel/support/IntrospectionSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/IntrospectionSupport.java index 3585940..01f8eee 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/IntrospectionSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/IntrospectionSupport.java @@ -539,8 +539,14 @@ public final class IntrospectionSupport { // loop and execute the best setter method Exception typeConversionFailed = null; - for (Method setter : setters) { + Method stringSetterMethod = null; + Iterator<Method> it = setters.iterator(); + while (it.hasNext()) { + Method setter = it.next(); Class<?> parameterType = setter.getParameterTypes()[0]; + if (parameterType.getName().equals("java.lang.String")) { + stringSetterMethod = setter; + } Object ref = value; // try and lookup the reference based on the method if (context != null && refName != null && ref == null) { @@ -548,7 +554,13 @@ public final class IntrospectionSupport { ref = CamelContextHelper.lookup(context, s); if (ref == null) { // try the next method if nothing was found - continue; + // if we did not found a good candidate then fallback to use the string setter (if possible) with the actual ref name value as-is + if (!it.hasNext() && stringSetterMethod != null) { + setter = stringSetterMethod; + ref = refName; + } else { + continue; + } } else { // setter method has not the correct type // (must use ObjectHelper.isAssignableFrom which takes primitive types into account) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java index f336d75..02c24c1 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java @@ -17,6 +17,7 @@ package org.apache.camel.support; import java.lang.reflect.Method; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; @@ -132,20 +133,28 @@ public final class PropertyBindingSupport { } /** - * Binds the properties to the target object. + * Binds the properties to the target object, and removes the property that was bound from properties. * * @param camelContext the camel context * @param target the target object - * @param properties the properties - * @return true if all the properties was bound, false otherwise + * @param properties the properties where the bound properties will be removed from + * @return true if one or more properties was bound */ public static boolean bindProperties(CamelContext camelContext, Object target, Map<String, Object> properties) { - boolean answer = true; - for (Map.Entry<String, Object> entry : properties.entrySet()) { - answer &= bindProperty(camelContext, target, entry.getKey(), entry.getValue()); + org.apache.camel.util.ObjectHelper.notNull(target, "target"); + org.apache.camel.util.ObjectHelper.notNull(properties, "properties"); + boolean rc = false; + + for (Iterator<Map.Entry<String, Object>> iter = properties.entrySet().iterator(); iter.hasNext();) { + Map.Entry<String, Object> entry = iter.next(); + if (bindProperty(camelContext, target, entry.getKey(), entry.getValue())) { + iter.remove(); + rc = true; + } } - return answer; - } + + return rc; + } /** * Binds the property to the target object.