Author: aadamchik
Date: Wed Sep 27 12:02:05 2006
New Revision: 450542

URL: http://svn.apache.org/viewvc?view=rev&rev=450542
Log:
CAY-667

Modified:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/CallbackOnListener.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/LifecycleEventCallbackMap.java
    
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/CallbackOnListener.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/CallbackOnListener.java?view=diff&rev=450542&r1=450541&r2=450542
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/CallbackOnListener.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/CallbackOnListener.java
 Wed Sep 27 12:02:05 2006
@@ -37,6 +37,11 @@
     private Method callbackMethod;
     private Object listener;
 
+    CallbackOnListener(Object listener, String methodName)
+            throws IllegalArgumentException {
+        this(listener, methodName, Object.class);
+    }
+
     CallbackOnListener(Object listener, String methodName, Class entityType)
             throws IllegalArgumentException {
 
@@ -51,7 +56,7 @@
     public void performCallback(Object entity) {
         try {
             callbackMethod.invoke(listener, new Object[] {
-                    entity
+                entity
             });
         }
         catch (Exception e) {

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=450542&r1=450541&r2=450542
==============================================================================
--- 
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 12:02:05 2006
@@ -33,9 +33,11 @@
 public class LifecycleEventCallbackMap {
 
     protected Map listeners;
+    protected Collection defaultListeners;
 
     public LifecycleEventCallbackMap() {
         listeners = new HashMap();
+        defaultListeners = new ArrayList();
     }
 
     /**
@@ -53,6 +55,22 @@
     }
 
     /**
+     * Registers a callback method to be invoked on a provided non-entity 
object when a
+     * lifecycle event occurs on any entity that does not suppress default 
callbacks.
+     */
+    public void addDefaultListener(Object listener, String methodName) {
+        CallbackOnListener callback = new CallbackOnListener(listener, 
methodName);
+        addDefaultCallback(callback);
+    }
+
+    /**
+     * Registers a callback object to be invoked when a lifecycle event occurs.
+     */
+    public void addDefaultCallback(LifecycleEventCallback callback) {
+        defaultListeners.add(callback);
+    }
+
+    /**
      * Registers a callback method to be invoked on an entity class instances 
when a
      * lifecycle event occurs.
      */
@@ -90,6 +108,16 @@
      * Invokes callbacks for a given entity object.
      */
     public void performCallbacks(Object object) {
+        
+        // default listeners are invoked first
+        if (!defaultListeners.isEmpty()) {
+            Iterator it = (Iterator) defaultListeners.iterator();
+            while (it.hasNext()) {
+                ((LifecycleEventCallback) it.next()).performCallback(object);
+            }
+        }
+
+        // apply per-entity listeners
         performCallbacks(object, object.getClass());
     }
 

Modified: 
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=diff&rev=450542&r1=450541&r2=450542
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/map/LifecycleEventCallbackMapTst.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/map/LifecycleEventCallbackMapTst.java
 Wed Sep 27 12:02:05 2006
@@ -25,6 +25,40 @@
 
 public class LifecycleEventCallbackMapTst extends TestCase {
 
+    public void testDefaultListeners() {
+
+        LifecycleEventCallbackMap map = new LifecycleEventCallbackMap();
+        L1 l1 = new L1();
+        map.addDefaultListener(l1, "callback");
+
+        C1 c1 = new C1();
+
+        assertEquals(0, l1.entities.size());
+        map.performCallbacks(c1);
+        assertEquals(1, l1.entities.size());
+        assertTrue(l1.entities.contains(c1));
+    }
+
+    public void testDefaultListenersCallbackOrder() {
+
+        LifecycleEventCallbackMap map = new LifecycleEventCallbackMap();
+        L2 l1 = new L2();
+        map.addListener(C1.class, l1, "callback");
+
+        L2 l2 = new L2();
+        map.addDefaultListener(l2, "callback");
+
+        C1 c1 = new C1();
+
+        map.performCallbacks(c1);
+        assertEquals(1, l1.callbackTimes.size());
+        assertEquals(1, l2.callbackTimes.size());
+        
+        Long t1 = (Long) l1.callbackTimes.get(0);
+        Long t2 = (Long) l2.callbackTimes.get(0);
+        assertTrue(t2.compareTo(t1) < 0);
+    }
+
     public void testCallbackOnSuperclass() {
 
         LifecycleEventCallbackMap map = new LifecycleEventCallbackMap();
@@ -91,6 +125,30 @@
 
         void c1Callback() {
             callbacks.add("c4Callback");
+        }
+    }
+
+    static class L1 {
+
+        protected List entities = new ArrayList();
+
+        void callback(Object entity) {
+            entities.add(entity);
+        }
+    }
+
+    static class L2 {
+
+        protected List callbackTimes = new ArrayList();
+
+        void callback(Object entity) {
+            callbackTimes.add(new Long(System.currentTimeMillis()));
+            try {
+                Thread.sleep(100);
+            }
+            catch (InterruptedException e) {
+                e.printStackTrace();
+            }
         }
     }
 }


Reply via email to