Return-Path: X-Original-To: apmail-openwebbeans-commits-archive@www.apache.org Delivered-To: apmail-openwebbeans-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4A977D0E9 for ; Mon, 5 Nov 2012 12:12:09 +0000 (UTC) Received: (qmail 19373 invoked by uid 500); 5 Nov 2012 12:12:09 -0000 Delivered-To: apmail-openwebbeans-commits-archive@openwebbeans.apache.org Received: (qmail 19197 invoked by uid 500); 5 Nov 2012 12:12:04 -0000 Mailing-List: contact commits-help@openwebbeans.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openwebbeans.apache.org Delivered-To: mailing list commits@openwebbeans.apache.org Received: (qmail 19126 invoked by uid 99); 5 Nov 2012 12:12:01 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 05 Nov 2012 12:12:01 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 05 Nov 2012 12:12:00 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 3868C23888E4 for ; Mon, 5 Nov 2012 12:11:40 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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/ Date: Mon, 05 Nov 2012 12:11:39 -0000 To: commits@openwebbeans.apache.org From: struberg@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121105121140.3868C23888E4@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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) + /** + *

This method shall only be called for subclasses. + * It will disable all observer methods which are overridden + * in the given subclass.

+ */ + public void disableOverriddenObservers(Class subClass) { for (Set> observerMethods: observers.values()) { for (Iterator> 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 beanXmls = new ArrayList(); + Collection beanXmls = new ArrayList(); beanXmls.add(getXmlPath(PACKAGE_NAME, "AlternativeSpecializes")); - Collection> beanClasses = new ArrayList>(); + Collection> beanClasses = new ArrayList>(); 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 beanXmls = new ArrayList(); + Collection beanXmls = new ArrayList(); beanXmls.add(getXmlPath(PACKAGE_NAME, "AlternativeSpecializes")); - Collection> beanClasses = new ArrayList>(); + Collection> beanClasses = new ArrayList>(); 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(); }