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 8213ae4add7a91111b10c06b4d45c3c0b894b170 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu May 23 10:25:07 2019 +0200 CAMEL-13557: Add property binding support to make it convenient to configure components and whatnot. --- .../camel/support/PropertyBindingSupportTest.java | 33 +++++++++++++--------- .../camel/support/PropertyBindingSupport.java | 28 ++++++++++++------ 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java index 35bfadf..c372e39 100644 --- a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java @@ -228,32 +228,39 @@ public class PropertyBindingSupportTest extends ContextTestSupport { return age; } - public void setAge(int age) { - this.age = age; - } - public boolean isRider() { return rider; } - public void setRider(boolean rider) { - this.rider = rider; - } - public Company getWork() { return work; } - public void setWork(Company work) { - this.work = work; - } - public boolean isGoldCustomer() { return goldCustomer; } - public void setGoldCustomer(boolean goldCustomer) { + // this has no setter but only builders + // and mix the builders with both styles (with as prefix and no prefix at all) + + public Bar withAge(int age) { + this.age = age; + return this; + } + + public Bar withRider(boolean rider) { + this.rider = rider; + return this; + } + + public Bar work(Company work) { + this.work = work; + return this; + } + + public Bar goldCustomer(boolean goldCustomer) { this.goldCustomer = goldCustomer; + return this; } } 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 453e5b0..d4a6980 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 @@ -140,10 +140,8 @@ public final class PropertyBindingSupport { Object prop = getOrElseProperty(newTarget, part, null); if (prop == null) { // okay is there a setter so we can create a new instance and set it automatic - Set<Method> newSetters = findSetterMethods(newClass, part, true); - // TODO: you may have setter + fluent builder at the same time, so grab setter first, and fallback to fluent builder afterwards - if (newSetters.size() == 1) { - Method method = newSetters.iterator().next(); + Method method = findBestSetterMethod(newClass, part); + if (method != null) { Class<?> parameterType = method.getParameterTypes()[0]; if (parameterType != null && org.apache.camel.util.ObjectHelper.hasDefaultPublicNoArgConstructor(parameterType)) { Object instance = context.getInjector().newInstance(parameterType); @@ -184,10 +182,8 @@ public final class PropertyBindingSupport { } } else if (value.toString().equals("#autowire")) { // we should get the type from the setter - // TODO: you may have setter + fluent builder at the same time, so grab setter first, and fallback to fluent builder afterwards - Set<Method> newSetters = findSetterMethods(target.getClass(), name, true); - if (newSetters.size() == 1) { - Method method = newSetters.iterator().next(); + Method method = findBestSetterMethod(target.getClass(), name); + if (method != null) { Class<?> parameterType = method.getParameterTypes()[0]; if (parameterType != null) { Set<?> types = context.getRegistry().findByType(parameterType); @@ -210,4 +206,20 @@ public final class PropertyBindingSupport { return IntrospectionSupport.setProperty(context, context.getTypeConverter(), target, name, value, refName, true); } + private static Method findBestSetterMethod(Class clazz, String name) { + // is there a direct setter? + Set<Method> candidates = findSetterMethods(clazz, name, false); + if (candidates.size() == 1) { + return candidates.iterator().next(); + } + + // okay now try with builder pattern + candidates = findSetterMethods(clazz, name, true); + if (candidates.size() == 1) { + return candidates.iterator().next(); + } + + return null; + } + }