[webbeans-commits] Webbeans SVN: r192 - in ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans: event and 1 other directory.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Tue Oct 28 06:51:40 EDT 2008


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)




More information about the weld-commits mailing list