CAMEL-8113: Optimize type converter registry.

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7f5301b7
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7f5301b7
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7f5301b7

Branch: refs/heads/master
Commit: 7f5301b75bc30acfe7c37d12225f385b2a2e9c3b
Parents: a707e51
Author: Claus Ibsen <davscl...@apache.org>
Authored: Thu Dec 18 17:12:40 2014 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Dec 18 21:27:57 2014 +0100

----------------------------------------------------------------------
 .../apache/camel/component/bean/BeanHolder.java   |  7 +++++++
 .../camel/component/bean/BeanProcessor.java       | 18 +++++++++++++-----
 .../camel/component/bean/ConstantBeanHolder.java  | 12 +++++++++---
 .../component/bean/ConstantTypeBeanHolder.java    |  4 ++++
 .../apache/camel/component/bean/RegistryBean.java |  4 ++++
 ...TypeConverterRegistryStatsPerformanceTest.java |  8 ++++++--
 6 files changed, 43 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java 
b/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java
index 7f26df3..5cb9dd4 100644
--- a/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java
+++ b/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java
@@ -41,6 +41,13 @@ public interface BeanHolder {
     Processor getProcessor();
 
     /**
+     * Whether a {@link Processor} is supported by this bean holder.
+     *
+     * @return <tt>true</tt> if the holder can supporting using a processor, 
<tt>false</tt> otherwise
+     */
+    boolean supportProcessor();
+
+    /**
      * Gets bean info for the bean.
      */
     BeanInfo getBeanInfo();

http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java 
b/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java
index 055ebfb..bf8ddbe 100644
--- 
a/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java
+++ 
b/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java
@@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory;
 public class BeanProcessor extends ServiceSupport implements AsyncProcessor {
     private static final Logger LOG = 
LoggerFactory.getLogger(BeanProcessor.class);
 
+    private Processor processor;
     private boolean multiParameterArray;
     private String method;
     private BeanHolder beanHolder;
@@ -90,8 +91,11 @@ public class BeanProcessor extends ServiceSupport implements 
AsyncProcessor {
         // do we have a custom adapter for this POJO to a Processor
         // but only do this if allowed
         if (allowProcessor(explicitMethodName, beanInfo)) {
-            // so if there is a custom type converter for the bean to processor
-            Processor processor = 
exchange.getContext().getTypeConverter().tryConvertTo(Processor.class, 
exchange, bean);
+            Processor processor = getProcessor();
+            if (processor == null) {
+                // so if there is a custom type converter for the bean to 
processor
+                processor = 
exchange.getContext().getTypeConverter().convertTo(Processor.class, exchange, 
bean);
+            }
             if (processor != null) {
                 LOG.trace("Using a custom adapter as bean invocation: {}", 
processor);
                 try {
@@ -168,7 +172,7 @@ public class BeanProcessor extends ServiceSupport 
implements AsyncProcessor {
     }
 
     protected Processor getProcessor() {
-        return beanHolder.getProcessor();
+        return processor;
     }
 
     public Object getBean() {
@@ -214,11 +218,15 @@ public class BeanProcessor extends ServiceSupport 
implements AsyncProcessor {
     // Implementation methods
     //-------------------------------------------------------------------------
     protected void doStart() throws Exception {
-        ServiceHelper.startService(getProcessor());
+        // optimize to only get (create) a processor if really needed
+        if (beanHolder.supportProcessor() && allowProcessor(method, 
beanHolder.getBeanInfo())) {
+            processor = beanHolder.getProcessor();
+            ServiceHelper.startService(processor);
+        }
     }
 
     protected void doStop() throws Exception {
-        ServiceHelper.stopService(getProcessor());
+        ServiceHelper.stopService(processor);
     }
 
     private boolean allowProcessor(String explicitMethodName, BeanInfo info) {

http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java
 
b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java
index 2cac840..d2cbe1c 100644
--- 
a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java
+++ 
b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java
@@ -29,7 +29,7 @@ import org.apache.camel.util.ObjectHelper;
 public class ConstantBeanHolder implements BeanHolder {
     private final Object bean;
     private final BeanInfo beanInfo;
-    private final Processor processor;
+    private Processor processor;
 
     public ConstantBeanHolder(Object bean, BeanInfo beanInfo) {
         ObjectHelper.notNull(bean, "bean");
@@ -37,7 +37,6 @@ public class ConstantBeanHolder implements BeanHolder {
 
         this.bean = bean;
         this.beanInfo = beanInfo;
-        this.processor = 
CamelContextHelper.convertTo(beanInfo.getCamelContext(), Processor.class, bean);
     }
 
     public ConstantBeanHolder(Object bean, CamelContext context) {
@@ -59,7 +58,14 @@ public class ConstantBeanHolder implements BeanHolder {
     }
 
     public Processor getProcessor() {
-        return processor;
+        if (this.processor == null) {
+            this.processor = 
CamelContextHelper.convertTo(beanInfo.getCamelContext(), Processor.class, bean);
+        }
+        return this.processor;
+    }
+
+    public boolean supportProcessor() {
+        return true;
     }
 
     public BeanInfo getBeanInfo() {

http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java
 
b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java
index b0b0694..8c9dc55 100644
--- 
a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java
+++ 
b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java
@@ -68,6 +68,10 @@ public class ConstantTypeBeanHolder implements 
BeanTypeHolder {
         return null;
     }
 
+    public boolean supportProcessor() {
+        return false;
+    }
+
     public BeanInfo getBeanInfo() {
         return beanInfo;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java 
b/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java
index 76a2f81..5f645f9 100644
--- a/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java
+++ b/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java
@@ -93,6 +93,10 @@ public class RegistryBean implements BeanHolder {
         return null;
     }
 
+    public boolean supportProcessor() {
+        return false;
+    }
+
     public BeanInfo getBeanInfo() {
         if (beanInfo == null) {
             Object bean = getBean();

http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
 
b/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
index 077f0f2..ab3d170 100644
--- 
a/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
@@ -64,8 +64,8 @@ public class TypeConverterRegistryStatsPerformanceTest 
extends ContextTestSuppor
             public void configure() {
                 from("direct:start")
                     
.transform().method(TypeConverterRegistryStatsPerformanceTest.class, 
"transformMe")
-//                    .bean(TypeConverterRegistryStatsPerformanceTest.class, 
"transformMe")
-                        .to("mock:result");
+                    .bean(TypeConverterRegistryStatsPerformanceTest.class, 
"transformMeAlso")
+                    .to("mock:result");
             }
         };
     }
@@ -73,4 +73,8 @@ public class TypeConverterRegistryStatsPerformanceTest 
extends ContextTestSuppor
     public String transformMe(String in) {
         return "Hello " + in;
     }
+
+    public String transformMeAlso(String in) {
+        return "Bye " + in;
+    }
 }

Reply via email to