You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/03/06 15:31:34 UTC
[camel] branch bind updated: CAMEL-13283: Make a facade api for
CamelBeanPostProcessor.
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch bind
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/bind by this push:
new f6aa9b5 CAMEL-13283: Make a facade api for CamelBeanPostProcessor.
f6aa9b5 is described below
commit f6aa9b50e766f2280e2c62b0f88298df05a1c432
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Mar 6 16:31:17 2019 +0100
CAMEL-13283: Make a facade api for CamelBeanPostProcessor.
---
.../camel/spring/CamelBeanPostProcessor.java | 2 +-
.../camel/spring/CamelContextFactoryBean.java | 4 ++
.../main/java/org/apache/camel/CamelContext.java | 8 ++++
.../apache/camel/spi/CamelBeanPostProcessor.java | 56 ++++++++++++++++++++++
.../apache/camel/impl/AbstractCamelContext.java | 19 ++++++++
.../camel/impl/DefaultCamelBeanPostProcessor.java | 27 +----------
.../org/apache/camel/impl/DefaultCamelContext.java | 8 ++++
.../org/apache/camel/impl/DefaultInjector.java | 5 +-
.../java/org/apache/camel/main/MainSupport.java | 12 +----
.../camel/impl/BeanInjectRouteBuilderTest.java | 3 +-
.../CamelProduceInterfaceEventNotifierTest.java | 5 +-
.../impl/DefaultCamelBeanPostProcessorTest.java | 5 +-
12 files changed, 111 insertions(+), 43 deletions(-)
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java
index 2f7eec8..2674031 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java
@@ -49,7 +49,7 @@ import org.springframework.context.ApplicationContextAware;
@Metadata(label = "spring,configuration")
@XmlRootElement(name = "beanPostProcessor")
@XmlAccessorType(XmlAccessType.FIELD)
-public class CamelBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {
+public class CamelBeanPostProcessor implements org.apache.camel.spi.CamelBeanPostProcessor, BeanPostProcessor, ApplicationContextAware {
private static final Logger LOG = LoggerFactory.getLogger(CamelBeanPostProcessor.class);
@XmlTransient
Set<String> prototypeBeans = new LinkedHashSet<>();
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
index 9613697..1f3cd17 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
@@ -277,6 +277,10 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
if (beanPostProcessor instanceof CamelBeanPostProcessor) {
((CamelBeanPostProcessor) beanPostProcessor).setCamelContext(getContext());
}
+ // register the bean post processor on camel context
+ if (beanPostProcessor instanceof org.apache.camel.spi.CamelBeanPostProcessor) {
+ context.setBeanPostProcessor((org.apache.camel.spi.CamelBeanPostProcessor) beanPostProcessor);
+ }
}
}
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 93348d0..247b52d 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
@@ -26,6 +26,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import org.apache.camel.spi.AsyncProcessorAwaitManager;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.CamelContextNameStrategy;
import org.apache.camel.spi.ClassResolver;
import org.apache.camel.spi.DataFormat;
@@ -713,6 +714,13 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
Injector getInjector();
/**
+ * Returns the bean post processor used to do any bean customization.
+ *
+ * @return the bean post processor.
+ */
+ CamelBeanPostProcessor getBeanPostProcessor();
+
+ /**
* Returns the management mbean assembler
*
* @return the mbean assembler
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/CamelBeanPostProcessor.java b/core/camel-api/src/main/java/org/apache/camel/spi/CamelBeanPostProcessor.java
new file mode 100644
index 0000000..bc957b1
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/CamelBeanPostProcessor.java
@@ -0,0 +1,56 @@
+/**
+ * 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.spi;
+
+/**
+ * Bean post processor.
+ */
+public interface CamelBeanPostProcessor {
+
+ /**
+ * Apply this post processor to the given new bean instance <i>before</i> any bean
+ * initialization callbacks (like <code>afterPropertiesSet</code>
+ * or a custom init-method). The bean will already be populated with property values.
+ * The returned bean instance may be a wrapper around the original.
+ *
+ * @param bean the new bean instance
+ * @param beanName the name of the bean
+ * @return the bean instance to use, either the original or a wrapped one; if
+ * <code>null</code>, no subsequent BeanPostProcessors will be invoked
+ * @throws Exception is thrown if error post processing bean
+ */
+ default Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception {
+ return bean;
+ }
+
+ /**
+ * Apply this post processor to the given new bean instance <i>after</i> any bean
+ * initialization callbacks (like <code>afterPropertiesSet</code>
+ * or a custom init-method). The bean will already be populated with property values.
+ * The returned bean instance may be a wrapper around the original.
+ *
+ * @param bean the new bean instance
+ * @param beanName the name of the bean
+ * @return the bean instance to use, either the original or a wrapped one; if
+ * <code>null</code>, no subsequent BeanPostProcessors will be invoked
+ * @throws Exception is thrown if error post processing bean
+ */
+ default Object postProcessAfterInitialization(Object bean, String beanName) throws Exception {
+ return bean;
+ }
+
+}
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 04348aa..f72e378 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
@@ -109,6 +109,7 @@ import org.apache.camel.processor.interceptor.HandleFault;
import org.apache.camel.reifier.RouteReifier;
import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
import org.apache.camel.spi.AsyncProcessorAwaitManager;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.CamelContextNameStrategy;
import org.apache.camel.spi.CamelContextTracker;
import org.apache.camel.spi.ClassResolver;
@@ -252,6 +253,7 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod
private volatile TypeConverter typeConverter;
private volatile TypeConverterRegistry typeConverterRegistry;
private volatile Injector injector;
+ private volatile CamelBeanPostProcessor beanPostProcessor;
private volatile ComponentResolver componentResolver;
private volatile LanguageResolver languageResolver;
private volatile DataFormatResolver dataFormatResolver;
@@ -2485,6 +2487,21 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod
this.injector = doAddService(injector);
}
+ public CamelBeanPostProcessor getBeanPostProcessor() {
+ if (beanPostProcessor == null) {
+ synchronized (lock) {
+ if (beanPostProcessor == null) {
+ setBeanPostProcessor(createBeanPostProcessor());
+ }
+ }
+ }
+ return beanPostProcessor;
+ }
+
+ public void setBeanPostProcessor(CamelBeanPostProcessor beanPostProcessor) {
+ this.beanPostProcessor = doAddService(beanPostProcessor);
+ }
+
public ManagementMBeanAssembler getManagementMBeanAssembler() {
return managementMBeanAssembler;
}
@@ -4698,6 +4715,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod
protected abstract Injector createInjector();
+ protected abstract CamelBeanPostProcessor createBeanPostProcessor();
+
protected abstract ComponentResolver createComponentResolver();
protected abstract Registry createRegistry();
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java
index e64f1fe..584fee6 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java
@@ -32,6 +32,7 @@ import org.apache.camel.Produce;
import org.apache.camel.PropertyInject;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.Registry;
import org.apache.camel.support.DefaultEndpoint;
import org.apache.camel.util.ReflectionHelper;
@@ -57,7 +58,7 @@ import static org.apache.camel.util.ObjectHelper.isEmpty;
* Components such as <tt>camel-spring</tt>, and <tt>camel-blueprint</tt> can leverage this post processor to hook in Camel
* bean post processing into their bean processing framework.
*/
-public class DefaultCamelBeanPostProcessor {
+public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
protected static final Logger LOG = LoggerFactory.getLogger(DefaultCamelBeanPostProcessor.class);
protected CamelPostProcessorHelper camelPostProcessorHelper;
@@ -70,18 +71,6 @@ public class DefaultCamelBeanPostProcessor {
this.camelContext = camelContext;
}
- /**
- * Apply this post processor to the given new bean instance <i>before</i> any bean
- * initialization callbacks (like <code>afterPropertiesSet</code>
- * or a custom init-method). The bean will already be populated with property values.
- * The returned bean instance may be a wrapper around the original.
- *
- * @param bean the new bean instance
- * @param beanName the name of the bean
- * @return the bean instance to use, either the original or a wrapped one; if
- * <code>null</code>, no subsequent BeanPostProcessors will be invoked
- * @throws Exception is thrown if error post processing bean
- */
public Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception {
LOG.trace("Camel bean processing before initialization for bean: {}", beanName);
@@ -110,18 +99,6 @@ public class DefaultCamelBeanPostProcessor {
return bean;
}
- /**
- * Apply this post processor to the given new bean instance <i>after</i> any bean
- * initialization callbacks (like <code>afterPropertiesSet</code>
- * or a custom init-method). The bean will already be populated with property values.
- * The returned bean instance may be a wrapper around the original.
- *
- * @param bean the new bean instance
- * @param beanName the name of the bean
- * @return the bean instance to use, either the original or a wrapped one; if
- * <code>null</code>, no subsequent BeanPostProcessors will be invoked
- * @throws Exception is thrown if error post processing bean
- */
public Object postProcessAfterInitialization(Object bean, String beanName) throws Exception {
LOG.trace("Camel bean processing after initialization for bean: {}", beanName);
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 201eb8b..6e9848e 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
@@ -42,6 +42,7 @@ import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
import org.apache.camel.runtimecatalog.impl.DefaultRuntimeCamelCatalog;
import org.apache.camel.spi.AsyncProcessorAwaitManager;
import org.apache.camel.spi.BeanRepository;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.CamelContextNameStrategy;
import org.apache.camel.spi.ClassResolver;
import org.apache.camel.spi.ComponentResolver;
@@ -167,6 +168,13 @@ public class DefaultCamelContext extends AbstractCamelContext {
}
/**
+ * Lazily create a default bean post processor
+ */
+ protected CamelBeanPostProcessor createBeanPostProcessor() {
+ return new DefaultCamelBeanPostProcessor(this);
+ }
+
+ /**
* Lazily create a default implementation
*/
protected ComponentResolver createComponentResolver() {
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java
index fd3f128..7324da2 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java
@@ -18,6 +18,7 @@ package org.apache.camel.impl;
import org.apache.camel.CamelContext;
import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.Injector;
import org.apache.camel.support.ObjectHelper;
@@ -31,10 +32,10 @@ import org.apache.camel.support.ObjectHelper;
public class DefaultInjector implements Injector {
// use the reflection injector
- private final DefaultCamelBeanPostProcessor postProcessor;
+ private final CamelBeanPostProcessor postProcessor;
public DefaultInjector(CamelContext context) {
- postProcessor = new DefaultCamelBeanPostProcessor(context);
+ postProcessor = context.getBeanPostProcessor();
}
@Override
diff --git a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
index b83ac2b..660ffdf 100644
--- a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
@@ -35,17 +35,14 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.camel.CamelContext;
import org.apache.camel.Component;
import org.apache.camel.ProducerTemplate;
-import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.impl.DefaultCamelBeanPostProcessor;
-import org.apache.camel.impl.DefaultModelJAXBContextFactory;
import org.apache.camel.impl.FileWatcherReloadStrategy;
import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.DataFormat;
import org.apache.camel.spi.EventNotifier;
import org.apache.camel.spi.Language;
-import org.apache.camel.spi.ModelJAXBContextFactory;
import org.apache.camel.spi.PropertiesComponent;
import org.apache.camel.spi.ReloadStrategy;
import org.apache.camel.support.EndpointHelper;
@@ -635,15 +632,10 @@ public abstract class MainSupport extends ServiceSupport {
postProcessCamelContext(camelContext);
}
- public ModelJAXBContextFactory getModelJAXBContextFactory() {
- return new DefaultModelJAXBContextFactory();
- }
-
protected void loadRouteBuilders(CamelContext camelContext) throws Exception {
// lets use Camel's bean post processor on any existing route builder classes
// so the instance has some support for dependency injection
- // TODO: We should have this hidden behind an interface, so we can do bean post processing via camel-api
- DefaultCamelBeanPostProcessor postProcessor = new DefaultCamelBeanPostProcessor(getCamelContext());
+ CamelBeanPostProcessor postProcessor = camelContext.getBeanPostProcessor();
for (RouteBuilder routeBuilder : getRouteBuilders()) {
postProcessor.postProcessBeforeInitialization(routeBuilder, routeBuilder.getClass().getName());
postProcessor.postProcessAfterInitialization(routeBuilder, routeBuilder.getClass().getName());
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java
index 9661027..a445b59 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java
@@ -22,6 +22,7 @@ import org.apache.camel.ContextTestSupport;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.junit.Test;
public class BeanInjectRouteBuilderTest extends ContextTestSupport {
@@ -41,7 +42,7 @@ public class BeanInjectRouteBuilderTest extends ContextTestSupport {
CamelContext context = super.createCamelContext();
// manual post process us as ContextTestSupport in camel-core doesn't do that out of the box
- DefaultCamelBeanPostProcessor post = new DefaultCamelBeanPostProcessor(context);
+ CamelBeanPostProcessor post = context.getBeanPostProcessor();
post.postProcessBeforeInitialization(this, "MyRoute");
post.postProcessAfterInitialization(this, "MyRoute");
return context;
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java
index 24e5c82..4c27500 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java
@@ -22,6 +22,7 @@ import java.util.List;
import org.apache.camel.CamelContext;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.Produce;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.CamelEvent;
import org.apache.camel.support.EventNotifierSupport;
import org.junit.Before;
@@ -31,7 +32,7 @@ public class CamelProduceInterfaceEventNotifierTest extends ContextTestSupport {
private static List<CamelEvent> events = new ArrayList<>();
- private DefaultCamelBeanPostProcessor postProcessor;
+ private CamelBeanPostProcessor postProcessor;
@Override
protected CamelContext createCamelContext() throws Exception {
@@ -75,7 +76,7 @@ public class CamelProduceInterfaceEventNotifierTest extends ContextTestSupport {
@Before
public void setUp() throws Exception {
super.setUp();
- postProcessor = new DefaultCamelBeanPostProcessor(context);
+ postProcessor = context.getBeanPostProcessor();
}
interface FooService {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java
index bdad223..0c8c8b0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java
@@ -21,12 +21,13 @@ import org.apache.camel.Consume;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
+import org.apache.camel.spi.CamelBeanPostProcessor;
import org.junit.Before;
import org.junit.Test;
public class DefaultCamelBeanPostProcessorTest extends ContextTestSupport {
- private DefaultCamelBeanPostProcessor postProcessor;
+ private CamelBeanPostProcessor postProcessor;
@Test
public void testPostProcessor() throws Exception {
@@ -57,7 +58,7 @@ public class DefaultCamelBeanPostProcessorTest extends ContextTestSupport {
@Before
public void setUp() throws Exception {
super.setUp();
- postProcessor = new DefaultCamelBeanPostProcessor(context);
+ postProcessor = context.getBeanPostProcessor();
}
@BindToRegistry