Skip to content

Commit

Permalink
Fixed implementations for add/removeObserver() methods and added the …
Browse files Browse the repository at this point in the history
…corresponding test implementations.

git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@386 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
drallen committed Dec 1, 2008
1 parent 394e736 commit ca0976f
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 134 deletions.
8 changes: 2 additions & 6 deletions webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
Expand Up @@ -378,9 +378,7 @@ public <T> Manager addObserver(Observer<T> observer, Class<T> eventType, Annotat
@SuppressWarnings("unchecked")
public <T> Manager addObserver(Observer<T> observer, TypeLiteral<T> eventType, Annotation... bindings)
{
// TODO Using the eventType TypeLiteral<T>, the Class<T> object must be
// retrieved
this.eventManager.addObserver(observer, (Class<T>) Reflections.getActualTypeArguments(eventType.getClass())[0], bindings);
this.eventManager.addObserver(observer, (Class<T>) eventType.getType(), bindings);
return this;
}

Expand Down Expand Up @@ -592,9 +590,7 @@ public <T> Manager removeObserver(Observer<T> observer, Class<T> eventType, Anno
@SuppressWarnings("unchecked")
public <T> Manager removeObserver(Observer<T> observer, TypeLiteral<T> eventType, Annotation... bindings)
{
// TODO The Class<T> for the event type must be retrieved from the
// TypeLiteral<T> instance
this.eventManager.removeObserver(observer, (Class<T>) Reflections.getActualTypeArguments(eventType.getClass())[0], bindings);
this.eventManager.removeObserver(observer, (Class<T>) eventType.getType(), bindings);
return this;
}

Expand Down

This file was deleted.

@@ -1,5 +1,12 @@
package org.jboss.webbeans.test;

import java.lang.annotation.Annotation;
import java.util.Set;

import javax.webbeans.Observer;
import javax.webbeans.TypeLiteral;

import org.jboss.webbeans.test.bindings.RoleBinding;
import org.testng.annotations.Test;

/**
Expand All @@ -11,6 +18,19 @@
@SpecVersion("PDR")
public class NewEventTest extends AbstractTest
{
public static class AnEventType
{
}

public static class AnObserver implements Observer<AnEventType>
{

public void notify(AnEventType event)
{
}

}

@Test(groups={"stub", "events"})
@SpecAssertion(section="7.1")
public void testEventTypeIncludesAllSuperclassesAndInterfacesOfEventObject()
Expand All @@ -34,7 +54,7 @@ public void testEventObjectWithWildcardsFails()

@Test(groups={"stub", "events"})
@SpecAssertion(section="7.1")
public void testConsumerNotifiedWhenEventTypeAndAllBindingMathces()
public void testConsumerNotifiedWhenEventTypeAndAllBindingsMatch()
{
assert false;
}
Expand All @@ -46,18 +66,83 @@ public void testManagerFireEvent()
assert false;
}

@Test(groups={"stub", "events"})
@Test(groups={"events"})
@SpecAssertion(section="7.3")
public void testManagerAddObserver()
{
assert false;
Observer<AnEventType> observer = new AnObserver();

// First test with the Class<T> of the event type
manager.addObserver(observer, AnEventType.class);
Set<Observer<AnEventType>> resolvedObservers = manager.resolveObservers(new AnEventType());
assert !resolvedObservers.isEmpty();
assert resolvedObservers.size() == 1;
assert resolvedObservers.iterator().next() == observer;

// Now test with the TypeLiteral<T> of the event type
observer = new AnObserver();
manager.addObserver(observer, new TypeLiteral<AnEventType>(){});
resolvedObservers = manager.resolveObservers(new AnEventType());
assert !resolvedObservers.isEmpty();
assert resolvedObservers.size() == 2;
boolean foundObserver = false;
for (Observer<AnEventType> obs : resolvedObservers)
{
if (obs == observer)
{
foundObserver = true;
break;
}
}
assert foundObserver;

// Try adding an observer with some binding types
observer = new AnObserver();
Annotation[] bindingTypes = new Annotation[] { new RoleBinding("Admin"), new RoleBinding("Manager") };
manager.addObserver(observer, AnEventType.class, bindingTypes);
resolvedObservers = manager.resolveObservers(new AnEventType(), bindingTypes);
assert !resolvedObservers.isEmpty();
assert resolvedObservers.size() == 3;
foundObserver = false;
for (Observer<AnEventType> obs : resolvedObservers)
{
if (obs == observer)
{
foundObserver = true;
break;
}
}
assert foundObserver;
}

@Test(groups={"stub", "events"})
@Test(groups={"events"})
@SpecAssertion(section="7.3")
public void testManagerRemoveObserver()
{
assert false;
Observer<AnEventType> observer = new AnObserver();

// First test with the Class<T> of the event type
manager.addObserver(observer, AnEventType.class);
manager.removeObserver(observer, AnEventType.class);
Set<Observer<AnEventType>> resolvedObservers = manager.resolveObservers(new AnEventType());
assert resolvedObservers.isEmpty();

// Now test with the TypeLiteral<T> of the event type
observer = new AnObserver();
manager.addObserver(observer, new TypeLiteral<AnEventType>(){});
manager.removeObserver(observer, new TypeLiteral<AnEventType>(){});
resolvedObservers = manager.resolveObservers(new AnEventType());
assert resolvedObservers.isEmpty();

// Also test with binding types
Annotation[] bindings = new Annotation[] { new RoleBinding("Admin") };
manager.addObserver(observer, AnEventType.class, bindings);
manager.removeObserver(observer, AnEventType.class);
resolvedObservers = manager.resolveObservers(new AnEventType(), bindings);
assert !resolvedObservers.isEmpty();
manager.removeObserver(observer, AnEventType.class, new RoleBinding("Admin"));
resolvedObservers = manager.resolveObservers(new AnEventType(), bindings);
assert resolvedObservers.isEmpty();
}

@Test(groups={"stub", "events"})
Expand Down Expand Up @@ -196,7 +281,7 @@ public void testXMLDefinedObserverNotFindingImplementationMethodFails()

@Test(groups={"stub", "events"})
@SpecAssertion(section="7.5.4")
public void testObserverMethodRecievesInjectionsOnNonObservesParameters()
public void testObserverMethodReceivesInjectionsOnNonObservesParameters()
{
assert false;
}
Expand Down
Expand Up @@ -17,7 +17,6 @@ public class MockManagerImpl extends ManagerImpl
private Object event = null;
private Class<? extends Object> eventType = null;
private Annotation[] eventBindings = null;
private Observer<?> observer = null;

/* (non-Javadoc)
* @see org.jboss.webbeans.ManagerImpl#fireEvent(java.lang.Object, java.lang.annotation.Annotation[])
Expand All @@ -28,33 +27,7 @@ public void fireEvent(Object event, Annotation... bindings)
// Record the event
this.event = event;
this.eventBindings = bindings;
}

/* (non-Javadoc)
* @see org.jboss.webbeans.ManagerImpl#addObserver(javax.webbeans.Observer, java.lang.Class, java.lang.annotation.Annotation[])
*/
@Override
public <T> Manager addObserver(Observer<T> observer, Class<T> eventType,
Annotation... bindings)
{
this.observer = observer;
this.eventType = eventType;
this.eventBindings = bindings;
return this;
}

/* (non-Javadoc)
* @see org.jboss.webbeans.ManagerImpl#addObserver(javax.webbeans.Observer, javax.webbeans.TypeLiteral, java.lang.annotation.Annotation[])
*/
@Override
public <T> Manager addObserver(Observer<T> observer,
TypeLiteral<T> eventType, Annotation... bindings)
{
this.observer = observer;
// TODO Fix the event type based on the type literal being passed. Not clear how to get the actual T.
this.eventType = null;
this.eventBindings = bindings;
return this;
super.fireEvent(event, bindings);
}

/**
Expand Down Expand Up @@ -85,14 +58,6 @@ public final Class<?> getEventType()
return eventType;
}

/**
* @return the observer
*/
public final Observer<?> getObserver()
{
return observer;
}

public void setEnabledDeploymentTypes(Class<? extends Annotation>... enabledDeploymentTypes)
{
initEnabledDeploymentTypes(enabledDeploymentTypes);
Expand Down

0 comments on commit ca0976f

Please sign in to comment.