Skip to content

Commit

Permalink
Event bus tied into Manager implementation; transaction handling stil…
Browse files Browse the repository at this point in the history
…l needs to be corrected and tests fixed.

git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@192 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
drallen committed Oct 28, 2008
1 parent e82bb04 commit ae8c2c6
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 7 deletions.
23 changes: 17 additions & 6 deletions webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
Expand Up @@ -32,6 +32,7 @@
import org.jboss.webbeans.injectable.ResolverInjectable;
import org.jboss.webbeans.util.ClientProxy;
import org.jboss.webbeans.util.MapWrapper;
import org.jboss.webbeans.util.Reflections;

public class ManagerImpl implements Manager
{
Expand Down Expand Up @@ -187,20 +188,29 @@ public Manager addInterceptor(Interceptor interceptor)

public <T> Manager addObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
{
// TODO Auto-generated method stub
this.eventBus.addObserver(observer, eventType, bindings);
return this;
}

public <T> Manager addObserver(Observer<T> observer, TypeLiteral<T> eventType, Annotation... bindings)
{
// TODO Auto-generated method stub
// TODO Using the eventType TypeLiteral<T>, the Class<T> object must be retrieved
this.eventBus.addObserver(observer, (Class<T>)Reflections.getActualTypeArguements(eventType.getClass())[0], bindings);
return this;
}

public void fireEvent(Object event, Annotation... bindings)
{
// TODO Auto-generated method stub

// Check the event object for template parameters which are not allowed by the spec.
if (Reflections.isParameterizedType(event.getClass()))
{
throw new IllegalArgumentException("Event type " + event.getClass().getName() +
" is not allowed because it is a generic");
}
// Get the observers for this event. Although resolveObservers is parameterized, this
// method is not, so we have to use Observer<Object> for observers.
Set<Observer<Object>> observers = this.resolveObservers(event, bindings);
this.eventBus.notifyObservers(observers, event);
}

public Context getContext(Class<? extends Annotation> scopeType)
Expand Down Expand Up @@ -298,13 +308,14 @@ else if (beans.size() > 1)

public <T> Manager removeObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
{
// TODO Auto-generated method stub
this.eventBus.removeObserver(observer, eventType, bindings);
return this;
}

public <T> Manager removeObserver(Observer<T> observer, TypeLiteral<T> eventType, Annotation... bindings)
{
// TODO Auto-generated method stub
// TODO The Class<T> for the event type must be retrieved from the TypeLiteral<T> instance
this.eventBus.removeObserver(observer, (Class<T>)Reflections.getActualTypeArguements(eventType.getClass())[0], bindings);
return this;
}

Expand Down
42 changes: 41 additions & 1 deletion webbeans-ri/src/main/java/org/jboss/webbeans/event/EventBus.java
Expand Up @@ -105,13 +105,53 @@ public <T> Set<Observer<T>> getObservers(T event, Annotation... bindings)
return results;
}

/**
* Notifies each observer immediately of the event unless a transaction is currently in
* progress, in which case a deferred event is created and registered.
* @param <T>
* @param observers
* @param event
*/
public <T> void notifyObservers(Set<Observer<T>> observers, T event)
{
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
observer.notify(event);
}
}
}

/**
* Removes an observer from the event bus.
*
* @param observer
* The observer to remove
*/
public <T> void removeObserver(Observer<T> observer, Class<T> eventType)
public <T> void removeObserver(Observer<T> observer, Class<T> eventType, Annotation... bindings)
{
ArrayList<EventObserver<?>> observers = registeredObservers.get(eventType);
for (int i = 0; i < observers.size(); i++)
Expand Down
Expand Up @@ -94,6 +94,8 @@ public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result
+ ((eventBindings == null) ? 0 : eventBindings.hashCode());
result = prime * result
+ ((eventType == null) ? 0 : eventType.hashCode());
result = prime * result + ((observer == null) ? 0 : observer.hashCode());
Expand All @@ -113,6 +115,12 @@ public boolean equals(Object obj)
if (getClass() != obj.getClass())
return false;
EventObserver<?> other = (EventObserver<?>) obj;
if (eventBindings == null)
{
if (other.eventBindings != null)
return false;
} else if (!eventBindings.equals(other.eventBindings))
return false;
if (eventType == null)
{
if (other.eventType != null)
Expand Down

0 comments on commit ae8c2c6

Please sign in to comment.