Repository: camel Updated Branches: refs/heads/master a2f5daa5d -> c8ca9f5b2
CAMEL-10275: Allow @ProperyInject on bean method arguments Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c8ca9f5b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c8ca9f5b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c8ca9f5b Branch: refs/heads/master Commit: c8ca9f5b2eeed70bc177b483b152d3ae9836edb5 Parents: a2f5daa Author: Claus Ibsen <davscl...@apache.org> Authored: Tue Aug 30 15:38:58 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Tue Aug 30 18:47:43 2016 +0200 ---------------------------------------------------------------------- .../java/org/apache/camel/PropertyInject.java | 2 +- .../apache/camel/builder/ExpressionBuilder.java | 6 +- .../apache/camel/component/bean/BeanInfo.java | 5 + .../simple/ast/SimpleFunctionExpression.java | 4 +- .../PropertyInjectAnnotationParameterTest.java | 118 +++++++++++++++++++ 5 files changed, 131 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/c8ca9f5b/camel-core/src/main/java/org/apache/camel/PropertyInject.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/PropertyInject.java b/camel-core/src/main/java/org/apache/camel/PropertyInject.java index b6d6852..2b2d4ac 100644 --- a/camel-core/src/main/java/org/apache/camel/PropertyInject.java +++ b/camel-core/src/main/java/org/apache/camel/PropertyInject.java @@ -28,7 +28,7 @@ import java.lang.annotation.Target; */ @Retention(RetentionPolicy.RUNTIME) @Documented -@Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR}) +@Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) public @interface PropertyInject { String value(); String defaultValue() default ""; http://git-wip-us.apache.org/repos/asf/camel/blob/c8ca9f5b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java index b6069ea..d80306a 100644 --- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java +++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java @@ -2063,7 +2063,7 @@ public final class ExpressionBuilder { return constantExpression(str); } - public static Expression propertiesComponentExpression(final String key, final String locations) { + public static Expression propertiesComponentExpression(final String key, final String locations, final String defaultValue) { return new ExpressionAdapter() { public Object evaluate(Exchange exchange) { String text = simpleExpression(key).evaluate(exchange, String.class); @@ -2091,6 +2091,10 @@ public final class ExpressionBuilder { return pc.parseUri(pc.getPrefixToken() + text + pc.getSuffixToken()); } } catch (Exception e) { + // property with key not found, use default value if provided + if (defaultValue != null) { + return defaultValue; + } throw ObjectHelper.wrapRuntimeCamelException(e); } } http://git-wip-us.apache.org/repos/asf/camel/blob/c8ca9f5b/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java b/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java index 752db1e..87be7ee 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java @@ -47,6 +47,7 @@ import org.apache.camel.Message; import org.apache.camel.OutHeaders; import org.apache.camel.Properties; import org.apache.camel.Property; +import org.apache.camel.PropertyInject; import org.apache.camel.builder.ExpressionBuilder; import org.apache.camel.language.LanguageAnnotation; import org.apache.camel.spi.Registry; @@ -973,6 +974,10 @@ public class BeanInfo { return ExpressionBuilder.outHeadersExpression(); } else if (annotation instanceof ExchangeException) { return ExpressionBuilder.exchangeExceptionExpression(CastUtils.cast(parameterType, Exception.class)); + } else if (annotation instanceof PropertyInject) { + PropertyInject propertyAnnotation = (PropertyInject) annotation; + Expression inject = ExpressionBuilder.propertiesComponentExpression(propertyAnnotation.value(), null, propertyAnnotation.defaultValue()); + return ExpressionBuilder.convertToExpression(inject, parameterType); } else { LanguageAnnotation languageAnnotation = annotation.annotationType().getAnnotation(LanguageAnnotation.class); if (languageAnnotation != null) { http://git-wip-us.apache.org/repos/asf/camel/blob/c8ca9f5b/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java b/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java index efa92d2..89c7ea8 100644 --- a/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java +++ b/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java @@ -177,7 +177,7 @@ public class SimpleFunctionExpression extends LiteralExpression { if (parts.length > 2) { throw new SimpleParserException("Valid syntax: ${properties:key[:default]} was: " + function, token.getIndex()); } - return ExpressionBuilder.propertiesComponentExpression(remainder, null); + return ExpressionBuilder.propertiesComponentExpression(remainder, null, null); } // properties-location: prefix @@ -194,7 +194,7 @@ public class SimpleFunctionExpression extends LiteralExpression { locations = ObjectHelper.before(remainder, ":"); key = ObjectHelper.after(remainder, ":"); } - return ExpressionBuilder.propertiesComponentExpression(key, locations); + return ExpressionBuilder.propertiesComponentExpression(key, locations, null); } // ref: prefix http://git-wip-us.apache.org/repos/asf/camel/blob/c8ca9f5b/camel-core/src/test/java/org/apache/camel/language/PropertyInjectAnnotationParameterTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/language/PropertyInjectAnnotationParameterTest.java b/camel-core/src/test/java/org/apache/camel/language/PropertyInjectAnnotationParameterTest.java new file mode 100644 index 0000000..4399666 --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/language/PropertyInjectAnnotationParameterTest.java @@ -0,0 +1,118 @@ +/** + * 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.language; + +import java.util.Properties; + +import org.apache.camel.CamelContext; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.PropertyInject; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.properties.PropertiesComponent; + +/** + * + */ +public class PropertyInjectAnnotationParameterTest extends ContextTestSupport { + + public void testPropertyInjectAnnotationOne() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); + + template.sendBody("direct:one", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testPropertyInjectAnnotationTwo() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("WorldWorldWorld"); + + template.sendBody("direct:two", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testPropertyInjectAnnotationThree() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Goodbye World"); + + template.sendBody("direct:three", "World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + + PropertiesComponent pc = new PropertiesComponent(); + Properties props = new Properties(); + props.put("greeting", "Hello"); + props.put("times", "3"); + pc.setInitialProperties(props); + context.addComponent("properties", pc); + + return context; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:one") + .bean(MyBean.class) + .to("mock:result"); + + from("direct:two") + .bean(MyCounterBean.class) + .to("mock:result"); + + from("direct:three") + .bean(MyOtherBean.class) + .to("mock:result"); + } + }; + } + + public static final class MyBean { + + public String callA(@PropertyInject("greeting") String greeting, String body) { + return greeting + " " + body; + } + + } + + public static final class MyOtherBean { + + public String callA(@PropertyInject(value = "bye", defaultValue = "Goodbye") String bye, String body) { + return bye + " " + body; + } + + } + + public static final class MyCounterBean { + + public String callA(@PropertyInject("times") int times, String body) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < times; i++) { + sb.append(body); + } + return sb.toString(); + } + + } + +}