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);
}