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