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 ma...@apache.org on 2006/01/05 01:38:45 UTC

svn commit: r366036 - in /db/jdo/trunk/tck20: ./ test/conf/ test/java/org/apache/jdo/tck/api/jdohelper/ test/java/org/apache/jdo/tck/api/persistencemanager/detach/ test/java/org/apache/jdo/tck/pc/shoppingcart/ test/jdo/applicationidentity/org/apache/jd...

Author: madams
Date: Wed Jan  4 16:38:21 2006
New Revision: 366036

URL: http://svn.apache.org/viewcvs?rev=366036&view=rev
Log:
JDO-272 Checking in some code so as not to lose it.  Some tests work, but IsDetached is currently broken.

Added:
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/jdohelper/IsDetached.java
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Cart.java
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/CartEntry.java
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Product.java
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Undetachable.java
    db/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/shoppingcart/
    db/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo
    db/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/shoppingcart/
    db/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo
    db/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema8.sql
    db/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema8.sql
Modified:
    db/jdo/trunk/tck20/project.properties
    db/jdo/trunk/tck20/test/conf/alltests.conf
    db/jdo/trunk/tck20/test/conf/detach.conf
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/DetachTest.java
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/GetDetachAllOnCommit.java
    db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/SetDetachAllOnCommit.java

Modified: db/jdo/trunk/tck20/project.properties
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/project.properties?rev=366036&r1=366035&r2=366036&view=diff
==============================================================================
--- db/jdo/trunk/tck20/project.properties (original)
+++ db/jdo/trunk/tck20/project.properties Wed Jan  4 16:38:21 2006
@@ -191,7 +191,11 @@
     org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldPrimitiveshort.java \
     org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldShort.java \
     org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldString.java \
-    org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldDate.java
+    org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldDate.java \
+    org/apache/jdo/tck/pc/shoppingcart/Undetachable.java \
+    org/apache/jdo/tck/pc/shoppingcart/Cart.java \
+    org/apache/jdo/tck/pc/shoppingcart/Product.java \
+    org/apache/jdo/tck/pc/shoppingcart/CartEntry.java
 
 jdo.tck.pcclasses.files = \
     org/apache/jdo/tck/api/instancecallbacks/InstanceLifecycleListenerAttach$PC.class \
@@ -292,7 +296,11 @@
     org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldPrimitiveshort.class \
     org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldShort.class \
     org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldString.class \
-    org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldDate.class
+    org/apache/jdo/tck/pc/singlefieldidentity/PCPointSingleFieldDate.class\
+    org/apache/jdo/tck/pc/shoppingcart/Undetachable.class \
+    org/apache/jdo/tck/pc/shoppingcart/Cart.class \
+    org/apache/jdo/tck/pc/shoppingcart/Product.class \
+    org/apache/jdo/tck/pc/shoppingcart/CartEntry.class
 
 jdo.tck.paclasses.sources = \
     org/apache/jdo/tck/models/inheritance/FieldWithSameNameInSuperclass.java \
@@ -383,4 +391,5 @@
     org/apache/jdo/tck/pc/mylib/PCClass.jdo \
     org/apache/jdo/tck/pc/query/package.jdo \
     org/apache/jdo/tck/pc/singlefieldidentity/package.jdo \
+    org/apache/jdo/tck/pc/shoppingcart/package.jdo \
     org/apache/jdo/tck/package.jdo

Modified: db/jdo/trunk/tck20/test/conf/alltests.conf
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/conf/alltests.conf?rev=366036&r1=366035&r2=366036&view=diff
==============================================================================
--- db/jdo/trunk/tck20/test/conf/alltests.conf (original)
+++ db/jdo/trunk/tck20/test/conf/alltests.conf Wed Jan  4 16:38:21 2006
@@ -154,6 +154,9 @@
 org.apache.jdo.tck.api.persistencemanager.lifecycle.MakeTransientFieldsPreservedUnchanged \
 org.apache.jdo.tck.api.persistencemanager.lifecycle.MakeTransientHasNoEffectOnTransientInstances \
 org.apache.jdo.tck.api.persistencemanager.lifecycle.MakeTransientNotSubjectToRollback \
+org.apache.jdo.tck.api.jdohelper.IsDetached \
+org.apache.jdo.tck.api.persistencemanager.detach.SetDetachAllOnCommit \
+org.apache.jdo.tck.api.persistencemanager.detach.GetDetachAllOnCommit \
 org.apache.jdo.tck.api.persistencemanagerfactory.AfterCloseGetPMThrowsException \
 org.apache.jdo.tck.api.persistencemanagerfactory.AfterCloseSetMethodsThrowException \
 org.apache.jdo.tck.api.persistencemanagerfactory.AfterGetPersistenceManagerNoSetMethodsSucceed \

Modified: db/jdo/trunk/tck20/test/conf/detach.conf
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/conf/detach.conf?rev=366036&r1=366035&r2=366036&view=diff
==============================================================================
--- db/jdo/trunk/tck20/test/conf/detach.conf (original)
+++ db/jdo/trunk/tck20/test/conf/detach.conf Wed Jan  4 16:38:21 2006
@@ -1,8 +1,9 @@
 jdo.tck.description = Detachment tests with standard mapping, no testdata. 
 jdo.tck.testdata = 
 jdo.tck.standarddata = 
-jdo.tck.mapping = 0
+jdo.tck.mapping = 8
 jdo.tck.classes = \
+    org.apache.jdo.tck.api.jdohelper.IsDetached \
     org.apache.jdo.tck.api.persistencemanager.detach.SetDetachAllOnCommit \
     org.apache.jdo.tck.api.persistencemanager.detach.GetDetachAllOnCommit
 jdo.tck.requiredOptions =

Added: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/jdohelper/IsDetached.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/jdohelper/IsDetached.java?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/jdohelper/IsDetached.java (added)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/jdohelper/IsDetached.java Wed Jan  4 16:38:21 2006
@@ -0,0 +1,80 @@
+/*
+ * 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.jdohelper;
+
+import org.apache.jdo.tck.api.persistencemanager.detach.DetachTest;
+import org.apache.jdo.tck.pc.shoppingcart.Cart;
+import org.apache.jdo.tck.pc.shoppingcart.Undetachable;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+import javax.jdo.JDOHelper;
+
+/**
+ * <B>Title:</B> Test IsDetached
+ * <BR>
+ * <B>Keywords:</B>
+ * <BR>
+ * <B>Assertion IDs:</B> A8.5.6-1
+ * <BR>
+ * <B>Assertion Description: </B>
+ * Instances that have been detached return true.
+ * The method returns false if the instance is transient or null or if its class is not detachable.
+ */
+public class IsDetached extends DetachTest {
+
+    private static final String ASSERTION_FAILED = "Assertion A8.5.6-1 JDOHelper.isDetached(Object) failed: ";
+
+    /**
+     * 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(IsDetached.class);
+    }
+
+    public void testNullTransientAndUndetachableIsDetachedFalse() {
+        pm = getPM();
+        pm.currentTransaction().begin();
+
+        assertFalse(ASSERTION_FAILED + "null object is detached", JDOHelper.isDetached(null));
+        assertFalse(ASSERTION_FAILED + "transient object is detached", JDOHelper.isDetached(new Cart()));
+        assertFalse(ASSERTION_FAILED + "object of class marked not detachabled is detached", JDOHelper.isDetached(new Undetachable()));
+
+        pm.currentTransaction().commit();
+    }
+
+    public void testDetachableIsDetachedTrue() {
+        pm = getPM();
+        pm.currentTransaction().begin();
+
+        Cart c = new Cart();
+        Object oid = pm.getObjectId(c);
+
+        pm.makePersistent(c);
+        pm.currentTransaction().commit();
+
+        pm.currentTransaction().begin();
+
+        c = (Cart) pm.getObjectById(oid);
+        Cart detached = (Cart) pm.detachCopy(c);
+
+        assertTrue(JDOHelper.isDetached(detached));
+
+        pm.currentTransaction().commit();
+    }
+}

Modified: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/DetachTest.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/DetachTest.java?rev=366036&r1=366035&r2=366036&view=diff
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/DetachTest.java (original)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/DetachTest.java Wed Jan  4 16:38:21 2006
@@ -16,15 +16,27 @@
 
 package org.apache.jdo.tck.api.persistencemanager.detach;
 
-import org.apache.jdo.tck.api.persistencemanager.PersistenceManagerTest;
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.shoppingcart.CartEntry;
+import org.apache.jdo.tck.pc.shoppingcart.Cart;
+import org.apache.jdo.tck.pc.shoppingcart.Product;
+import org.apache.jdo.tck.pc.shoppingcart.Undetachable;
+
+import javax.jdo.PersistenceManager;
 
 /**
  *
  */
-public class DetachTest extends PersistenceManagerTest {
-    
+public class DetachTest extends JDO_Test {
+
     /** Creates a new instance of DetachTest */
     public DetachTest() {
     }
-    
+
+    protected void localSetUp() {
+        addTearDownClass(CartEntry.class);
+        addTearDownClass(Cart.class);
+        addTearDownClass(Product.class);
+        addTearDownClass(Undetachable.class);
+    }
 }

Modified: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/GetDetachAllOnCommit.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/GetDetachAllOnCommit.java?rev=366036&r1=366035&r2=366036&view=diff
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/GetDetachAllOnCommit.java (original)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/GetDetachAllOnCommit.java Wed Jan  4 16:38:21 2006
@@ -21,18 +21,20 @@
 import org.apache.jdo.tck.util.BatchTestRunner;
 
 /**
- * <B>Title:</B> Test SetDetachAllOnCommit
+ * <B>Title:</B> Test GetDetachAllOnCommit
  * <BR>
- * <B>Keywords:</B> KEYWORDS
+ * <B>Keywords:</B>
  * <BR>
- * <B>Assertion IDs:</B> A12.6.8-1
+ * <B>Assertion IDs:</B> A12.6.8-2
  * <BR>
  * <B>Assertion Description: </B>
- * We define a new property called DetachOnClose PersistenceManager.setDetachOnClose(boolean detachOnClose) sets the DetachOnClose property
+ * We define a new property called DetachAllOnCommit
+ * PersistenceManager.getDetachAllOnCommit(boolean detachAllOnCommit)
+ * gets the DetachAllOnCommit property
  */
 public class GetDetachAllOnCommit extends DetachTest {
     
-    private static final String ASSERTION_FAILED = "Assertion A12.6.8-1 (SetDetachAllOnCommit) failed: ";
+    private static final String ASSERTION_FAILED = "Assertion A12.6.8-2 (pm.getDetachAllOnCommit) failed: ";
     
     /**
      * The <code>main</code> is called when the class
@@ -68,4 +70,3 @@
         }
     }
 }
-

Modified: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/SetDetachAllOnCommit.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/SetDetachAllOnCommit.java?rev=366036&r1=366035&r2=366036&view=diff
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/SetDetachAllOnCommit.java (original)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/api/persistencemanager/detach/SetDetachAllOnCommit.java Wed Jan  4 16:38:21 2006
@@ -28,11 +28,13 @@
  * <B>Assertion IDs:</B> A12.6.8-1
  * <BR>
  * <B>Assertion Description: </B>
- * We define a new property called DetachAllOnCommit PersistenceManager.getDetachAllOnCommit(boolean detachAllOnCommit) gets the DetachAllOnCommit property
+ * We define a new property called DetachAllOnCommit
+ * PersistenceManager.setDetachAllOnCommit(boolean detachAllOnCommit)
+ * sets the DetachAllOnCommit property
  */
 public class SetDetachAllOnCommit extends DetachTest {
     
-    private static final String ASSERTION_FAILED = "Assertion A12.6.8-1 (SetDetachAllOnCommit) failed: ";
+    private static final String ASSERTION_FAILED = "Assertion A12.6.8-1 (pm.setDetachAllOnCommit) failed: ";
     
     /**
      * The <code>main</code> is called when the class
@@ -68,4 +70,3 @@
         }
     }
 }
-

Added: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Cart.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Cart.java?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Cart.java (added)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Cart.java Wed Jan  4 16:38:21 2006
@@ -0,0 +1,236 @@
+/*
+ * 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.pc.shoppingcart;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/** This class represents an online shopping cart.  It has a list of entries of
+ * type CartEntry.
+ */
+public class Cart implements Serializable {
+
+    protected static long nextId = System.currentTimeMillis();
+
+    public synchronized static long nextId() {
+        return nextId++;
+    }
+
+    /** Identity field for use with application identity */
+    protected long id;
+
+    /** The identity of the customer whose shopping cart this is. */
+    protected String customerId;
+
+    /** The list of entries in this cart */
+    protected List entries = new ArrayList(); // element-type CartEntry
+
+    public Cart() {
+        this(nextId());
+    }
+
+    protected Cart(long id) {
+        setId(id);
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    protected void setId(long id) {
+        this.id = id;
+    }
+
+    public CartEntry newCartEntry(Product product, int quantity) {
+        CartEntry ce = new CartEntry(this, CartEntry.nextId(), product, quantity);
+        entries.add(ce);
+        return ce;
+    }
+
+    public void addCartEntry(CartEntry ce) {
+        if (ce == null) {
+            throw new IllegalArgumentException("no CartEntry given");
+        }
+        ce.setCart(this);
+        entries.add(ce);
+    }
+
+    public String getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(String customerId) {
+        this.customerId = customerId;
+    }
+
+    public void add(int arg0, CartEntry arg1) {
+        entries.add(arg0, arg1);
+    }
+
+    public boolean add(CartEntry arg0) {
+        return entries.add(arg0);
+    }
+
+    public boolean addAll(int arg0, Collection arg1) {
+        Iterator i = arg1.iterator();
+        while (i.hasNext()) {
+            CartEntry entry = (CartEntry) i.next();
+        }
+        return entries.addAll(arg0, arg1);
+    }
+
+    public boolean addAll(Collection arg0) {
+        Iterator i = arg0.iterator();
+        while (i.hasNext()) {
+            CartEntry entry = (CartEntry) i.next();
+        }
+        return entries.addAll(arg0);
+    }
+
+    public void clear() {
+        entries.clear();
+    }
+
+    public boolean contains(CartEntry o) {
+        return entries.contains(o);
+    }
+
+    public boolean containsAll(Collection arg0) {
+        return entries.containsAll(arg0);
+    }
+
+    public CartEntry get(int index) {
+        return (CartEntry) entries.get(index);
+    }
+
+    public int indexOf(CartEntry o) {
+        return entries.indexOf(o);
+    }
+
+    public boolean isEmpty() {
+        return entries.isEmpty();
+    }
+
+    public Iterator iterator() {
+        return entries.iterator();
+    }
+
+    public int lastIndexOf(CartEntry o) {
+        return entries.lastIndexOf(o);
+    }
+
+    public ListIterator listIterator() {
+        return entries.listIterator();
+    }
+
+    public ListIterator listIterator(int index) {
+        return entries.listIterator(index);
+    }
+
+    public Object remove(int index) {
+        return entries.remove(index);
+    }
+
+    public boolean remove(CartEntry o) {
+        return entries.remove(o);
+    }
+
+    public boolean removeAll(Collection arg0) {
+        Iterator i = arg0.iterator();
+        while (i.hasNext()) {
+            CartEntry entry = (CartEntry) i.next();
+        }
+        return entries.removeAll(arg0);
+    }
+
+    public boolean retainAll(Collection arg0) {
+        return entries.retainAll(arg0);
+    }
+
+    public Object set(int arg0, CartEntry arg1) {
+        return entries.set(arg0, arg1);
+    }
+
+    public int entrySize() {
+        return entries.size();
+    }
+
+    public List subList(int fromIndex, int toIndex) {
+        return entries.subList(fromIndex, toIndex);
+    }
+    
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (!(that instanceof Cart)) {
+            return false;
+        }
+        return equals((Cart) that);
+    }
+    
+    public boolean equals(Cart that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        return this.id == that.id;
+    }
+    
+    public int hashCode() {
+        return (int) id;
+    }
+
+    public static class Oid implements Serializable {
+        public long id;
+
+        public Oid() {
+        }
+
+        public Oid(String s) {
+            id = Long.parseLong(justTheId(s));
+        }
+
+        public String toString() {
+            return this.getClass().getName() + ":" + id;
+        }
+
+        public int hashCode() {
+            return (int) id;
+        }
+
+        public boolean equals(Object other) {
+            if (other != null && (other instanceof Oid)) {
+                Oid that = (Oid) other;
+                return that.id == this.id;
+            }
+            return false;
+        }
+
+        protected static String justTheId(String str) {
+            return str.substring(str.indexOf(':') + 1);
+        }
+    }
+}

Added: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/CartEntry.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/CartEntry.java?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/CartEntry.java (added)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/CartEntry.java Wed Jan  4 16:38:21 2006
@@ -0,0 +1,148 @@
+/*
+ * 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.pc.shoppingcart;
+
+import java.io.Serializable;
+
+/** This class represents an entry in an online shopping cart that has a
+ * quantity of a product.
+ */ 
+public class CartEntry implements Serializable {
+
+    protected static long nextId = System.currentTimeMillis();
+
+    public synchronized static long nextId() {
+        return nextId++;
+    }
+
+    /** Identity field for use with application identity */
+    protected long id;
+    protected Cart cart;
+    protected Product product;
+    protected int quantity = 1;
+
+    /** No-arg constructor required by JDO; not for public consumption */
+    protected CartEntry() {}
+
+    public CartEntry(Cart cart, Product product) {
+        this(cart, nextId(), product);
+    }
+    public CartEntry(Cart cart, long id, Product product) {
+        this(cart, id, product, 1);
+    }
+    public CartEntry(Cart cart, long id, Product product, int quantity) {
+        setCart(cart);
+        setId(id);
+        setProduct(product);
+        setQuantity(quantity);
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    protected void setId(long id) {
+        this.id = id;
+    }
+
+    public Cart getCart() {
+        return cart;
+    }
+
+    protected void setCart(Cart cart) {
+        if (this.cart != null) {
+            throw new IllegalStateException("Cart already set");
+        }
+        this.cart = cart;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public int getQuantity() {
+        return quantity;
+    }
+
+    public void setQuantity(int quantity) {
+        if (quantity < 1) {
+            throw new IllegalArgumentException("quantity can't be less than one");
+        }
+        this.quantity = quantity;
+    }
+
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (!(that instanceof CartEntry)) {
+            return false;
+        }
+        return equals((CartEntry) that);
+    }
+    
+    public boolean equals(CartEntry that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        return this.id == that.id;
+    }
+    
+    public int hashCode() {
+        return (int) id;
+    }
+
+    public static class Oid implements Serializable {
+        public long id;
+
+        public Oid() {
+        }
+
+        public Oid(String s) {
+            id = Long.parseLong(justTheId(s));
+        }
+
+        public String toString() {
+            return this.getClass().getName() + ":" + id;
+        }
+
+        public int hashCode() {
+            return (int) id;
+        }
+
+        public boolean equals(Object other) {
+            if (other != null && (other instanceof Oid)) {
+                Oid that = (Oid) other;
+                return that.id == this.id;
+            }
+            return false;
+        }
+
+        protected static String justTheId(String str) {
+            return str.substring(str.indexOf(':') + 1);
+        }
+    }
+}

Added: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Product.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Product.java?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Product.java (added)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Product.java Wed Jan  4 16:38:21 2006
@@ -0,0 +1,86 @@
+/*
+ * 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.pc.shoppingcart;
+
+import java.io.Serializable;
+
+/** This class represents a product that you would buy from an online store.
+ */
+public class Product implements Serializable {
+
+    /** Identity field when used with application identity */
+    protected String sku;
+
+    protected String description;
+
+    /** No-arg constructor required by JDO; not for public consumption */
+    protected Product() {}
+
+    /** Domain model constructor */
+    public Product(String sku) {
+        setSku(sku);
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        if (sku == null || (sku = sku.trim()).length() == 0) {
+            throw new IllegalArgumentException("no sku given");
+        }
+        this.sku = sku.toUpperCase();
+    }
+
+    public static class Oid implements Serializable {
+        public String sku;
+
+        public Oid() {
+        }
+
+        public Oid(String s) {
+            sku = justTheSku(s);
+        }
+
+        public String toString() {
+            return this.getClass().getName() + ":" + sku;
+        }
+
+        public int hashCode() {
+            return sku.hashCode();
+        }
+
+        public boolean equals(Object other) {
+            if (other != null && (other instanceof Oid)) {
+                Oid that = (Oid) other;
+                return that.sku.equals(this.sku);
+            }
+            return false;
+        }
+
+        protected static String justTheSku(String str) {
+            return str.substring(str.indexOf(':') + 1);
+        }
+    }
+}

Added: db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Undetachable.java
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Undetachable.java?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Undetachable.java (added)
+++ db/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/shoppingcart/Undetachable.java Wed Jan  4 16:38:21 2006
@@ -0,0 +1,92 @@
+/*
+ * 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.pc.shoppingcart;
+
+import java.io.Serializable;
+
+/**
+ * This class is a token undetachable class. It is only present to be
+ * persistence-capable but not detachable so as to test that a detachable class
+ * must be declared so.
+ */
+public class Undetachable implements Serializable {
+
+    protected static long nextId = System.currentTimeMillis();
+
+    public synchronized static long nextId() {
+        return nextId++;
+    }
+
+    /** Identity field for use with application identity */
+    protected long id;
+    protected int foo;
+    protected int bar;
+
+    public Undetachable() {
+        this(nextId());
+    }
+
+    public Undetachable(long id) {
+        this.id = id;
+    }
+
+    public static class Oid implements Serializable {
+        public long id;
+
+        public Oid() {
+        }
+
+        public Oid(String s) {
+            id = Long.parseLong(justTheId(s));
+        }
+
+        public String toString() {
+            return this.getClass().getName() + ":" + id;
+        }
+
+        public int hashCode() {
+            return (int) id;
+        }
+
+        public boolean equals(Object other) {
+            if (other != null && (other instanceof Oid)) {
+                Oid that = (Oid) other;
+                return that.id == this.id;
+            }
+            return false;
+        }
+
+        protected static String justTheId(String str) {
+            return str.substring(str.indexOf(':') + 1);
+        }
+    }
+
+    public int getFoo() {
+        return foo;
+    }
+
+    public void setFoo(int foo) {
+        this.foo = foo;
+    }
+
+    public int getBar() {
+        return bar;
+    }
+
+    public void setBar(int bar) {
+        this.bar = bar;
+    }
+}

Added: db/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo (added)
+++ db/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo Wed Jan  4 16:38:21 2006
@@ -0,0 +1,45 @@
+<?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">
+<jdo>
+    <package name="org.apache.jdo.tck.pc.shoppingcart">
+
+        <class
+                name="Undetachable"
+                identity-type="application"
+                objectid-class="org.apache.jdo.tck.pc.shoppingcart.Undetachable$Oid"
+                detachable="false"
+                >
+            <field name="id" primary-key="true"/>
+        </class>
+
+        <class
+                name="Product"
+                identity-type="application"
+                objectid-class="org.apache.jdo.tck.pc.shoppingcart.Product$Oid"
+                detachable="true"
+                >
+            <field name="sku" primary-key="true"/>
+        </class>
+
+        <class
+                name="Cart"
+                identity-type="application"
+                objectid-class="org.apache.jdo.tck.pc.shoppingcart.Product$Oid"
+                detachable="true"
+                >
+            <field name="id" primary-key="true"/>
+            <field name="entries">
+                <collection element-type="CartEntry"/>
+            </field>
+        </class>
+
+        <class
+                name="CartEntry"
+                identity-type="application"
+                objectid-class="org.apache.jdo.tck.pc.shoppingcart.CartEntry$Oid"
+                detachable="true"
+                >
+            <field name="id" primary-key="true"/>
+        </class>
+    </package>
+</jdo>

Added: db/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo (added)
+++ db/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/shoppingcart/package.jdo Wed Jan  4 16:38:21 2006
@@ -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">
+<jdo>
+    <package name="org.apache.jdo.tck.pc.shoppingcart">
+
+        <class
+                name="Undetachable"
+                identity-type="datastore"
+                detachable="false"
+                />
+
+        <class
+                name="Product"
+                identity-type="datastore"
+                detachable="true"
+                />
+
+        <class
+                name="Cart"
+                identity-type="datastore"
+                detachable="true"
+                >
+            <field name="entries">
+                <collection element-type="CartEntry"/>
+            </field>
+        </class>
+
+        <class
+                name="CartEntry"
+                identity-type="datastore"
+                detachable="true"
+                />
+    </package>
+</jdo>

Added: db/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema8.sql
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema8.sql?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema8.sql (added)
+++ db/jdo/trunk/tck20/test/sql/derby/applicationidentity/schema8.sql Wed Jan  4 16:38:21 2006
@@ -0,0 +1,43 @@
+-- SchemaType: application identity
+
+connect 'jdbc:derby:jdotckdb;create=true' user 'tckuser' password 'tckuser';
+
+CREATE SCHEMA applicationidentity8;
+SET SCHEMA applicationidentity8;
+
+DROP TABLE CART_ENTRIES;
+DROP TABLE CARTS;
+DROP TABLE PRODUCTS;
+DROP TABLE UNDETACHABLES;
+
+CREATE TABLE CARTS (
+    CART_ID BIGINT NOT NULL,
+    CUSTOMER_ID INTEGER NOT NULL,
+
+    CONSTRAINT CARTS_PK PRIMARY KEY (CART_ID)
+);
+
+CREATE TABLE PRODUCTS (
+    SKU VARCHAR(48) NOT NULL,
+    DESCRIPTION VARCHAR(128),
+
+    CONSTRAINT PRODUCTS_PK PRIMARY KEY (SKU)
+);
+
+CREATE TABLE CART_ENTRIES (
+    ID BIGINT NOT NULL,
+    CART_ID BIGINT NOT NULL,
+    SKU VARCHAR(48) NOT NULL,
+
+    CONSTRAINT CART_ENTRIES_PK  PRIMARY KEY (ID),
+    CONSTRAINT CARTS_FK         FOREIGN KEY (CART_ID)   REFERENCES CARTS,
+    CONSTRAINT PRODUCTS_FK      FOREIGN KEY (SKU)       REFERENCES PRODUCTS
+);
+
+CREATE TABLE UNDETACHABLES (
+    ID BIGINT NOT NULL,
+    FOO INTEGER,
+    BAR INTEGER,
+
+    CONSTRAINT UNDETACHABLES_PK PRIMARY KEY (ID)
+);

Added: db/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema8.sql
URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema8.sql?rev=366036&view=auto
==============================================================================
--- db/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema8.sql (added)
+++ db/jdo/trunk/tck20/test/sql/derby/datastoreidentity/schema8.sql Wed Jan  4 16:38:21 2006
@@ -0,0 +1,43 @@
+-- SchemaType: datastore identity
+
+connect 'jdbc:derby:jdotckdb;create=true' user 'tckuser' password 'tckuser';
+
+CREATE SCHEMA datastoreidentity8;
+SET SCHEMA datastoreidentity8;
+
+DROP TABLE CART_ENTRIES;
+DROP TABLE CARTS;
+DROP TABLE PRODUCTS;
+DROP TABLE UNDETACHABLES;
+
+CREATE TABLE CARTS (
+    CART_ID BIGINT NOT NULL,
+    CUSTOMER_ID INTEGER NOT NULL,
+
+    CONSTRAINT CARTS_PK PRIMARY KEY (CART_ID)
+);
+
+CREATE TABLE PRODUCTS (
+    SKU VARCHAR(48) NOT NULL,
+    DESCRIPTION VARCHAR(128),
+
+    CONSTRAINT PRODUCTS_PK PRIMARY KEY (SKU)
+);
+
+CREATE TABLE CART_ENTRIES (
+    ID BIGINT NOT NULL,
+    CART_ID BIGINT NOT NULL,
+    SKU VARCHAR(48) NOT NULL,
+
+    CONSTRAINT CART_ENTRIES_PK  PRIMARY KEY (ID),
+    CONSTRAINT CARTS_FK         FOREIGN KEY (CART_ID)   REFERENCES CARTS,
+    CONSTRAINT PRODUCTS_FK      FOREIGN KEY (SKU)       REFERENCES PRODUCTS
+);
+
+CREATE TABLE UNDETACHABLES (
+    ID BIGINT NOT NULL,
+    FOO INTEGER,
+    BAR INTEGER,
+
+    CONSTRAINT UNDETACHABLES_PK PRIMARY KEY (ID)
+);