EXTCDI-252 lazy init of the TransactionBeanStorage proxy

git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk@1225750 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java b/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java
index 59f8d4a..ea3e618 100644
--- a/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java
+++ b/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java
@@ -19,6 +19,7 @@
 package org.apache.myfaces.extensions.cdi.jpa.impl.transaction.context;
 
 
+import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
 import org.apache.myfaces.extensions.cdi.jpa.api.TransactionScoped;
 import org.apache.myfaces.extensions.cdi.jpa.api.Transactional;
 
@@ -26,27 +27,23 @@
 import javax.enterprise.context.spi.Context;
 import javax.enterprise.context.spi.Contextual;
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Typed;
 import java.lang.annotation.Annotation;
 import java.util.Map;
 
 /**
  * CDI Context for managing @{@link TransactionScoped} contextual instances.
  */
+@Typed()
 public class TransactionContext implements Context
 {
     // Attention! this is not a normal instance but a PROXY
     // thus it resolves the correct contextual instance every time
     private TransactionBeanStorage beanStorage;
 
-    public TransactionContext(TransactionBeanStorage beanStorage)
-    {
-        this.beanStorage = beanStorage;
-    }
-
-
     public <T> T get(Contextual<T> component)
     {
-        Map<Contextual, TransactionBeanEntry> transactionBeanEntryMap = beanStorage.getActiveTransactionContext();
+        Map<Contextual, TransactionBeanEntry> transactionBeanEntryMap = getBeanStorage().getActiveTransactionContext();
 
         if (transactionBeanEntryMap == null)
         {
@@ -65,7 +62,7 @@
 
     public <T> T get(Contextual<T> component, CreationalContext<T> creationalContext)
     {
-        Map<Contextual, TransactionBeanEntry> transactionBeanEntryMap = beanStorage.getActiveTransactionContext();
+        Map<Contextual, TransactionBeanEntry> transactionBeanEntryMap = getBeanStorage().getActiveTransactionContext();
 
         if (transactionBeanEntryMap == null)
         {
@@ -96,7 +93,7 @@
     {
         try
         {
-            return beanStorage.getActiveTransactionContext() != null;
+            return getBeanStorage().getActiveTransactionContext() != null;
         }
         catch (ContextNotActiveException e)
         {
@@ -104,5 +101,22 @@
         }
     }
 
+    private TransactionBeanStorage getBeanStorage()
+    {
+        if(this.beanStorage == null)
+        {
+            lazyInitBeanStoreProxy();
+        }
+        return this.beanStorage;
+    }
 
+    private synchronized void lazyInitBeanStoreProxy()
+    {
+        if(this.beanStorage != null)
+        {
+            return;
+        }
+
+        this.beanStorage = BeanManagerProvider.getInstance().getContextualReference(TransactionBeanStorage.class);
+    }
 }
diff --git a/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContextExtension.java b/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContextExtension.java
index 494d9ff..620529e 100644
--- a/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContextExtension.java
+++ b/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContextExtension.java
@@ -23,7 +23,6 @@
 
 import javax.enterprise.event.Observes;
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
-import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Extension;
 
@@ -45,14 +44,7 @@
             return;
         }
 
-        // We get a proxy for the RequestScoped TransactionBeanStorage and hand it over to the TransactionContext
-        // This way we avoid the need of later having to synchronize the access on lazy initialization.
-        Bean<?> beanStorageBean = beanManager.resolve(beanManager.getBeans(TransactionBeanStorage.class));
-        TransactionBeanStorage beanStorage = (TransactionBeanStorage)
-                beanManager.getReference(beanStorageBean, TransactionBeanStorage.class,
-                                         beanManager.createCreationalContext(beanStorageBean));
-
-        TransactionContext transactionContext = new TransactionContext(beanStorage);
+        TransactionContext transactionContext = new TransactionContext();
         afterBeanDiscovery.addContext(transactionContext);
     }