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

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Tue Nov 25 14:47:32 EST 2008


Author: nickarls
Date: 2008-11-25 14:47:31 -0500 (Tue, 25 Nov 2008)
New Revision: 362

Added:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/TransactionObservationPhase.java
Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/DeferredEventNotification.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java
Log:
more on transactional observers

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/DeferredEventNotification.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/DeferredEventNotification.java	2008-11-24 10:54:23 UTC (rev 361)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/DeferredEventNotification.java	2008-11-25 19:47:31 UTC (rev 362)
@@ -1,20 +1,21 @@
 package org.jboss.webbeans.event;
 
+import javax.transaction.Status;
 import javax.transaction.Synchronization;
 import javax.webbeans.Observer;
 
 /**
- * A synchronization object which will deliver the event to the observer
- * after the JTA transaction currently in effect is committed.
+ * A synchronization object which will deliver the event to the observer after
+ * the JTA transaction currently in effect is committed.
  * 
  * @author David Allen
- *
+ * 
  */
 public class DeferredEventNotification<T> implements Synchronization
 {
-   private Observer<T> observer;
+   private ObserverImpl<T> observer;
    private T event;
-   
+
    /**
     * Creates a new deferred event notifier.
     * 
@@ -24,7 +25,7 @@
     */
    public DeferredEventNotification(T event, Observer<T> observer)
    {
-      this.observer = observer;
+      this.observer = (ObserverImpl<T>) observer;
       this.event = event;
    }
 
@@ -36,15 +37,34 @@
       return observer;
    }
 
-   public void afterCompletion(int arg0)
+   public void afterCompletion(int status)
    {
-      // The event is already delivered before completion
+      if (observer.isInterestedInTransactionPhase(TransactionObservationPhase.AFTER_COMPLETION))
+      {
+         observer.notify(event);
+      }
+      switch (status)
+      {
+      case Status.STATUS_COMMITTED:
+         if (observer.isInterestedInTransactionPhase(TransactionObservationPhase.AFTER_SUCCESS))
+         {
+            observer.notify();
+         }
+         break;
+      case Status.STATUS_ROLLEDBACK:
+         if (observer.isInterestedInTransactionPhase(TransactionObservationPhase.AFTER_FAILURE))
+         {
+            observer.notify();
+         }
+         break;
+      }
    }
 
    public void beforeCompletion()
    {
-      // Execute the observer method on the event
-      observer.notify(event);      
+      if (observer.isInterestedInTransactionPhase(TransactionObservationPhase.BEFORE_COMPLETION))
+      {
+         observer.notify(event);
+      }
    }
-
 }

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 10:54:23 UTC (rev 361)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java	2008-11-25 19:47:31 UTC (rev 362)
@@ -1,6 +1,8 @@
 package org.jboss.webbeans.event;
 
 import java.lang.annotation.Annotation;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.webbeans.AfterTransactionCompletion;
 import javax.webbeans.AfterTransactionFailure;
@@ -26,11 +28,10 @@
  */
 public class ObserverImpl<T> implements Observer<T>
 {
-
    private EventBean<T> eventBean;
    private final AnnotatedMethod<Object> observerMethod;
    private final Class<T> eventType;
-   private boolean transactional;
+   private Set<TransactionObservationPhase> transactionObservationPhases;
    private boolean conditional;
    private ManagerImpl manager;
 
@@ -52,10 +53,31 @@
       this.eventBean = eventBean;
       this.observerMethod = observer;
       this.eventType = eventType;
-      transactional = !observerMethod.getAnnotatedParameters(AfterTransactionCompletion.class).isEmpty() || !observerMethod.getAnnotatedParameters(AfterTransactionFailure.class).isEmpty() || !observerMethod.getAnnotatedParameters(AfterTransactionSuccess.class).isEmpty() || !observerMethod.getAnnotatedParameters(BeforeTransactionCompletion.class).isEmpty();
+      initTransactionObservationPhases();
       conditional = !observerMethod.getAnnotatedParameters(IfExists.class).isEmpty();
    }
 
+   private void initTransactionObservationPhases()
+   {
+      transactionObservationPhases = new HashSet<TransactionObservationPhase>();
+      if (observerMethod.getAnnotatedParameters(BeforeTransactionCompletion.class).isEmpty())
+      {
+         transactionObservationPhases.add(TransactionObservationPhase.BEFORE_COMPLETION);
+      }
+      if (observerMethod.getAnnotatedParameters(AfterTransactionCompletion.class).isEmpty())
+      {
+         transactionObservationPhases.add(TransactionObservationPhase.AFTER_COMPLETION);
+      }
+      if (observerMethod.getAnnotatedParameters(AfterTransactionFailure.class).isEmpty())
+      {
+         transactionObservationPhases.add(TransactionObservationPhase.AFTER_FAILURE);
+      }
+      if (observerMethod.getAnnotatedParameters(AfterTransactionSuccess.class).isEmpty())
+      {
+         transactionObservationPhases.add(TransactionObservationPhase.AFTER_SUCCESS);
+      }
+   }
+
    /*
     * (non-Javadoc)
     * 
@@ -87,8 +109,9 @@
    /**
     * Uses the container to retrieve the most specialized instance of this
     * observer.
-    * @param conditional 
     * 
+    * @param conditional
+    * 
     * @return the most specialized instance
     */
    protected Object getInstance(boolean conditional)
@@ -99,11 +122,17 @@
 
    public boolean isTransactional()
    {
-      return transactional;
+      return !transactionObservationPhases.isEmpty();
    }
 
    public boolean isConditional()
    {
       return conditional;
    }
+
+   public boolean isInterestedInTransactionPhase(TransactionObservationPhase transactionObservationPhase)
+   {
+      return transactionObservationPhases.contains(transactionObservationPhase);
+   }
+
 }

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/TransactionObservationPhase.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/TransactionObservationPhase.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/TransactionObservationPhase.java	2008-11-25 19:47:31 UTC (rev 362)
@@ -0,0 +1,6 @@
+package org.jboss.webbeans.event;
+
+public enum TransactionObservationPhase
+{
+   BEFORE_COMPLETION, AFTER_COMPLETION, AFTER_FAILURE, AFTER_SUCCESS
+}




More information about the weld-commits mailing list