This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch bean in repository https://gitbox.apache.org/repos/asf/camel.git
commit 41dfd8972a68e828fbb54c97dde2abcab025a0ce Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Apr 25 11:02:15 2019 +0200 CAMEL-13449: camel3 - Move bean component out of camel-core --- .../component/bean/DefaultBeanProxyFactory.java | 3 + .../services/org/apache/camel/bean-proxy-factory | 18 ++++++ .../main/java/org/apache/camel/CamelContext.java | 6 ++ .../org/apache/camel/builder/ProxyBuilder.java | 4 +- .../apache/camel/impl/AbstractCamelContext.java | 22 +++++++ .../camel/impl/BeanProxyFactoryResolver.java | 71 ++++++++++++++++++++++ .../camel/impl/CamelPostProcessorHelper.java | 4 +- .../org/apache/camel/impl/DefaultCamelContext.java | 5 ++ 8 files changed, 129 insertions(+), 4 deletions(-) diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/DefaultBeanProxyFactory.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/DefaultBeanProxyFactory.java index 421c86d..b2eeaa6 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/DefaultBeanProxyFactory.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/DefaultBeanProxyFactory.java @@ -21,6 +21,9 @@ import org.apache.camel.spi.BeanProxyFactory; public final class DefaultBeanProxyFactory implements BeanProxyFactory { + public DefaultBeanProxyFactory() { + } + @SafeVarargs @Override public final <T> T createProxy(Endpoint endpoint, boolean binding, Class<T>... interfaceClasses) throws Exception { diff --git a/components/camel-bean/src/main/resources/META-INF/services/org/apache/camel/bean-proxy-factory b/components/camel-bean/src/main/resources/META-INF/services/org/apache/camel/bean-proxy-factory new file mode 100644 index 0000000..58e2e9a --- /dev/null +++ b/components/camel-bean/src/main/resources/META-INF/services/org/apache/camel/bean-proxy-factory @@ -0,0 +1,18 @@ +# +# 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. +# + +class=org.apache.camel.component.bean.DefaultBeanProxyFactory diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java index e6b4a66..80aaa76 100644 --- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java +++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java @@ -25,6 +25,7 @@ import java.util.concurrent.ScheduledExecutorService; import org.apache.camel.spi.AnnotationBasedProcessorFactory; import org.apache.camel.spi.AsyncProcessorAwaitManager; +import org.apache.camel.spi.BeanProxyFactory; import org.apache.camel.spi.CamelBeanPostProcessor; import org.apache.camel.spi.CamelContextNameStrategy; import org.apache.camel.spi.ClassResolver; @@ -1485,4 +1486,9 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration { */ AnnotationBasedProcessorFactory getAnnotationBasedProcessorFactory(); + /** + * Gets the {@link BeanProxyFactory} to use. + */ + BeanProxyFactory getBeanProxyFactory(); + } diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java b/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java index 7e0e759..263135a 100644 --- a/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java +++ b/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java @@ -81,9 +81,9 @@ public final class ProxyBuilder { public <T> T build(Class<T>... interfaceClasses) throws Exception { ObjectHelper.notNull(endpoint, "endpoint"); // use proxy service - BeanProxyFactory factory = camelContext.hasService(BeanProxyFactory.class); + BeanProxyFactory factory = camelContext.getBeanProxyFactory(); if (factory == null) { - throw new IllegalArgumentException("Cannot find BeanProxyFactory service. Make sure camel-bean is on the classpath."); + throw new IllegalArgumentException("Cannot find BeanProxyFactory. Make sure camel-bean is on the classpath."); } return factory.createProxy(endpoint, binding, interfaceClasses); } diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java b/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java index 98e84bb..748554d 100644 --- a/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java +++ b/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java @@ -105,6 +105,7 @@ import org.apache.camel.reifier.RouteReifier; import org.apache.camel.runtimecatalog.RuntimeCamelCatalog; import org.apache.camel.spi.AnnotationBasedProcessorFactory; import org.apache.camel.spi.AsyncProcessorAwaitManager; +import org.apache.camel.spi.BeanProxyFactory; import org.apache.camel.spi.CamelBeanPostProcessor; import org.apache.camel.spi.CamelContextNameStrategy; import org.apache.camel.spi.CamelContextTracker; @@ -254,6 +255,7 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod private volatile ManagementMBeanAssembler managementMBeanAssembler; private volatile RestRegistry restRegistry; private volatile HeadersMapFactory headersMapFactory; + private volatile BeanProxyFactory beanProxyFactory; private volatile ClassResolver classResolver; private volatile PackageScanClassResolver packageScanClassResolver; private volatile ServicePool<Producer> producerServicePool; @@ -2561,6 +2563,12 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod // Start runtime catalog getExtension(RuntimeCamelCatalog.class); + // if camel-bean is on classpath then we can load its bean proxy facory + BeanProxyFactory beanProxyFactory = new BeanProxyFactoryResolver().resolve(this); + if (beanProxyFactory != null) { + addService(beanProxyFactory); + } + // re-create endpoint registry as the cache size limit may be set after the constructor of this instance was called. // and we needed to create endpoints up-front as it may be accessed before this context is started endpoints = doAddService(createEndpointRegistry(endpoints)); @@ -3936,6 +3944,18 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod return annotationBasedProcessorFactory; } + @Override + public BeanProxyFactory getBeanProxyFactory() { + if (beanProxyFactory == null) { + synchronized (lock) { + if (beanProxyFactory == null) { + beanProxyFactory = createBeanProxyFactory(); + } + } + } + return beanProxyFactory; + } + protected Map<String, RouteService> getRouteServices() { return routeServices; } @@ -4037,6 +4057,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod protected abstract HeadersMapFactory createHeadersMapFactory(); + protected abstract BeanProxyFactory createBeanProxyFactory(); + protected abstract LanguageResolver createLanguageResolver(); protected abstract RestRegistry createRestRegistry(); diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/BeanProxyFactoryResolver.java b/core/camel-core/src/main/java/org/apache/camel/impl/BeanProxyFactoryResolver.java new file mode 100644 index 0000000..de002e1 --- /dev/null +++ b/core/camel-core/src/main/java/org/apache/camel/impl/BeanProxyFactoryResolver.java @@ -0,0 +1,71 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.impl; + +import java.io.IOException; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.BeanProxyFactory; +import org.apache.camel.spi.FactoryFinder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Factory resolver to find the {@link BeanProxyFactory} from the classpath in camel-bean. + */ +public class BeanProxyFactoryResolver { + + public static final String RESOURCE_PATH = "META-INF/services/org/apache/camel/"; + + private static final Logger LOG = LoggerFactory.getLogger(BeanProxyFactoryResolver.class); + + private FactoryFinder factoryFinder; + + public BeanProxyFactory resolve(CamelContext context) { + // use factory finder to find a custom implementations + Class<?> type = null; + try { + type = findFactory("bean-proxy-factory", context); + } catch (Exception e) { + // ignore + } + + if (type != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Found BeanProxyFactory: {} via: {}{}", type.getName(), factoryFinder.getResourcePath(), "bean-proxy-factory"); + } + if (BeanProxyFactory.class.isAssignableFrom(type)) { + BeanProxyFactory answer = (BeanProxyFactory) context.getInjector().newInstance(type); + LOG.info("Detected and using custom BeanProxyFactory: {}", answer); + return answer; + } else { + throw new IllegalArgumentException("Type is not a BeanProxyFactory implementation. Found: " + type.getName()); + } + } + + LOG.debug("Cannot find BeanProxyFactory. Make sure camel-bean is on the classpath."); + return null; + } + + private Class<?> findFactory(String name, CamelContext context) throws ClassNotFoundException, IOException { + if (factoryFinder == null) { + factoryFinder = context.getFactoryFinder(RESOURCE_PATH); + } + return factoryFinder.findClass(name); + } + +} diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java b/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java index 467b85f..130854f 100644 --- a/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java +++ b/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java @@ -251,9 +251,9 @@ public class CamelPostProcessorHelper implements CamelContextAware { // lets create a proxy try { // use proxy service - BeanProxyFactory factory = camelContext.hasService(BeanProxyFactory.class); + BeanProxyFactory factory = camelContext.getBeanProxyFactory(); if (factory == null) { - throw new IllegalArgumentException("Cannot find BeanProxyFactory service. Make sure camel-bean is on the classpath."); + throw new IllegalArgumentException("Cannot find BeanProxyFactory. Make sure camel-bean is on the classpath."); } return factory.createProxy(endpoint, binding, type); } catch (Exception e) { diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java index 4c64ba9..f635af3 100644 --- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java +++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java @@ -36,6 +36,7 @@ import org.apache.camel.model.validator.ValidatorDefinition; import org.apache.camel.runtimecatalog.RuntimeCamelCatalog; import org.apache.camel.runtimecatalog.impl.DefaultRuntimeCamelCatalog; import org.apache.camel.spi.AsyncProcessorAwaitManager; +import org.apache.camel.spi.BeanProxyFactory; import org.apache.camel.spi.BeanRepository; import org.apache.camel.spi.CamelBeanPostProcessor; import org.apache.camel.spi.CamelContextNameStrategy; @@ -276,6 +277,10 @@ public class DefaultCamelContext extends AbstractCamelContext { return new HeadersMapFactoryResolver().resolve(this); } + protected BeanProxyFactory createBeanProxyFactory() { + return new BeanProxyFactoryResolver().resolve(this); + } + protected LanguageResolver createLanguageResolver() { return new DefaultLanguageResolver(); }