[webbeans-commits] Webbeans SVN: r355 - ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Mon Nov 24 03:20:17 EST 2008


Author: nickarls
Date: 2008-11-24 03:20:17 -0500 (Mon, 24 Nov 2008)
New Revision: 355

Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventManager.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java
Log:
Transactional observers modifictions.

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventManager.java	2008-11-24 07:36:20 UTC (rev 354)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventManager.java	2008-11-24 08:20:17 UTC (rev 355)
@@ -27,13 +27,17 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import javax.annotation.Resource;
 import javax.transaction.RollbackException;
+import javax.transaction.Status;
 import javax.transaction.SystemException;
 import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
-import javax.webbeans.Current;
 import javax.webbeans.Observer;
 
+import org.jboss.webbeans.ManagerImpl;
+import org.jboss.webbeans.transaction.TransactionListener;
+
 /**
  * The event bus is where observers are registered and events are fired.
  * 
@@ -43,25 +47,25 @@
 public class EventManager
 {
    private final Map<Class<?>, CopyOnWriteArrayList<EventObserver<?>>> registeredObservers;
-   
-   @Current
-   private TransactionManager transactionManager;
+   private ManagerImpl manager;
+   // TODO: can we do this?
+   @Resource TransactionManager transactionManager;
 
    /**
-    * Initializes a new instance of the EventManager. This includes looking up the
-    * transaction manager which is needed to defer events till the end of a
-    * transaction. 
+    * Initializes a new instance of the EventManager. This includes looking up
+    * the transaction manager which is needed to defer events till the end of a
+    * transaction.
     */
-   public EventManager()
+   public EventManager(ManagerImpl manager)
    {
       registeredObservers = new ConcurrentHashMap<Class<?>, CopyOnWriteArrayList<EventObserver<?>>>();
+      this.manager = manager;
    }
 
    /**
     * Adds an observer to the event bus so that it receives event notifications.
     * 
-    * @param observer
-    *           The observer that should receive events
+    * @param observer The observer that should receive events
     */
    public <T> void addObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
    {
@@ -78,28 +82,6 @@
       }
    }
 
-   /**
-    * Defers delivery of an event till the end of the currently active
-    * transaction.
-    * 
-    * @param event The event object to deliver
-    * @param observer The observer to receive the event
-    * @throws SystemException
-    * @throws IllegalStateException
-    * @throws RollbackException
-    */
-   public <T> void deferEvent(T event, Observer<T> observer) throws SystemException, IllegalStateException, RollbackException
-   {
-      if (transactionManager != null)
-      {
-         // Get the current transaction associated with the thread
-         Transaction transaction = transactionManager.getTransaction();
-         if (transaction != null)
-         {
-            transaction.registerSynchronization(new DeferredEventNotification<T>(event, observer));
-         }
-      }
-   }
 
    /**
     * Resolves the list of observers to be notified for a given event and
@@ -123,6 +105,18 @@
       return interestedObservers;
    }
 
+   private boolean isTransactionActive() {
+      try
+      {
+         // TODO: Check NPE conditions;
+         return transactionManager.getTransaction().getStatus() == Status.STATUS_ACTIVE;
+      }
+      catch (SystemException e)
+      {
+         return false;
+      }      
+   }
+   
    /**
     * Notifies each observer immediately of the event unless a transaction is
     * currently in progress, in which case a deferred event is created and
@@ -136,30 +130,11 @@
    {
       for (Observer<T> observer : observers)
       {
-         // TODO Replace this with the correct transaction code
-         Transaction transaction = null;
-         try
-         {
-            transaction = transactionManager.getTransaction();
-         } catch (SystemException e)
-         {
-         }
-         if (transaction != null)
-         {
-            try
-            {
-               deferEvent(event, observer);
-            } catch (IllegalStateException e)
-            {
-            } catch (SystemException e)
-            {
-            } catch (RollbackException e)
-            {
-               // TODO If transaction is being rolled back, perhaps notification should terminate now
-            }
-         } else
-         {
-            // Notify observer immediately in the same context as this method
+         if (isTransactionActive() && ((ObserverImpl<?>) observer).isTransactional()) {
+            TransactionListener transactionListener = manager.getInstanceByType(TransactionListener.class);
+            DeferredEventNotification<T> deferredEvent = new DeferredEventNotification<T>(event, observer);
+            transactionListener.registerSynhronization(deferredEvent);
+         } else {
             observer.notify(event);
          }
       }
@@ -168,8 +143,7 @@
    /**
     * Removes an observer from the event bus.
     * 
-    * @param observer
-    *           The observer to remove
+    * @param observer The observer to remove
     */
    public <T> void removeObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
    {

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java	2008-11-24 07:36:20 UTC (rev 354)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java	2008-11-24 08:20:17 UTC (rev 355)
@@ -2,6 +2,10 @@
 
 import java.lang.annotation.Annotation;
 
+import javax.webbeans.AfterTransactionCompletion;
+import javax.webbeans.AfterTransactionFailure;
+import javax.webbeans.AfterTransactionSuccess;
+import javax.webbeans.BeforeTransactionCompletion;
 import javax.webbeans.Current;
 import javax.webbeans.Observer;
 
@@ -97,4 +101,12 @@
       // Return the most specialized instance of the component
       return manager.getInstanceByType(eventBean.getType(), eventBean.getBindingTypes().toArray(new Annotation[0]));
    }
+   
+   public boolean isTransactional() {
+      return
+         !observerMethod.getAnnotatedParameters(AfterTransactionCompletion.class).isEmpty() ||
+         !observerMethod.getAnnotatedParameters(AfterTransactionFailure.class).isEmpty() ||
+         !observerMethod.getAnnotatedParameters(AfterTransactionSuccess.class).isEmpty() ||
+         !observerMethod.getAnnotatedParameters(BeforeTransactionCompletion.class).isEmpty();
+   }
 }




More information about the weld-commits mailing list