Skip to content

Commit

Permalink
Refactored transactional observer code for better encapsulation and r…
Browse files Browse the repository at this point in the history
…untime performance.

git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@594 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
drallen committed Dec 19, 2008
1 parent a39b804 commit 8addb07
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 84 deletions.
Expand Up @@ -109,7 +109,7 @@ public ManagerImpl()
this.decorators = new HashSet<Decorator>();
this.interceptors = new HashSet<Interceptor>();
this.contextMap = new ContextMap();
this.eventManager = new EventManager(this);
this.eventManager = new EventManager();
this.ejbDescriptorCache = new EjbDescriptorCache();

List<Class<? extends Annotation>> defaultEnabledDeploymentTypes = new ArrayList<Class<? extends Annotation>>();
Expand Down
Expand Up @@ -21,10 +21,10 @@
import javax.transaction.Synchronization;
import javax.webbeans.Observer;

import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.AFTER_COMPLETION;
import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.AFTER_SUCCESS;
import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.AFTER_FAILURE;
import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.BEFORE_COMPLETION;
import static org.jboss.webbeans.event.ObserverImpl.TransactionObservationPhase.AFTER_COMPLETION;
import static org.jboss.webbeans.event.ObserverImpl.TransactionObservationPhase.AFTER_SUCCESS;
import static org.jboss.webbeans.event.ObserverImpl.TransactionObservationPhase.AFTER_FAILURE;
import static org.jboss.webbeans.event.ObserverImpl.TransactionObservationPhase.BEFORE_COMPLETION;

/**
* A synchronization object which will deliver the event to the observer after
Expand Down
Expand Up @@ -25,13 +25,9 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.webbeans.Observer;

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.contexts.DependentContext;
import org.jboss.webbeans.transaction.UserTransaction;
import org.jboss.webbeans.util.Reflections;
import org.jboss.webbeans.util.Strings;

Expand All @@ -45,18 +41,7 @@
*/
public class EventManager
{
private ManagerImpl manager;

/**
* The known transactional phases a transactional event observer can be
* interested in
*/
protected enum TransactionObservationPhase
{
NONE, BEFORE_COMPLETION, AFTER_COMPLETION, AFTER_FAILURE, AFTER_SUCCESS
}

/**
/**
* An event type -> observer list map
*/
private class RegisteredObserversMap extends ForwardingMap<Class<?>, List<EventObserver<?>>>
Expand Down Expand Up @@ -140,12 +125,9 @@ public String toString()

/**
* Initializes a new instance of the EventManager.
*
* @param manager The Web Beans manager
*/
public EventManager(ManagerImpl manager)
public EventManager()
{
this.manager = manager;
registeredObservers = new RegisteredObserversMap();
}

Expand Down Expand Up @@ -188,24 +170,6 @@ public <T> Set<Observer<T>> getObservers(T event, Annotation... bindings)
return interestedObservers;
}

/**
* Checks if there is currently a transaction active
*
* @return True if there is one, false otherwise
*/
private boolean isTransactionActive()
{
UserTransaction userTransaction = manager.getInstanceByType(UserTransaction.class);
try
{
return userTransaction!=null && userTransaction.getStatus() == Status.STATUS_ACTIVE;
}
catch (SystemException e)
{
return false;
}
}

/**
* Iterates over the interested observers. If an observer is transactional
* and there is a transaction currently in progress, the event is deferred.
Expand All @@ -221,14 +185,7 @@ public <T> void notifyObservers(Set<Observer<T>> observers, T event)
DependentContext.INSTANCE.setActive(true);
for (Observer<T> observer : observers)
{
if ((observer instanceof ObserverImpl) && isTransactionActive() && ((ObserverImpl<?>) observer).isTransactional())
{
deferEvent(event, observer);
}
else
{
observer.notify(event);
}
observer.notify(event);
}
}
finally
Expand All @@ -237,22 +194,6 @@ public <T> void notifyObservers(Set<Observer<T>> observers, T event)
}
}

/**
* Defers an event for processing in a later phase of the current transaction.
*
* Gets the transaction listener, creates a deferred event representation and
* registers the deferred event.
*
* @param event The event type
* @param observer The interested observer
*/
private <T> void deferEvent(T event, Observer<T> observer)
{
UserTransaction userTransaction = manager.getInstanceByType(UserTransaction.class);
DeferredEventNotification<T> deferredEvent = new DeferredEventNotification<T>(event, observer);
userTransaction.registerSynchronization(deferredEvent);
}

/**
* Removes an observer from the event bus.
*
Expand Down
Expand Up @@ -17,16 +17,12 @@

package org.jboss.webbeans.event;

import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.AFTER_COMPLETION;
import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.AFTER_FAILURE;
import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.AFTER_SUCCESS;
import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.BEFORE_COMPLETION;
import static org.jboss.webbeans.event.EventManager.TransactionObservationPhase.NONE;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.webbeans.AfterTransactionCompletion;
import javax.webbeans.AfterTransactionFailure;
import javax.webbeans.AfterTransactionSuccess;
Expand All @@ -44,9 +40,9 @@
import javax.webbeans.manager.Bean;

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.event.EventManager.TransactionObservationPhase;
import org.jboss.webbeans.introspector.AnnotatedMethod;
import org.jboss.webbeans.introspector.AnnotatedParameter;
import org.jboss.webbeans.transaction.UserTransaction;
import org.jboss.webbeans.util.Reflections;

/**
Expand All @@ -62,7 +58,16 @@
*/
public class ObserverImpl<T> implements Observer<T>
{
private Bean<?> eventBean;
/**
* The known transactional phases a transactional event observer can be
* interested in
*/
protected enum TransactionObservationPhase
{
NONE, BEFORE_COMPLETION, AFTER_COMPLETION, AFTER_FAILURE, AFTER_SUCCESS
}

private Bean<?> observerBean;
private final AnnotatedMethod<Object> observerMethod;
private TransactionObservationPhase transactionObservationPhase;
private boolean conditional;
Expand All @@ -80,7 +85,7 @@ public class ObserverImpl<T> implements Observer<T>
public ObserverImpl(final AnnotatedMethod<Object> observer, final Bean<?> observerBean, final ManagerImpl manager)
{
this.manager = manager;
this.eventBean = observerBean;
this.observerBean = observerBean;
this.observerMethod = observer;
validateObserverMethod();
initTransactionObservationPhase();
Expand All @@ -92,19 +97,19 @@ private void initTransactionObservationPhase()
List<TransactionObservationPhase> observationPhases = new ArrayList<TransactionObservationPhase>();
if (!observerMethod.getAnnotatedParameters(BeforeTransactionCompletion.class).isEmpty())
{
observationPhases.add(BEFORE_COMPLETION);
observationPhases.add(TransactionObservationPhase.BEFORE_COMPLETION);
}
if (!observerMethod.getAnnotatedParameters(AfterTransactionCompletion.class).isEmpty())
{
observationPhases.add(AFTER_COMPLETION);
observationPhases.add(TransactionObservationPhase.AFTER_COMPLETION);
}
if (!observerMethod.getAnnotatedParameters(AfterTransactionFailure.class).isEmpty())
{
observationPhases.add(AFTER_FAILURE);
observationPhases.add(TransactionObservationPhase.AFTER_FAILURE);
}
if (!observerMethod.getAnnotatedParameters(AfterTransactionSuccess.class).isEmpty())
{
observationPhases.add(AFTER_SUCCESS);
observationPhases.add(TransactionObservationPhase.AFTER_SUCCESS);
}
if (observationPhases.size() > 1)
{
Expand All @@ -116,7 +121,7 @@ else if (observationPhases.size() == 1)
}
else
{
transactionObservationPhase = NONE;
transactionObservationPhase = TransactionObservationPhase.NONE;
}
}

Expand Down Expand Up @@ -171,7 +176,14 @@ public void notify(final T event)
{
try
{
observerMethod.invokeWithSpecialValue(instance, Observes.class, event, manager);
if ( isTransactional() && isTransactionActive() )
{
deferEvent(event);
}
else
{
observerMethod.invokeWithSpecialValue(instance, Observes.class, event, manager);
}
}
catch (ExecutionException e)
{
Expand Down Expand Up @@ -202,7 +214,40 @@ public void notify(final T event)
protected Object getInstance(boolean create)
{
// Return the most specialized instance of the component
return manager.getMostSpecializedInstance(eventBean, create);
return manager.getMostSpecializedInstance(observerBean, create);
}

/**
* Checks if there is currently a transaction active
*
* @return True if there is one, false otherwise
*/
private boolean isTransactionActive()
{
UserTransaction userTransaction = manager.getInstanceByType(UserTransaction.class);
try
{
return userTransaction!=null && userTransaction.getStatus() == Status.STATUS_ACTIVE;
}
catch (SystemException e)
{
return false;
}
}

/**
* Defers an event for processing in a later phase of the current transaction.
*
* Gets the transaction listener, creates a deferred event representation and
* registers the deferred event.
*
* @param event The event type
*/
private void deferEvent(T event)
{
UserTransaction userTransaction = manager.getInstanceByType(UserTransaction.class);
DeferredEventNotification<T> deferredEvent = new DeferredEventNotification<T>(event, this);
userTransaction.registerSynchronization(deferredEvent);
}

/**
Expand Down Expand Up @@ -241,7 +286,7 @@ public String toString()
{
StringBuilder builder = new StringBuilder();
builder.append("Observer Implentation: \n");
builder.append(" Observer (Declaring) bean: " + eventBean);
builder.append(" Observer (Declaring) bean: " + observerBean);
builder.append(" Observer method: " + observerMethod);
return builder.toString();
}
Expand Down

0 comments on commit 8addb07

Please sign in to comment.