You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2012/11/05 13:11:39 UTC
svn commit: r1405764 - 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: struberg
Date: Mon Nov 5 12:11:39 2012
New Revision: 1405764
URL: http://svn.apache.org/viewvc?rev=1405764&view=rev
Log:
OWB-711 remove overridden observer methods
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/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=1405764&r1=1405763&r2=1405764&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 Mon Nov 5 12:11:39 2012
@@ -90,17 +90,37 @@ public final class NotificationManager
addObserver(observer, typeLiteral.getType());
}
- public void disableObservers(Class<?> declaringClass)
+ /**
+ * <p>This method shall only be called for subclasses.
+ * It will disable all observer methods which are overridden
+ * in the given subclass.</p>
+ */
+ public void disableOverriddenObservers(Class<?> subClass)
{
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))
+ if (observer instanceof ObserverMethodImpl)
{
- i.remove();
+ Method observerMethod = ((ObserverMethodImpl<?>)observer).getObserverMethod();
+
+ // we only remove methods from a superclass
+ if (!observerMethod.getDeclaringClass().equals(subClass))
+ {
+ try
+ {
+ subClass.getMethod(observerMethod.getName(), observerMethod.getParameterTypes());
+ i.remove();
+ }
+ catch(NoSuchMethodException nsme)
+ {
+ // that's perfectly fine.
+ // it means that we don't need to remove anything becasue the
+ // observer method didn't get overridden.
+ }
+ }
}
}
}
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=1405764&r1=1405763&r2=1405764&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 Mon Nov 5 12:11:39 2012
@@ -1467,6 +1467,8 @@ public final class WebBeansUtil
if (superBean != null)
{
+ webBeansContext.getBeanManagerImpl().getNotificationManager().disableOverriddenObservers(superClass);
+
// Recursively configure super class first if super class is also a special bean.
// So the name and bean meta data could be populated to this beanclass.
if (beanClasses.contains(superClass) && ((AbstractOwbBean<?>)superBean).isEnabled())
@@ -1478,13 +1480,11 @@ 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/ObserverTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/specalization/observer/ObserverTest.java?rev=1405764&r1=1405763&r2=1405764&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 Mon Nov 5 12:11:39 2012
@@ -36,10 +36,10 @@ public class ObserverTest extends Abstra
@Test
public void testObserverMethodsInParentOfAlternativeAndSpecializedBeans()
{
- 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(BeanC.class);
startContainer(beanClasses, beanXmls);
@@ -49,19 +49,20 @@ public class ObserverTest extends Abstra
TestEvent testEvent = new TestEvent();
getBeanManager().fireEvent(testEvent);
-
- Assert.assertEquals(0, testEvent.getCalledObservers().size());
-
+
+ Assert.assertEquals(1, testEvent.getCalledObservers().size());
+ Assert.assertTrue(testEvent.getCalledObservers().iterator().next().endsWith(":[specialize]"));
+
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);
@@ -93,7 +94,8 @@ public class ObserverTest extends Abstra
getBeanManager().fireEvent(testEvent);
Assert.assertEquals(BeanE.class, beans.toArray(new Bean<?>[0])[0].getBeanClass());
- Assert.assertEquals(0, testEvent.getCalledObservers().size());
+ Assert.assertEquals(1, testEvent.getCalledObservers().size());
+ Assert.assertTrue(testEvent.getCalledObservers().iterator().next().endsWith(":[specialize]"));
shutDownContainer();
}