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 83d8be8cef3f0c5709f2c6e2527c6c0235fadac2 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon Jun 17 07:14:59 2019 +0200 CAMEL-13647: Allow to do autowrire by classpath. Quick and dirty prototype. --- .../java/org/apache/camel/maven/AutowireMojo.java | 3 ++- .../java/org/apache/camel/main/MainSupport.java | 15 ++++++++------- .../camel/support/PropertyBindingSupport.java | 22 +++++++++++++++++----- .../src/main/resources/application.properties | 4 ++-- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/catalog/camel-main-maven-plugin/src/main/java/org/apache/camel/maven/AutowireMojo.java b/catalog/camel-main-maven-plugin/src/main/java/org/apache/camel/maven/AutowireMojo.java index ab205f3..1519298 100644 --- a/catalog/camel-main-maven-plugin/src/main/java/org/apache/camel/maven/AutowireMojo.java +++ b/catalog/camel-main-maven-plugin/src/main/java/org/apache/camel/maven/AutowireMojo.java @@ -55,6 +55,7 @@ import org.apache.maven.model.Exclusion; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; @@ -68,7 +69,7 @@ import org.reflections.util.ConfigurationBuilder; /** * Pre scans your project and prepare autowiring by classpath scanning */ -@Mojo(name = "autowire", threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE) +@Mojo(name = "autowire", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE) public class AutowireMojo extends AbstractExecMojo { /** diff --git a/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java index 71d427c..2fe20ef 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java @@ -1003,14 +1003,15 @@ public abstract class MainSupport extends ServiceSupport { String stringValue = value != null ? value.toString() : null; LOG.debug("Setting property {} on {} with value {}", name, target, stringValue); - boolean hit = PropertyBindingSupport.bindProperty(context, target, name, stringValue); - - if (hit) { - it.remove(); + if (failIfNotSet) { + PropertyBindingSupport.bindMandatoryProperty(context, target, name, stringValue); rc = true; - } else if (failIfNotSet) { - throw new IllegalArgumentException("Cannot configure option [" + name + "] with value [" + stringValue + "] as the bean class [" - + ObjectHelper.classCanonicalName(target) + "] has no suitable setter method, or not possible to lookup a bean with the id [" + stringValue + "] in Camel registry"); + } else { + boolean hit = PropertyBindingSupport.bindProperty(context, target, name, stringValue); + if (hit) { + it.remove(); + rc = true; + } } } 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 8a4ad00..462cdf2 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 @@ -507,7 +507,7 @@ public final class PropertyBindingSupport { public static boolean bindProperty(CamelContext camelContext, Object target, String name, Object value) { try { if (target != null && name != null) { - return setProperty(camelContext, target, name, value, true, true, true, true, true); + return setProperty(camelContext, target, name, value, false, true, true, true, true, true); } } catch (Exception e) { throw new PropertyBindingException(target, name, e); @@ -520,7 +520,7 @@ public final class PropertyBindingSupport { boolean nesting, boolean deepNesting, boolean fluentBuilder, boolean reference, boolean placeholder) { try { if (target != null && name != null) { - return setProperty(camelContext, target, name, value, nesting, deepNesting, fluentBuilder, reference, placeholder); + return setProperty(camelContext, target, name, value, false, nesting, deepNesting, fluentBuilder, reference, placeholder); } } catch (Exception e) { throw new PropertyBindingException(target, name, e); @@ -540,7 +540,7 @@ public final class PropertyBindingSupport { public static void bindMandatoryProperty(CamelContext camelContext, Object target, String name, Object value) { try { if (target != null && name != null) { - boolean bound = setProperty(camelContext, target, name, value, true, true, true, true, true); + boolean bound = setProperty(camelContext, target, name, value, true, true, true, true, true, true); if (!bound) { throw new PropertyBindingException(target, name); } @@ -550,7 +550,7 @@ public final class PropertyBindingSupport { } } - private static boolean setProperty(CamelContext context, Object target, String name, Object value, + private static boolean setProperty(CamelContext context, Object target, String name, Object value, boolean mandatory, boolean nesting, boolean deepNesting, boolean fluentBuilder, boolean reference, boolean placeholder) throws Exception { String refName = null; @@ -563,6 +563,8 @@ public final class PropertyBindingSupport { } } + String ognlPath = name; + // if name has dot then we need to OGNL walk it if (nesting) { if (name.indexOf('.') > 0) { @@ -591,6 +593,11 @@ public final class PropertyBindingSupport { newTarget = instance; newClass = newTarget.getClass(); } + } else { + if (mandatory) { + // there is no getter with this given name, so lets report this as a problem + throw new IllegalArgumentException("Cannot find nested getter method: " + part + " on bean: " + newClass + " when binding property: " + ognlPath); + } } } else { newTarget = prop; @@ -642,7 +649,12 @@ public final class PropertyBindingSupport { } } - return IntrospectionSupport.setProperty(context, context.getTypeConverter(), target, name, value, refName, fluentBuilder); + boolean hit = IntrospectionSupport.setProperty(context, context.getTypeConverter(), target, name, value, refName, fluentBuilder); + if (!hit && mandatory) { + // there is no setter with this given name, so lets report this as a problem + throw new IllegalArgumentException("Cannot find setter method: " + name + " on bean: " + target + " when binding property: " + ognlPath); + } + return hit; } private static Object getOrElseProperty(Object target, String property, Object defaultValue) { diff --git a/examples/camel-example-main/src/main/resources/application.properties b/examples/camel-example-main/src/main/resources/application.properties index cd2942e..9af7830 100644 --- a/examples/camel-example-main/src/main/resources/application.properties +++ b/examples/camel-example-main/src/main/resources/application.properties @@ -42,8 +42,8 @@ camel.component.quartz2.start-delayed-seconds = 3 # you can configure whether OS environment should override (=2 which is default) or as fallback (=1) ### camel.component.properties.environment-variable-mode=1 -camel.component.jms.configuration.connectionFactory=#class:org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory -camel.component.jms.configuration.connectionFactory.#private#brokerURL=tcp://localhost:61616 +### camel.component.jms.configuration.connectionFactory=#class:org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory +### camel.component.jms.configuration.connectionFactory.#private#brokerURL=tcp://localhost:61616 # properties used in the route myCron = 0/2 * * * * ?