You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-commits@db.apache.org by cl...@apache.org on 2005/10/17 05:29:15 UTC

svn commit: r325833 - in /incubator/jdo/trunk/tck20: ./ test/java/org/apache/jdo/tck/api/instancecallbacks/ test/jdo/applicationidentity/org/apache/jdo/tck/api/ test/jdo/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/ test/jdo/datastoreid...

Author: clr
Date: Sun Oct 16 20:29:07 2005
New Revision: 325833

URL: http://svn.apache.org/viewcvs?rev=325833&view=rev
Log:
JDO-155 Add lifecycle tests

Added:
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/AbstractInstanceLifecycleListener.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerClear.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerCreate.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDelete.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDetach.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDirty.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerLoad.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerStore.java
    incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/api/
    incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/
    incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo
    incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/api/
    incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/
    incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo
    incubator/jdo/trunk/tck20/test/orm/applicationidentity/org/apache/jdo/tck/api/
    incubator/jdo/trunk/tck20/test/orm/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/
    incubator/jdo/trunk/tck20/test/orm/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm
    incubator/jdo/trunk/tck20/test/orm/datastoreidentity/org/apache/jdo/tck/api/
    incubator/jdo/trunk/tck20/test/orm/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/
    incubator/jdo/trunk/tck20/test/orm/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm
Modified:
    incubator/jdo/trunk/tck20/maven.xml
    incubator/jdo/trunk/tck20/project.properties
    incubator/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema.sql
    incubator/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema.sql

Modified: incubator/jdo/trunk/tck20/maven.xml
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/maven.xml?rev=325833&r1=325832&r2=325833&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/maven.xml (original)
+++ incubator/jdo/trunk/tck20/maven.xml Sun Oct 16 20:29:07 2005
@@ -398,8 +398,8 @@
             <not>
                 <uptodate targetfile="${jdo.tck.enhanced.dir}/${jdo.tck.identitytype}.jar">
                     <srcfiles dir="${basedir}/test/jdo/${jdo.tck.identitytype}"
-                          includes="org/apache/jdo/tck/pc/**/*.jdo, 
-                                    org/apache/jdo/tck/pc/**/jdoTest.properties"/>
+                          includes="org/apache/jdo/tck/**/*.jdo, 
+                                    org/apache/jdo/tck/**/jdoTest.properties"/>
                     <srcfiles dir="${basedir}/test/java"
                           includes="${jdo.tck.pcclasses.sources},
                                     ${jdo.tck.paclasses.sources}"/>

Modified: incubator/jdo/trunk/tck20/project.properties
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/project.properties?rev=325833&r1=325832&r2=325833&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/project.properties (original)
+++ incubator/jdo/trunk/tck20/project.properties Sun Oct 16 20:29:07 2005
@@ -96,6 +96,12 @@
 # jpox dependencies
 
 jdo.tck.pcclasses.sources = \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach.java \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerClear.java \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDelete.java \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDetach.java \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerLoad.java \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerStore.java \
     org/apache/jdo/tck/pc/lifecycle/StateTransitionObj.java \
     org/apache/jdo/tck/pc/company/Address.java \
     org/apache/jdo/tck/pc/company/Company.java \
@@ -188,6 +194,12 @@
     org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldDate.java
 
 jdo.tck.pcclasses.files = \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach$PC.class \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerClear$PC.class \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDelete$PC.class \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDetach$PC.class \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerLoad$PC.class \
+    org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerStore$PC.class \
     org/apache/jdo/tck/pc/lifecycle/StateTransitionObj.class \
     org/apache/jdo/tck/pc/company/Address.class \
     org/apache/jdo/tck/pc/company/Company.class \
@@ -316,6 +328,7 @@
     org/apache/jdo/tck/api/instancecallbacks/TestParts.class
 
 jdo.tck.jdometadata.files = \
+    org/apache/jdo/tck/api/instancecallbacks/package.jdo \
     org/apache/jdo/tck/pc/company/package.jdo \
     org/apache/jdo/tck/pc/fieldtypes/AllTypes.jdo \
     org/apache/jdo/tck/pc/fieldtypes/ArrayCollections.jdo \

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/AbstractInstanceLifecycleListener.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/AbstractInstanceLifecycleListener.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/AbstractInstanceLifecycleListener.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/AbstractInstanceLifecycleListener.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,511 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.AttachLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+import javax.jdo.listener.CreateLifecycleListener;
+import javax.jdo.listener.DeleteLifecycleListener;
+import javax.jdo.listener.DetachLifecycleListener;
+import javax.jdo.listener.DirtyLifecycleListener;
+import javax.jdo.listener.LoadLifecycleListener;
+import javax.jdo.listener.StoreLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.pc.mylib.PCPoint;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Abstract test AbstractInstanceLifecycleListener
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener lifecycle listener callback
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-1, A12.15-2, A12.15-3, A12.15-4, A12.15-5, 
+ * A12.15-6, A12.15-7, A12.15-8, A12.15-9, A12.15-10, A12.15-11, A12.15-12, 
+ * A12.15-13, A12.15-14, 
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-1 void postCreate(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is created, 
+ * during makePersistent. It is called after the instance transitions 
+ * to persistent-new.
+ * A12.15-2 void postLoad(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is loaded. 
+ * It is called after the jdoPostLoad method is invoked on the instance.
+ * A12.15-3 void preStore(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is stored, 
+ * for example during flush or commit. It is called 
+ * before the jdoPreStore method is invoked on the instance.
+ * A12.15-4 void postStore(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is stored,
+ * for example during flush or commit. It is called 
+ * after the jdoPreStore method is invoked on the instance. 
+ * An object identity for a per?sistent-new instance must have been assigned
+ * to the instance when this callback is invoked.
+ * A12.15-5 void preClear(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is cleared, for example during afterCompletion. It is called 
+ * before the jdoPreClear method is invoked on the instance.
+ * A12.15-6 void postClear(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is cleared, for example during afterCom?pletion. It is called 
+ * after the jdoPreClear method is invoked on the instance and the fields 
+ * have been cleared by the JDO implementation.
+ * A12.15-7 void preDelete(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is deleted, during deletePersistent. It is called before 
+ * the state transition and before the jdoPreDelete method 
+ * is invoked on the instance.
+ * A12.15-8 void postDelete(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is deleted, during deletePersistent. It is called 
+ * after the jdoPreDelete method is invoked on the instance
+ * and after the state transition.
+ * A12.15-9 void preDirty(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent clean instance 
+ * is first made dirty, during an operation that modifies 
+ * the value of a persistent or transactional field. It is called
+ * before the field value is changed.
+ * A12.15-10 void postDirty(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent clean instance 
+ * is first made dirty, during an operation that modifies 
+ * the value of a persistent or transactional field. It is called
+ * after the field value was changed.
+ * A12.15-11 void preDetach(InstanceLifecycleEvent event); 
+ * This method is called before a persistent instance is copied 
+ * for detachment.
+ * A12.15-12 void postDetach(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is copied 
+ * for detachment. 
+ * The source instance is the detached copy; the target instance
+ * is the persistent instance.
+ * A12.15-13 void preAttach(InstanceLifecycleEvent event); 
+ * This method is called before a detached instance is attached. 
+ * The source instance is the detached instance].
+ * A12.15-14 void postAttach(InstanceLifecycleEvent event);
+ * This method is called after a detached instance is attached. 
+ * The source instance is the corresponding persistent instance in the cache;
+ * the target instance is the detached instance.
+ *
+ * This is the abstract base class for the lifecycle listener test classes.
+ * It contains constants, variables, and methods used by each listener test
+ * class. This class implements the setup and teardown methods used by each
+ * concrete test class.
+ *
+ * This class also includes the listener base class that is extended by
+ * each specific listener. 
+ *
+ * The strategy of each test case is the same. A specific listener is
+ * implemented that responds only to events for that specific test; a
+ * specific persistence-capable class is also implemented, that responds
+ * only to callbacks for the specific test. A sequence of operations that
+ * stimulates the callbacks is executed. During these operations, listener
+ * events and callbacks are collected by the listener instance. Finally,
+ * the actual events and callbacks that were collected are analyzed and
+ * differences are reported.
+ */
+
+public abstract class AbstractInstanceLifecycleListener extends JDO_Test {
+
+    /** */
+    protected static final String ASSERTION1_FAILED = 
+        "Assertion A12.15-1 (TestInstanceLifecycleListenerCreate) failed: ";
+    protected static final String ASSERTION2_FAILED = 
+        "Assertion A12.15-2 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION3_FAILED = 
+        "Assertion A12.15-3 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION4_FAILED = 
+        "Assertion A12.15-4 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION5_FAILED = 
+        "Assertion A12.15-5 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION6_FAILED = 
+        "Assertion A12.15-6 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION7_FAILED = 
+        "Assertion A12.15-7 (TestInstanceLifecycleListenerDelete) failed: ";
+    protected static final String ASSERTION8_FAILED = 
+        "Assertion A12.15-8 (TestInstanceLifecycleListenerDelete) failed: ";
+    protected static final String ASSERTION9_FAILED = 
+        "Assertion A12.15-9 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION10_FAILED = 
+        "Assertion A12.15-10 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION11_FAILED = 
+        "Assertion A12.15-11 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION12_FAILED = 
+        "Assertion A12.15-12 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION13_FAILED = 
+        "Assertion A12.15-13 (TestInstanceLifecycleListener) failed: ";
+    protected static final String ASSERTION14_FAILED = 
+        "Assertion A12.15-14 (TestInstanceLifecycleListener) failed: ";
+
+    /** 
+     * The listener to be used for the test. This method is implemented
+     * by the subclasses to use the proper listener.
+     */
+    protected abstract InstanceLifecycleListenerImpl getListener();
+
+    /** 
+     * The classes to be used for the test. This method is implemented
+     * by the subclasses to use the proper classes. The classes returned
+     * by this method are used for two purposes: they are used to register
+     * listeners; and they are used as the teardown classes whose instances
+     * are removed from the datastore at the end of the test.
+     */
+    protected abstract Class[] getPersistentClasses();
+
+    /** 
+     * Register a new InstanceLifecycleListenerImpl with the 
+     * PersistenceManager.
+     */
+    protected void addListener() {
+        getPM();
+        pm.addInstanceLifecycleListener(getListener(), getPersistentClasses());
+    }
+    
+    /**
+     * Unregister the InstanceLifecycleListenerImpl with the 
+     * PersistenceManager.
+     */
+    protected void removeListener() {
+        getPM();
+        pm.removeInstanceLifecycleListener(getListener());
+    }
+
+    /** 
+     * Set up for lifecycle tests:
+     * Register the LifecycleListener; add PCPoint to tearDownClasses.
+     */
+    protected void localSetUp() {
+        addListener();
+        addTearDownClass(getPersistentClasses());
+    }
+
+    /**
+     * Clean up after lifecycle tests:
+     * Unregister the LifecycleListener.
+     */
+    protected void localTearDown() {
+        removeListener();
+    }
+
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager. This is the base class that is extended 
+     * by each test.
+     */
+    protected abstract static class InstanceLifecycleListenerImpl 
+            implements AttachLifecycleListener, ClearLifecycleListener,
+            CreateLifecycleListener, DeleteLifecycleListener,
+            DetachLifecycleListener, DirtyLifecycleListener,
+            LoadLifecycleListener, StoreLifecycleListener {
+
+        protected InstanceLifecycleListenerImpl() {}
+
+        protected Object expectedSource = null;
+        protected Object expectedTarget = null;
+        
+        public void setExpectedSource(Object source) {
+            expectedSource = source;
+        }
+
+        public void setExpectedTarget(Object target) {
+            expectedTarget = target;
+        }
+
+        /** 
+         * This is the list names of locations for listener events and 
+         * callbacks. Each instance of an event or callback has a specific 
+         * name that is associated with the value. The values
+         * are used during collection of events and both names and values
+         * are used for reporting results.
+         */
+        private static List locations = new ArrayList();
+
+        /** These are indexes into the sequence array. Each index
+         * represents the position in the sequence array for the
+         * corresponding callback or listener event.
+         */
+        public static final int PRE_ATTACH_CALLBACK;
+        public static final int POST_ATTACH_CALLBACK;
+        public static final int PRE_ATTACH_LISTENER;
+        public static final int POST_ATTACH_LISTENER;
+        public static final int PRE_CLEAR_CALLBACK;
+        public static final int PRE_CLEAR_LISTENER;
+        public static final int POST_CLEAR_LISTENER;
+        public static final int POST_CREATE_LISTENER;
+        public static final int PRE_DELETE_CALLBACK;
+        public static final int PRE_DELETE_LISTENER;
+        public static final int POST_DELETE_LISTENER;
+        public static final int PRE_DETACH_CALLBACK;
+        public static final int POST_DETACH_CALLBACK;
+        public static final int PRE_DETACH_LISTENER;
+        public static final int POST_DETACH_LISTENER;
+        public static final int PRE_DIRTY_LISTENER;
+        public static final int POST_DIRTY_LISTENER;
+        public static final int POST_LOAD_CALLBACK;
+        public static final int POST_LOAD_LISTENER;
+        public static final int PRE_STORE_CALLBACK;
+        public static final int PRE_STORE_LISTENER;
+        public static final int POST_STORE_LISTENER;
+
+        /**
+         * Initialize the list of names and the associated values. For each
+         * listener event and callback, add the name and then assign the value.
+         */
+        static {
+            int index = 0;
+            locations.add("PRE_ATTACH_LISTENER");
+            PRE_ATTACH_LISTENER = index++;
+            locations.add("PRE_ATTACH_CALLBACK");
+            PRE_ATTACH_CALLBACK = index++;
+            locations.add("POST_ATTACH_CALLBACK");
+            POST_ATTACH_CALLBACK = index++;
+            locations.add("POST_ATTACH_LISTENER");
+            POST_ATTACH_LISTENER = index++;
+            locations.add("PRE_CLEAR_LISTENER");
+            PRE_CLEAR_LISTENER = index++;
+            locations.add("PRE_CLEAR_CALLBACK");
+            PRE_CLEAR_CALLBACK = index++;
+            locations.add("POST_CLEAR_LISTENER");
+            POST_CLEAR_LISTENER = index++;
+            locations.add("POST_CREATE_LISTENER");
+            POST_CREATE_LISTENER = index++;
+            locations.add("PRE_DELETE_LISTENER");
+            PRE_DELETE_LISTENER = index++;
+            locations.add("PRE_DELETE_CALLBACK");
+            PRE_DELETE_CALLBACK = index++;
+            locations.add("POST_DELETE_LISTENER");
+            POST_DELETE_LISTENER = index++;
+            locations.add("POST_DETACH_CALLBACK");
+            POST_DETACH_CALLBACK = index++;
+            locations.add("PRE_DETACH_LISTENER");
+            PRE_DETACH_LISTENER = index++;
+            locations.add("PRE_DETACH_CALLBACK");
+            PRE_DETACH_CALLBACK = index++;
+            locations.add("POST_DETACH_LISTENER");
+            POST_DETACH_LISTENER = index++;
+            locations.add("PRE_DIRTY_LISTENER");
+            PRE_DIRTY_LISTENER = index++;
+            locations.add("POST_DIRTY_LISTENER");
+            POST_DIRTY_LISTENER = index++;
+            locations.add("POST_LOAD_CALLBACK");
+            POST_LOAD_CALLBACK = index++;
+            locations.add("POST_LOAD_LISTENER");
+            POST_LOAD_LISTENER = index++;
+            locations.add("PRE_STORE_LISTENER");
+            PRE_STORE_LISTENER = index++;
+            locations.add("PRE_STORE_CALLBACK");
+            PRE_STORE_CALLBACK = index++;
+            locations.add("POST_STORE_LISTENER");
+            POST_STORE_LISTENER = index++;
+        }
+
+        private int[] actual = new int[locations.size()];
+
+        /** Track the current sequence of callbacks.
+         */
+        private int current = 0;
+
+        public void notifyEvent(int event) {
+            actual[event] = ++current;
+        }
+
+        /**
+         * Initialize the expected ordering of callbacks and listeners.
+         * Each entry in the sequence is one of the PRE_ or POST_XXX_LISTENER
+         * or _CALLBACK above. The order in the sequence is the expected
+         * calling order.
+         */
+        private static int[] newExpected(int[] sequence) {
+            int order = 0;
+            int[] result = new int[locations.size()];
+            for (int i = 0; i < sequence.length; ++i) {
+                result[sequence[i]] = ++order;
+            }
+            return result;
+        }
+
+        /** 
+         * The error message buffer to report exceptions.
+         */
+        protected StringBuffer messages = new StringBuffer();
+        
+        protected void checkEventType(String where, int expected, int actual) {
+            if (expected != actual) {
+                messages.append(where + "wrong event type: " +
+                        "expected <" + expected +
+                        ">, actual <" + actual + ">\n");
+            }
+        }
+        
+        protected void checkEventSource(String where, Object eventSource) {
+            if (expectedSource != eventSource) {
+                messages.append(where + "wrong event source: " +
+                        "expected <" + expectedSource +
+                        ">, actual <" + eventSource + ">\n");
+            }            
+        }
+
+        protected void checkEventTarget(String where, Object eventTarget) {
+            if (expectedTarget != eventTarget) {
+                messages.append(where + "wrong event target: " +
+                        "expected <" + expectedTarget +
+                        ">, actual <" + eventTarget + ">\n");
+            }            
+        }
+
+        protected void checkTrue(String where, boolean condition) {
+            if (!condition) {
+                messages.append(where + "was not true.\n");
+            }
+        }
+
+        protected void checkSame(String where, 
+                Object expected, Object actual) {
+            if (expected != actual) {
+                messages.append(where + 
+                        "expected <" + expected +
+                        ">, actual <" + actual + ">\n");
+            }            
+        }
+
+        protected void checkPersistent(String where, Object obj) {
+            if (!JDOHelper.isPersistent(obj)) {
+                messages.append(where + "object should be persistent.\n");
+            }
+        }
+
+        protected void checkNotPersistent(String where, Object obj) {
+            if (JDOHelper.isPersistent(obj)) {
+                messages.append(where + "object should not be persistent.\n");
+            }
+        }
+
+        protected void checkDirty(String where, Object obj) {
+            if (!JDOHelper.isDirty(obj)) {
+                messages.append(where + "object should be dirty.\n");
+            }
+        }
+
+        protected void checkNotDirty(String where, Object obj) {
+            if (JDOHelper.isDirty(obj)) {
+                messages.append(where + "object should not be dirty.\n");
+            }
+        }
+
+        protected void checkNew(String where, Object obj) {
+            if (!JDOHelper.isNew(obj)) {
+                messages.append(where + "object should be new.\n");
+            }
+        }
+
+        protected void checkNotNew(String where, Object obj) {
+            if (JDOHelper.isNew(obj)) {
+                messages.append(where + "object should not be new.\n");
+            }
+        }
+
+        protected void checkDeleted(String where, Object obj) {
+            if (!JDOHelper.isDeleted(obj)) {
+                messages.append(where + "object should be deleted.\n");
+            }
+        }
+
+        protected void checkNotDeleted(String where, Object obj) {
+            if (JDOHelper.isDeleted(obj)) {
+                messages.append(where + "object should not be deleted.\n");
+            }
+        }
+
+        /** 
+         * Verify the actual sequence of callbacks and listeners
+         * against the expected. Each of the expected and actual are
+         * int arrays in which each listener and callback have one
+         * position in the array and the value of the array at that
+         * position is the order, starting with 1, of the callback.
+         * If the callback or listener was never invoked, the value
+         * is 0.
+         */
+        public void verifyCallbacks(String where, int[] expected) {
+            int[] expectedSequence = newExpected(expected);
+            for (int index = 0; index < locations.size(); ++index) {
+                if (expectedSequence[index] != actual[index]) {
+                    messages.append("\nSequence verification failed for " +
+                            locations.get(index) + 
+                            "; expected: <" + expectedSequence[index] +
+                            "> actual: <" + actual[index] +
+                            ">\n");
+                }
+            }
+            if (messages.length() > 0) {
+                fail(where + "\n" + messages.toString());
+            }
+        }
+
+        public void postAttach(InstanceLifecycleEvent event) {
+        }
+
+        public void postClear(InstanceLifecycleEvent event) {
+        }
+
+        public void postCreate(InstanceLifecycleEvent event) {
+        }
+
+        public void postDelete(InstanceLifecycleEvent event) {
+        }
+
+        public void postDetach(InstanceLifecycleEvent event) {
+        }
+
+        public void postDirty(InstanceLifecycleEvent event) {
+        }
+
+        public void postLoad(InstanceLifecycleEvent event) {
+        }
+
+        public void postStore(InstanceLifecycleEvent event) {
+        }
+
+        public void preAttach(InstanceLifecycleEvent event) {
+        }
+
+        public void preClear(InstanceLifecycleEvent event) {
+        }
+
+        public void preDelete(InstanceLifecycleEvent event) {
+        }
+
+        public void preDetach(InstanceLifecycleEvent event) {
+        }
+
+        public void preDirty(InstanceLifecycleEvent event) {
+        }
+
+        public void preStore(InstanceLifecycleEvent event) {
+        }
+        
+    }
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.Date;
+
+import javax.jdo.listener.AttachCallback;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.pc.mylib.PCPoint;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test TestInstanceLifecycleListenerAttach
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener preAttach postAttach
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-13 A12.15-14
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-13 void preAttach(InstanceLifecycleEvent event); 
+ * This method is called before a detached instance is attached. 
+ * The source instance is the detached instance].
+ * A12.15-14 void postAttach(InstanceLifecycleEvent event);
+ * This method is called after a detached instance is attached. 
+ * The source instance is the corresponding persistent instance in the cache;
+ * the target instance is the detached instance.
+ */
+
+public class InstanceLifecycleListenerAttach 
+        extends AbstractInstanceLifecycleListener {
+
+    
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerAttachImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PC.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerAttach.class);
+    }
+
+    /** 
+     * This test creates a new persistent instance and detaches it.
+     * The instance is attached in a new transaction, which causes
+     * the attach callbacks and listeners to be called.
+     */
+    public void testAttach() {
+
+        // set up the persistent instance
+        PC pc = new PC(listener);
+
+        getPM();
+        pm.currentTransaction().begin();
+        pm.makePersistent(pc);
+        PC detached = (PC)pm.detachCopy(pc);
+        pm.currentTransaction().commit();
+        pm.currentTransaction().begin();
+        listener.setExpectedSource(detached);
+        // attachCopy should cause the attach listeners to be called
+        PC attached = (PC)pm.attachCopy(detached, false);
+        pm.currentTransaction().commit();
+
+        // now check the callback and listener were called
+        listener.verifyCallbacks(ASSERTION13_FAILED, new int[] {
+                listener.PRE_ATTACH_LISTENER,
+                listener.PRE_ATTACH_CALLBACK,
+                listener.POST_ATTACH_LISTENER});
+    }
+    
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerAttachImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void preAttach(InstanceLifecycleEvent event) {
+            notifyEvent(PRE_ATTACH_LISTENER);
+            checkEventType(ASSERTION13_FAILED,
+                    InstanceLifecycleEvent.ATTACH, event.getEventType());
+            checkEventSource(ASSERTION13_FAILED, event.getSource());
+        }
+
+        public void postAttach(InstanceLifecycleEvent event) {
+            notifyEvent(POST_ATTACH_LISTENER);
+            checkEventType(ASSERTION14_FAILED,
+                    InstanceLifecycleEvent.ATTACH, event.getEventType());
+            checkPersistent(ASSERTION14_FAILED + "in postAttach, source ",
+                    event.getSource());
+            checkTrue(ASSERTION14_FAILED + 
+                    "in postAttach, source wasPostAttachCalled() ",
+                    ((PC)event.getSource()).wasPostAttachCalled());
+            checkSame(ASSERTION14_FAILED + "in postAttach, target ",
+                    expectedSource, event.getTarget());
+        }
+
+    }
+
+    /** The persistence-capable class that implements the attach callback.
+     */
+    public static class PC implements AttachCallback {
+        transient InstanceLifecycleListenerImpl listener;
+
+        transient boolean postAttachCalled = false;
+        public boolean wasPostAttachCalled() {
+            return postAttachCalled;
+        }
+        
+        transient Object postAttachObject = null;
+        public Object getPostAttachObject() {
+            return postAttachObject;
+        }
+
+        int id; 
+        public PC() {
+        }
+        public PC(InstanceLifecycleListenerImpl listener) {
+            id = counter++;
+            this.listener = listener;
+        }
+        static int counter = (int)(new Date().getTime());
+
+        public void jdoPreAttach() {
+            if (listener == null)
+                return;
+            listener.notifyEvent(listener.PRE_ATTACH_CALLBACK);
+        }
+        public void jdoPostAttach(Object obj) {
+            postAttachCalled = true;
+            postAttachObject = obj;
+        }
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerClear.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerClear.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerClear.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerClear.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.Date;
+
+import javax.jdo.listener.ClearCallback;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.pc.mylib.PCPoint;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test TestInstanceLifecycleListenerClear
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener hollow preClear postClear
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-5 A12.15-6
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-5 void preClear(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is cleared, for example during afterCompletion. It is called 
+ * before the jdoPreClear method is invoked on the instance.
+ * A12.15-6 void postClear(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is cleared, for example during afterCompletion. It is called 
+ * after the jdoPreClear method is invoked on the instance and the fields 
+ * have been cleared by the JDO implementation.
+ */
+
+public class InstanceLifecycleListenerClear 
+        extends AbstractInstanceLifecycleListener {
+
+    
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerClearImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PC.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerClear.class);
+    }
+
+    /** 
+     * This test creates a new persistent instance and commits it.
+     * Since the RetainValues flag is set to false, the persistent
+     * fields will be cleared, and the pre-clear listener,
+     * pre-clear callback, and post-clear listener will be called.
+     */
+    public void testClear() {
+
+        // set up the persistent instance
+        PC pc = new PC(listener);
+        listener.setExpectedSource(pc);
+
+        // commit should cause the clear listeners to be called
+        getPM();
+        pm.currentTransaction().begin();
+        pm.currentTransaction().setRetainValues(false);
+        pm.makePersistent(pc);
+        pm.currentTransaction().commit();
+
+        // now check the callback and listeners were called
+        listener.verifyCallbacks(ASSERTION5_FAILED, new int[] {
+                listener.PRE_CLEAR_LISTENER,
+                listener.PRE_CLEAR_CALLBACK,
+                listener.POST_CLEAR_LISTENER});
+    }
+    
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerClearImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void preClear(InstanceLifecycleEvent event) {
+            notifyEvent(PRE_CLEAR_LISTENER);
+            checkEventType(ASSERTION5_FAILED, 
+                    InstanceLifecycleEvent.CLEAR, event.getEventType());
+            checkEventSource(ASSERTION5_FAILED, event.getSource());
+            checkPersistent(ASSERTION5_FAILED + " in preClear, ", 
+                    expectedSource);
+        }
+
+        public void postClear(InstanceLifecycleEvent event) {
+            notifyEvent(POST_CLEAR_LISTENER);
+            checkEventType(ASSERTION6_FAILED, 
+                    InstanceLifecycleEvent.CLEAR, event.getEventType());
+            checkEventSource(ASSERTION6_FAILED, event.getSource());
+            checkPersistent(ASSERTION6_FAILED + " in postClear, ",
+                    expectedSource);
+        }
+
+    }
+
+    /** The persistence-capable class that implements the clear callback.
+     */
+    public static class PC implements ClearCallback {
+        transient InstanceLifecycleListenerImpl listener;
+        int id; 
+        public PC() {
+        }
+        public PC(InstanceLifecycleListenerImpl listener) {
+            id = counter++;
+            this.listener = listener;
+        }
+        static int counter = (int)(new Date().getTime());
+
+        public void jdoPreClear() {
+            listener.notifyEvent(listener.PRE_CLEAR_CALLBACK);
+        }
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerCreate.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerCreate.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerCreate.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerCreate.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.AttachLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+import javax.jdo.listener.CreateLifecycleListener;
+import javax.jdo.listener.DeleteLifecycleListener;
+import javax.jdo.listener.DetachLifecycleListener;
+import javax.jdo.listener.LoadLifecycleListener;
+import javax.jdo.listener.StoreLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.pc.mylib.PCPoint;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test TestInstanceLifecycleListener
+ * <BR>
+ * <B>Keywords:</B> addLifeCycleListener removeLifeCycleListener
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-1
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-1 void postCreate(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is created, 
+ * during makePersistent. It is called after the instance transitions 
+ * to persistent-new.
+ */
+
+public class InstanceLifecycleListenerCreate 
+        extends AbstractInstanceLifecycleListener {
+
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerCreateImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PCPoint.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerCreate.class);
+    }
+
+    /** */
+    public void testCreate() {
+
+        // set up the persistent instance
+        PCPoint point = new PCPoint(12, 15);
+        listener.setExpectedSource(point);
+
+        // makePersistent should cause the create listener to be called
+        getPM();
+        pm.currentTransaction().begin();
+        pm.makePersistent(point);
+        pm.currentTransaction().commit();
+
+        // verify that the listener was called
+        listener.verifyCallbacks(ASSERTION1_FAILED, new int[] {
+                listener.POST_CREATE_LISTENER});
+    }
+    
+    /** 
+     * The LifeCycleListener class to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerCreateImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void postCreate(InstanceLifecycleEvent event) {
+            notifyEvent(POST_CREATE_LISTENER);
+            checkEventType(ASSERTION1_FAILED,
+                    InstanceLifecycleEvent.CREATE, event.getEventType());
+            checkEventSource(ASSERTION1_FAILED, event.getSource());
+            checkPersistent(ASSERTION1_FAILED + " in postCreate, ",
+                    expectedSource);
+            checkNew(ASSERTION1_FAILED + " in postCreate, ",
+                    expectedSource);
+        }
+
+    }
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDelete.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDelete.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDelete.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDelete.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.Date;
+
+import javax.jdo.listener.DeleteCallback;
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.DeleteLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.pc.mylib.PCPoint;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test TestInstanceLifecycleListenerDelete
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener deletePersistent preDelete postDelete
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-7 A12.15-8
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-7 void preDelete(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is deleted, during deletePersistent. It is called before 
+ * the state transition and before the jdoPreDelete method 
+ * is invoked on the instance.
+ * A12.15-8 void postDelete(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance 
+ * is deleted, during deletePersistent. It is called 
+ * after the jdoPreDelete method is invoked on the instance
+ * and after the state transition.
+ */
+
+public class InstanceLifecycleListenerDelete 
+        extends AbstractInstanceLifecycleListener {
+
+    
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerDeleteImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PC.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerDelete.class);
+    }
+
+    /**
+     * This test creates a new persistent instance, and deletes it.
+     * The pre-delete listener, pre-delete callback, and post-delete
+     * listener will be called.
+     */
+    public void testDelete() {
+
+        // set up the persistent instance
+        PC pc = new PC(listener);
+        listener.setExpectedSource(pc);
+
+        // deletePersistent should cause the delete listeners to be called
+        getPM();
+        pm.currentTransaction().begin();
+        pm.makePersistent(pc);
+        pm.deletePersistent(pc);
+        pm.currentTransaction().commit();
+
+        // now check the callback and listeners were called
+        listener.verifyCallbacks(ASSERTION7_FAILED, (new int[] {
+                listener.PRE_DELETE_LISTENER,
+                listener.PRE_DELETE_CALLBACK,
+                listener.POST_DELETE_LISTENER}));
+    }
+    
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerDeleteImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void preDelete(InstanceLifecycleEvent event) {
+            notifyEvent(PRE_DELETE_LISTENER);
+            checkEventType(ASSERTION7_FAILED,
+                    InstanceLifecycleEvent.DELETE, event.getEventType());
+            checkEventSource(ASSERTION7_FAILED, event.getSource());
+            checkPersistent(ASSERTION7_FAILED + " in preDelete, ",
+                    expectedSource);
+            checkNotDeleted(ASSERTION7_FAILED + " in preDelete, ",
+                    expectedSource);
+        }
+
+        public void postDelete(InstanceLifecycleEvent event) {
+            notifyEvent(POST_DELETE_LISTENER);
+            checkEventType(ASSERTION8_FAILED,
+                    InstanceLifecycleEvent.DELETE, event.getEventType());
+            checkEventSource(ASSERTION8_FAILED, event.getSource());
+            checkPersistent(ASSERTION8_FAILED + " in postDelete, ",
+                    expectedSource);
+            checkDeleted(ASSERTION8_FAILED + " in postDelete, ",
+                    expectedSource);
+        }
+    }
+
+    /** The persistence-capable class that implements the delete callback.
+     */
+    public static class PC implements DeleteCallback {
+        transient InstanceLifecycleListenerImpl listener;
+        int id; 
+        public PC() {
+        }
+        public PC(InstanceLifecycleListenerImpl listener) {
+            id = counter++;
+            this.listener = listener;
+        }
+        static int counter = (int)(new Date().getTime());
+
+        public void jdoPreDelete() {
+            listener.notifyEvent(listener.PRE_DELETE_CALLBACK);
+        }
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDetach.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDetach.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDetach.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDetach.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.Date;
+
+import javax.jdo.listener.DetachCallback;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test InstanceLifecycleListenerDetach
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener preDetach postDetach
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-11 A12.15-12
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-11 void preDetach(InstanceLifecycleEvent event); 
+ * This method is called before a persistent instance is copied 
+ * for detachment.
+ * A12.15-12 void postDetach(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is copied 
+ * for detachment. 
+ * The source instance is the detached copy; the target instance
+ * is the persistent instance.
+ */
+
+public class InstanceLifecycleListenerDetach 
+        extends AbstractInstanceLifecycleListener {
+
+    
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerDetachImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PC.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerLoad.class);
+    }
+
+    /** 
+     * This test creates a new persistent instance and commits it.
+     * Since the RetainValues flag is set to false, the persistent
+     * fields will be cleared, and the pre-clear listener,
+     * pre-clear callback, and post-clear listener will be called.
+     */
+    public void testDetach() {
+
+        // set up the persistent instance
+        PC pc = new PC(listener);
+        listener.setExpectedSource(pc);
+
+        getPM();
+        pm.currentTransaction().begin();
+        pm.makePersistent(pc);
+        // detachCopy should cause the detach listeners to be called
+        PC detached = (PC)pm.detachCopy(pc);
+        pm.currentTransaction().commit();
+
+        // now check the callback and listener were called
+        listener.verifyCallbacks(ASSERTION11_FAILED, new int[] {
+                listener.PRE_DETACH_LISTENER,
+                listener.PRE_DETACH_CALLBACK,
+                listener.POST_DETACH_LISTENER});
+    }
+    
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerDetachImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void preDetach(InstanceLifecycleEvent event) {
+            notifyEvent(PRE_DETACH_LISTENER);
+            checkEventType(ASSERTION11_FAILED,
+                    InstanceLifecycleEvent.DETACH, event.getEventType());
+            checkEventSource(ASSERTION11_FAILED, event.getSource());
+            checkPersistent(ASSERTION11_FAILED + "in preDetach, source ",
+                    event.getSource());
+        }
+
+        public void postDetach(InstanceLifecycleEvent event) {
+            notifyEvent(POST_DETACH_LISTENER);
+            checkEventType(ASSERTION12_FAILED,
+                    InstanceLifecycleEvent.DETACH, event.getEventType());
+            checkSame(ASSERTION12_FAILED + "in postDetach, target ",
+                    expectedSource, event.getTarget());
+            checkNotPersistent(ASSERTION12_FAILED + "in postDetach, source ",
+                    event.getSource());
+            checkPersistent(ASSERTION12_FAILED + "in postDetach, target ",
+                    event.getTarget());
+            checkTrue(ASSERTION12_FAILED + 
+                    "in postDetach, source wasPostDetachCalled() ",
+                    ((PC)event.getSource()).wasPostDetachCalled());
+        }
+
+    }
+
+    /** The persistence-capable class that implements the load callback.
+     */
+    public static class PC implements DetachCallback {
+        transient InstanceLifecycleListenerImpl listener;
+        int id; 
+        public PC() {
+        }
+        public PC(InstanceLifecycleListenerImpl listener) {
+            id = counter++;
+            this.listener = listener;
+        }
+        static int counter = (int)(new Date().getTime());
+
+        transient boolean postDetachCalled = false;
+        public boolean wasPostDetachCalled() {
+            return postDetachCalled;
+        }
+
+        transient Object postDetachObject = null;
+        public Object getPostDetachObject() {
+            return postDetachObject;
+        }
+ 
+        public void jdoPreDetach() {
+            if (listener == null)
+                return;
+            listener.notifyEvent(listener.PRE_DETACH_CALLBACK);
+        }
+        public void jdoPostDetach(Object obj) {
+            postDetachCalled = true;
+            postDetachObject = obj;
+        }
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDirty.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDirty.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDirty.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerDirty.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.Date;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.pc.mylib.PCPoint;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test InstanceLifecycleListenerDirty
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener preDirty postDirty
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-9 A12.15-10
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-9 void preDirty(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent clean instance 
+ * is first made dirty, during an operation that modifies 
+ * the value of a persistent or transactional field. It is called
+ * before the field value is changed.
+ * A12.15-10 void postDirty(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent clean instance 
+ * is first made dirty, during an operation that modifies 
+ * the value of a persistent or transactional field. It is called
+ * after the field value was changed.
+ */
+
+public class InstanceLifecycleListenerDirty 
+        extends AbstractInstanceLifecycleListener {
+
+    
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerDirtyImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PCPoint.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerDirty.class);
+    }
+
+    /** 
+     * This test creates a new persistent instance and commits it.
+     * A new transaction is started and a persistent field is modified.
+     * This will call the dirty listeners.
+     */
+    public void testDirty() {
+
+        // set up the persistent instance
+        PCPoint pc = new PCPoint(100, 200);
+        listener.setExpectedSource(pc);
+
+        // setY should cause the dirty listeners to be called
+        getPM();
+        pm.currentTransaction().begin();
+        pm.makePersistent(pc);
+        pm.currentTransaction().commit();
+        pm.currentTransaction().begin();
+        pc.setY(new Integer(666));
+        pm.currentTransaction().commit();
+
+        // now check the callback and listener were called
+        listener.verifyCallbacks(ASSERTION10_FAILED, new int[] {
+                listener.PRE_DIRTY_LISTENER,
+                listener.POST_DIRTY_LISTENER});
+    }
+    
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerDirtyImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void preDirty(InstanceLifecycleEvent event) {
+            notifyEvent(PRE_DIRTY_LISTENER);
+            checkEventType(ASSERTION9_FAILED,
+                    InstanceLifecycleEvent.DIRTY, event.getEventType());
+            checkEventSource(ASSERTION9_FAILED, event.getSource());
+            checkPersistent(ASSERTION9_FAILED + " in preDirty, ",
+                    expectedSource);
+            checkNotDirty(ASSERTION9_FAILED + " in preDirty, ",
+                    expectedSource);
+        }
+
+        public void postDirty(InstanceLifecycleEvent event) {
+            notifyEvent(POST_DIRTY_LISTENER);
+            checkEventType(ASSERTION10_FAILED,
+                    InstanceLifecycleEvent.DIRTY, event.getEventType());
+            checkEventSource(ASSERTION10_FAILED, event.getSource());
+            checkPersistent(ASSERTION10_FAILED + " in postDirty,",
+                    expectedSource);
+            checkDirty(ASSERTION9_FAILED + " in postDirty, ",
+                    expectedSource);
+        }
+
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerLoad.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerLoad.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerLoad.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerLoad.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.Date;
+
+import javax.jdo.listener.LoadCallback;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test InstanceLifecycleListenerLoad
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener postLoad
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-2
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-2 void postLoad(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is loaded. 
+ * It is called after the jdoPostLoad method is invoked on the instance.
+ */
+
+public class InstanceLifecycleListenerLoad 
+        extends AbstractInstanceLifecycleListener {
+
+    
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerLoadImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PC.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerLoad.class);
+    }
+
+    /** 
+     * This test creates a new persistent instance and commits it.
+     * In a new transaction, a value is accessed, which causes the
+     * instance to be loaded.
+     */
+    public void testLoad() {
+
+        // set up the persistent instance
+        PC pc = new PC(listener);
+        listener.setExpectedSource(pc);
+
+        // field access should cause the load listeners to be called
+        getPM();
+        pm.currentTransaction().begin();
+        pm.currentTransaction().setRetainValues(false);
+        pm.makePersistent(pc);
+        pm.currentTransaction().commit();
+        pm.currentTransaction().begin();
+        pc.getValue();
+        pm.currentTransaction().commit();
+
+        // now check the callback and listener were called
+        listener.verifyCallbacks(ASSERTION2_FAILED, new int[] {
+                listener.POST_LOAD_CALLBACK,
+                listener.POST_LOAD_LISTENER});
+    }
+    
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerLoadImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void postLoad(InstanceLifecycleEvent event) {
+            notifyEvent(POST_LOAD_LISTENER);
+            checkEventType(ASSERTION2_FAILED,
+                    InstanceLifecycleEvent.LOAD, event.getEventType());
+            checkEventSource(ASSERTION2_FAILED, event.getSource());
+            checkPersistent(ASSERTION2_FAILED + " in postLoad, ",
+                    expectedSource);
+            checkNotNew(ASSERTION2_FAILED + " in postLoad, ",
+                    expectedSource);
+        }
+
+    }
+
+    /** The persistence-capable class that implements the load callback.
+     */
+    public static class PC implements LoadCallback {
+        transient InstanceLifecycleListenerImpl listener;
+        int id; 
+        int value;
+        public int getValue() {
+            return value;
+        }
+        public PC() {
+        }
+        public PC(InstanceLifecycleListenerImpl listener) {
+            id = counter++;
+            this.listener = listener;
+        }
+        static int counter = (int)(new Date().getTime());
+
+        public void jdoPostLoad() {
+            listener.notifyEvent(listener.POST_LOAD_CALLBACK);
+        }
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerStore.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerStore.java?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerStore.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerStore.java Sun Oct 16 20:29:07 2005
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.jdo.tck.api.instancecallbacks;
+
+import java.util.Date;
+
+import javax.jdo.listener.StoreCallback;
+
+import javax.jdo.JDOHelper;
+
+import javax.jdo.listener.InstanceLifecycleEvent;
+import javax.jdo.listener.InstanceLifecycleListener;
+import javax.jdo.listener.ClearLifecycleListener;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ * <B>Title:</B> Test InstanceLifecycleListenerLoad
+ * <BR>
+ * <B>Keywords:</B> LifeCycleListener preStore postStore
+ * <BR>
+ * <B>Assertion IDs:</B> A12.15-3 A12.15-4
+ * <BR>
+ * <B>Assertion Description: </B>
+ * A12.15-3 void preStore(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is stored, 
+ * for example during flush or commit. It is called 
+ * before the jdoPreStore method is invoked on the instance.
+ * A12.15-4 void postStore(InstanceLifecycleEvent event); 
+ * This method is called whenever a persistent instance is stored,
+ * for example during flush or commit. It is called 
+ * after the jdoPreStore method is invoked on the instance. 
+ * An object identity for a per?sistent-new instance must have been assigned
+ * to the instance when this callback is invoked.
+ */
+
+public class InstanceLifecycleListenerStore 
+        extends AbstractInstanceLifecycleListener {
+
+    
+    /**
+     * The InstanceLifecycleListener used for this test
+     */
+    InstanceLifecycleListenerImpl listener = 
+            new InstanceLifecycleListenerStoreImpl();
+
+    /** Return the listener.
+     */
+    protected InstanceLifecycleListenerImpl getListener() {
+        return listener;
+    }
+
+    /**
+     * The persistent classes used for this test.
+     */
+    private static Class[] persistentClasses = new Class[] {PC.class};
+
+    /** Return the persistent classes.
+     */
+    protected Class[] getPersistentClasses() {
+        return persistentClasses;
+    }
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(InstanceLifecycleListenerStore.class);
+    }
+
+    /** 
+     * This test creates a new persistent instance and commits it.
+     * The store callback and listeners will be called.
+     */
+    public void testStore() {
+
+        // set up the persistent instance
+        PC pc = new PC(listener);
+        listener.setExpectedSource(pc);
+
+        // commit should cause the store listeners to be called
+        getPM();
+        pm.currentTransaction().begin();
+        pm.makePersistent(pc);
+        pm.currentTransaction().commit();
+
+        // now check the callback and listener were called
+        listener.verifyCallbacks(ASSERTION2_FAILED, new int[] {
+                listener.PRE_STORE_LISTENER,
+                listener.PRE_STORE_CALLBACK,
+                listener.POST_STORE_LISTENER});
+    }
+    
+    /** 
+     * The LifeCycleListener to be registered with the 
+     * PersistenceManager.
+     */
+    private static class InstanceLifecycleListenerStoreImpl 
+            extends InstanceLifecycleListenerImpl {
+
+        public void preStore(InstanceLifecycleEvent event) {
+            notifyEvent(PRE_STORE_LISTENER);
+            checkEventType(ASSERTION3_FAILED,
+                    InstanceLifecycleEvent.STORE, event.getEventType());
+            checkEventSource(ASSERTION3_FAILED, event.getSource());
+            checkPersistent(ASSERTION3_FAILED + " in preStore, ",
+                    expectedSource);
+        }
+
+        public void postStore(InstanceLifecycleEvent event) {
+            notifyEvent(POST_STORE_LISTENER);
+            checkEventType(ASSERTION4_FAILED,
+                    InstanceLifecycleEvent.STORE, event.getEventType());
+            checkEventSource(ASSERTION4_FAILED, event.getSource());
+            checkPersistent(ASSERTION4_FAILED + " in postStore, ",
+                    expectedSource);
+        }
+
+    }
+
+    /** The persistence-capable class that implements the load callback.
+     */
+    public static class PC implements StoreCallback {
+        transient InstanceLifecycleListenerImpl listener;
+        int id; 
+        public PC() {
+        }
+        public PC(InstanceLifecycleListenerImpl listener) {
+            id = counter++;
+            this.listener = listener;
+        }
+        static int counter = (int)(new Date().getTime());
+
+        public void jdoPreStore() {
+            listener.notifyEvent(listener.PRE_STORE_CALLBACK);
+        }
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo (added)
+++ incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo Sun Oct 16 20:29:07 2005
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 2.0//EN" "http://java.sun.com/dtd/jdo_2_0.dtd">
+<!--
+This file contains the persistence information for persistence-capable classes 
+-->
+<jdo> 
+    <package name="org.apache.jdo.tck.api.instancecallbacks">
+        <class name="InstanceLifecycleListenerAttach$PC" detachable="true">
+            <field name="id" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerClear$PC">
+            <field name="id" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerDelete$PC">
+            <field name="id" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerDetach$PC" detachable="true">
+            <field name="id" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerLoad$PC">
+            <field name="id" primary-key="true"/>
+            <field name="value"/>
+        </class>
+        <class name="InstanceLifecycleListenerStore$PC">
+            <field name="id" primary-key="true"/>
+        </class>
+    </package>
+</jdo>

Added: incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo (added)
+++ incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package.jdo Sun Oct 16 20:29:07 2005
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 2.0//EN" "http://java.sun.com/dtd/jdo_2_0.dtd">
+<!--
+This file contains the persistence information for persistence-capable classes 
+-->
+<jdo> 
+    <package name="org.apache.jdo.tck.api.instancecallbacks">
+        <class name="InstanceLifecycleListenerAttach$PC" 
+                identity-type="datastore" detachable="true">
+            <field name="id"/>
+        </class>
+        <class name="InstanceLifecycleListenerClear$PC" 
+                identity-type="datastore">
+            <field name="id"/>
+        </class>
+        <class name="InstanceLifecycleListenerDelete$PC" 
+                identity-type="datastore">
+            <field name="id"/>
+        </class>
+        <class name="InstanceLifecycleListenerDetach$PC" 
+                identity-type="datastore" detachable="true">
+            <field name="id"/>
+        </class>
+        <class name="InstanceLifecycleListenerLoad$PC" 
+                identity-type="datastore">
+            <field name="id"/>
+            <field name="value"/>
+        </class>
+        <class name="InstanceLifecycleListenerStore$PC" 
+                identity-type="datastore">
+            <field name="id"/>
+        </class>
+    </package>
+</jdo>

Added: incubator/jdo/trunk/tck20/test/orm/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/orm/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/orm/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm (added)
+++ incubator/jdo/trunk/tck20/test/orm/applicationidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm Sun Oct 16 20:29:07 2005
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE orm PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Mapping Metadata 2.0//EN" "http://java.sun.com/dtd/orm_2_0.dtd">
+<!--
+This file contains the schema information when an implementation
+has application identity.
+-->
+<orm>
+    <package name="org.apache.jdo.tck.api.instancecallbacks">
+
+        <class name="InstanceLifecycleListenerAttach$PC" 
+                table="LIFECYCLELISTENERATTACH">
+            <field name="id" column="ID" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerClear$PC" 
+                table="LIFECYCLELISTENERCLEAR">
+            <field name="id" column="ID" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerDelete$PC" 
+                table="LIFECYCLELISTENERDELETE">
+            <field name="id" column="ID" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerDetach$PC" 
+                table="LIFECYCLELISTENERDETACH">
+            <field name="id" column="ID" primary-key="true"/>
+        </class>
+        <class name="InstanceLifecycleListenerLoad$PC" 
+                table="LIFECYCLELISTENERLOAD">
+            <field name="id" column="ID" primary-key="true"/>
+            <field name="value" column="VALUE"/>
+        </class>
+        <class name="InstanceLifecycleListenerStore$PC" 
+                table="LIFECYCLELISTENERSTORE">
+            <field name="id" column="ID" primary-key="true"/>
+        </class>
+    </package>
+</orm>

Added: incubator/jdo/trunk/tck20/test/orm/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/orm/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm?rev=325833&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/orm/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm (added)
+++ incubator/jdo/trunk/tck20/test/orm/datastoreidentity/org/apache/jdo/tck/api/instancecallbacks/package-derby.orm Sun Oct 16 20:29:07 2005
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE orm PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Mapping Metadata 2.0//EN" "http://java.sun.com/dtd/orm_2_0.dtd">
+<!--
+This file contains the schema information when an implementation
+has datastore identity.
+-->
+<orm>
+    <package name="org.apache.jdo.tck.api.instancecallbacks">
+
+        <class name="InstanceLifecycleListenerAttach$PC" 
+                table="LIFECYCLELISTENERATTACH">
+            <datastore-identity strategy="identity" column="DATASTORE_IDENTITY"/>
+            <field name="id" column="ID"/>
+        </class>
+        <class name="InstanceLifecycleListenerClear$PC" 
+                table="LIFECYCLELISTENERCLEAR">
+            <datastore-identity strategy="identity" column="DATASTORE_IDENTITY"/>
+            <field name="id" column="ID"/>
+        </class>
+        <class name="InstanceLifecycleListenerDelete$PC" 
+                table="LIFECYCLELISTENERDELETE">
+            <datastore-identity strategy="identity" column="DATASTORE_IDENTITY"/>
+            <field name="id" column="ID"/>
+        </class>
+        <class name="InstanceLifecycleListenerDetach$PC" 
+                table="LIFECYCLELISTENERDETACH">
+            <datastore-identity strategy="identity" column="DATASTORE_IDENTITY"/>
+            <field name="id" column="ID"/>
+        </class>
+        <class name="InstanceLifecycleListenerLoad$PC" 
+                table="LIFECYCLELISTENERLOAD">
+            <datastore-identity strategy="identity" column="DATASTORE_IDENTITY"/>
+            <field name="id" column="ID"/>
+            <field name="value" column="VALUE"/>
+        </class>
+        <class name="InstanceLifecycleListenerStore$PC" 
+                table="LIFECYCLELISTENERSTORE">
+            <datastore-identity strategy="identity" column="DATASTORE_IDENTITY"/>
+            <field name="id" column="ID"/>
+        </class>
+    </package>
+</orm>

Modified: incubator/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema.sql
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema.sql?rev=325833&r1=325832&r2=325833&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema.sql (original)
+++ incubator/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema.sql Sun Oct 16 20:29:07 2005
@@ -7374,4 +7374,51 @@
     CONSTRAINT STOBJ_PK PRIMARY KEY (ID)
 );
 
+-------------------------
+--lifecycle-callbacks
+-------------------------
+
+DROP TABLE LIFECYCLELISTENERATTACH;
+
+CREATE TABLE LIFECYCLELISTENERATTACH (
+    ID INTEGER NOT NULL,
+    CONSTRAINT LIFECYCLE_ATTACH_PK PRIMARY KEY (ID)
+);
+
+DROP TABLE LIFECYCLELISTENERCLEAR;
+
+CREATE TABLE LIFECYCLELISTENERCLEAR (
+    ID INTEGER NOT NULL,
+    CONSTRAINT LIFECYCLE_CLEAR_PK PRIMARY KEY (ID)
+);
+
+DROP TABLE LIFECYCLELISTENERDELETE;
+
+CREATE TABLE LIFECYCLELISTENERDELETE (
+    ID INTEGER NOT NULL,
+    CONSTRAINT LIFECYCLE_DELETE_PK PRIMARY KEY (ID)
+);
+
+DROP TABLE LIFECYCLELISTENERDETACH;
+
+CREATE TABLE LIFECYCLELISTENERDETACH (
+    ID INTEGER NOT NULL,
+    CONSTRAINT LIFECYCLE_DETACH_PK PRIMARY KEY (ID)
+);
+
+DROP TABLE LIFECYCLELISTENERLOAD;
+
+CREATE TABLE LIFECYCLELISTENERLOAD (
+    ID INTEGER NOT NULL,
+    VALUE INTEGER NOT NULL,
+    CONSTRAINT LIFECYCLE_LOAD_PK PRIMARY KEY (ID)
+);
+
+DROP TABLE LIFECYCLELISTENERSTORE;
+
+CREATE TABLE LIFECYCLELISTENERSTORE (
+    ID INTEGER NOT NULL,
+    CONSTRAINT LIFECYCLE_STORE_PK PRIMARY KEY (ID)
+);
+
 disconnect;

Modified: incubator/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema.sql
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema.sql?rev=325833&r1=325832&r2=325833&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema.sql (original)
+++ incubator/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema.sql Sun Oct 16 20:29:07 2005
@@ -7380,4 +7380,57 @@
     CONSTRAINT STOBJ_PK PRIMARY KEY (DATASTORE_IDENTITY)
 );
 
+-------------------------
+--lifecycle-callbacks
+-------------------------
+
+DROP TABLE LIFECYCLELISTENERATTACH;
+
+CREATE TABLE LIFECYCLELISTENERATTACH (
+    DATASTORE_IDENTITY INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
+    ID INTEGER,
+    CONSTRAINT LIFECYCLE_ATTACH_PK PRIMARY KEY (DATASTORE_IDENTITY)
+);
+
+DROP TABLE LIFECYCLELISTENERCLEAR;
+
+CREATE TABLE LIFECYCLELISTENERCLEAR (
+    DATASTORE_IDENTITY INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
+    ID INTEGER,
+    CONSTRAINT LIFECYCLE_CLEAR_PK PRIMARY KEY (DATASTORE_IDENTITY)
+);
+
+DROP TABLE LIFECYCLELISTENERDELETE;
+
+CREATE TABLE LIFECYCLELISTENERDELETE (
+    DATASTORE_IDENTITY INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
+    ID INTEGER,
+    CONSTRAINT LIFECYCLE_DELETE_PK PRIMARY KEY (DATASTORE_IDENTITY)
+);
+
+DROP TABLE LIFECYCLELISTENERDETACH;
+
+CREATE TABLE LIFECYCLELISTENERDETACH (
+    DATASTORE_IDENTITY INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
+    ID INTEGER,
+    CONSTRAINT LIFECYCLE_DETACH_PK PRIMARY KEY (DATASTORE_IDENTITY)
+);
+
+DROP TABLE LIFECYCLELISTENERLOAD;
+
+CREATE TABLE LIFECYCLELISTENERLOAD (
+    DATASTORE_IDENTITY INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
+    ID INTEGER NOT NULL,
+    VALUE INTEGER NOT NULL,
+    CONSTRAINT LIFECYCLE_LOAD_PK PRIMARY KEY (DATASTORE_IDENTITY)
+);
+
+DROP TABLE LIFECYCLELISTENERSTORE;
+
+CREATE TABLE LIFECYCLELISTENERSTORE (
+    DATASTORE_IDENTITY INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
+    ID INTEGER,
+    CONSTRAINT LIFECYCLE_STORE_PK PRIMARY KEY (DATASTORE_IDENTITY)
+);
+
 disconnect;