Skip to content

Commit

Permalink
forwaringmap for event observers
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@384 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
nickarls committed Dec 1, 2008
1 parent 39e7d33 commit 8c73bce
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 7 deletions.
Expand Up @@ -27,16 +27,16 @@
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.Observer;

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.transaction.TransactionListener;

import com.google.common.collect.ForwardingMap;

/**
* The event bus is where observers are registered and events are fired.
*
Expand All @@ -45,7 +45,43 @@
*/
public class EventManager
{
private final Map<Class<?>, CopyOnWriteArrayList<EventObserver<?>>> registeredObservers;
private class RegisteredObserversMap extends ForwardingMap<Class<?>, List<EventObserver<?>>>
{

private Map<Class<?>, List<EventObserver<?>>> delegate;

public RegisteredObserversMap()
{
delegate = new ConcurrentHashMap<Class<?>, List<EventObserver<?>>>();
}

@Override
protected Map<Class<?>, List<EventObserver<?>>> delegate()
{
return delegate;
}

@Override
public CopyOnWriteArrayList<EventObserver<?>> get(Object key)
{
CopyOnWriteArrayList<EventObserver<?>> observers = (CopyOnWriteArrayList<EventObserver<?>>) super.get(key);
return observers != null ? observers : new CopyOnWriteArrayList<EventObserver<?>>();
}

public void put(Class<?> eventType, EventObserver<?> observer)
{
List<EventObserver<?>> observers = super.get(eventType);
if (observers == null)
{
observers = new CopyOnWriteArrayList<EventObserver<?>>();
super.put(eventType, observers);
}
observers.add(observer);
}

}

private final RegisteredObserversMap registeredObservers;
private ManagerImpl manager;
// TODO: can we do this?
@Resource
Expand All @@ -58,7 +94,7 @@ public class EventManager
*/
public EventManager(ManagerImpl manager)
{
registeredObservers = new ConcurrentHashMap<Class<?>, CopyOnWriteArrayList<EventObserver<?>>>();
registeredObservers = new RegisteredObserversMap();
this.manager = manager;
}

Expand All @@ -70,7 +106,7 @@ public EventManager(ManagerImpl manager)
public <T> void addObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
{
CopyOnWriteArrayList<EventObserver<?>> eventTypeObservers = registeredObservers.get(eventType);
if (eventTypeObservers == null)
if (eventTypeObservers.isEmpty())
{
eventTypeObservers = new CopyOnWriteArrayList<EventObserver<?>>();
registeredObservers.put(eventType, eventTypeObservers);
Expand Down Expand Up @@ -167,7 +203,7 @@ public String toString()
buffer.append("Event manager\n");
buffer.append("Registered observers: " + registeredObservers.size() + "\n");
int i = 1;
for (Entry<Class<?>, CopyOnWriteArrayList<EventObserver<?>>> entry : registeredObservers.entrySet())
for (Entry<Class<?>, List<EventObserver<?>>> entry : registeredObservers.entrySet())
{
for (EventObserver<?> observer : entry.getValue())
{
Expand Down
Expand Up @@ -537,7 +537,7 @@ private void initConstructors()
*
* @param annotationType The annotation type to match
* @return A set of abstracted constructors with given annotation type. If
* the constructors set is empty, initialize it first .Returns an
* the constructors set is empty, initialize it first. Returns an
* empty set if there are no matches.
*
* @see org.jboss.webbeans.introspector.AnnotatedClass#getAnnotatedConstructors(Class)
Expand Down

0 comments on commit 8c73bce

Please sign in to comment.