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