You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by ta...@apache.org on 2016/06/07 20:02:50 UTC

deltaspike git commit: DELTASPIKE-1168 [perf] optimize DelegateQueryBuilder#selectDelegate

Repository: deltaspike
Updated Branches:
  refs/heads/master f47b9d305 -> 6c5f4d21c


DELTASPIKE-1168 [perf] optimize DelegateQueryBuilder#selectDelegate

Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/6c5f4d21
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/6c5f4d21
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/6c5f4d21

Branch: refs/heads/master
Commit: 6c5f4d21ccb28d9f4d9c1b00087846180c0fdf94
Parents: f47b9d3
Author: Thomas Andraschko <ta...@apache.org>
Authored: Tue Jun 7 22:02:44 2016 +0200
Committer: Thomas Andraschko <ta...@apache.org>
Committed: Tue Jun 7 22:02:44 2016 +0200

----------------------------------------------------------------------
 .../data/impl/builder/DelegateQueryBuilder.java | 59 ++++++++++++--------
 1 file changed, 37 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6c5f4d21/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
index 87218b3..c17a1f6 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
@@ -21,6 +21,8 @@ package org.apache.deltaspike.data.impl.builder;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 import javax.enterprise.context.ApplicationScoped;
 
@@ -49,12 +51,15 @@ public class DelegateQueryBuilder extends QueryBuilder
     @Inject
     private BeanManager beanManager;
 
+    private final Map<Method, Bean<DelegateQueryHandler>> lookupCache
+        = new HashMap<Method, Bean<DelegateQueryHandler>>();
+    
     @Override
     public Object execute(CdiQueryInvocationContext context)
     {
         try
         {
-            DelegateQueryHandler delegate = selectDelegate(context);
+            DelegateQueryHandler delegate = lookup(context);
             if (delegate != null)
             {
                 Object result = invoke(delegate, context);
@@ -83,25 +88,42 @@ public class DelegateQueryBuilder extends QueryBuilder
         throw new QueryInvocationException("No DelegateQueryHandler found", context);
     }
 
-    private DelegateQueryHandler selectDelegate(CdiQueryInvocationContext context)
+    private DelegateQueryHandler lookup(CdiQueryInvocationContext context)
     {
-        Set<Bean<DelegateQueryHandler>> beans = BeanProvider
-                .getBeanDefinitions(DelegateQueryHandler.class, true, true);
-        for (Bean<DelegateQueryHandler> bean : beans)
+        Bean<DelegateQueryHandler> selectedBean = lookupCache.get(context.getMethod());
+        
+        if (selectedBean == null)
         {
-            if (ClassUtils.containsPossiblyGenericMethod(bean.getBeanClass(), context.getMethod()))
+            Set<Bean<DelegateQueryHandler>> beans = BeanProvider
+                    .getBeanDefinitions(DelegateQueryHandler.class, true, true);
+            for (Bean<DelegateQueryHandler> bean : beans)
             {
-                if (bean.getScope().equals(Dependent.class))
+                if (ClassUtils.containsPossiblyGenericMethod(bean.getBeanClass(), context.getMethod()))
                 {
-                    CreationalContext<DelegateQueryHandler> cc = beanManager.createCreationalContext(bean);
-                    DelegateQueryHandler instance = (DelegateQueryHandler) beanManager.getReference(
-                            bean, DelegateQueryHandler.class, cc);
-                    context.addDestroyable(new BeanDestroyable<DelegateQueryHandler>(bean, instance, cc));
-                    return instance;
+                    selectedBean = bean;
                 }
-                return (DelegateQueryHandler) BeanProvider.getContextualReference(bean.getBeanClass());
+            }
+            
+            if (selectedBean != null)
+            {
+                lookupCache.put(context.getMethod(), selectedBean);
             }
         }
+        
+        
+        if (selectedBean != null)
+        {
+            CreationalContext<DelegateQueryHandler> cc = beanManager.createCreationalContext(selectedBean);
+            DelegateQueryHandler instance = (DelegateQueryHandler) beanManager.getReference(
+                    selectedBean, DelegateQueryHandler.class, cc);
+            
+            if (selectedBean.getScope().equals(Dependent.class))
+            {
+                context.addDestroyable(new BeanDestroyable<DelegateQueryHandler>(selectedBean, instance, cc));
+            }
+
+            return instance;
+        }
         return null;
     }
 
@@ -109,7 +131,8 @@ public class DelegateQueryBuilder extends QueryBuilder
     {
         try
         {
-            return invoke(delegate, context.getMethod(), context.getMethodParameters());
+            Method extract = ClassUtils.extractPossiblyGenericMethod(delegate.getClass(), context.getMethod());
+            return extract.invoke(delegate, context.getMethodParameters());
         }
         catch (InvocationTargetException e)
         {
@@ -124,12 +147,4 @@ public class DelegateQueryBuilder extends QueryBuilder
             throw new RuntimeException(e);
         }
     }
-
-    protected Object invoke(Object target, Method method, Object[] args) throws InvocationTargetException,
-            IllegalAccessException
-    {
-        Method extract = ClassUtils.extractPossiblyGenericMethod(target.getClass(), method);
-        return extract.invoke(target, args);
-    }
-
 }