You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ar...@apache.org on 2012/10/13 20:55:09 UTC
svn commit: r1397922 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/event/ main/java/org/apache/webbeans/util/
test/java/org/apache/webbeans/newtests/specalization/observer/
Author: arne
Date: Sat Oct 13 18:55:08 2012
New Revision: 1397922
URL: http://svn.apache.org/viewvc?rev=1397922&view=rev
Log:
OWB-711 Implemented disabling of observer methods of classes that are specialized
Removed:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/BeanF.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/BeanB.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/ObserverTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java?rev=1397922&r1=1397921&r2=1397922&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java Sat Oct 13 18:55:08 2012
@@ -26,6 +26,7 @@ import java.lang.reflect.ParameterizedTy
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -39,6 +40,7 @@ import javax.enterprise.inject.spi.Annot
import javax.enterprise.inject.spi.ObserverMethod;
import javax.enterprise.inject.spi.ProcessProducer;
import javax.enterprise.util.TypeLiteral;
+
import org.apache.webbeans.annotation.AnyLiteral;
import org.apache.webbeans.component.InjectionTargetBean;
import org.apache.webbeans.config.OWBLogConst;
@@ -88,6 +90,22 @@ public final class NotificationManager
addObserver(observer, typeLiteral.getType());
}
+ public void disableObservers(Class<?> declaringClass)
+ {
+ for (Set<ObserverMethod<?>> observerMethods: observers.values())
+ {
+ for (Iterator<ObserverMethod<?>> i = observerMethods.iterator(); i.hasNext();)
+ {
+ ObserverMethod<?> observer = i.next();
+ if (observer instanceof ObserverMethodImpl
+ && ((ObserverMethodImpl<?>)observer).getObserverMethod().getDeclaringClass().equals(declaringClass))
+ {
+ i.remove();
+ }
+ }
+ }
+ }
+
public <T> Set<ObserverMethod<? super T>> resolveObservers(T event, Annotation... eventQualifiers)
{
EventUtil.checkEventBindings(webBeansContext, eventQualifiers);
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1397922&r1=1397921&r2=1397922&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Sat Oct 13 18:55:08 2012
@@ -1478,11 +1478,13 @@ public final class WebBeansUtil
{
//disable superbean if the current bean is not an alternative
((AbstractOwbBean<?>)superBean).setEnabled(false);
+ webBeansContext.getBeanManagerImpl().getNotificationManager().disableObservers(superClass);
}
else if(altManager.isClassAlternative(specializedClass))
{
//disable superbean if the current bean is an enabled alternative
((AbstractOwbBean<?>)superBean).setEnabled(false);
+ webBeansContext.getBeanManagerImpl().getNotificationManager().disableObservers(superClass);
}
AbstractOwbBean<?> comp = (AbstractOwbBean<?>)specialized;
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/BeanB.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/BeanB.java?rev=1397922&r1=1397921&r2=1397922&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/BeanB.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/BeanB.java Sat Oct 13 18:55:08 2012
@@ -20,6 +20,7 @@ package org.apache.webbeans.newtests.spe
import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Observes;
import javax.enterprise.inject.Specializes;
@Specializes
@@ -28,6 +29,11 @@ public class BeanB extends BeanA
{
private static final long serialVersionUID = 821164664338581947L;
+ protected void observeTestEvent(@Observes TestEvent testEvent)
+ {
+ testEvent.addInvocation(getBeanName());
+ }
+
@Override
public String getBeanName()
{
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/ObserverTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/ObserverTest.java?rev=1397922&r1=1397921&r2=1397922&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/ObserverTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/ObserverTest.java Sat Oct 13 18:55:08 2012
@@ -32,68 +32,89 @@ import org.junit.Test;
public class ObserverTest extends AbstractUnitTest
{
private static final String PACKAGE_NAME = ObserverTest.class.getPackage().getName();
-
+
@Test
- public void testObserverMethodsInSpecializedBeans()
+ public void testObserverMethodsInParentOfAlternativeAndSpecializedBeans()
{
- Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
- beanClasses.add(BeanA.class);
- beanClasses.add(BeanB.class);
- startContainer(beanClasses, null);
+ Collection<String> beanXmls = new ArrayList<String>();
+ beanXmls.add(getXmlPath(PACKAGE_NAME, "AlternativeSpecializes"));
+ Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+ beanClasses.add(BeanA.class);
+ beanClasses.add(BeanC.class);
+ startContainer(beanClasses, beanXmls);
+
Set<Bean<?>> beans = getBeanManager().getBeans(BeanA.class);
Assert.assertEquals(1, beans.size());
-
+
TestEvent testEvent = new TestEvent();
getBeanManager().fireEvent(testEvent);
-
- Assert.assertEquals(1, testEvent.getCalledObservers().size());
- Assert.assertTrue(testEvent.getCalledObservers().iterator().next().endsWith(":[specialize]"));
-
+
+ Assert.assertEquals(0, testEvent.getCalledObservers().size());
+
shutDownContainer();
}
-
+
@Test
public void testOverrideObserverMethodsInAlternativeAndSpecializedBeans()
{
- Collection<String> beanXmls = new ArrayList<String>();
+ Collection<String> beanXmls = new ArrayList<String>();
beanXmls.add(getXmlPath(PACKAGE_NAME, "AlternativeSpecializes"));
-
- Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+
+ Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
beanClasses.add(BeanA.class);
beanClasses.add(BeanD.class);
startContainer(beanClasses, beanXmls);
-
+
Set<Bean<?>> beans = getBeanManager().getBeans(BeanA.class);
Assert.assertEquals(1, beans.size());
-
+
TestEvent testEvent = new TestEvent();
getBeanManager().fireEvent(testEvent);
-
+
Assert.assertEquals(1, testEvent.getCalledObservers().size());
Assert.assertTrue(testEvent.getCalledObservers().iterator().next().endsWith(":[alternative]:[specialize]"));
-
+
+ shutDownContainer();
+ }
+
+ @Test
+ public void testObserverMethodsInParentOfSpecializedBeans()
+ {
+ Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+ beanClasses.add(BeanA.class);
+ beanClasses.add(BeanE.class);
+ startContainer(beanClasses, null);
+
+ Set<Bean<?>> beans = getBeanManager().getBeans(BeanA.class);
+ Assert.assertEquals(1, beans.size());
+
+ TestEvent testEvent = new TestEvent();
+ getBeanManager().fireEvent(testEvent);
+
+ Assert.assertEquals(BeanE.class, beans.toArray(new Bean<?>[0])[0].getBeanClass());
+ Assert.assertEquals(0, testEvent.getCalledObservers().size());
+
shutDownContainer();
}
-
+
@Test
public void testOverrideObserverMethodsInSpecializedBeans()
{
Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
beanClasses.add(BeanA.class);
- beanClasses.add(BeanF.class);
+ beanClasses.add(BeanB.class);
startContainer(beanClasses, null);
-
+
Set<Bean<?>> beans = getBeanManager().getBeans(BeanA.class);
Assert.assertEquals(1, beans.size());
-
+
TestEvent testEvent = new TestEvent();
getBeanManager().fireEvent(testEvent);
-
- Assert.assertEquals(BeanF.class, beans.toArray(new Bean<?>[0])[0].getBeanClass());
+
Assert.assertEquals(1, testEvent.getCalledObservers().size());
Assert.assertTrue(testEvent.getCalledObservers().iterator().next().endsWith(":[specialize]"));
-
+
shutDownContainer();
}
}