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
The following commit(s) were added to refs/heads/master by this push: new 701e033 CAMEL-12079: Bean language: support bean::function notation 701e033 is described below commit 701e033914f8708bc76b0094117d1d3c697bd30b Author: Sami Nurminen <snurm...@gmail.com> AuthorDate: Thu Dec 28 21:24:48 2017 +0200 CAMEL-12079: Bean language: support bean::function notation --- .../apache/camel/language/bean/BeanLanguage.java | 19 +++++-- .../java/org/apache/camel/util/ResourceHelper.java | 6 +-- .../java/org/apache/camel/language/BeanTest.java | 20 ++++++- .../org/apache/camel/util/ResourceHelperTest.java | 61 ++++++++++++++++++++-- 4 files changed, 91 insertions(+), 15 deletions(-) diff --git a/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java b/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java index a7ac33a..459a562 100644 --- a/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java +++ b/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java @@ -91,10 +91,19 @@ public class BeanLanguage implements Language, IsSingleton { beanName = ObjectHelper.before(expression, "?"); method = ObjectHelper.after(expression, "?method="); } else { - int idx = expression.indexOf('.'); - if (idx > 0) { - beanName = expression.substring(0, idx); - method = expression.substring(idx + 1); + //first check case :: because of my.own.Bean::method + int doubleColonIndex = expression.indexOf("::"); + //need to check that not inside params + int beginOfParameterDeclaration = expression.indexOf("("); + if (doubleColonIndex > 0 && (expression.indexOf("(") < 0 || doubleColonIndex < beginOfParameterDeclaration)) { + beanName = expression.substring(0, doubleColonIndex); + method = expression.substring(doubleColonIndex + 2); + } else { + int idx = expression.indexOf('.'); + if (idx > 0) { + beanName = expression.substring(0, idx); + method = expression.substring(idx + 1); + } } } @@ -109,4 +118,4 @@ public class BeanLanguage implements Language, IsSingleton { public boolean isSingleton() { return true; } -} \ No newline at end of file +} diff --git a/camel-core/src/main/java/org/apache/camel/util/ResourceHelper.java b/camel-core/src/main/java/org/apache/camel/util/ResourceHelper.java index 6f28dac..152f7db 100644 --- a/camel-core/src/main/java/org/apache/camel/util/ResourceHelper.java +++ b/camel-core/src/main/java/org/apache/camel/util/ResourceHelper.java @@ -127,7 +127,7 @@ public final class ResourceHelper { * <il>classpath:nameOfFile - to refer to the classpath (default)</il> * <il>http:uri - to load the resource using HTTP</il> * <il>ref:nameOfBean - to lookup the resource in the {@link org.apache.camel.spi.Registry}</il> - * <il>bean:nameOfBean.methodName - to lookup a bean in the {@link org.apache.camel.spi.Registry} and call the method</il> + * <il>bean:nameOfBean.methodName or bean:nameOfBean::methodName - to lookup a bean in the {@link org.apache.camel.spi.Registry} and call the method</il> * <il><customProtocol>:uri - to lookup the resource using a custom {@link java.net.URLStreamHandler} registered for the <customProtocol>, * on how to register it @see java.net.URL#URL(java.lang.String, java.lang.String, int, java.lang.String)</il> * </ul> @@ -147,10 +147,6 @@ public final class ResourceHelper { return new ByteArrayInputStream(value.getBytes()); } else if (uri.startsWith("bean:")) { String bean = uri.substring(5); - if (bean.contains(".")) { - String method = StringHelper.after(bean, "."); - bean = StringHelper.before(bean, ".") + "?method=" + method; - } Exchange dummy = new DefaultExchange(camelContext); Object out = camelContext.resolveLanguage("bean").createExpression(bean).evaluate(dummy, Object.class); if (dummy.getException() != null) { diff --git a/camel-core/src/test/java/org/apache/camel/language/BeanTest.java b/camel-core/src/test/java/org/apache/camel/language/BeanTest.java index de541e4..84bd554 100644 --- a/camel-core/src/test/java/org/apache/camel/language/BeanTest.java +++ b/camel-core/src/test/java/org/apache/camel/language/BeanTest.java @@ -32,13 +32,26 @@ import org.apache.camel.language.bean.BeanLanguage; public class BeanTest extends LanguageTestSupport { public void testSimpleExpressions() throws Exception { + assertExpression("foo.echo('e::o')", "e::o"); + assertExpression("foo.echo('e.o')", "e.o"); + assertExpression("my.company.MyClass::echo('a')", "a"); + assertExpression("my.company.MyClass::echo('a.b')", "a.b"); + assertExpression("my.company.MyClass::echo('a::b')", "a::b"); assertExpression("foo.cheese", "abc"); assertExpression("foo?method=cheese", "abc"); + assertExpression("my.company.MyClass::cheese", "abc"); + assertExpression("foo?method=echo('e::o')", "e::o"); } public void testPredicates() throws Exception { assertPredicate("foo.isFooHeaderAbc"); assertPredicate("foo?method=isFooHeaderAbc"); + assertPredicate("my.company.MyClass::isFooHeaderAbc"); + } + + public void testDoubleColon() throws Exception { + assertPredicate("foo::isFooHeaderAbc"); + assertPredicateFails("foo:isFooHeaderAbc"); } public void testBeanTypeExpression() throws Exception { @@ -99,6 +112,7 @@ public class BeanTest extends LanguageTestSupport { protected Context createJndiContext() throws Exception { Context context = super.createJndiContext(); context.bind("foo", new MyBean()); + context.bind("my.company.MyClass", new MyBean()); return context; } @@ -108,6 +122,10 @@ public class BeanTest extends LanguageTestSupport { return in.getHeader("foo"); } + public String echo(String echo) { + return echo; + } + public boolean isFooHeaderAbc(@Header("foo") String foo) { return "abc".equals(foo); } @@ -118,4 +136,4 @@ public class BeanTest extends LanguageTestSupport { return "Hello " + name; } } -} \ No newline at end of file +} diff --git a/camel-core/src/test/java/org/apache/camel/util/ResourceHelperTest.java b/camel-core/src/test/java/org/apache/camel/util/ResourceHelperTest.java index 1efcc4e..cc12490 100644 --- a/camel-core/src/test/java/org/apache/camel/util/ResourceHelperTest.java +++ b/camel-core/src/test/java/org/apache/camel/util/ResourceHelperTest.java @@ -16,13 +16,12 @@ */ package org.apache.camel.util; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.io.*; import java.net.URL; import java.util.LinkedHashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; import org.apache.camel.CamelContext; import org.apache.camel.TestSupport; @@ -101,6 +100,60 @@ public class ResourceHelperTest extends TestSupport { context.stop(); } + public void testLoadBeanDoubleColon() throws Exception { + SimpleRegistry registry = new SimpleRegistry(); + registry.put("myBean", new AtomicReference<InputStream>(new ByteArrayInputStream("a".getBytes()))); + + CamelContext context = new DefaultCamelContext(registry); + context.start(); + + InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(context, "bean:myBean::get"); + assertNotNull(is); + + String text = context.getTypeConverter().convertTo(String.class, is); + assertNotNull(text); + assertEquals(text, "a"); + is.close(); + + context.stop(); + } + + public void testLoadBeanDoubleColonLong() throws Exception { + SimpleRegistry registry = new SimpleRegistry(); + registry.put("my.company.MyClass", new AtomicReference<InputStream>(new ByteArrayInputStream("a".getBytes()))); + + CamelContext context = new DefaultCamelContext(registry); + context.start(); + + InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(context, "bean:my.company.MyClass::get"); + assertNotNull(is); + + String text = context.getTypeConverter().convertTo(String.class, is); + assertNotNull(text); + assertEquals(text, "a"); + is.close(); + + context.stop(); + } + + public void testLoadBeanDot() throws Exception { + SimpleRegistry registry = new SimpleRegistry(); + registry.put("myBean", new AtomicReference<InputStream>(new ByteArrayInputStream("a".getBytes()))); + + CamelContext context = new DefaultCamelContext(registry); + context.start(); + + InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(context, "bean:myBean.get"); + assertNotNull(is); + + String text = context.getTypeConverter().convertTo(String.class, is); + assertNotNull(text); + assertEquals(text, "a"); + is.close(); + + context.stop(); + } + public void testLoadClasspathDefault() throws Exception { CamelContext context = new DefaultCamelContext(); context.start(); -- To stop receiving notification emails like this one, please contact davscl...@apache.org.