You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2011/11/01 17:07:06 UTC

svn commit: r1196076 - in /myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction: ./ context/

Author: gpetracek
Date: Tue Nov  1 16:07:05 2011
New Revision: 1196076

URL: http://svn.apache.org/viewvc?rev=1196076&view=rev
Log:
EXTCDI-223 cleanup

Added:
    myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanEntry.java   (contents, props changed)
      - copied, changed from r1176771, myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanBag.java
Removed:
    myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanBag.java
Modified:
    myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/TransactionalInterceptorStrategy.java
    myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanStorage.java
    myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java

Modified: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/TransactionalInterceptorStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/TransactionalInterceptorStrategy.java?rev=1196076&r1=1196075&r2=1196076&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/TransactionalInterceptorStrategy.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/TransactionalInterceptorStrategy.java Tue Nov  1 16:07:05 2011
@@ -62,9 +62,11 @@ public class TransactionalInterceptorStr
 
     private static final Logger LOGGER = Logger.getLogger(TransactionalInterceptorStrategy.class.getName());
 
-    private @Inject BeanManager beanManager;
+    @Inject
+    private BeanManager beanManager;
 
-    private @Inject TransactionBeanStorage transactionBeanStorage;
+    @Inject
+    private TransactionBeanStorage transactionBeanStorage;
 
 
     /** key=qualifier name, value= reference counter */
@@ -85,24 +87,18 @@ public class TransactionalInterceptorStr
 
         // the 'layer' of the transactional invocation, aka the refCounter for the current qualifier
         int transactionLayer = incrementRefCounter(qualifierKey);
+
         if (transactionLayer == 0)
         {
             // 0 indicates that a new Context needs to get started
             transactionBeanStorage.startTransactionScope(qualifierKey);
         }
-        String previousTransactionKey = transactionBeanStorage.activateTransactionScope(qualifierKey);
-
-        Bean<EntityManager> entityManagerBean = resolveEntityManagerBean(qualifierClass);
 
-        EntityManager entityManager = (EntityManager) beanManager.getReference(entityManagerBean, EntityManager.class,
-                                                                beanManager.createCreationalContext(entityManagerBean));
+        String previousTransactionKey = transactionBeanStorage.activateTransactionScope(qualifierKey);
 
-        if (ems.get() == null)
-        {
-            ems.set(new HashMap<String, EntityManager>());
-        }
-        ems.get().put(qualifierKey, entityManager);
+        EntityManager entityManager = resolveEntityManagerForQualifier(qualifierClass);
 
+        storeEntityManagerForQualifier(qualifierKey, entityManager);
 
         EntityTransaction transaction = entityManager.getTransaction();
 
@@ -139,9 +135,12 @@ public class TransactionalInterceptorStr
                         }
                         catch (Exception eRollback)
                         {
-                            LOGGER.log(Level.SEVERE,
-                                       "Got additional Exception while subsequently " +
-                                       "rolling back other SQL transactions", eRollback);
+                            if(LOGGER.isLoggable(Level.SEVERE))
+                            {
+                                LOGGER.log(Level.SEVERE,
+                                        "Got additional Exception while subsequently " +
+                                                "rolling back other SQL transactions", eRollback);
+                            }
                         }
                     }
                 }
@@ -238,10 +237,28 @@ public class TransactionalInterceptorStr
 
             if (commitFailed)
             {
+                //noinspection ThrowFromFinallyBlock
                 throw firstException;
             }
         }
+    }
+
+    private EntityManager resolveEntityManagerForQualifier(Class<? extends Annotation> qualifierClass)
+    {
+        Bean<EntityManager> entityManagerBean = resolveEntityManagerBean(qualifierClass);
+
+        return (EntityManager) beanManager.getReference(entityManagerBean, EntityManager.class,
+                                                                beanManager.createCreationalContext(entityManagerBean));
+    }
+
+    private void storeEntityManagerForQualifier(String qualifierKey, EntityManager entityManager)
+    {
+        if (ems.get() == null)
+        {
+            ems.set(new HashMap<String, EntityManager>());
+        }
 
+        ems.get().put(qualifierKey, entityManager);
     }
 
     /**
@@ -360,9 +377,7 @@ public class TransactionalInterceptorStr
         {
             entityManagerBeans = new HashSet<Bean<?>>();
         }
-        Bean<EntityManager> entityManagerBean = null;
 
-        it:
         for (Bean<?> currentEntityManagerBean : entityManagerBeans)
         {
             Set<Annotation> foundQualifierAnnotations = currentEntityManagerBean.getQualifiers();
@@ -371,12 +386,10 @@ public class TransactionalInterceptorStr
             {
                 if (currentQualifierAnnotation.annotationType().equals(qualifierClass))
                 {
-                    entityManagerBean = (Bean<EntityManager>) currentEntityManagerBean;
-                    break it;
+                    return (Bean<EntityManager>) currentEntityManagerBean;
                 }
             }
         }
-        return entityManagerBean;
+        return null;
     }
-
 }

Copied: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanEntry.java (from r1176771, myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanBag.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanEntry.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanEntry.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanBag.java&r1=1176771&r2=1196076&rev=1196076&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanBag.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanEntry.java Tue Nov  1 16:07:05 2011
@@ -25,13 +25,13 @@ import javax.enterprise.context.spi.Crea
  * Holds the information we need store to manage
  * the beans in the {@link TransactionContext}.
  */
-public class TransactionBeanBag<T>
+public class TransactionBeanEntry<T>
 {
     private Contextual<T> bean;
     private T contextualInstance;
     private CreationalContext<T> creationalContext;
 
-    public TransactionBeanBag(Contextual<T> bean, T contextualInstance, CreationalContext<T> creationalContext)
+    public TransactionBeanEntry(Contextual<T> bean, T contextualInstance, CreationalContext<T> creationalContext)
     {
         this.bean = bean;
         this.contextualInstance = contextualInstance;

Propchange: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanEntry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanStorage.java?rev=1196076&r1=1196075&r2=1196076&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanStorage.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionBeanStorage.java Tue Nov  1 16:07:05 2011
@@ -19,12 +19,12 @@
 package org.apache.myfaces.extensions.cdi.jpa.impl.transaction.context;
 
 import javax.annotation.PreDestroy;
-import javax.enterprise.context.ContextNotActiveException;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.spi.Contextual;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Stack;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
@@ -33,7 +33,7 @@ import java.util.logging.Logger;
  * contextual instances, their {@link javax.enterprise.context.spi.CreationalContext} etc.</p>
  *
  * <p>We use a RequestScoped bean because this way we don't need to take
- * care about cleaning up any ThreadLocals ourselfs. This also makes sure that
+ * care about cleaning up any ThreadLocals ourselves. This also makes sure that
  * we subsequently destroy any left over TransactionScoped beans (which should not happen,
  * but who knows). We also don't need to do any fancy synchronization stuff since
  * we are sure that we are always in the same Thread.</p>
@@ -54,10 +54,10 @@ public class TransactionBeanStorage
      * </ol>
      *
      */
-    private Map<String, Stack<Map<Contextual, TransactionBeanBag>>> storedTransactionContexts =
-            new HashMap<String, Stack<Map<Contextual, TransactionBeanBag>>>();
+    private Map<String, Stack<Map<Contextual, TransactionBeanEntry>>> storedTransactionContexts =
+            new HashMap<String, Stack<Map<Contextual, TransactionBeanEntry>>>();
 
-    private Map<Contextual, TransactionBeanBag> activeTransactionContext;
+    private Map<Contextual, TransactionBeanEntry> activeTransactionContext;
 
     private String activeTransactionKey = null;
 
@@ -67,16 +67,20 @@ public class TransactionBeanStorage
      */
     public void startTransactionScope(String transactionKey)
     {
-        LOGGER.finer( "starting TransactionScope " + transactionKey);
-        Stack<Map<Contextual, TransactionBeanBag>> transStack = storedTransactionContexts.get(transactionKey);
+        if(LOGGER.isLoggable(Level.FINER))
+        {
+            LOGGER.finer( "starting TransactionScope " + transactionKey);
+        }
+
+        Stack<Map<Contextual, TransactionBeanEntry>> transStack = storedTransactionContexts.get(transactionKey);
 
         if (transStack == null)
         {
-            transStack = new Stack<Map<Contextual, TransactionBeanBag>>();
+            transStack = new Stack<Map<Contextual, TransactionBeanEntry>>();
             storedTransactionContexts.put(transactionKey, transStack);
         }
 
-        transStack.push(new HashMap<Contextual, TransactionBeanBag>());
+        transStack.push(new HashMap<Contextual, TransactionBeanEntry>());
     }
 
     /**
@@ -87,18 +91,20 @@ public class TransactionBeanStorage
      */
     public void endTransactionScope(String transactionKey)
     {
-        LOGGER.finer( "ending TransactionScope " + transactionKey);
+        if(LOGGER.isLoggable(Level.FINER))
+        {
+            LOGGER.finer( "ending TransactionScope " + transactionKey);
+        }
 
         // drop the context from the storage
-        Stack<Map<Contextual, TransactionBeanBag>> transStack = storedTransactionContexts.get(transactionKey);
-        Map<Contextual, TransactionBeanBag> beans = transStack.pop();
+        Stack<Map<Contextual, TransactionBeanEntry>> transStack = storedTransactionContexts.get(transactionKey);
+        Map<Contextual, TransactionBeanEntry> beans = transStack.pop();
         destroyBeans(beans);
 
         if (transStack.size() == 0)
         {
             storedTransactionContexts.remove(transactionKey);
         }
-
     }
 
     /**
@@ -113,19 +119,25 @@ public class TransactionBeanStorage
      */
     public String activateTransactionScope(String transactionKey)
     {
-        LOGGER.finer( "activating TransactionScope " + transactionKey);
+        if(LOGGER.isLoggable(Level.FINER))
+        {
+            LOGGER.finer( "activating TransactionScope " + transactionKey);
+        }
 
+        //can be null on the topmost stack-layer
         if (transactionKey == null)
         {
+            //TODO refactor it to a reset method
             activeTransactionKey = null;
             activeTransactionContext = null;
             return null;
         }
 
-        Stack<Map<Contextual, TransactionBeanBag>> transStack = storedTransactionContexts.get(transactionKey);
+        Stack<Map<Contextual, TransactionBeanEntry>> transStack = storedTransactionContexts.get(transactionKey);
+
         if (transStack == null)
         {
-            throw new ContextNotActiveException("Cannot activate TransactionScope with key " + transactionKey);
+            throw new IllegalStateException("Cannot activate TransactionScope with key " + transactionKey);
         }
 
         activeTransactionContext =  transStack.peek();
@@ -141,18 +153,22 @@ public class TransactionBeanStorage
      */
     public void endAllTransactionScopes()
     {
-        LOGGER.finer( "destroying all TransactionScopes");
+        if(LOGGER.isLoggable(Level.FINER))
+        {
+            LOGGER.finer( "destroying all TransactionScopes");
+        }
 
-        for (Stack<Map<Contextual, TransactionBeanBag>> transStack : storedTransactionContexts.values())
+        for (Stack<Map<Contextual, TransactionBeanEntry>> transStack : storedTransactionContexts.values())
         {
             while (!transStack.isEmpty())
             {
-                Map<Contextual, TransactionBeanBag> beans = transStack.pop();
+                Map<Contextual, TransactionBeanEntry> beans = transStack.pop();
                 destroyBeans(beans);
             }
         }
 
         // we also need to clean our active context info
+        storedTransactionContexts.clear();
         activeTransactionContext = null;
         activeTransactionKey = null;
     }
@@ -161,7 +177,7 @@ public class TransactionBeanStorage
     /**
      * @return the Map which represents the currently active Context content.
      */
-    public Map<Contextual, TransactionBeanBag> getActiveTransactionContext()
+    public Map<Contextual, TransactionBeanEntry> getActiveTransactionContext()
     {
         return activeTransactionContext;
     }
@@ -180,14 +196,12 @@ public class TransactionBeanStorage
      * Properly destroy all the given beans.
      * @param activeBeans
      */
-    private void destroyBeans(Map<Contextual, TransactionBeanBag> activeBeans)
+    private void destroyBeans(Map<Contextual, TransactionBeanEntry> activeBeans)
     {
-        for (TransactionBeanBag beanBag : activeBeans.values())
+        for (TransactionBeanEntry beanBag : activeBeans.values())
         {
             beanBag.getBean().destroy(beanBag.getContextualInstance(), beanBag.getCreationalContext());
         }
     }
-
-
 }
 

Modified: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java?rev=1196076&r1=1196075&r2=1196076&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/transaction/context/TransactionContext.java Tue Nov  1 16:07:05 2011
@@ -20,6 +20,7 @@ package org.apache.myfaces.extensions.cd
 
 
 import org.apache.myfaces.extensions.cdi.jpa.api.TransactionScoped;
+import org.apache.myfaces.extensions.cdi.jpa.api.Transactional;
 
 import javax.enterprise.context.ContextNotActiveException;
 import javax.enterprise.context.spi.Context;
@@ -45,17 +46,18 @@ public class TransactionContext implemen
 
     public <T> T get(Contextual<T> component)
     {
-        Map<Contextual, TransactionBeanBag> beanBags = beanStorage.getActiveTransactionContext();
+        Map<Contextual, TransactionBeanEntry> transactionBeanEntryMap = beanStorage.getActiveTransactionContext();
 
-        if (beanBags == null)
+        if (transactionBeanEntryMap == null)
         {
-            throw new ContextNotActiveException();
+            throw new ContextNotActiveException("Not accessed within a transactional method - use @" +
+                    Transactional.class.getName());
         }
 
-        TransactionBeanBag beanBag = beanBags.get(component);
-        if (beanBag != null)
+        TransactionBeanEntry transactionBeanEntry = transactionBeanEntryMap.get(component);
+        if (transactionBeanEntry != null)
         {
-            return (T) beanBag.getContextualInstance();
+            return (T) transactionBeanEntry.getContextualInstance();
         }
 
         return null;
@@ -63,23 +65,24 @@ public class TransactionContext implemen
 
     public <T> T get(Contextual<T> component, CreationalContext<T> creationalContext)
     {
-        Map<Contextual, TransactionBeanBag> beanBags = beanStorage.getActiveTransactionContext();
+        Map<Contextual, TransactionBeanEntry> transactionBeanEntryMap = beanStorage.getActiveTransactionContext();
 
-        if (beanBags == null)
+        if (transactionBeanEntryMap == null)
         {
-            throw new ContextNotActiveException();
+            throw new ContextNotActiveException("Not accessed within a transactional method - use @" +
+                    Transactional.class.getName());
         }
 
-        TransactionBeanBag beanBag = beanBags.get(component);
-        if (beanBag != null)
+        TransactionBeanEntry transactionBeanEntry = transactionBeanEntryMap.get(component);
+        if (transactionBeanEntry != null)
         {
-            return (T) beanBag.getContextualInstance();
+            return (T) transactionBeanEntry.getContextualInstance();
         }
 
         // if it doesn't yet exist, we need to create it now!
         T instance = component.create(creationalContext);
-        beanBag = new TransactionBeanBag(component, instance, creationalContext);
-        beanBags.put(component, beanBag);
+        transactionBeanEntry = new TransactionBeanEntry(component, instance, creationalContext);
+        transactionBeanEntryMap.put(component, transactionBeanEntry);
 
         return instance;
     }
@@ -95,12 +98,11 @@ public class TransactionContext implemen
         {
             return beanStorage.getActiveTransactionContext() != null;
         }
-        catch(ContextNotActiveException cnae)
+        catch (ContextNotActiveException e)
         {
             return false;
         }
     }
 
 
-
 }