This is an automated email from the ASF dual-hosted git repository. onders pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 3f72c51441555646b42165aabd86aa9a8f3a5d80 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon May 18 19:46:04 2020 +0200 CAMEL-15082: Fixed camel-bean to set additional bean parameters which did not work correctly before. --- .../apache/camel/component/bean/BeanEndpoint.java | 2 +- .../apache/camel/component/bean/BeanHolder.java | 12 +++++ .../camel/component/bean/ConstantBeanHolder.java | 24 ++++++++++ .../component/bean/ConstantTypeBeanHolder.java | 25 ++++++++++- .../apache/camel/component/bean/RegistryBean.java | 27 +++++++++++ .../camel/component/bean/RequestBeanHolder.java | 12 +++++ .../apache/camel/language/bean/BeanExpression.java | 2 +- ...entWithPropertiesLookupSetFromEndpointTest.java | 52 ++++++++++++++++++++++ 8 files changed, 153 insertions(+), 3 deletions(-) diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanEndpoint.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanEndpoint.java index 8d0df45..89483f3 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanEndpoint.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanEndpoint.java @@ -111,7 +111,7 @@ public class BeanEndpoint extends DefaultEndpoint { } processor.setScope(scope); if (parameters != null) { - setProperties(processor, parameters); + holder.setOptions(parameters); } } } diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHolder.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHolder.java index af56127..ab73441 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHolder.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHolder.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.bean; +import java.util.Map; + import org.apache.camel.Exchange; import org.apache.camel.NoSuchBeanException; import org.apache.camel.Processor; @@ -26,6 +28,16 @@ import org.apache.camel.Processor; public interface BeanHolder { /** + * Additional options that should be configured on the bean + */ + Map<String, Object> getOptions(); + + /** + * Sets additional options that should be configured on the bean + */ + void setOptions(Map<String, Object> options); + + /** * Gets the bean. * * @throws NoSuchBeanException is thrown if the bean cannot be found. diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java index 9f42b16..83b1313 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java @@ -16,10 +16,13 @@ */ package org.apache.camel.component.bean; +import java.util.Map; + import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.support.CamelContextHelper; +import org.apache.camel.support.PropertyBindingSupport; import org.apache.camel.util.ObjectHelper; /** @@ -29,6 +32,7 @@ public class ConstantBeanHolder implements BeanHolder { private final Object bean; private final BeanInfo beanInfo; private Processor processor; + private Map<String, Object> options; public ConstantBeanHolder(Object bean, BeanInfo beanInfo) { ObjectHelper.notNull(bean, "bean"); @@ -46,6 +50,26 @@ public class ConstantBeanHolder implements BeanHolder { } @Override + public Map<String, Object> getOptions() { + return options; + } + + @Override + public void setOptions(Map<String, Object> options) { + this.options = options; + + // since its a constant we can set the options immediately on the bean + if (options != null && !options.isEmpty()) { + PropertyBindingSupport.build() + .withRemoveParameters(false) + .withCamelContext(getBeanInfo().getCamelContext()) + .withProperties(options) + .withTarget(bean) + .bind(); + } + } + + @Override public String toString() { // avoid invoke toString on bean as it may be a remote proxy return ObjectHelper.className(bean) + "(" + ObjectHelper.getIdentityHashCode(bean) + ")"; diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java index 3802380..4191b32 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java @@ -16,9 +16,12 @@ */ package org.apache.camel.component.bean; +import java.util.Map; + import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Processor; +import org.apache.camel.support.PropertyBindingSupport; import org.apache.camel.util.ObjectHelper; /** @@ -27,6 +30,7 @@ import org.apache.camel.util.ObjectHelper; public class ConstantTypeBeanHolder implements BeanTypeHolder { private final Class<?> type; private final BeanInfo beanInfo; + private Map<String, Object> options; public ConstantTypeBeanHolder(Class<?> type, CamelContext context) { this(type, new BeanInfo(context, type)); @@ -40,6 +44,16 @@ public class ConstantTypeBeanHolder implements BeanTypeHolder { this.beanInfo = beanInfo; } + @Override + public Map<String, Object> getOptions() { + return options; + } + + @Override + public void setOptions(Map<String, Object> options) { + this.options = options; + } + /** * Creates a cached and constant {@link org.apache.camel.component.bean.BeanHolder} from this holder. * @@ -59,7 +73,16 @@ public class ConstantTypeBeanHolder implements BeanTypeHolder { public Object getBean(Exchange exchange) { // only create a bean if we have a default no-arg constructor if (beanInfo.hasPublicNoArgConstructors()) { - return getBeanInfo().getCamelContext().getInjector().newInstance(type, false); + Object bean = getBeanInfo().getCamelContext().getInjector().newInstance(type, false); + if (options != null && !options.isEmpty()) { + PropertyBindingSupport.build() + .withRemoveParameters(false) + .withCamelContext(getBeanInfo().getCamelContext()) + .withProperties(options) + .withTarget(bean) + .bind(); + } + return bean; } else { return null; } diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/RegistryBean.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/RegistryBean.java index d8376fd..907477b 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/RegistryBean.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/RegistryBean.java @@ -16,11 +16,14 @@ */ package org.apache.camel.component.bean; +import java.util.Map; + import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.NoSuchBeanException; import org.apache.camel.Processor; import org.apache.camel.spi.Registry; +import org.apache.camel.support.PropertyBindingSupport; /** * An implementation of a {@link BeanHolder} which will look up a bean from the registry and act as a cache of its metadata @@ -32,6 +35,7 @@ public class RegistryBean implements BeanHolder { private volatile BeanInfo beanInfo; private volatile Class<?> clazz; private ParameterMappingStrategy parameterMappingStrategy; + private Map<String, Object> options; public RegistryBean(CamelContext context, String name) { this(context.getRegistry(), context, name); @@ -59,6 +63,16 @@ public class RegistryBean implements BeanHolder { return "bean: " + name; } + @Override + public Map<String, Object> getOptions() { + return options; + } + + @Override + public void setOptions(Map<String, Object> options) { + this.options = options; + } + /** * Creates a singleton (cached and constant) {@link org.apache.camel.component.bean.BeanHolder} from this holder. */ @@ -70,6 +84,19 @@ public class RegistryBean implements BeanHolder { @Override public Object getBean(Exchange exchange) throws NoSuchBeanException { + Object bean = doGetBean(exchange); + if (options != null && !options.isEmpty()) { + PropertyBindingSupport.build() + .withRemoveParameters(false) + .withCamelContext(getBeanInfo().getCamelContext()) + .withProperties(options) + .withTarget(bean) + .bind(); + } + return bean; + } + + private Object doGetBean(Exchange exchange) throws NoSuchBeanException { // must always lookup bean first Object value = lookupBean(); diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/RequestBeanHolder.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/RequestBeanHolder.java index ce4d789..df98660 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/RequestBeanHolder.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/RequestBeanHolder.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.bean; +import java.util.Map; + import org.apache.camel.Exchange; import org.apache.camel.NoSuchBeanException; import org.apache.camel.Processor; @@ -34,6 +36,16 @@ public class RequestBeanHolder implements BeanHolder { } @Override + public Map<String, Object> getOptions() { + return holder.getOptions(); + } + + @Override + public void setOptions(Map<String, Object> options) { + this.holder.setOptions(options); + } + + @Override public Object getBean(Exchange exchange) throws NoSuchBeanException { Object bean = exchange.getProperty(key); if (bean == null) { diff --git a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java index 3d48bf0..8bc87cf 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java +++ b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java @@ -281,7 +281,7 @@ public class BeanExpression implements Expression, Predicate, AfterPropertiesCon } else if (beanName != null) { // it may refer to a type such as when used with bean language if (context.getRegistry().lookupByName(beanName) == null) { - + // TODO: ????? } holder = new RegistryBean(context, beanName); } else if (type != null) { diff --git a/core/camel-core/src/test/java/org/apache/camel/component/bean/BeanComponentWithPropertiesLookupSetFromEndpointTest.java b/core/camel-core/src/test/java/org/apache/camel/component/bean/BeanComponentWithPropertiesLookupSetFromEndpointTest.java new file mode 100644 index 0000000..55f3392 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/component/bean/BeanComponentWithPropertiesLookupSetFromEndpointTest.java @@ -0,0 +1,52 @@ +/* + * 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.component.bean; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.spi.Registry; +import org.junit.Test; + +public class BeanComponentWithPropertiesLookupSetFromEndpointTest extends ContextTestSupport { + + @Override + protected Registry createRegistry() throws Exception { + Registry jndi = super.createRegistry(); + jndi.bind("foo", "Hi"); + return jndi; + } + + @Test + public void testBeanComponent() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hi World"); + + template.sendBody("direct:start", "World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").to("bean:org.apache.camel.component.bean.MyPrefixBean?bean.prefix=#foo").to("mock:result"); + } + }; + } + +}