Author: aadamchik Date: Wed Sep 27 08:30:22 2006 New Revision: 450477 URL: http://svn.apache.org/viewvc?view=rev&rev=450477 Log: CAY-669
Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/map/LifecycleEventCallbackMapTst.java Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/LifecycleEventCallbackMap.java Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/LifecycleEventCallbackMap.java URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/LifecycleEventCallbackMap.java?view=diff&rev=450477&r1=450476&r2=450477 ============================================================================== --- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/LifecycleEventCallbackMap.java (original) +++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/LifecycleEventCallbackMap.java Wed Sep 27 08:30:22 2006 @@ -90,7 +90,23 @@ * Invokes callbacks for a given entity object. */ public void performCallbacks(Object object) { - String key = object.getClass().getName(); + performCallbacks(object, object.getClass()); + } + + /** + * Invokes callbacks for the class hierarchy, starting from the most generic + * superclass. + */ + protected void performCallbacks(Object object, Class callbackEntityClass) { + if (Object.class.equals(callbackEntityClass) || callbackEntityClass == null) { + return; + } + + // recursively perform super callbacks first + performCallbacks(object, callbackEntityClass.getSuperclass()); + + // perform callbacks on provided class + String key = callbackEntityClass.getName(); Collection entityListeners = (Collection) listeners.get(key); if (entityListeners != null) { Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/map/LifecycleEventCallbackMapTst.java URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/map/LifecycleEventCallbackMapTst.java?view=auto&rev=450477 ============================================================================== --- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/map/LifecycleEventCallbackMapTst.java (added) +++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/map/LifecycleEventCallbackMapTst.java Wed Sep 27 08:30:22 2006 @@ -0,0 +1,96 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ +package org.apache.cayenne.map; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; + +public class LifecycleEventCallbackMapTst extends TestCase { + + public void testCallbackOnSuperclass() { + + LifecycleEventCallbackMap map = new LifecycleEventCallbackMap(); + map.addListener(C1.class, "c1Callback"); + + C3 subclass = new C3(); + + assertEquals(0, subclass.callbacks.size()); + map.performCallbacks(subclass); + assertEquals(1, subclass.callbacks.size()); + } + + public void testCallbackOnSuperclassWithSublcassOverrides() { + + LifecycleEventCallbackMap map = new LifecycleEventCallbackMap(); + map.addListener(C1.class, "c1Callback"); + + C4 subclass = new C4(); + + assertEquals(0, subclass.callbacks.size()); + map.performCallbacks(subclass); + assertEquals(1, subclass.callbacks.size()); + assertEquals("c4Callback", subclass.callbacks.get(0)); + } + + public void testCallbackOrderInInheritanceHierarchy() { + + LifecycleEventCallbackMap map = new LifecycleEventCallbackMap(); + map.addListener(C2.class, "c2Callback"); + map.addListener(C1.class, "c1Callback"); + + C2 c = new C2(); + + assertTrue(c.callbacks.isEmpty()); + map.performCallbacks(c); + assertEquals(2, c.callbacks.size()); + + // superclass callbacks should be invoked first + assertEquals("c1Callback", c.callbacks.get(0)); + assertEquals("c2Callback", c.callbacks.get(1)); + } + + static class C1 { + + protected List callbacks = new ArrayList(); + + void c1Callback() { + callbacks.add("c1Callback"); + } + } + + static class C2 extends C1 { + + void c2Callback() { + callbacks.add("c2Callback"); + } + } + + static class C3 extends C1 { + + } + + static class C4 extends C1 { + + void c1Callback() { + callbacks.add("c4Callback"); + } + } +}