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();
     }


Reply via email to