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 mb...@apache.org on 2005/05/22 20:40:21 UTC

svn commit: r171355 [13/31] - in /incubator/jdo/trunk/fostore20: ./ src/ src/conf/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/jdo/ src/java/org/apache/jdo/impl/ src/java/org/apache/jdo/impl/fostore/ test/ test/conf/ test/fsuid2/ test/fsuid2/org/ test/fsuid2/org/apache/ test/fsuid2/org/apache/jdo/ test/fsuid2/org/apache/jdo/pc/ test/java/ test/java/org/ test/java/org/apache/ test/java/org/apache/jdo/ test/java/org/apache/jdo/impl/ test/java/org/apache/jdo/impl/fostore/ test/java/org/apache/jdo/pc/ test/java/org/apache/jdo/pc/appid/ test/java/org/apache/jdo/pc/empdept/ test/java/org/apache/jdo/pc/serializable/ test/java/org/apache/jdo/pc/xempdept/ test/java/org/apache/jdo/test/ test/java/org/apache/jdo/test/query/ test/java/org/apache/jdo/test/util/ test/jdo/ test/jdo/org/ test/jdo/org/apache/ test/jdo/org/apache/jdo/ test/jdo/org/apache/jdo/pc/ test/jdo/org/apache/jdo/pc/appid/ test/jdo/org/apache/jdo/pc/empdept/ test/jdo/org/apache/jdo/pc/serializable/ test/jdo/org/apache/jdo/pc/xempdept/

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCArrays.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCArrays.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCArrays.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCArrays.java Sun May 22 11:40:13 2005
@@ -0,0 +1,642 @@
+/*
+ * 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.pc;
+
+import java.lang.reflect.Array;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Locale;
+import java.util.Map;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.Vector;
+
+import org.apache.jdo.test.util.Util;
+
+/**
+* Contains 3 arrays of each supported type: one with elements, one without,
+* and one whose reference is null
+*
+* @author Dave Bristor
+*/
+public class PCArrays {
+    // boolean
+    public boolean _booleanArray[];
+    public boolean _emptyBooleanArray[];
+    public boolean _nullBooleanArray[];
+
+    public Boolean _lang_BooleanArray[];
+    public Boolean _empty_lang_BooleanArray[];
+    public Boolean _null_lang_BooleanArray[];
+
+    // char
+    public char _charArray[];
+    public char _emptyCharArray[];
+    public char _nullCharArray[];
+
+    public Character _lang_CharacterArray[];
+    public Character _empty_lang_CharacterArray[];
+    public Character _null_lang_CharacterArray[];
+
+    // byte
+    public byte _byteArray[];
+    public byte _emptyByteArray[];
+    public byte _nullByteArray[];
+
+    public Byte _lang_ByteArray[];
+    public Byte _empty_lang_ByteArray[];
+    public Byte _null_lang_ByteArray[];
+
+    // short
+    public short _shortArray[];
+    public short _emptyShortArray[];
+    public short _nullShortArray[];
+    
+    public Short _lang_ShortArray[];
+    public Short _empty_lang_ShortArray[];
+    public Short _null_lang_ShortArray[];
+
+    // int
+    public int _intArray[];
+    public int _emptyIntArray[];
+    public int _nullIntArray[];
+
+    public Integer _lang_IntegerArray[];
+    public Integer _empty_lang_IntegerArray[];
+    public Integer _null_lang_IntegerArray[];
+
+    // long
+    public long _longArray[];
+    public long _emptyLongArray[];
+    public long _nullLongArray[];
+
+    public Long _lang_LongArray[];
+    public Long _empty_lang_LongArray[];
+    public Long _null_lang_LongArray[];
+
+    // float
+    public float _floatArray[];
+    public float _emptyFloatArray[];
+    public float _nullFloatArray[];
+
+    public Float _lang_FloatArray[];
+    public Float _empty_lang_FloatArray[];
+    public Float _null_lang_FloatArray[];
+
+    // double
+    public double _doubleArray[];
+    public double _emptyDoubleArray[];
+    public double _nullDoubleArray[];
+
+    public Double _lang_DoubleArray[];
+    public Double _empty_lang_DoubleArray[];
+    public Double _null_lang_DoubleArray[];
+
+    // String
+    public String _stringArray[];
+    public String _emptyStringArray[];
+    public String _nullStringArray[];
+
+    private final Date date;
+
+    private static final BigDecimal bigDecimal = new BigDecimal(3.14159);
+    private static final BigInteger bigInteger = new
+        BigInteger("12345678998765432112345");
+    private static final Locale locale = new Locale("fr", "CA", "MAC");
+
+    // Date
+    public Date _dateArray[];
+    public Date _emptyDateArray[];
+    public Date _nullDateArray[];
+
+    // BigDecimal
+    public BigDecimal _bigDecimalArray[];
+    public BigDecimal _emptyBigDecimalArray[];
+    public BigDecimal _nullBigDecimalArray[];
+    
+    // BigInteger
+    public BigInteger _bigIntegerArray[];
+    public BigInteger _emptyBigIntegerArray[];
+    public BigInteger _nullBigIntegerArray[];
+
+    // Locale
+    public Locale _localeArray[];
+    public Locale _emptyLocaleArray[];
+    public Locale _nullLocaleArray[];
+
+    // ArrayList
+    public ArrayList _arrayListArray[];
+    public ArrayList _emptyArrayListArray[];
+    public ArrayList _nullArrayListArray[];
+
+    // HashMap
+    public HashMap _hashMapArray[];
+    public HashMap _emptyHashMapArray[];
+    public HashMap _nullHashMapArray[];
+
+    // HashSet
+    public HashSet _hashSetArray[];
+    public HashSet _emptyHashSetArray[];
+    public HashSet _nullHashSetArray[];
+
+    // Hashtable
+    public Hashtable _hashtableArray[];
+    public Hashtable _emptyHashtableArray[];
+    public Hashtable _nullHashtableArray[];
+
+    // LinkedList 
+    public LinkedList _linkedListArray[];
+    public LinkedList _emptyLinkedListArray[];
+    public LinkedList _nullLinkedListArray[];
+
+    // TreeMap
+    public TreeMap _treeMapArray[];
+    public TreeMap _emptyTreeMapArray[];
+    public TreeMap _nullTreeMapArray[];
+
+    // TreeSet
+    public TreeSet _treeSetArray[];
+    public TreeSet _emptyTreeSetArray[];
+    public TreeSet _nullTreeSetArray[];
+
+    // Vector
+    public Vector _vectorArray[];
+    public Vector _emptyVectorArray[];
+    public Vector _nullVectorArray[];
+
+    public PCArrays() { 
+        date = Util.moonWalkDate.getTime();
+    }
+    
+    // Create some arrays with "interesting" values.
+    //
+    public void init() {
+        // boolean
+        _booleanArray = new boolean[] { true, false, true, false};
+        _emptyBooleanArray = new boolean[0];
+        _nullBooleanArray = null;
+        
+        _lang_BooleanArray = new Boolean[] {
+            new Boolean(true), new Boolean(true), new Boolean(false), new Boolean(false)};
+        _empty_lang_BooleanArray = new Boolean[0];
+        _null_lang_BooleanArray = null;
+
+        // char
+        _charArray = new char[] { 'h', 'e', 'l', 'l', 'o' };
+        _emptyCharArray = new char[0];
+        _nullCharArray = null;
+        
+        _lang_CharacterArray = new Character[] {
+            new Character('w'), new Character('o'), new Character('r'),
+                new Character('l'), new Character('d') };
+        _empty_lang_CharacterArray = new Character[0];
+        _null_lang_CharacterArray = null;
+
+        // byte
+        _byteArray = new byte[] { 0xf, 0xe, 0xd, 0xc, 0xb, 0xa };
+        _emptyByteArray = new byte[0];
+        _nullByteArray = null;
+        
+        _lang_ByteArray = new Byte[] {
+            new Byte((byte)0xa), new Byte((byte)0xb), new Byte((byte)0xc), new
+                Byte((byte)0xd), new Byte((byte)0xe), new Byte((byte)0xf) };
+        _empty_lang_ByteArray = new Byte[0];
+        _null_lang_ByteArray = null;
+
+        // short
+        _shortArray = new short[] { 10, 20, 30, 40 };
+        _emptyShortArray = new short[0];
+        _nullShortArray = null;
+        
+        _lang_ShortArray = new Short[] {
+            new Short((short)10), new Short((short)9), new Short((short)8),
+                new Short((short)7), new Short((short)6) };
+        _empty_lang_ShortArray = new Short[0];
+        _null_lang_ShortArray = null;
+
+        // int
+        _intArray = new int[] { 1, 3, 5 };
+        _emptyIntArray = new int[0];
+        _nullIntArray = null;
+
+        _lang_IntegerArray = new Integer[] {
+            new Integer(2), new Integer(4), new Integer(6) };
+        _empty_lang_IntegerArray = new Integer[0];
+        _null_lang_IntegerArray = null;
+
+        // long
+        _longArray = new long[] { Long.MIN_VALUE, 0L, Long.MAX_VALUE };
+        _emptyLongArray = new long[0];
+        _nullLongArray = null;
+        
+        _lang_LongArray = new Long[] {
+            new Long(-2), new Long(-1), new Long(0), new Long(1), new Long(2) };
+        _empty_lang_LongArray = new Long[0];
+        _null_lang_LongArray = null;
+        
+        // float
+        _floatArray = new float[] { 6.02e+23f, 3.14159f, 186000.0f };
+        _emptyFloatArray = new float[0];
+        _nullFloatArray = null;
+
+        _lang_FloatArray = new Float[] {
+            new Float(3.14159f), new Float(6.02e+23f), new Float(186000.0f) };
+        _empty_lang_FloatArray = new Float[0];
+        _null_lang_FloatArray = null;
+        
+        // double
+        _doubleArray = new double[] { 0.0, 1.0, 2.0 };
+        _emptyDoubleArray = new double[0];
+        _nullDoubleArray = null;
+
+        _lang_DoubleArray = new Double[] {
+            new Double(3.333), new Double(5.55555), new Double(7.7777777) };
+        _empty_lang_DoubleArray = new Double[0];
+        _null_lang_DoubleArray = null;
+
+        // String
+        _stringArray = new String[] { "hello", "world", "hi", "mom" };
+        _emptyStringArray = new String[0];
+        _nullStringArray = null;
+
+        // Date
+        _dateArray = new Date[] { date, date };
+        _emptyDateArray = new Date[0];
+        _nullDateArray = null;
+
+        // BigDecimal
+        _bigDecimalArray = new BigDecimal[] {
+            new BigDecimal(3.1415), new BigDecimal(6.02e+23) };
+        _emptyBigDecimalArray = new BigDecimal[0];
+        _nullBigDecimalArray = null;
+
+        // BigInteger
+        _bigIntegerArray = new BigInteger[] {
+            new BigInteger("123456789"), new BigInteger("987654321") };
+        _emptyBigIntegerArray = new BigInteger[0];
+        _nullBigIntegerArray = null;
+
+        // Locale
+        _localeArray = new Locale[] { locale, locale, locale };
+        _emptyLocaleArray = new Locale[0];
+        _nullLocaleArray = null;
+
+        // ArrayList
+        _arrayListArray = new ArrayList[2];
+        ArrayList al = new ArrayList();
+        al.add("hello");
+        al.add(new Double(3.14159));
+        _arrayListArray[0] = al;
+        
+        al = new ArrayList();
+        al.add(new Integer(42));
+        al.add(new Boolean(true));
+        al.add(new Byte((byte)0xd));
+        _arrayListArray[1] = al;
+        
+        _emptyArrayListArray = new ArrayList[0];
+        _nullArrayListArray = null;
+
+        // HashMap
+        _hashMapArray = new HashMap[2];
+        HashMap hm = new HashMap();
+        hm.put(new Character('d'), "d is 13");
+        hm.put("wombat", bigDecimal);
+        _hashMapArray[0] = hm;
+        
+        hm = new HashMap();
+        hm.put(new Integer(1), new Integer(42));
+        hm.put(new Double(3.14159), new Float(6.02e+23));
+        _hashMapArray[1] = hm;
+        
+        _emptyHashMapArray = new HashMap[0];
+        _nullHashMapArray = null;
+
+        // HashSet
+        _hashSetArray = new HashSet[3];
+        HashSet hs = new HashSet();
+        hs.add("home, home on the range...");
+        hs.add(new Character('J'));
+        _hashSetArray[0] = hs;
+        
+        hs = new HashSet();
+        hs.add(new Double(3.0e+6));
+        hs.add(new Integer(13));
+        _hashSetArray[1] = hs;
+        
+        hs = new HashSet();
+        hs.add(new Float(6.02e+23));
+        hs.add("when I was back there in seminary school, ...");
+        _hashSetArray[2] = hs;
+        
+        _emptyHashSetArray = new HashSet[0];
+        _nullHashSetArray = null;
+
+        // Hashtable
+        _hashtableArray = new Hashtable[2];
+        Hashtable ht = new Hashtable();
+        ht.put(new Character('d'), "d is 13");
+        ht.put("wombat", bigDecimal);
+        _hashtableArray[0] = ht;
+        
+        ht = new Hashtable();
+        ht.put(new Integer(1), new Integer(42));
+        ht.put(new Double(3.14159), new Float(6.02e+23));
+        _hashtableArray[1] = ht;
+        
+        _emptyHashtableArray = new Hashtable[0];
+        _nullHashtableArray = null;
+
+        // LinkedList
+        _linkedListArray = new LinkedList[2];
+        LinkedList ll = new LinkedList();
+        ll.add("'hello, world'");
+        ll.add(new Double(1234.56789));
+        _linkedListArray[0] = ll;
+
+        ll = new LinkedList();
+        ll.add(new Integer(9876));
+        _linkedListArray[1] = ll;
+
+        _emptyLinkedListArray = new LinkedList[0];
+        _nullLinkedListArray = null;
+        
+
+        // TreeMap
+        _treeMapArray = new TreeMap[2];
+        TreeMap tm = new TreeMap();
+        tm.put(new Double(6.02e+23), new Integer(42));
+        tm.put(new Double(3.14159), new Float(6.02e+23));
+        _treeMapArray[0] = tm;
+        
+        tm = new TreeMap();
+        tm.put(new Double(186000), "d is 13");
+        _treeMapArray[1] = tm;
+        
+        _emptyTreeMapArray = new TreeMap[0];
+        _nullTreeMapArray = null;
+
+        // TreeSet
+        _treeSetArray = new TreeSet[2];
+        TreeSet ts = new TreeSet();
+        ts.add(new Double(6.02e+23));
+        ts.add(new Double(3.14159));
+        _treeSetArray[0] = ts;
+        
+        ts = new TreeSet();
+        ts.add(new Double(186000));
+        _treeSetArray[1] = ts;
+        
+        _emptyTreeSetArray = new TreeSet[0];
+        _nullTreeSetArray = null;
+
+        // Vector
+        _vectorArray = new Vector[3];
+        Vector v = new Vector();
+        v.addElement(new Byte((byte)13));
+        v.addElement(new Boolean(true));
+        _vectorArray[0] = v;
+        
+        v = new Vector();
+        v.addElement("Call me Ishmael.");
+        v.addElement(new Boolean(false));
+        _vectorArray[1] = v;
+        
+        v = new Vector();
+        v.add("four score and twenty beers ago");
+        v.add(new Double(0.0102030508));
+        _vectorArray[2] = v;
+        
+        _emptyVectorArray = new Vector[0];
+        _nullVectorArray = null;
+    }
+
+    String stringify(Object arr, String name) {
+        StringBuffer rc =new StringBuffer("\n").append(name).append(": ");
+
+        if (null == arr) {
+            rc.append(" __null__");
+        } else try {
+            int length = Array.getLength(arr);
+            if (0 == length) {
+                rc.append(" __empty__");
+            } else {
+                for (int i = 0; i < length; i++) {
+                    if (i > 0) {
+                        rc.append(",");
+                    }
+                    rc.append(" ");
+                    Object obj = Array.get(arr, i);
+                    if (obj instanceof Date) {
+                        rc.append(Util.longFormatter.format((Date)obj));
+                    } else if (obj instanceof Map) {
+                        rc.append(Util.sortMap((Map)obj));
+                    } else {
+                        rc.append(obj);
+                    }
+                }
+            }
+        } catch (IllegalArgumentException ex) {
+            throw new RuntimeException("illegal argument: " + arr.getClass().getName());
+        } catch (ArrayIndexOutOfBoundsException ex) {
+            throw new RuntimeException("out of bounds: " + arr.getClass().getName());
+        }
+
+        return rc.toString();
+    }
+
+    public String toString() {
+        StringBuffer rc = new StringBuffer(Util.getClassName(this));
+
+        // boolean
+        rc.append(stringify(_booleanArray, "_booleanArray"));
+        rc.append(stringify(_emptyBooleanArray, "_emptyBooleanArray"));
+        rc.append(stringify(_nullBooleanArray, "_nullBooleanArray"));
+        rc.append("\n");
+
+        rc.append(stringify(_lang_BooleanArray, "_lang_BooleanArray"));
+        rc.append(stringify(_empty_lang_BooleanArray, "_empty_lang_BooleanArray"));
+        rc.append(stringify(_null_lang_BooleanArray, "_null_lang_BooleanArray"));
+        rc.append("\n");
+        
+        // char
+        rc.append(stringify(_charArray, "_charArray"));
+        rc.append(stringify(_emptyCharArray, "_emptyCharArray"));
+        rc.append(stringify(_nullCharArray, "_nullCharArray"));
+        rc.append("\n");
+            
+        rc.append(stringify(_lang_CharacterArray, "_lang_CharacterArray"));
+        rc.append(stringify(_empty_lang_CharacterArray, "_empty_lang_CharacterArray"));
+        rc.append(stringify(_null_lang_CharacterArray, "_null_lang_CharacterArray"));
+        rc.append("\n");
+            
+        // byte
+        rc.append(stringify(_byteArray, "_byteArray"));
+        rc.append(stringify(_emptyByteArray, "_emptyByteArray"));
+        rc.append(stringify(_nullByteArray, "_nullByteArray"));
+        rc.append("\n");
+            
+        rc.append(stringify(_lang_ByteArray, "_lang_ByteArray"));
+        rc.append(stringify(_empty_lang_ByteArray, "_empty_lang_ByteArray"));
+        rc.append(stringify(_null_lang_ByteArray, "_null_lang_ByteArray"));
+        rc.append("\n");
+            
+        // short
+        rc.append(stringify(_shortArray, "_shortArray"));
+        rc.append(stringify(_emptyShortArray, "_emptyShortArray"));
+        rc.append(stringify(_nullShortArray, "_nullShortArray"));
+        rc.append("\n");
+
+        rc.append(stringify(_lang_ShortArray, "_lang_ShortArray"));
+        rc.append(stringify(_empty_lang_ShortArray, "_empty_lang_ShortArray"));
+        rc.append(stringify(_null_lang_ShortArray, "_null_lang_ShortArray"));
+        rc.append("\n");
+
+        // int
+        rc.append(stringify(_intArray, "_intArray"));
+        rc.append(stringify(_emptyIntArray, "_emptyIntArray"));
+        rc.append(stringify(_nullIntArray, "_nullIntArray"));
+        rc.append("\n");
+
+        rc.append(stringify(_lang_IntegerArray, "_lang_IntegerArray"));
+        rc.append(stringify(_empty_lang_IntegerArray, "_empty_lang_IntegerArray"));
+        rc.append(stringify(_null_lang_IntegerArray, "_null_lang_IntegerArray"));
+        rc.append("\n");
+
+        // long
+        rc.append(stringify(_longArray, "_longArray"));
+        rc.append(stringify(_emptyLongArray, "_emptyLongArray"));
+        rc.append(stringify(_nullLongArray, "_nullLongArray"));
+        rc.append("\n");
+        
+        rc.append(stringify(_lang_LongArray, "_lang_LongArray"));
+        rc.append(stringify(_empty_lang_LongArray, "_empty_lang_LongArray"));
+        rc.append(stringify(_null_lang_LongArray, "_null_lang_LongArray"));
+        rc.append("\n");
+        
+        // float
+        rc.append(stringify(_floatArray, "_floatArray"));
+        rc.append(stringify(_emptyFloatArray, "_emptyFloatArray"));
+        rc.append(stringify(_nullFloatArray, "_nullFloatArray"));
+        rc.append("\n");
+            
+        rc.append(stringify(_lang_FloatArray, "_lang_FloatArray"));
+        rc.append(stringify(_empty_lang_FloatArray, "_empty_lang_FloatArray"));
+        rc.append(stringify(_null_lang_FloatArray, "_null_lang_FloatArray"));
+        rc.append("\n");
+            
+        // double
+        rc.append(stringify(_doubleArray, "_doubleArray"));
+        rc.append(stringify(_emptyDoubleArray, "_emptyDoubleArray"));
+        rc.append(stringify(_nullDoubleArray, "_nullDoubleArray"));
+        rc.append("\n");
+            
+        rc.append(stringify(_lang_DoubleArray, "_lang_DoubleArray"));
+        rc.append(stringify(_empty_lang_DoubleArray, "_empty_lang_DoubleArray"));
+        rc.append(stringify(_null_lang_DoubleArray, "_null_lang_DoubleArray"));
+        rc.append("\n");
+            
+        // String
+        rc.append(stringify(_stringArray, "_stringArray"));
+        rc.append(stringify(_emptyStringArray, "_emptyStringArray"));
+        rc.append(stringify(_nullStringArray, "_nullStringArray"));
+        rc.append("\n");
+
+        // Date
+        rc.append(stringify(_dateArray, "_dateArray"));
+        rc.append(stringify(_emptyDateArray, "_emptyDateArray"));
+        rc.append(stringify(_nullDateArray, "_nullDateArray"));
+        rc.append("\n");
+
+        // BigDecimal
+        rc.append(stringify(_bigDecimalArray, "_bigDecimalArray"));
+        rc.append(stringify(_emptyBigDecimalArray, "_emptyBigDecimalArray"));
+        rc.append(stringify(_nullBigDecimalArray, "_nullBigDecimalArray"));
+        rc.append("\n");
+
+        // BigInteger
+        rc.append(stringify(_bigIntegerArray, "_bigIntegerArray"));
+        rc.append(stringify(_emptyBigIntegerArray, "_emptyBigIntegerArray"));
+        rc.append(stringify(_nullBigIntegerArray, "_nullBigIntegerArray"));
+        rc.append("\n");
+
+        // Locale
+        rc.append(stringify(_localeArray, "_localeArray"));
+        rc.append(stringify(_emptyLocaleArray, "_emptyLocaleArray"));
+        rc.append(stringify(_nullLocaleArray, "_nullLocaleArray"));
+        rc.append("\n");
+
+        // ArrayList
+        rc.append(stringify(_arrayListArray, "_arrayListArray"));
+        rc.append(stringify(_emptyArrayListArray, "_emptyArrayListArray"));
+        rc.append(stringify(_nullArrayListArray, "_nullArrayListArray"));
+        rc.append("\n");
+
+        // HashMap
+        rc.append(stringify(_hashMapArray, "_hashMapArray"));
+        rc.append(stringify(_emptyHashMapArray, "_emptyHashMapArray"));
+        rc.append(stringify(_nullHashMapArray, "_nullHashMapArray"));
+        rc.append("\n");
+
+        // HashSet
+        rc.append(stringify(_hashSetArray, "_hashSetArray"));
+        rc.append(stringify(_emptyHashSetArray, "_emptyHashSetArray"));
+        rc.append(stringify(_nullHashSetArray, "_nullHashSetArray"));
+        rc.append("\n");
+
+        // Hashtable
+        rc.append(stringify(_hashtableArray, "_hashtableArray"));
+        rc.append(stringify(_emptyHashtableArray, "_emptyHashtableArray"));
+        rc.append(stringify(_nullHashtableArray, "_nullHashtableArray"));
+        rc.append("\n");
+
+        // LinkedList
+        rc.append(stringify(_linkedListArray, "_linkedListArray"));
+        rc.append(stringify(_emptyLinkedListArray, "_emptyLinkedListArray"));
+        rc.append(stringify(_nullLinkedListArray, "_nullLinkedListArray"));
+        rc.append("\n");
+
+        // TreeMap
+        rc.append(stringify(_treeMapArray, "_treeMapArray"));
+        rc.append(stringify(_emptyTreeMapArray, "_emptyTreeMapArray"));
+        rc.append(stringify(_nullTreeMapArray, "_nullTreeMapArray"));
+        rc.append("\n");
+
+        // TreeSet
+        rc.append(stringify(_treeSetArray, "_treeSetArray"));
+        rc.append(stringify(_emptyTreeSetArray, "_emptyTreeSetArray"));
+        rc.append(stringify(_nullTreeSetArray, "_nullTreeSetArray"));
+        rc.append("\n");
+
+        // Vector
+        rc.append(stringify(_vectorArray, "_vectorArray"));
+        rc.append(stringify(_emptyVectorArray, "_emptyVectorArray"));
+        rc.append(stringify(_nullVectorArray, "_nullVectorArray"));
+        rc.append("\n");
+
+        return rc.toString();
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCBase.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCBase.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCBase.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCBase.java Sun May 22 11:40:13 2005
@@ -0,0 +1,23 @@
+/*
+ * 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.pc;
+
+public class PCBase {
+    public String s;
+
+    public PCBase() { }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollection.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollection.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollection.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollection.java Sun May 22 11:40:13 2005
@@ -0,0 +1,69 @@
+/*
+ * 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.pc;
+
+import javax.jdo.spi.PersistenceCapable;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+/**
+ * Represents a PC type that holds a Set and Map of PC instances.
+ * @version 1.0.1
+ */
+public class PCCollection {
+    private int id;
+    private Set set;
+    private Map map;
+
+    public PCCollection() {
+    }
+    
+    public int getId() {
+        return id;
+    }
+    
+    public void setId(int id) {
+        this.id = id;
+    }
+    
+    public Set getSet() {
+        return set;
+    }
+    
+    public void setSet(Set set) {
+        this.set = set;
+    }
+    
+    public Map getMap() {
+        return map;
+    }
+    
+    public void setMap(Map map) {
+        this.map = map;
+    }
+    
+    public String toString() {
+        return "PCCollection:" + id + " Set (" + (set==null?"null":String.valueOf(set.size())) +
+            ") Map (" + (map==null?"null":String.valueOf(map.size())) + ")";
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollections.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollections.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollections.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCollections.java Sun May 22 11:40:13 2005
@@ -0,0 +1,593 @@
+/*
+ * 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.pc;
+
+import java.lang.reflect.Array;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.Vector;
+
+import org.apache.jdo.test.util.Util;
+
+
+/**
+* Test ability to store & fetch instances of various collections.  This class
+* provides three fields for each type of collection we can store: one which
+* has values, one which is empty, and one which represents the field being
+* null.
+*
+* @author Dave Bristor
+*/
+public class PCCollections {
+    public java.util.ArrayList _arrayList;
+    public java.util.ArrayList _emptyArrayList;
+    public java.util.ArrayList _nullArrayList;
+
+    public java.util.ArrayList _sco_arrayList;
+    public java.util.ArrayList _sco_emptyArrayList;
+    public java.util.ArrayList _sco_nullArrayList;
+
+    public java.util.Vector _vector;
+    public java.util.Vector _emptyVector;
+    public java.util.Vector _nullVector;
+
+    public java.util.Vector _sco_vector;
+    public java.util.Vector _sco_emptyVector;
+    public java.util.Vector _sco_nullVector;
+
+    public java.util.HashMap _hashMap;
+    public java.util.HashMap _emptyHashMap;
+    public java.util.HashMap _nullHashMap;
+    
+    public java.util.HashMap _sco_hashMap;
+    public java.util.HashMap _sco_emptyHashMap;
+    public java.util.HashMap _sco_nullHashMap;
+    
+    public java.util.Hashtable _hashtable;
+    public java.util.Hashtable _emptyHashtable;
+    public java.util.Hashtable _nullHashtable;
+    
+    public java.util.Hashtable _sco_hashtable;
+    public java.util.Hashtable _sco_emptyHashtable;
+    public java.util.Hashtable _sco_nullHashtable;
+    
+    public java.util.HashSet _hashSet;
+    public java.util.HashSet _emptyHashSet;
+    public java.util.HashSet _nullHashSet;
+
+    public java.util.HashSet _sco_hashSet;
+    public java.util.HashSet _sco_emptyHashSet;
+    public java.util.HashSet _sco_nullHashSet;
+
+    public java.util.LinkedList _linkedList;
+    public java.util.LinkedList _emptyLinkedList;
+    public java.util.LinkedList _nullLinkedList;
+
+    public java.util.LinkedList _sco_linkedList;
+    public java.util.LinkedList _sco_emptyLinkedList;
+    public java.util.LinkedList _sco_nullLinkedList;
+
+    public java.util.TreeMap _treeMap;
+    public java.util.TreeMap _emptyTreeMap;
+    public java.util.TreeMap _nullTreeMap;
+    
+    public java.util.TreeMap _sco_treeMap;
+    public java.util.TreeMap _sco_emptyTreeMap;
+    public java.util.TreeMap _sco_nullTreeMap;
+    
+    public java.util.TreeSet _treeSet;
+    public java.util.TreeSet _emptyTreeSet;
+    public java.util.TreeSet _nullTreeSet;
+    
+    public java.util.TreeSet _sco_treeSet;
+    public java.util.TreeSet _sco_emptyTreeSet;
+    public java.util.TreeSet _sco_nullTreeSet;
+    
+    private final Date date;
+
+    private static final BigDecimal bigDecimal = new BigDecimal(3.14159);
+    private static final BigInteger bigInteger = new
+        BigInteger("12345678998765432112345");
+    private static final Locale locale = new Locale("fr", "CA", "MAC");
+
+    public PCCollections() {
+        date = Util.moonWalkDate.getTime();
+    }
+
+    // get methods for SCO types.
+
+    public java.util.ArrayList getSCOArrayList() {
+        return _sco_arrayList;
+    }
+
+    public java.util.Vector getSCOVector() {
+        return _sco_vector;
+    }
+
+    public java.util.TreeSet getSCOTreeSet() {
+        return _sco_treeSet;
+    }
+
+    public java.util.HashSet getSCOHashSet() {
+        return _sco_hashSet;
+    }
+
+    public java.util.LinkedList getSCOLinkedList() {
+        return _sco_linkedList;
+    }
+
+    public java.util.HashMap getSCOHashMap() {
+        return _sco_hashMap;
+    }
+
+    public java.util.Hashtable getSCOHashtable() {
+        return _sco_hashtable;
+    }
+
+    public java.util.TreeMap getSCOTreeMap() {
+        return _sco_treeMap;
+    }
+
+    //
+    // Notice the method pairs below, and that the first invokes the second.
+    // In fact, once enhanced, the first will invoke the *enhanced* version of
+    // the second, as defined in PCCollections, because that class is that of
+    // which Test_Collections makes an instance, and so of course the derived
+    // method is invoked.
+    //
+    
+    public void setSCOArrayList(java.util.ArrayList scoArrayList) {
+        _sco_arrayList = scoArrayList;
+        _sco_arrayList.add(new Short((short)18));
+        _sco_arrayList.add("home, home on the range...");
+        _sco_arrayList.add(new Float(9876.5432f));
+        _sco_arrayList.add(date);
+        _sco_arrayList.add(bigDecimal);
+        _sco_arrayList.add(bigInteger);
+        _sco_arrayList.add(locale);
+    }
+
+    public void setSCOVector(java.util.Vector scoVector) {
+        _sco_vector = scoVector;
+        _sco_vector.addElement(new Byte((byte)13));
+        _sco_vector.addElement("Call me Ishmael.");
+        _sco_vector.addElement(new Boolean(true));
+        _sco_vector.addElement(new Boolean(false));
+        _sco_vector.addElement(date);
+        _sco_vector.addElement(bigDecimal);
+        _sco_vector.addElement(bigInteger);
+        _sco_vector.addElement(locale);
+    }
+
+    public void setSCOHashSet(java.util.HashSet scoHashSet) {
+        _sco_hashSet = scoHashSet;
+        _sco_hashSet.add("home, home on the range...");
+        _sco_hashSet.add(new Character('J'));
+        _sco_hashSet.add(new Double(3.0e+6));
+        _sco_hashSet.add(date);
+        _sco_hashSet.add(bigDecimal);
+        _sco_hashSet.add(bigInteger);
+        _sco_hashSet.add(locale);
+    }
+
+    public void setSCOLinkedList(java.util.LinkedList scoLinkedList) {
+        _sco_linkedList = scoLinkedList;
+        _sco_linkedList.add(new Byte((byte)13));
+        _sco_linkedList.add("once upon a time ...");
+        _sco_linkedList.add(new Boolean(true));
+        _sco_linkedList.add(new Boolean(false));
+        _sco_linkedList.add(date);
+        _sco_linkedList.add(bigDecimal);
+        _sco_linkedList.add(bigInteger);
+        _sco_linkedList.add(locale);
+    }
+
+    public void setSCOHashMap(java.util.HashMap scoHashMap) {
+        _sco_hashMap = scoHashMap;
+        _sco_hashMap.put("veni, vidi, vici", "in vino veritas ...");
+        _sco_hashMap.put(new Integer(1), new Integer(42));
+        _sco_hashMap.put(new Double(3.14159), new Float(6.02e+23));
+        _sco_hashMap.put(new Character('d'), "d is 13");
+        _sco_hashMap.put(new Byte((byte)0xf), date);
+        _sco_hashMap.put("wombat", bigDecimal);
+        _sco_hashMap.put(new Float(0.1f), bigInteger);
+        _sco_hashMap.put(new Long(123456789), locale);
+    }
+
+    public void setSCOHashtable(java.util.Hashtable scoHashtable) {
+        _sco_hashtable = scoHashtable;
+        _sco_hashtable.put("in the beginning", "here I am ...");
+        _sco_hashtable.put(new Integer(1), new Integer(42));
+        _sco_hashtable.put(new Double(3.14159), new Float(6.02e+23));
+        _sco_hashtable.put(new Character('d'), "d is 13");
+        _sco_hashtable.put(new Byte((byte)0xf), date);
+        _sco_hashtable.put("wombat", bigDecimal);
+        _sco_hashtable.put(new Float(0.1f), bigInteger);
+        _sco_hashtable.put(new Long(123456789), locale);
+    }
+
+    public void setSCOTreeMap(java.util.TreeMap scoTreeMap) {
+        _sco_treeMap = scoTreeMap;
+        _sco_treeMap.put(new Double(100), "he who knows not ...");
+        _sco_treeMap.put(new Double(3), new Float(6.02e+23));
+        _sco_treeMap.put(new Double(1), new Integer(42));
+        _sco_treeMap.put(new Double(-123), "d is 13");
+        _sco_treeMap.put(new Double(111), bigDecimal);
+        _sco_treeMap.put(new Double(10), date);
+        _sco_treeMap.put(new Double(0), bigInteger);
+        _sco_treeMap.put(new Double(789), locale);
+    }
+
+    public void setSCOTreeSet(java.util.TreeSet scoTreeSet) {
+        _sco_treeSet = scoTreeSet;
+        _sco_treeSet.add(new Double(100));
+        _sco_treeSet.add(new Double(3));
+        _sco_treeSet.add(new Double(3.0e+6));
+        _sco_treeSet.add(new Double(-123));
+        _sco_treeSet.add(new Double(111));
+        _sco_treeSet.add(new Double(890));
+        _sco_treeSet.add(new Double(411));
+    }
+
+    // Add the given PC to each collection type.  The caller in fact *should*
+    // create a PCPoint, so that we can test that collections can contain PC's
+    // as well.
+    public void addPoint(PCPoint p) {
+        _arrayList.add(p);
+        _sco_arrayList.add(p);
+        _vector.addElement(p);
+        _sco_vector.addElement(p);
+        _hashMap.put("hello", p);
+        _sco_hashMap.put("hello", p);
+        _hashtable.put("hello", p);
+        _sco_hashtable.put("hello", p);
+        _hashSet.add(p);
+        _sco_hashSet.add(p);
+        _treeMap.put(new Double(300000), p);
+        _sco_treeMap.put(new Double(300000), p);
+        _linkedList.add(p);
+        _sco_linkedList.add(p);
+    }
+        
+
+    // Create a PCCollections with "interesting" values.
+    public void init() {
+
+        // ArrayList
+        _arrayList = new java.util.ArrayList();
+        _arrayList.add(new Integer(42));
+        _arrayList.add(new Double(3.14159));
+        _arrayList.add("hello-world");
+        _arrayList.add(date);
+        _arrayList.add(bigDecimal);
+        _arrayList.add(bigInteger);
+        _arrayList.add(locale);
+        
+        _emptyArrayList = new java.util.ArrayList();
+
+        _nullArrayList = null;
+
+        // SCO ArrayList
+        _sco_arrayList = null; // No PM => Test_Collections uses setSCOArrayList
+        _sco_emptyArrayList = new java.util.ArrayList();
+        _sco_nullArrayList = null;
+
+        // Vector
+        _vector = new java.util.Vector();
+        _vector.add("four score and twenty beers ago");
+        _vector.add(new Double(0.0102030508));
+        _vector.add(new Integer(13));
+        _vector.add(new Character('z'));
+        _vector.add(date);
+        _vector.add(bigDecimal);
+        _vector.add(bigInteger);
+        _vector.add(locale);
+
+        _emptyVector = new java.util.Vector();
+
+        _nullVector = null;
+
+        // SCO Vector
+        _sco_vector = null; // No PM => Test_Collections uses setSCOVector
+        _sco_emptyVector = new java.util.Vector();
+        _sco_nullVector = null;
+
+        // HashMap
+        _hashMap = new java.util.HashMap();
+        _hashMap.put(new Integer(1), new Integer(42));
+        _hashMap.put(new Double(3.14159), new Float(6.02e+23));
+        _hashMap.put(new Character('d'), "d is 13");
+        _hashMap.put(new Byte((byte)0xf), date);
+        _hashMap.put("wombat", bigDecimal);
+        _hashMap.put(new Float(0.1f), bigInteger);
+        _hashMap.put(new Long(123456789), locale);
+
+        _emptyHashMap = new HashMap();
+
+        _nullHashMap = null;
+
+        // SCO HashMap
+        _sco_hashMap = null; // No PM => Test_Collections uses setSCOHashMap
+        _sco_emptyHashMap = new java.util.HashMap();
+        _sco_nullHashMap = null;
+
+        // Hashtable
+        _hashtable = new java.util.Hashtable();
+        _hashtable.put(new Integer(1), new Integer(42));
+        _hashtable.put(new Double(3.14159), new Float(6.02e+23));
+        _hashtable.put(new Character('d'), "d is 13");
+        _hashtable.put(new Byte((byte)0xf), date);
+        _hashtable.put("wombat", bigDecimal);
+        _hashtable.put(new Float(0.1f), bigInteger);
+        _hashtable.put(new Long(123456789), locale);
+
+        _emptyHashtable = new Hashtable();
+
+        _nullHashtable = null;
+
+        // SCO Hashtable
+        _sco_hashtable = null; // No PM => Test_Collections uses setSCOHashtable
+        _sco_emptyHashtable = new java.util.Hashtable();
+        _sco_nullHashtable = null;
+
+        // HashSet
+        _hashSet = new java.util.HashSet();
+        _hashSet.add(new Integer(13));
+        _hashSet.add(new Float(6.02e+23));
+        _hashSet.add("when I was back there in seminary school, ...");
+        _hashSet.add(date);
+        _hashSet.add(bigDecimal);
+        _hashSet.add(bigInteger);
+        _hashSet.add(locale);
+
+        _emptyHashSet = new java.util.HashSet();
+
+        _nullHashSet = null;
+
+        // SCO HashSet
+        _sco_hashSet = null; // No PM => Test_Collections uses setSCOHashSet
+        _sco_emptyHashSet = new java.util.HashSet();
+        _sco_nullHashSet = null;
+
+        // LinkedList
+        _linkedList = new java.util.LinkedList();
+        _linkedList.add(new Double(.00001));
+        _linkedList.add(new Integer(3800));
+        _linkedList.add("four score and twenty years ago");
+        _linkedList.add(date);
+        _linkedList.add(bigDecimal);
+        _linkedList.add(bigInteger);
+        _linkedList.add(locale);
+
+        _emptyLinkedList = new LinkedList();
+
+        _nullLinkedList = null;        
+
+        // SCO LinkedList
+        _sco_linkedList = null; // No PM => Test_Collections uses setSCOLinkedList
+        _sco_emptyLinkedList = new java.util.LinkedList();
+        _sco_nullLinkedList = null;
+
+        // TreeMap
+        // Keys must all be of same type for TreeMap.
+        _treeMap = new java.util.TreeMap();
+        _treeMap.put(new Double(6.02e+23), new Integer(42));
+        _treeMap.put(new Double(3.14159), new Float(6.02e+23));
+        _treeMap.put(new Double(186000), "d is 13");
+        _treeMap.put(new Double(0.1), date);
+        _treeMap.put(new Double(0.12), bigDecimal);
+        _treeMap.put(new Double(0.123), bigInteger);
+        _treeMap.put(new Double(0.1234), locale);
+
+        _emptyTreeMap = new TreeMap();
+
+        _nullTreeMap = null;
+
+        // SCO TreeMap
+        _sco_treeSet = null; // No PM => Test_Collections uses setSCOTreeMap
+        _sco_emptyTreeMap = new java.util.TreeMap();
+        _sco_nullTreeMap = null;
+
+        // TreeSet
+        _treeSet = new java.util.TreeSet();
+        _treeSet.add(new Double(13));
+        _treeSet.add(new Double(6.02e+23));
+        _treeSet.add(new Double(186000));
+        _treeSet.add(new Double(0.1234));
+        _treeSet.add(new Double(0.123));
+        _treeSet.add(new Double(0.12));
+        _treeSet.add(new Double(0.1));
+
+        _emptyTreeSet = new java.util.TreeSet();
+
+        _nullTreeSet = null;
+
+        // SCO TreeSet
+        _sco_treeSet = null; // No PM => Test_Collections uses setSCOTreeSet
+        _sco_emptyTreeSet = new java.util.TreeSet();
+        _sco_nullTreeSet = null;
+
+        //
+        // Extra Collection and Map tests, putting maps and arrays into
+        // collections and maps.
+        //
+
+        // Don't reuse the above _arrayList and _hashMap because they contain
+        // Date objects, which I've determined empirically to have different
+        // toString() representations in different JDK's (e.g. on Solaris and
+        // WinNT).
+        java.util.ArrayList al = new java.util.ArrayList();
+        al.add(new Integer(42));
+        al.add("hello-world");
+        al.add(bigDecimal);
+        al.add(locale);
+
+        java.util.HashMap hm = new java.util.HashMap();
+        hm = new java.util.HashMap();
+        hm.put(new Integer(1), new Integer(42));
+        hm.put(new Character('d'), "d is 13");
+        hm.put("wombat", bigDecimal);
+        hm.put(new Float(0.1f), bigInteger);
+
+        int xyz[] = new int[] { 1, 2, 3, 4, 5 }; // Array of primitive
+        Date dates[] = new Date[] { date, date }; // Array of Object
+
+        // Extra Collection tests: Collection of Collection, Collection of
+        // Map, Collection of array of primitive, Collection of array of Object.
+        _vector.add(al); // Collection of Collection
+        _vector.add(hm); // Collection of Map
+        _vector.add(xyz);
+        _vector.add(dates);
+
+        // Extra tests: Map of Map, Map of Collection, Map of array of
+        // primitive, Map of array of Object.
+        _treeMap.put(new Double(1234.5), al); // Map of collection
+        _treeMap.put(new Double(1.0), hm); // Map of Map
+        _treeMap.put(new Double(2.345), xyz); // Map of array of primitive
+        _treeMap.put(new Double(0.0000000000000009), dates); // Map of array of SCO
+    }
+
+    public String toString() {
+        StringBuffer rc = new StringBuffer(Util.getClassName(this));
+        StringBuffer info;
+        try {
+            // ArrayList
+            rc.append(Util.stringifyList(_arrayList,
+                                         Util.getInfo("_arrayList", _arrayList)));
+            rc.append(Util.stringifyList(_emptyArrayList, "_emptyArrayList"));
+            rc.append(Util.stringifyList(_nullArrayList, "_nullArrayList"));
+            rc.append("\n");
+
+            // SCO ArrayList
+            rc.append(Util.stringifyList(_sco_arrayList,
+                                         Util.getInfo("_sco_arrayList", _sco_arrayList)));
+            rc.append(Util.stringifyList(_sco_emptyArrayList, "_sco_emptyArrayList"));
+            rc.append(Util.stringifyList(_sco_nullArrayList, "_sco_nullArrayList"));
+            rc.append("\n");
+
+            // Vector
+            rc.append(Util.stringifyList(_vector, Util.getInfo("_vector", _vector)));
+            rc.append(Util.stringifyList(_emptyVector, "_emptyVector"));
+            rc.append(Util.stringifyList(_nullVector, "_nullVector"));
+            rc.append("\n");
+
+            // SCO Vector
+            rc.append(Util.stringifyList(_sco_vector,
+                                         Util.getInfo("_sco_vector", _sco_vector)));
+            rc.append(Util.stringifyList(_sco_emptyVector, "_sco_emptyVector"));
+            rc.append(Util.stringifyList(_sco_nullVector, "_sco_nullVector"));
+            rc.append("\n");
+
+            // HashMap
+            rc.append(Util.stringifyMap(_hashMap, Util.getInfo("_hashMap", _hashMap)));
+            rc.append(Util.stringifyMap(_emptyHashMap, "_emptyHashMap"));
+            rc.append(Util.stringifyMap(_nullHashMap, "_nullHashMap"));
+            rc.append("\n");
+
+            // SCO HashMap
+            rc.append(Util.stringifyMap(_sco_hashMap,
+                                        Util.getInfo("_sco_hashMap", _sco_hashMap)));
+            rc.append(Util.stringifyMap(_sco_emptyHashMap, "_sco_emptyHashMap"));
+            rc.append(Util.stringifyMap(_sco_nullHashMap, "_sco_nullHashMap"));
+            rc.append("\n");
+
+            // Hashtable
+            rc.append(Util.stringifyMap(_hashtable, Util.getInfo("_hashtable", _hashtable)));
+            rc.append(Util.stringifyMap(_emptyHashtable, "_emptyHashtable"));
+            rc.append(Util.stringifyMap(_nullHashtable, "_nullHashtable"));
+            rc.append("\n");
+
+            // SCO Hashtable
+            rc.append(Util.stringifyMap(_sco_hashtable,
+                                        Util.getInfo("_sco_hashtable", _sco_hashtable)));
+            rc.append(Util.stringifyMap(_sco_emptyHashtable, "_sco_emptyHashtable"));
+            rc.append(Util.stringifyMap(_sco_nullHashtable, "_sco_nullHashtable"));
+            rc.append("\n");
+
+            // HashSet
+            rc.append(Util.stringifySet(_hashSet, Util.getInfo("_hashSet", _hashSet)));
+            rc.append(Util.stringifySet(_emptyHashSet, "_emptyHashSet"));
+            rc.append(Util.stringifySet(_nullHashSet, "_nullHashSet"));
+            rc.append("\n");
+
+            // SCO HashSet
+            rc.append(Util.stringifySet(_sco_hashSet,
+                                        Util.getInfo("_sco_hashSet", _sco_hashSet)));
+            rc.append(Util.stringifySet(_sco_emptyHashSet, "_sco_emptyHashSet"));
+            rc.append(Util.stringifySet(_sco_nullHashSet, "_sco_nullHashSet"));
+            rc.append("\n");
+
+            // LinkedList
+            rc.append(Util.stringifyList(_linkedList, Util.getInfo("_linkedList", _linkedList)));
+            rc.append(Util.stringifyList(_emptyLinkedList, "_emptyLinkedList"));
+            rc.append(Util.stringifyList(_nullLinkedList, "_nullLinkedList"));
+            rc.append("\n");
+
+            // SCO LinkedList
+            rc.append(Util.stringifyList(_sco_linkedList,
+                                         Util.getInfo("_sco_linkedList", _sco_linkedList)));
+            rc.append(Util.stringifyList(_sco_emptyLinkedList, "_sco_emptyLinkedList"));
+            rc.append(Util.stringifyList(_sco_nullLinkedList, "_sco_nullLinkedList"));
+            rc.append("\n");
+
+            // TreeMap
+            rc.append(Util.stringifyMap(_treeMap, Util.getInfo("_treeMap", _treeMap)));
+            rc.append(Util.stringifyMap(_emptyTreeMap, "_emptyTreeMap"));
+            rc.append(Util.stringifyMap(_nullTreeMap, "_nullTreeMap"));
+            rc.append("\n");
+
+            // SCO TreeMap
+            rc.append(Util.stringifyMap(_sco_treeMap, Util.getInfo("_sco_treeMap", _sco_treeMap)));
+            rc.append(Util.stringifyMap(_sco_emptyTreeMap, "_sco_emptyTreeMap"));
+            rc.append(Util.stringifyMap(_sco_nullTreeMap, "_sco_nullTreeMap"));
+            rc.append("\n");
+
+            // TreeSet
+            rc.append(Util.stringifySet(_treeSet, Util.getInfo("_treeSet", _treeSet)));
+            rc.append(Util.stringifySet(_emptyTreeSet, "_emptyTreeSet"));
+            rc.append(Util.stringifySet(_nullTreeSet, "_nullTreeSet"));
+            rc.append("\n");
+
+            // SCO TreeSet
+            rc.append(Util.stringifySet(_sco_treeSet,
+                                        Util.getInfo("_sco_treeSet", _sco_treeSet)));
+            rc.append(Util.stringifySet(_sco_emptyTreeSet, "_sco_emptyTreeSet"));
+            rc.append(Util.stringifySet(_sco_nullTreeSet, "_sco_nullTreeSet"));
+            rc.append("\n");
+
+        } catch (NullPointerException ex) {
+            ex.printStackTrace();
+            return (rc.toString() + "\nPCCollections has null values");
+        }
+        return rc.toString();
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle.java Sun May 22 11:40:13 2005
@@ -0,0 +1,69 @@
+/*
+ * 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.pc;
+
+// Test graph with cycles: each class contains a member of the other class.
+//
+
+
+/**
+* A class whose instances refer to instances of this class, creating a cycle.
+*
+* @author Dave Bristor
+*/
+public class PCCycle {
+    public String name;
+    public PCCycle2 c2;
+
+    public PCCycle() { }
+
+    public void init(String name, PCCycle2 c2) {
+        this.name = name;
+        this.c2 = c2;
+    }
+
+    PCCycle2 getC2() {
+        return c2;
+    }
+
+    public String toString(PCCycle2 c2) {
+        String rc = "loop!";
+        if (this.c2 != c2) {
+            rc = toString();
+        }
+        return rc;
+    }
+    
+    public String toString() {
+        String rc = null;
+        try {
+            rc = this.getClass().getName()
+                + " name=" + name;
+            try {
+                // Compare w/ PCCycle2.toString()
+                rc += " c2='" + getC2().toString() + "'";
+            } catch (NullPointerException ex) {
+                ex.printStackTrace(System.err);
+                rc += " c2=<NPE>";
+            }
+        } catch (NullPointerException ex) {
+            ex.printStackTrace(System.err);
+            rc = "PCCycle has no values";
+        }
+        return rc;
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle2.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle2.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle2.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCCycle2.java Sun May 22 11:40:13 2005
@@ -0,0 +1,60 @@
+/*
+ * 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.pc;
+
+// Test graph with cycles: each class contains a member of the other class.
+//
+
+/**
+* A class whose instances refer to instances of this class, creating a cycle.
+*
+* @author Dave Bristor
+*/
+public class PCCycle2 {
+    public int id;
+    public PCCycle c;
+
+    public PCCycle2() { }
+
+    public void init (int id, PCCycle c) {
+        this.id = id;
+        this.c = c;
+    }
+
+    PCCycle getC() {
+        return c;
+    }
+
+    public String toString() {
+        String rc = null;
+        try {
+            rc = this.getClass().getName()
+                + " id=" + id;
+            try {
+                // Compare w/ PCCycle.toString()
+                rc += " c='" + getC().toString(this) + "'";
+            } catch (NullPointerException ex) {
+                ex.printStackTrace(System.err);
+                rc += " c=<NPE>";
+            }
+        } catch (NullPointerException ex) {
+            ex.printStackTrace(System.err);
+            rc = "PCCycle has no values";
+        }
+        return rc;
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment.java Sun May 22 11:40:13 2005
@@ -0,0 +1,89 @@
+/*
+ * 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.pc;
+
+import java.util.HashSet;
+
+/**
+* A sample department class, generated from an SQL schema.
+*/
+public class PCDepartment {
+    public long deptid;
+    
+    public String name;
+    
+    public java.util.HashSet employees;
+
+    public String toString() {
+        return "Dept: " + name + ", id=" + deptid +
+            ", emps: " + employees.size();
+    }
+
+    public PCDepartment() {
+    }
+
+    public PCDepartment(long _id, String _name) {
+        deptid = _id;
+        name = _name;
+    }
+    
+    public long getDeptid() {
+        return deptid;
+    }
+    
+    public void setDeptid(long deptid) {
+        this. deptid = deptid;
+    }
+    
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this. name = name;
+    }
+    
+    public java.util.HashSet getEmployees() {
+        return employees;
+    }
+    
+    public void setEmployees(java.util.HashSet employees) {
+        this. employees = employees;
+    }
+    
+    public static class Oid {
+        public long deptid;
+        
+        public Oid() {
+        }
+        
+        public boolean equals(java.lang.Object obj) {
+            if( obj==null ||
+            !this.getClass().equals(obj.getClass()) ) return( false );
+            Oid o=(Oid) obj;
+            if( this.deptid!=o.deptid ) return( false );
+            return( true );
+        }
+        
+        public int hashCode() {
+            int hashCode=0;
+            hashCode += deptid;
+            return( hashCode );
+        }
+    }
+}
+

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment1.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment1.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment1.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDepartment1.java Sun May 22 11:40:13 2005
@@ -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.pc;
+
+import java.util.HashSet;
+
+/**
+* A sample department class. Used with other classes which 
+* names end with "1".
+*
+* @author Marina Vatkina.
+*/
+public class PCDepartment1 {
+    public long deptid;
+    
+    public String name;
+    
+    public java.util.HashSet employees;
+
+    public String toString() {
+        return "Dept: " + name + ", id=" + deptid +
+            ", emps: " + employees.size();
+    }
+
+    public PCDepartment1() {
+    }
+
+    public PCDepartment1(long _id, String _name) {
+        deptid = _id;
+        name = _name;
+    }
+    
+    public long getDeptid() {
+        return deptid;
+    }
+    
+    public void setDeptid(long deptid) {
+        this. deptid = deptid;
+    }
+    
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this. name = name;
+    }
+    
+    public java.util.HashSet getEmployees() {
+        return employees;
+    }
+    
+    public void setEmployees(java.util.HashSet employees) {
+        this. employees = employees;
+    }
+    
+    public static class Oid {
+        public long deptid;
+        
+        public Oid() {
+        }
+        
+        public boolean equals(java.lang.Object obj) {
+            if( obj==null ||
+            !this.getClass().equals(obj.getClass()) ) return( false );
+            Oid o=(Oid) obj;
+            if( this.deptid!=o.deptid ) return( false );
+            return( true );
+        }
+        
+        public int hashCode() {
+            int hashCode=0;
+            hashCode += deptid;
+            return( hashCode );
+        }
+    }
+}
+

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDerived.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDerived.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDerived.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCDerived.java Sun May 22 11:40:13 2005
@@ -0,0 +1,21 @@
+/*
+ * 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.pc;
+
+public class PCDerived extends PCBase {
+    public PCDerived() { }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee.java Sun May 22 11:40:13 2005
@@ -0,0 +1,219 @@
+/*
+ * 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.pc;
+
+import java.util.HashSet;
+
+import org.apache.jdo.test.util.Util;
+
+/**
+* A sample employee class, generated from an SQL schema.
+*/
+public class PCEmployee {
+    public long empid;
+    
+    public String lastname;
+    
+    public String firstname;
+    
+    public java.util.Date hiredate;
+    
+    public java.util.Date birthdate;
+    
+    public double salary;
+    
+    public java.util.HashSet projects;
+    
+    public PCDepartment department;
+    
+    public PCEmployee manager;
+    
+    public java.util.HashSet employees;
+    
+    public PCInsurance insurance;
+    
+    public String toString() {
+        StringBuffer rc = new StringBuffer("Emp: ");
+        rc.append(lastname);
+        rc.append(", " + firstname);
+        rc.append(", id=" + empid);
+        rc.append(", born " + Util.shortFormatter.format(birthdate));
+        rc.append(", hired " + Util.shortFormatter.format(hiredate));
+        rc.append(" $" + salary);
+        String mgrName = "none";
+        if (null != manager) {
+            mgrName = manager.getLastname();
+        }
+        rc.append(" manager: " + mgrName);
+        rc.append(" dept: " + department.getName());
+        int numEmps = 0;
+        if (null != employees) {
+            numEmps = employees.size();
+        }
+        rc.append(" emps: " + numEmps);
+        if (null != insurance) {
+            rc.append(" insurance: " + insurance.getCarrier());
+        } else {
+            rc.append(" insurance: null");
+        }
+
+        return rc.toString();
+    }
+            
+    public PCEmployee() {
+    }
+
+    public PCEmployee(long _empid, String _last, String _first, double _sal,
+             java.util.Date _born, java.util.Date _hired) {
+        empid = _empid;
+        lastname = _last;
+        firstname = _first;
+        salary = _sal;
+        birthdate = _born;
+        hiredate = _hired;
+    }
+    
+    public long getEmpid() {
+        return empid;
+    }
+    
+    public void setEmpid(long empid) {
+        this. empid = empid;
+    }
+    
+    public String getLastname() {
+        return lastname;
+    }
+    
+    public void setLastname(String lastname) {
+        this. lastname = lastname;
+    }
+    
+    public String getFirstname() {
+        return firstname;
+    }
+    
+    public void setFirstname(String firstname) {
+        this. firstname = firstname;
+    }
+    
+    public java.util.Date getHiredate() {
+        return hiredate;
+    }
+    
+    public void setHiredate(java.util.Date hiredate) {
+        this. hiredate = hiredate;
+    }
+    
+    public java.util.Date getBirthdate() {
+        return birthdate;
+    }
+    
+    public void setBirthdate(java.util.Date birthdate) {
+        this. birthdate = birthdate;
+    }
+    
+    public double getSalary() {
+        return salary;
+    }
+    
+    public void setSalary(double salary) {
+        this. salary = salary;
+    }
+    
+    public java.util.HashSet getProjects() {
+        return projects;
+    }
+    
+    public void setProjects(java.util.HashSet projects) {
+        this. projects = projects;
+    }
+    
+    public PCDepartment getDepartment() {
+        return department;
+    }
+    
+    public void setDepartment(PCDepartment department) {
+        this. department = department;
+    }
+    
+    public PCEmployee getManager() {
+        return manager;
+    }
+    
+    public void setManager(PCEmployee manager) {
+        this. manager = manager;
+    }
+    
+    public java.util.HashSet getEmployees() {
+        return employees;
+    }
+    
+    public void setEmployees(java.util.HashSet employees) {
+        this. employees = employees;
+    }
+    
+    public PCInsurance getInsurance() {
+        return insurance;
+    }
+    
+    public void setInsurance(PCInsurance insurance) {
+        this. insurance = insurance;
+    }
+
+    // Returns true iff the values of fields in this are == to those in the
+    // given object.
+    public boolean sameValues(Object o) {
+        PCEmployee other = (PCEmployee)o;
+
+        return
+            (empid == other.empid) &&
+            (lastname == other.lastname) &&
+            (firstname == other.firstname) &&
+            (hiredate == other.hiredate) &&
+            (salary == other.salary) &&
+            (projects == other.projects) &&
+            (department == other.department) &&
+            (manager == other.manager) &&
+            (employees == other.employees) &&
+            (insurance == other.insurance);
+    }        
+    
+    public static class Oid {
+        public long empid;
+        
+        public Oid() {
+        }
+        
+        public boolean equals(java.lang.Object obj) {
+            if( obj==null ||
+            !this.getClass().equals(obj.getClass()) ) return( false );
+            Oid o=(Oid) obj;
+            if( this.empid!=o.empid ) return( false );
+            return( true );
+        }
+        
+        public int hashCode() {
+            int hashCode=0;
+            hashCode += empid;
+            return( hashCode );
+        }
+        
+        
+    }
+}
+

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee1.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee1.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee1.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCEmployee1.java Sun May 22 11:40:13 2005
@@ -0,0 +1,227 @@
+/*
+ * 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.pc;
+
+import org.apache.jdo.test.util.Util;
+
+/**
+* A extended employee class that differs from Employee class
+* in types of the relationship fields on the many side:
+* Array of javax.jdo.spi.PersistenceCapable instances for
+* manager-employees relationship, and LinkedList for the list
+* of projects.
+*
+* @author Marina Vatkina
+*/
+public class PCEmployee1 implements java.io.Serializable {
+    public long empid;
+    
+    public String lastname;
+    
+    public String firstname;
+    
+    public java.util.Date hiredate;
+    
+    public java.util.Date birthdate;
+    
+    public double salary;
+    
+    public java.util.LinkedList projects;
+    
+    public PCDepartment1 department;
+    
+    public PCEmployee1 manager;
+    
+    public Object[] employees;
+    
+    public PCInsurance1 insurance;
+    
+    public String toString() {
+        StringBuffer rc = new StringBuffer("Emp: ");
+        rc.append(lastname);
+        rc.append(", " + firstname);
+        rc.append(", id=" + empid);
+        rc.append(", born " + Util.shortFormatter.format(birthdate));
+        rc.append(", hired " + Util.shortFormatter.format(hiredate));
+        rc.append(" $" + salary);
+        String mgrName = "none";
+        if (null != manager) {
+            mgrName = manager.getLastname();
+        }
+        rc.append(" manager: " + mgrName);
+        String dname = "none";
+        if (null != department) {
+            dname = department.getName();
+        }
+        rc.append(" dept: " + dname);
+        int numEmps = 0;
+        if (null != employees) {
+            numEmps = employees.length;
+        }
+        rc.append(" emps: " + numEmps);
+        if (null != insurance) {
+            rc.append(" insurance: " + insurance.getCarrier());
+        } else {
+            rc.append(" insurance: null");
+        }
+
+        return rc.toString();
+    }
+            
+    public PCEmployee1() {
+    }
+
+    public PCEmployee1(long _empid, String _last, String _first, double _sal,
+             java.util.Date _born, java.util.Date _hired) {
+        empid = _empid;
+        lastname = _last;
+        firstname = _first;
+        salary = _sal;
+        birthdate = _born;
+        hiredate = _hired;
+    }
+    
+    public long getEmpid() {
+        return empid;
+    }
+    
+    public void setEmpid(long empid) {
+        this. empid = empid;
+    }
+    
+    public String getLastname() {
+        return lastname;
+    }
+    
+    public void setLastname(String lastname) {
+        this. lastname = lastname;
+    }
+    
+    public String getFirstname() {
+        return firstname;
+    }
+    
+    public void setFirstname(String firstname) {
+        this. firstname = firstname;
+    }
+    
+    public java.util.Date getHiredate() {
+        return hiredate;
+    }
+    
+    public void setHiredate(java.util.Date hiredate) {
+        this. hiredate = hiredate;
+    }
+    
+    public java.util.Date getBirthdate() {
+        return birthdate;
+    }
+    
+    public void setBirthdate(java.util.Date birthdate) {
+        this. birthdate = birthdate;
+    }
+    
+    public double getSalary() {
+        return salary;
+    }
+    
+    public void setSalary(double salary) {
+        this. salary = salary;
+    }
+    
+    public java.util.LinkedList getProjects() {
+        return projects;
+    }
+    
+    public void setProjects(java.util.LinkedList projects) {
+        this. projects = projects;
+    }
+    
+    public PCDepartment1 getDepartment() {
+        return department;
+    }
+    
+    public void setDepartment(PCDepartment1 department) {
+        this. department = department;
+    }
+    
+    public PCEmployee1 getManager() {
+        return manager;
+    }
+    
+    public void setManager(PCEmployee1 manager) {
+        this. manager = manager;
+    }
+    
+    public Object[] getEmployees() {
+        return employees;
+    }
+    
+    public void setEmployees(Object[] employees) {
+        this. employees = employees;
+    }
+    
+    public PCInsurance1 getInsurance() {
+        return insurance;
+    }
+    
+    public void setInsurance(PCInsurance1 insurance) {
+        this. insurance = insurance;
+    }
+
+    // Returns true iff the values of fields in this are == to those in the
+    // given object.
+    public boolean sameValues(Object o) {
+        PCEmployee1 other = (PCEmployee1)o;
+
+        return
+            (empid == other.empid) &&
+            (lastname == other.lastname) &&
+            (firstname == other.firstname) &&
+            (hiredate == other.hiredate) &&
+            (salary == other.salary) &&
+            (projects == other.projects) &&
+            (department == other.department) &&
+            (manager == other.manager) &&
+            (employees == other.employees) &&
+            (insurance == other.insurance);
+    }        
+    
+    public static class Oid {
+        public long empid;
+        
+        public Oid() {
+        }
+        
+        public boolean equals(java.lang.Object obj) {
+            if( obj==null ||
+            !this.getClass().equals(obj.getClass()) ) return( false );
+            Oid o=(Oid) obj;
+            if( this.empid!=o.empid ) return( false );
+            return( true );
+        }
+        
+        public int hashCode() {
+            int hashCode=0;
+            hashCode += empid;
+            return( hashCode );
+        }
+        
+        
+    }
+}
+

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCFullTimeEmployee1.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCFullTimeEmployee1.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCFullTimeEmployee1.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCFullTimeEmployee1.java Sun May 22 11:40:13 2005
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ */
+
+/*
+ * PCFullTimeEmployee1.java
+ *
+ * Created on May 22, 2001, 9:36 AM
+ */
+
+package org.apache.jdo.pc;
+
+/**
+ *
+ * @author  clr
+ * @version 
+ */
+public class PCFullTimeEmployee1 extends PCEmployee1 {
+
+    public int range;
+    
+    /** Creates new PCFullTimeEmployee1 */
+    public PCFullTimeEmployee1() {
+    }
+    public PCFullTimeEmployee1(
+            String _first,  
+            String _last, 
+            java.util.Date _born, 
+            long _empid, 
+            java.util.Date _hired,
+            double _sal,
+            int _range ) {
+        super (_empid, _last, _first, _sal, _born, _hired);
+        range = _range;
+    }
+    
+    public double getRange() {
+        return range;
+    }
+    
+    public void setRange(int range) {
+        this.range = range;
+    }
+    
+    public String toString() {
+        StringBuffer rc = new StringBuffer("PCFullTimeEmployee1: ");
+        rc.append(super.toString());
+        rc.append(" range: " + range);
+        return rc.toString();
+    }
+            
+
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCId.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCId.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCId.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCId.java Sun May 22 11:40:13 2005
@@ -0,0 +1,58 @@
+/*
+ * 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.pc;
+
+public class PCId implements Comparable {
+    private int id;
+    private static int count = 0;
+
+    public PCId() {
+        id = 100 + count;
+        count++;
+    }
+
+    public int hashCode() {
+        return id;
+    }
+
+    public boolean equals(Object o) {
+        boolean rc = false;
+        if (null != o && o instanceof PCId) {
+            PCId other = (PCId)o;
+            rc = (id == other.id);
+        }
+        return rc;
+    }
+
+    public String toString() {
+        return "PCId=" + id;
+    }
+    
+    public int compareTo(Object obj) {
+        if (obj == null) {
+            throw new RuntimeException("Null cannot be compared.");
+        }
+        if (obj instanceof PCId) {
+            return id - ((PCId)obj).id;
+        } else {
+            throw new RuntimeException("Object of class " 
+            + obj.getClass().getName() 
+            + " cannot be compared to an instance of PCId.");
+        }
+    }
+    
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance.java Sun May 22 11:40:13 2005
@@ -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.pc;
+
+import java.util.HashSet;
+
+/**
+* A sample insurance class, generated from an SQL schema.
+*/
+public class PCInsurance {
+    public long insid;
+    
+    public String carrier;
+    
+    public PCEmployee employee;
+    
+    public String toString() {
+        return "Ins: " + carrier + ", id=" + insid +
+            ", emp " + employee.getLastname();
+    }
+
+    public PCInsurance() {
+    }
+
+    public PCInsurance(long _id, String _carrier, PCEmployee _emp) {
+        insid = _id;
+        carrier = _carrier;
+        employee = _emp;
+    }
+    
+    public long getInsid() {
+        return insid;
+    }
+    
+    public void setInsid(long insid) {
+        this. insid = insid;
+    }
+    
+    public String getCarrier() {
+        return carrier;
+    }
+    
+    public void setCarrier(String carrier) {
+        this. carrier = carrier;
+    }
+    
+    public PCEmployee getEmployee() {
+        return employee;
+    }
+    
+    public void setEmployee(PCEmployee employee) {
+        this. employee = employee;
+    }
+    
+    public static class Oid {
+        public long insid;
+        
+        public Oid() {
+        }
+        
+        public boolean equals(java.lang.Object obj) {
+            if( obj==null ||
+            !this.getClass().equals(obj.getClass()) ) return( false );
+            Oid o=(Oid) obj;
+            if( this.insid!=o.insid ) return( false );
+            return( true );
+        }
+        
+        public int hashCode() {
+            int hashCode=0;
+            hashCode += insid;
+            return( hashCode );
+        }
+        
+        
+}
+}
+

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance1.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance1.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance1.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInsurance1.java Sun May 22 11:40:13 2005
@@ -0,0 +1,101 @@
+/*
+ * 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.pc;
+
+import java.util.HashSet;
+
+/**
+* A sample insurance class. Used with other classes which names 
+* end with "1".
+* 
+* @author Marina Vatkina
+*/
+public class PCInsurance1 {
+    public long insid;
+    
+    public String carrier;
+    
+    public PCEmployee1 employee;
+    
+    public String toString() {
+        String ename = "none";
+        try{ 
+            ename = employee.getLastname();
+        } catch (Exception e) {
+//System.out.println("I: " + e);
+        }
+        return "Ins: " + carrier + ", id=" + insid +
+            ", emp " + ename;
+    }
+
+    public PCInsurance1() {
+    }
+
+    public PCInsurance1(long _id, String _carrier, PCEmployee1 _emp) {
+        insid = _id;
+        carrier = _carrier;
+        employee = _emp;
+    }
+    
+    public long getInsid() {
+        return insid;
+    }
+    
+    public void setInsid(long insid) {
+        this. insid = insid;
+    }
+    
+    public String getCarrier() {
+        return carrier;
+    }
+    
+    public void setCarrier(String carrier) {
+        this. carrier = carrier;
+    }
+    
+    public PCEmployee1 getEmployee() {
+        return employee;
+    }
+    
+    public void setEmployee(PCEmployee1 employee) {
+        this. employee = employee;
+    }
+    
+    public static class Oid {
+        public long insid;
+        
+        public Oid() {
+        }
+        
+        public boolean equals(java.lang.Object obj) {
+            if( obj==null ||
+            !this.getClass().equals(obj.getClass()) ) return( false );
+            Oid o=(Oid) obj;
+            if( this.insid!=o.insid ) return( false );
+            return( true );
+        }
+        
+        public int hashCode() {
+            int hashCode=0;
+            hashCode += insid;
+            return( hashCode );
+        }
+        
+        
+}
+}
+

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInterfaces.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInterfaces.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInterfaces.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/pc/PCInterfaces.java Sun May 22 11:40:13 2005
@@ -0,0 +1,66 @@
+/*
+ * 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.pc;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.jdo.test.util.Util;
+
+
+/**
+* Test ability to store & fetch instances of classes which refer to other
+* PersistenceCapable classes, where the field type in the referring class is
+* of an interface, not of an implementation.
+*
+* @author Dave Bristor
+*/
+public class PCInterfaces {
+    public java.util.List _list;
+    public java.util.List _emptyList = new Vector();
+    public java.util.List _nullList = null;
+
+    public PCInterfaces() { }
+
+    public void init() {
+        _list = new ArrayList();
+        _list.add(new Integer(42));
+        _list.add(new Long(5551212));
+    }
+    
+    public boolean equals(Object o) {
+        // Note, this implementation assumes all _nullXXX fields are null
+        // and all _XXX fields are not null in this instance
+        if (null == o || !(o instanceof PCInterfaces))
+            return false;
+        PCInterfaces other = (PCInterfaces)o;
+        return _list.equals(other._list) &&
+               _emptyList.equals(other._emptyList) && 
+               _nullList == other._nullList;
+    }
+
+    public String toString() {
+        StringBuffer rc = new StringBuffer(this.getClass().getName());
+        rc.append(Util.stringifyList(_list,
+                                     Util.getInfo("_list", _list)));
+        rc.append(Util.stringifyList(_emptyList, "_emptyList"));
+        rc.append(Util.stringifyList(_nullList, "_nullList"));
+        return rc.toString();
+    }
+}