Author: davsclaus Date: Wed Aug 3 19:34:46 2011 New Revision: 1153620 URL: http://svn.apache.org/viewvc?rev=1153620&view=rev Log: CAMEL-4293: Fixed issue when invoking a Bean and that bean has a @Bean in the method signature. Causing @Bean to not invoke its configured method.
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTwoTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java?rev=1153620&r1=1153619&r2=1153620&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java Wed Aug 3 19:34:46 2011 @@ -369,6 +369,13 @@ public class MethodInfo { it = ObjectHelper.createIterator(methodParameters); } + // remove headers as they should not be propagated + // we need to do this before the expressions gets evaluated as it may contain + // a @Bean expression which would by mistake read these headers. So the headers + // must be removed at this point of time + exchange.getIn().removeHeader(Exchange.BEAN_MULTI_PARAMETER_ARRAY); + exchange.getIn().removeHeader(Exchange.BEAN_METHOD_NAME); + for (int i = 0; i < size; i++) { // grab the parameter value for the given index Object parameterValue = it != null && it.hasNext() ? it.next() : null; Added: camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTest.java?rev=1153620&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTest.java Wed Aug 3 19:34:46 2011 @@ -0,0 +1,130 @@ +/** + * 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 org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; + +/** + * + */ +public class BeanAnnotationParameterTest extends ContextTestSupport { + + public void testBeanAnnotationOne() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); + + template.sendBody("direct:one", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testBeanAnnotationTwo() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); + + template.sendBody("direct:two", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testBeanAnnotationThree() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); + + template.sendBody("direct:three", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testBeanAnnotationFour() throws Exception { + getMockEndpoint("mock:middle").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); + + template.sendBody("direct:four", "World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("GreetingService", new GreetingService()); + return jndi; + } + + @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(MyBean.class, "callA") + .to("mock:result"); + + from("direct:three") + .setHeader(Exchange.BEAN_METHOD_NAME, constant("callA")) + .bean(MyBean.class) + .to("mock:result"); + + from("direct:four") + .bean(MyBean.class, "callA") + .to("mock:middle") + .bean(MyBean.class, "callB") + .to("mock:result"); + } + }; + } + + public static final class MyBean { + + public String callA(@Bean(ref = "GreetingService", method = "english") String greeting, String body) { + return greeting + " " + body; + } + + public String callB() { + return "Bye World"; + } + + } + + public static final class GreetingService { + + public String callA() { + throw new IllegalArgumentException("Should not callA"); + } + + public String callB() { + throw new IllegalArgumentException("Should not callB"); + } + + public String english() { + return "Hello"; + } + + public String french() { + return "Bonjour"; + } + + public String german() { + return "Hallo"; + } + } +} Added: camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTwoTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTwoTest.java?rev=1153620&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTwoTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanAnnotationParameterTwoTest.java Wed Aug 3 19:34:46 2011 @@ -0,0 +1,132 @@ +/** + * 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 org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; + +/** + * + */ +public class BeanAnnotationParameterTwoTest extends ContextTestSupport { + + public void testBeanAnnotationOne() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello/Bonjour World"); + + template.sendBody("direct:one", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testBeanAnnotationTwo() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello/Bonjour World"); + + template.sendBody("direct:two", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testBeanAnnotationThree() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello/Bonjour World"); + + template.sendBody("direct:three", "World"); + + assertMockEndpointsSatisfied(); + } + + public void testBeanAnnotationFour() throws Exception { + getMockEndpoint("mock:middle").expectedBodiesReceived("Hello/Bonjour World"); + getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); + + template.sendBody("direct:four", "World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("GreetingService", new GreetingService()); + return jndi; + } + + @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(MyBean.class, "callA") + .to("mock:result"); + + from("direct:three") + .setHeader(Exchange.BEAN_METHOD_NAME, constant("callA")) + .bean(MyBean.class) + .to("mock:result"); + + from("direct:four") + .bean(MyBean.class, "callA") + .to("mock:middle") + .bean(MyBean.class, "callB") + .to("mock:result"); + } + }; + } + + public static final class MyBean { + + public String callA(@Bean(ref = "GreetingService", method = "english") String greeting, + @Bean(ref = "GreetingService", method = "french") String french, + String body) { + return greeting + "/" + french + " " + body; + } + + public String callB() { + return "Bye World"; + } + + } + + public static final class GreetingService { + + public String callA() { + throw new IllegalArgumentException("Should not callA"); + } + + public String callB() { + throw new IllegalArgumentException("Should not callB"); + } + + public String english() { + return "Hello"; + } + + public String french() { + return "Bonjour"; + } + + public String german() { + return "Hallo"; + } + } +}