Repository: deltaspike
Updated Branches:
  refs/heads/master d2adacf41 -> 96761cdbf


DELTASPIKE-1161 [perf] avoid Instance#Select

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

Branch: refs/heads/master
Commit: 96761cdbf78f1ed63921aff78a007c8625dbc697
Parents: d2adacf
Author: tandraschko <tandrasc...@apache.org>
Authored: Fri Jun 3 10:33:05 2016 +0200
Committer: tandraschko <tandrasc...@apache.org>
Committed: Fri Jun 3 10:33:05 2016 +0200

----------------------------------------------------------------------
 .../data/impl/handler/EntityManagerRef.java     | 24 +++++++-
 .../impl/handler/EntityManagerRefLookup.java    | 64 ++++++++++++++++++--
 2 files changed, 81 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/96761cdb/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
 
b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
index 8e6dad9..5039003 100644
--- 
a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
+++ 
b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
@@ -24,13 +24,20 @@ import org.apache.deltaspike.data.api.EntityManagerResolver;
 
 public class EntityManagerRef
 {
-    private Class<? extends EntityManagerResolver> entityManagerResolverClass;
-    private DependentProvider<? extends EntityManagerResolver> 
entityManagerResolverDependentProvider;
     private EntityManager entityManager;
+    private DependentProvider<? extends EntityManager> 
entityManagerDependentProvider;
+    
+    private Class<? extends EntityManagerResolver> entityManagerResolverClass;
     private EntityManagerResolver entityManagerResolver;
-
+    private DependentProvider<? extends EntityManagerResolver> 
entityManagerResolverDependentProvider;
+        
     public void release()
     {
+        if (entityManagerDependentProvider != null)
+        {
+            entityManagerDependentProvider.destroy();
+        }
+        
         if (entityManagerResolverDependentProvider != null)
         {
             entityManagerResolverDependentProvider.destroy();
@@ -77,4 +84,15 @@ public class EntityManagerRef
     {
         this.entityManagerResolver = entityManagerResolver;
     }
+
+    public DependentProvider<? extends EntityManager> 
getEntityManagerDependentProvider()
+    {
+        return entityManagerDependentProvider;
+    }
+
+    public void setEntityManagerDependentProvider(
+            DependentProvider<? extends EntityManager> 
entityManagerDependentProvider)
+    {
+        this.entityManagerDependentProvider = entityManagerDependentProvider;
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/96761cdb/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
 
b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
index aa3ea3b..c43b42f 100644
--- 
a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
+++ 
b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
@@ -18,9 +18,14 @@
  */
 package org.apache.deltaspike.data.impl.handler;
 
+import java.lang.annotation.Annotation;
+import java.util.Set;
 import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.inject.Inject;
 import javax.persistence.EntityManager;
+import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
 
 import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.apache.deltaspike.data.impl.meta.RepositoryComponent;
@@ -30,11 +35,51 @@ import 
org.apache.deltaspike.jpa.spi.entitymanager.ActiveEntityManagerHolder;
 public class EntityManagerRefLookup
 {
     @Inject
-    private EntityManager entityManager;
-
-    @Inject
     private ActiveEntityManagerHolder activeEntityManagerHolder;
 
+    private volatile Boolean globalEntityManagerInitialized;
+    private boolean globalEntityManagerIsNormalScope;
+    private EntityManager globalEntityManager;
+    
+    private void lazyInitGlobalEntityManager()
+    {
+        if (this.globalEntityManagerInitialized == null)
+        {
+            initGlobalEntityManager();
+        }
+    }
+
+    private synchronized void initGlobalEntityManager()
+    {
+        // switch into paranoia mode
+        if (this.globalEntityManagerInitialized == null)
+        {
+            this.globalEntityManagerInitialized = true;
+            
+            BeanManager beanManager = 
BeanManagerProvider.getInstance().getBeanManager();
+            Set<Bean<?>> beans = beanManager.getBeans(EntityManager.class);
+
+            if (!beans.isEmpty() && beans.size() == 1)
+            {
+                Class<? extends Annotation> scope = 
beanManager.resolve(beans).getScope();
+                globalEntityManagerIsNormalScope = 
beanManager.isNormalScope(scope);
+
+                if (globalEntityManagerIsNormalScope)
+                {
+                    Bean<?> bean = beans.iterator().next();
+                    globalEntityManager = (EntityManager) 
beanManager.getReference(bean,
+                            EntityManager.class,
+                            beanManager.createCreationalContext(bean));
+                }
+            }
+            else
+            {
+                throw new IllegalArgumentException(
+                        "None or multiple EntityManager's found with the 
default qualifier.");
+            }            
+        }
+    }
+    
     public EntityManagerRef lookupReference(final RepositoryComponent 
repository)
     {
         EntityManagerRef ref = new EntityManagerRef();
@@ -73,7 +118,18 @@ public class EntityManagerRefLookup
             }
             else
             {
-                ref.setEntityManager(entityManager);
+                lazyInitGlobalEntityManager();
+                if (globalEntityManagerIsNormalScope)
+                {
+                    ref.setEntityManager(globalEntityManager);
+                }
+                else
+                {
+                    ref.setEntityManagerDependentProvider(
+                            BeanProvider.getDependent(EntityManager.class));
+                    ref.setEntityManager(
+                            ref.getEntityManagerDependentProvider().get());
+                }
             }
         }
 

Reply via email to