Author: dallen6
Date: 2008-10-28 06:51:40 -0400 (Tue, 28 Oct 2008)
New Revision: 192
Modified:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventBus.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventObserver.java
Log:
Event bus tied into Manager implementation; transaction handling still needs to be
corrected and tests fixed.
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java 2008-10-28
08:25:21 UTC (rev 191)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java 2008-10-28
10:51:40 UTC (rev 192)
@@ -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
{
@@ -187,20 +188,29 @@
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)
@@ -298,13 +308,14 @@
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;
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventBus.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventBus.java 2008-10-28
08:25:21 UTC (rev 191)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventBus.java 2008-10-28
10:51:40 UTC (rev 192)
@@ -106,12 +106,52 @@
}
/**
+ * 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++)
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventObserver.java
===================================================================
---
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventObserver.java 2008-10-28
08:25:21 UTC (rev 191)
+++
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/EventObserver.java 2008-10-28
10:51:40 UTC (rev 192)
@@ -95,6 +95,8 @@
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());
return result;
@@ -113,6 +115,12 @@
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)