Updated Branches: refs/heads/master efbb85961 -> a52864dfc
CAMEL-6455: Improved bean component to support specifying empty parameter in the method name. And thrown a MethodNotFoundException if not found. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a52864df Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a52864df Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a52864df Branch: refs/heads/master Commit: a52864dfc931ee898cd53850c830049c820bf5a3 Parents: efbb859 Author: Claus Ibsen <[email protected]> Authored: Thu Jun 20 16:41:54 2013 +0200 Committer: Claus Ibsen <[email protected]> Committed: Thu Jun 20 17:09:49 2013 +0200 ---------------------------------------------------------------------- .../apache/camel/component/bean/BeanInfo.java | 14 ++++++ .../apache/camel/component/bean/MethodInfo.java | 4 ++ .../component/bean/MethodNotFoundException.java | 6 +++ ...eterAndNoMethodWithNoParameterIssueTest.java | 49 +++++++++++++++++--- 4 files changed, 66 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/a52864df/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 a511943..dc9eb04 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 @@ -206,6 +206,7 @@ public class BeanInfo { if (methodName.contains("(")) { name = ObjectHelper.before(methodName, "("); } + boolean emptyParameters = methodName.endsWith("()"); // special for getClass, as we want the user to be able to invoke this method // for example to log the class type or the likes @@ -221,6 +222,11 @@ public class BeanInfo { if (methods != null && methods.size() == 1) { // only one method then choose it methodInfo = methods.get(0); + + // validate that if we want an explict no-arg method, then that's what we get + if (emptyParameters && methodInfo.hasParameters()) { + throw new MethodNotFoundException(exchange, pojo, methodName, "(with no parameters)"); + } } else if (methods != null) { // there are more methods with that name so we cannot decide which to use @@ -228,6 +234,14 @@ public class BeanInfo { // must use the method name which may have qualifiers methodInfo = chooseMethod(pojo, exchange, methodName); + // validate that if we want an explicit no-arg method, then that's what we get + if (emptyParameters) { + if (methodInfo == null || methodInfo.hasParameters()) { + // we could not find a no-arg method with that name + throw new MethodNotFoundException(exchange, pojo, methodName, "(with no parameters)"); + } + } + if (methodInfo == null || !name.equals(methodInfo.getMethod().getName())) { throw new AmbiguousMethodCallException(exchange, methods); } http://git-wip-us.apache.org/repos/asf/camel/blob/a52864df/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java b/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java index 721a2c5..5080e24 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java @@ -378,6 +378,10 @@ public class MethodInfo { return hasHandlerAnnotation; } + public boolean hasParameters() { + return !parameters.isEmpty(); + } + public boolean isReturnTypeVoid() { return method.getReturnType().getName().equals("void"); } http://git-wip-us.apache.org/repos/asf/camel/blob/a52864df/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java b/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java index 71e9760..e31c729 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/MethodNotFoundException.java @@ -35,6 +35,12 @@ public class MethodNotFoundException extends CamelExchangeException { this.bean = pojo; } + public MethodNotFoundException(Exchange exchange, Object pojo, String methodName, String postfix) { + super("Method with name: " + methodName + " " + postfix + " not found on bean: " + pojo + " of type: " + ObjectHelper.className(pojo), exchange); + this.methodName = methodName; + this.bean = pojo; + } + public MethodNotFoundException(Exchange exchange, Class<?> type, String methodName, boolean isStaticMethod) { super((isStaticMethod ? "Static method" : "Method") + " with name: " + methodName + " not found on class: " + ObjectHelper.name(type), exchange); this.methodName = methodName; http://git-wip-us.apache.org/repos/asf/camel/blob/a52864df/camel-core/src/test/java/org/apache/camel/component/bean/BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/component/bean/BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest.java b/camel-core/src/test/java/org/apache/camel/component/bean/BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest.java index 3058eb8..af45526 100644 --- a/camel-core/src/test/java/org/apache/camel/component/bean/BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest.java +++ b/camel-core/src/test/java/org/apache/camel/component/bean/BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest.java @@ -16,30 +16,49 @@ */ package org.apache.camel.component.bean; +import org.apache.camel.CamelExecutionException; import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.JndiRegistry; /** - * + * CAMEL-6455 */ public class BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest extends ContextTestSupport { - // TODO: CAMEL-6455 - @Override protected JndiRegistry createRegistry() throws Exception { JndiRegistry jndi = super.createRegistry(); jndi.bind("myBean", new MyBean()); + jndi.bind("myOtherBean", new MyOtherBean()); return jndi; } public void testBean() throws Exception { - getMockEndpoint("mock:result").expectedBodiesReceived("Camel"); - getMockEndpoint("mock:result").expectedHeaderReceived("foo", "bar"); + getMockEndpoint("mock:result").expectedMessageCount(0); + + try { + template.sendBody("direct:start", "Camel"); + fail("Should have thrown exception"); + } catch (CamelExecutionException e) { + MethodNotFoundException cause = assertIsInstanceOf(MethodNotFoundException.class, e.getCause()); + assertEquals("doSomething()", cause.getMethodName()); + } + + assertMockEndpointsSatisfied(); + } - template.sendBody("direct:start", "Camel"); + public void testOtherBean() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(0); + + try { + template.sendBody("direct:other", "Camel"); + fail("Should have thrown exception"); + } catch (CamelExecutionException e) { + MethodNotFoundException cause = assertIsInstanceOf(MethodNotFoundException.class, e.getCause()); + assertEquals("doSomething()", cause.getMethodName()); + } assertMockEndpointsSatisfied(); } @@ -50,7 +69,11 @@ public class BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest ext @Override public void configure() throws Exception { from("direct:start") - .to("bean:myBean?method=doSomething(*)") + .to("bean:myBean?method=doSomething()") + .to("mock:result"); + + from("direct:other") + .to("bean:myOtherBean?method=doSomething()") .to("mock:result"); } }; @@ -63,4 +86,16 @@ public class BeanMethodWithEmptyParameterAndNoMethodWithNoParameterIssueTest ext } } + + public static final class MyOtherBean { + + public static void doSomething(Exchange exchange) { + exchange.getIn().setHeader("foo", "bar"); + } + + public static void doSomething(Exchange exchange, String foo, String bar) { + exchange.getIn().setHeader(foo, bar); + } + + } }
