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.

Reply via email to