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
+}
Show replies by thread