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 mc...@apache.org on 2005/04/04 21:44:01 UTC

svn commit: r160090 [51/63] - in incubator/jdo/trunk: ./ tck20/ tck20/assertions/ tck20/iut_jars/ tck20/test/ tck20/test/conf/ tck20/test/java/ tck20/test/java/org/ tck20/test/java/org/apache/ tck20/test/java/org/apache/jdo/ tck20/test/java/org/apache/jdo/tck/ tck20/test/java/org/apache/jdo/tck/api/ tck20/test/java/org/apache/jdo/tck/api/instancecallbacks/ tck20/test/java/org/apache/jdo/tck/api/jdohelper/ tck20/test/java/org/apache/jdo/tck/api/persistencemanager/ tck20/test/java/org/apache/jdo/tck/api/persistencemanager/cache/ tck20/test/java/org/apache/jdo/tck/api/persistencemanager/close/ tck20/test/java/org/apache/jdo/tck/api/persistencemanager/extent/ tck20/test/java/org/apache/jdo/tck/api/persistencemanager/flags/ tck20/test/java/org/apache/jdo/tck/api/persistencemanager/getobject/ tck20/test/java/org/apache/jdo/tck/api/persistencemanager/lifecycle/ tck20/test/java/org/apache/jdo/tck/api/persistencemanagerfactory/ tck20/test/java/org/apache/jdo/tck/enhancement/ tck20/test/java/org/apache/jdo/tck/extents/ tck20/test/java/org/apache/jdo/tck/lifecycle/ tck20/test/java/org/apache/jdo/tck/lifecycle/nontransactional/ tck20/test/java/org/apache/jdo/tck/models/ tck20/test/java/org/apache/jdo/tck/models/embedded/ tck20/test/java/org/apache/jdo/tck/models/fieldtypes/ tck20/test/java/org/apache/jdo/tck/models/inheritance/ tck20/test/java/org/apache/jdo/tck/pc/ tck20/test/java/org/apache/jdo/tck/pc/company/ tck20/test/java/org/apache/jdo/tck/pc/fieldtypes/ tck20/test/java/org/apache/jdo/tck/pc/inheritance/ tck20/test/java/org/apache/jdo/tck/pc/instancecallbacks/ tck20/test/java/org/apache/jdo/tck/pc/lifecycle/ tck20/test/java/org/apache/jdo/tck/pc/mylib/ tck20/test/java/org/apache/jdo/tck/query/ tck20/test/java/org/apache/jdo/tck/query/operators/ tck20/test/java/org/apache/jdo/tck/transactions/ tck20/test/java/org/apache/jdo/tck/util/ tck20/test/jdo/ tck20/test/jdo/applicationidentity/ tck20/test/jdo/applicationidentity/org/ tck20/test/jdo/applicationidentity/org/apache/ tck20/test/jdo/applicationidentity/org/apache/jdo/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/company/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/fieldtypes/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/inheritance/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/instancecallbacks/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/lifecycle/ tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/mylib/ tck20/test/jdo/datastoreidentity/ tck20/test/jdo/datastoreidentity/org/ tck20/test/jdo/datastoreidentity/org/apache/ tck20/test/jdo/datastoreidentity/org/apache/jdo/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/company/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/fieldtypes/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/inheritance/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/instancecallbacks/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/lifecycle/ tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/mylib/ tck20/test/orm/ tck20/test/orm/applicationidentity/ tck20/test/orm/applicationidentity/org/ tck20/test/orm/applicationidentity/org/apache/ tck20/test/orm/applicationidentity/org/apache/jdo/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/pc/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/pc/company/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/pc/fieldtypes/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/pc/inheritance/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/pc/instancecallbacks/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/pc/lifecycle/ tck20/test/orm/applicationidentity/org/apache/jdo/tck/pc/mylib/ tck20/test/orm/datastoreidentity/ tck20/test/orm/datastoreidentity/org/ tck20/test/orm/datastoreidentity/org/apache/ tck20/test/orm/datastoreidentity/org/apache/jdo/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/pc/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/pc/company/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/pc/fieldtypes/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/pc/inheritance/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/pc/instancecallbacks/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/pc/lifecycle/ tck20/test/orm/datastoreidentity/org/apache/jdo/tck/pc/mylib/ tck20/test/sql/ tck20/test/sql/derby/

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimistic.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimistic.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimistic.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimistic.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,90 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Optimistic
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-14.
+ *<BR>
+ *<B>Assertion Description: </B>
+ A call to Transaction.setOptimistic causes the optimistic setting passed to replace the optimistic setting
+ currently active, if the Optimistic optional feature is supported. 
+
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/09/01     1.0
+ */
+public class SetOptimistic extends JDO_Test {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A13.4.2-14 (SetOptimistic) 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(SetOptimistic.class);
+    }
+
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestSetOptimistic(pm);   
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /** */
+    void runTestSetOptimistic(PersistenceManager pm) {
+        if (!isOptimisticSupported()) {
+            if (debug) logger.debug("Optimistic not supported.");
+            return;
+        }
+        
+        Transaction tx = pm.currentTransaction();
+        boolean orig = tx.getOptimistic();
+        tx.setOptimistic(!orig);
+        if (tx.getOptimistic() == orig) {
+            fail(ASSERTION_FAILED,
+                 "changing the optimistic flag by calling tx.setOptimistic does not have a effect.");
+        }
+        if ((tx != null) && tx.isActive()) {
+        	tx.rollback();
+        }
+    }
+}
+

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimistic.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticCalledDuringTxCompletion.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticCalledDuringTxCompletion.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticCalledDuringTxCompletion.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticCalledDuringTxCompletion.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,134 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.JDOUserException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+import javax.transaction.Synchronization;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Optimistic Called During TX Completion
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-3.
+ *<BR>
+ *<B>Assertion Description: </B>
+ If the setOptimistic method of the Transaction interface is called during commit or rollback processing (within the
+ beforeCompletion and afterCompletion synchronization methods), a JDOUserException is thrown. 
+
+
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/20/01     1.0
+ * 
+ */
+public class SetOptimisticCalledDuringTxCompletion 
+    extends JDO_Test 
+    implements Synchronization {
+
+    private Transaction tx;
+
+    private boolean optimisticFlag;
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A13.4.2-3 (SetOptimisticCalledDuringTxCompletion) 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(SetOptimisticCalledDuringTxCompletion.class);
+    }
+    
+    /** */
+    public void beforeCompletion(){
+        if (debug) logger.debug ("beforeCompletion");
+        try {
+            tx.setOptimistic(optimisticFlag);
+            fail(ASSERTION_FAILED,
+                 "tx.setOptimistic called in beforeCompletion should throw JDOUserException.");
+        }
+        catch (JDOUserException ex) {
+            // expected exception
+            if (debug) logger.debug("caught expected exception " + ex);
+        }
+        catch (Exception ex) {
+            fail(ASSERTION_FAILED,
+                 "tx.setOptimistic called in beforeCompletion throws unexpected exception: " + ex);
+        }
+    }
+    
+    /** */
+    public void afterCompletion(int status) {
+        if (debug) logger.debug("afterCompletion");
+        try {
+            tx.setOptimistic(optimisticFlag);
+        }
+        catch (Exception ex) {
+            fail(ASSERTION_FAILED,
+                 "tx.setOptimistic called in afterCompletion throws unexpected exception: " + ex);
+        }
+    }
+      
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestSetOptimisticCalledDuringTxCompletion(pm); 
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /** test transactions.setOptimistic() */
+    void runTestSetOptimisticCalledDuringTxCompletion(PersistenceManager pm) {
+        tx = pm.currentTransaction();
+        try {
+            tx.setSynchronization(this);          
+
+            optimisticFlag = false;
+            tx.begin();
+            tx.commit();
+            
+            if (isOptimisticSupported()) {
+                optimisticFlag = true;
+                tx.begin();
+                tx.commit();
+            }
+
+            tx = null;
+        }
+        finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticCalledDuringTxCompletion.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticDuringTransaction.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticDuringTransaction.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticDuringTransaction.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticDuringTransaction.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,107 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.JDOUserException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Optimistic During Transaction
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-15.
+ *<BR>
+ *<B>Assertion Description: </B>
+ If Transaction.setOptimistic is called while there is an active transaction, a JDOUserException is thrown. 
+
+
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/09/01     1.0
+ */
+public class SetOptimisticDuringTransaction extends JDO_Test {
+ 
+    /** */
+    private static final String ASSERTION_FAILED = 
+    "Assertion A13.4.2-15 (SetOptimisticDuringTransaction) 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(SetOptimisticDuringTransaction.class);
+    }
+
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestSetOptimisticDuringTransaction(pm); 
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /**  */
+    void runTestSetOptimisticDuringTransaction(PersistenceManager pm) {
+        Transaction tx = pm.currentTransaction();
+        try {
+            tx.begin();
+            // try to call tx.setOptimistic(true)
+            if (isOptimisticSupported()) {
+                try {
+                    tx.setOptimistic(true);
+                    fail(ASSERTION_FAILED,
+                         "calling tx.setOptimistic in the context of an active transaction should throw a JDOUserException.");
+                }
+                catch (JDOUserException ex) {
+                    // expected exception
+                    if (debug) logger.debug("caught expected exception " + ex);
+                }
+            }
+            // try to call tx.setOptimistic(false)
+            try {
+                tx.setOptimistic(false);
+                fail(ASSERTION_FAILED,
+                     "calling tx.setOptimistic in the context of an active transaction should throw a JDOUserException.");
+            }
+            catch (JDOUserException ex) {
+                // expected exception
+                if (debug) logger.debug("caught expected exception " + ex);
+            }
+            tx.commit();
+            tx = null;
+        }
+        finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticDuringTransaction.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticTrueWhenNotSupported.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticTrueWhenNotSupported.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticTrueWhenNotSupported.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticTrueWhenNotSupported.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,90 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.JDOUnsupportedOptionException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Optimistic True When Not Supported
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-7.
+ *<BR>
+ *<B>Assertion Description: </B>
+ If the optional feature Optimistic is not supported, then a call to Transaction.setOptimistic with a value of true will
+ throw a JDOUnsupportedOptionException. 
+
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/18/01     1.0
+ */
+public class SetOptimisticTrueWhenNotSupported extends JDO_Test {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A13.4.2-7 (SetOptimisticTrueWhenNotSupported) 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(SetOptimisticTrueWhenNotSupported.class);
+    }
+
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestSetOptimisticTrueWhenNotSupported(pm);   
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /** */
+    void runTestSetOptimisticTrueWhenNotSupported(PersistenceManager pm) {
+        if (isOptimisticSupported()) {
+            if (debug) logger.debug("Optimistic supported.");
+            return;
+        }
+        
+        Transaction tx = pm.currentTransaction();
+        try {
+            tx.setOptimistic(true);
+            fail(ASSERTION_FAILED,
+                 "tx.setOptimistic(true) should throw JDOUnsupportedOptionException, if the implementation does not support optimistic transactions.");
+        }
+        catch (JDOUnsupportedOptionException ex) {
+            // expected excepted
+            if (debug) logger.debug("caught expected exception " + ex);
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetOptimisticTrueWhenNotSupported.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValues.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValues.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValues.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValues.java Mon Apr  4 12:41:23 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.tck.transactions;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Retain Values
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-18.
+ *<BR>
+ *<B>Assertion Description: </B>
+ The retainValues setting passed to setRetainValues replaces 
+ the retainValues setting currently active. 
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/09/01     1.0
+ */
+public class SetRetainValues extends JDO_Test {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A13.4.2-18 (SetRetainValues) 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(SetRetainValues.class);
+    }
+
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestSetRetainValues(pm);
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /** */
+    void runTestSetRetainValues(PersistenceManager pm) {
+        if (!isRetainValuesSupported()) {
+            if (debug) logger.debug("RetainValues not supported.");
+            return;
+        }
+        
+        Transaction tx = pm.currentTransaction();
+        boolean orig = tx.getRetainValues();
+        tx.setRetainValues(!orig);
+        if (tx.getRetainValues() == orig) {
+            fail(ASSERTION_FAILED,
+                 "changing the retainValues flag by calling tx.setRetainValues does not have a effect.");
+        }
+        if ((tx != null) && tx.isActive()) {
+        	tx.rollback();
+        }
+    }
+}
+

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValues.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesCalledDuringTxCompletion.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesCalledDuringTxCompletion.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesCalledDuringTxCompletion.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesCalledDuringTxCompletion.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,137 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.JDOUserException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+import javax.transaction.Synchronization;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Optimistic Called During TX Completion
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-4.
+ *<BR>
+ *<B>Assertion Description: </B>
+ If the setOptimistic method of the Transaction interface is called during
+ * commit or rollback processing (within the beforeCompletion and
+ * afterCompletion synchronization methods), a JDOUserException is thrown. 
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/20/01     1.0
+ */
+public class SetRetainValuesCalledDuringTxCompletion 
+    extends JDO_Test 
+    implements Synchronization {
+
+    private Transaction tx;
+    
+    private boolean retainValuesFlag;
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A13.4.2-4 (SetRetainValuesCalledDuringTxCompletion) 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(SetRetainValuesCalledDuringTxCompletion.class);
+    }
+
+    /** */
+    public void beforeCompletion(){
+        if (debug) logger.debug ("beforeCompletion");
+        try {
+            tx.setRetainValues(retainValuesFlag);
+            fail(ASSERTION_FAILED,
+                 "tx.setRetainValues called in beforeCompletion should throw JDOUserException.");
+        }
+        catch (JDOUserException ex) {
+            // expected exception
+            if (debug) logger.debug("caught expected exception " + ex);
+        }
+        catch (Exception ex) {
+            fail(ASSERTION_FAILED,
+                 "tx.setRetainValues called in beforeCompletion throws unexpected exception: " + ex);
+        }
+    }
+    
+    /** */
+    public void afterCompletion(int status) {
+        if (debug) logger.debug ("afterCompletion");
+        try {
+            tx.setRetainValues(retainValuesFlag);
+        }
+        catch (JDOUserException ex) {
+            // TBD: need to remove this catch block as soon as the JDORI is
+            // fixed see 'Issue 61: Transaction.isActive issues'
+            if (debug) logger.debug("caught exception " + ex);
+        }
+        catch (Exception ex) {
+            fail(ASSERTION_FAILED,
+                 "tx.setRetainValues called in afterCompletion throws unexpected exception: " + ex);
+        }
+    }
+    
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestSetRetainValuesCalledDuringTxCompletion(pm);
+
+        pm.close();
+        pm = null;
+    }
+
+    /** */
+    void runTestSetRetainValuesCalledDuringTxCompletion(PersistenceManager pm) {
+        tx = pm.currentTransaction();
+        try {
+            tx.setSynchronization(this);          
+            
+            retainValuesFlag = false;
+            tx.begin();
+            tx.commit();
+            
+            if (isRetainValuesSupported()) {
+                retainValuesFlag = true;
+                tx.begin();
+                tx.commit();
+            }
+
+            tx = null;
+        }
+        finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesCalledDuringTxCompletion.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesTrueWhenNotSupported.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesTrueWhenNotSupported.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesTrueWhenNotSupported.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesTrueWhenNotSupported.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,90 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.JDOUnsupportedOptionException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Retain Values True When Not Supported
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-8.
+ *<BR>
+ *<B>Assertion Description: </B>
+ If the optional feature RetainValues is not supported, then a call to Transaction.setRetainValues with a
+ value of true will cause a JDOUnsupportedOptionException to be thrown. 
+
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/22/01     1.0
+ */
+public class SetRetainValuesTrueWhenNotSupported extends JDO_Test {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A13.4.2-8 (SetRetainValuesTrueWhenNotSupported) 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(SetRetainValuesTrueWhenNotSupported.class);
+    }
+    
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestSetRetainValuesTrueWhenNotSupported(pm);
+
+        pm.close(); 
+        pm = null;
+    }
+    
+    /** test transactions.setRetainValues() */
+    void runTestSetRetainValuesTrueWhenNotSupported(PersistenceManager pm) {
+        if (isRetainValuesSupported()) {
+            if (debug) logger.debug("RetainValues supported.");
+            return;
+        }
+
+        Transaction tx = pm.currentTransaction();
+        try {
+            tx.setRetainValues(true);
+            fail(ASSERTION_FAILED,
+                 "tx.setRetainValues(true) should throw JDOUnsupportedOptionException, if the implementation does not support retainValues.");
+        }
+        catch (JDOUnsupportedOptionException ex) {
+            // expected excepted
+            if (debug) logger.debug("caught expected exception " + ex);
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetRetainValuesTrueWhenNotSupported.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronization.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronization.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronization.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronization.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,125 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+import javax.transaction.Synchronization;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Synchronization
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.3-1.
+ *<BR>
+ *<B>Assertion Description: </B>
+ A call to Transaction.setSynchronization registers a Synchronization instance with the
+ Transaction for transaction completion notifications. Any Synchronization instance already registered will be replaced.
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/11/01     1.0
+ */
+public class SetSynchronization extends JDO_Test implements Synchronization {
+    
+    private Transaction tx;
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+       "Assertion A13.4.3-1 (SetSynchronization) 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(SetSynchronization.class);
+    }
+    
+    /** */
+    public void beforeCompletion(){
+        try {
+            if (debug) 
+                logger.debug("before Complition isActive returns :" +
+                             tx.isActive());
+        }
+        catch (Exception ex) {
+            fail(ASSERTION_FAILED,
+                 "tx.isActive called in beforeCompletion throws unexpected exception: " + ex);
+        }
+        
+    }
+
+    /** */
+    public void afterCompletion(int status) {
+        try {
+            if (debug) 
+                logger.debug("after Complition isActive returns :" +
+                             tx.isActive());
+        }
+        catch (Exception ex) {
+            fail(ASSERTION_FAILED,
+                 "tx.isActive called in afterCompletion throws unexpected exception: " + ex);
+        }
+    }
+
+    /** */
+    public void test() {
+        pm = getPM();
+        
+        runTestSetSynchronization(pm); 
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /** */ 
+    void runTestSetSynchronization(PersistenceManager pm) {
+        tx = pm.currentTransaction();
+        try {
+            tx.begin();
+            Synchronization orig = tx.getSynchronization();
+            tx.setSynchronization(this);
+            Synchronization current = tx.getSynchronization();
+            if (current == orig) {
+                fail(ASSERTION_FAILED,
+                     "tx.setSynchronization does not replace Synchronization instances registered with the transaction.");
+            }
+            if (current != this) {
+                fail(ASSERTION_FAILED,
+                     "unexpected sxnchronization isntance, expected " + this + ", got " + current);
+            }   
+
+            tx.commit();
+            tx = null;
+        }
+        finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronization.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronizationToNull.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronizationToNull.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronizationToNull.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronizationToNull.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,104 @@
+/*
+ * 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.transactions;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> Set Synchronization To Null
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.3-2.
+ *<BR>
+ *<B>Assertion Description: </B>
+ If the parameter to Transaction.setSynchronization is null, then no instance
+ will be notified. 
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Azita Kamangar   10/11/01     1.0
+ */
+public class SetSynchronizationToNull 
+    extends JDO_Test 
+    implements javax.transaction.Synchronization {
+    
+    /** */
+    private static final String ASSERTION_FAILED = 
+    "Assertion A13.4.3-2 (SetSynchronizationToNull) 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(SetSynchronizationToNull.class);
+    }
+
+    /** */
+    public void beforeCompletion(){
+        fail(ASSERTION_FAILED,
+             "Instance should not be registered, thus this beforeCompletion methgod should not be called.");
+    }
+
+    /** */
+    public void afterCompletion(int status) {
+        fail(ASSERTION_FAILED,
+             "Instance should not be registered, thus this afterCompletion methgod should not be called.");
+    }
+    
+    /** */
+    public void test() {
+        pm = getPM();
+        
+        runTestSetSynchronizationToNull(pm); 
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /** */
+    void runTestSetSynchronizationToNull(PersistenceManager pm) {
+        Transaction tx = pm.currentTransaction();
+        try {
+            tx.begin();
+            tx.setSynchronization(this);
+            tx.setSynchronization(null);
+            if (tx.getSynchronization() != null) {
+                fail(ASSERTION_FAILED,
+                     "tx.setSynchronization(null) should overwrite previous registered synchronization instance.");
+            }
+
+            tx.commit();
+            tx = null;
+        }
+        finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/SetSynchronizationToNull.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/WhenNontransactionalReadIsFalse.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/WhenNontransactionalReadIsFalse.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/WhenNontransactionalReadIsFalse.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/WhenNontransactionalReadIsFalse.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,140 @@
+/*
+ * 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.transactions;
+
+import java.util.Collection;
+import java.util.Date;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.Query;
+import javax.jdo.Transaction;
+import javax.jdo.JDOUserException;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.company.Company;
+import org.apache.jdo.tck.pc.company.Department;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+
+/**
+ *<B>Title:</B> When Nontransactional Read Is False
+ *<BR>
+ *<B>Keywords:</B> transactions
+ *<BR>
+ *<B>Assertion ID:</B> A13.4.2-10.
+ *<BR>
+ *<B>Assertion Description: </B>
+    If this flag is set to false, then queries and field read access
+    (including navigation) outside an active transaction
+    throw a JDOUserException.
+ */
+
+
+/*
+ * Revision History
+ * ================
+ * Author         :     Date   :    Version  
+ * Michelle Caisse   11/11/04     1.0
+ */
+public class WhenNontransactionalReadIsFalse extends JDO_Test {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A13.4.2-10 (WhenNontransactionalReadIsFalse) 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(WhenNontransactionalReadIsFalse.class);
+    }
+
+    /** */
+    public void test() {
+        pm = getPM();
+          
+        runTestWhenNontransactionalReadIsFalse(pm);
+
+        pm.close(); 
+        pm = null;
+    }
+
+    /** test transactions.setNontransactionalReadIsFalse() */
+    public void runTestWhenNontransactionalReadIsFalse(PersistenceManager pm) {
+        Transaction tx = pm.currentTransaction();
+        try {
+            tx.setNontransactionalRead(false);
+            tx.begin();
+            Company c = new Company(1L, "MyCompany", new Date(), null);
+            Department d = new Department(999, "MyDepartment", c);
+            pm.makePersistent(c);
+            pm.makePersistent(d);
+            if (tx.getNontransactionalRead()) {
+                fail(ASSERTION_FAILED,
+                     "tx.getNontransactionalRead before commit returns true after setting the flag to false.");
+            }
+            tx.commit();
+            if (tx.getNontransactionalRead()) {
+                fail(ASSERTION_FAILED,
+                     "tx.getNontransactionalRead after commit returns true after setting the flag to false.");
+            }
+
+            // make sure transaction is not active
+            if (tx.isActive()) {
+                fail(ASSERTION_FAILED,
+                     "transaction still active after tx.commit.");
+            }
+            tx = null;
+
+            try {
+                // read department name
+                String name = d.getName();
+                fail(ASSERTION_FAILED,
+                     "Field read permitted outside an active transaction when NontransactionalRead is false.");
+            } catch (JDOUserException juex) {
+                 if (debug)
+                     logger.debug(" Caught expected JDOUserException " + juex);
+            }
+            try {
+                // navigate from department to company
+                c = d.getCompany();
+                fail(ASSERTION_FAILED,
+                     "Navigation permitted outside an active transaction when NontransactionalRead is false.");
+            } catch (JDOUserException juex) {
+                 if (debug)
+                     logger.debug(" Caught expected JDOUserException " + juex);
+            }
+            try {
+                // run query
+                Query q = pm.newQuery(Department.class);
+                q.setFilter("name == \"MyDepartment\"");
+                Collection result = (Collection)q.execute();
+                fail(ASSERTION_FAILED,
+                     "Query permitted outside an active transaction when NontransactionalRead is false.");
+            } catch (JDOUserException juex) {
+                 if (debug)
+                     logger.debug(" Caught expected JDOUserException " + juex);
+            }
+        }
+        finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+        }
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/transactions/WhenNontransactionalReadIsFalse.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchResultPrinter.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchResultPrinter.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchResultPrinter.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchResultPrinter.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,103 @@
+/*
+ * 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.util;
+
+import java.io.PrintStream;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestResult;
+import junit.textui.ResultPrinter;
+
+/**
+ * Default result printer implementation for running tests in batch mode.
+ * 
+ * @author Michael Bouschen
+ */
+public class BatchResultPrinter
+    extends ResultPrinter
+{
+    /** */
+    public BatchResultPrinter(PrintStream writer) {
+        super(writer);
+    }
+        
+    /** Called in case of a test error. */
+    public void addError(Test test, Throwable t) {
+        getWriter().print("   ERROR");
+    }
+        
+    /** Called in case of a test failure. */ 
+    public void addFailure(Test test, AssertionFailedError t) {
+        getWriter().print("   FAILURE");
+    }
+        
+    /** Called when a test case is finished. */
+    public void endTest(Test test) {
+        getWriter().println();
+    }
+        
+    /** Called when a test case is started. */
+    public void startTest(Test test) {
+        String testName;
+        if (test instanceof TestCase) {
+            testName = getClassBaseName(test) + "." + ((TestCase)test).getName();
+        }
+        else {
+            testName = test.toString();
+        }
+        getWriter().print("RUN " + testName);
+    }
+        
+    /** */
+    protected void printHeader(long runTime) {
+        getWriter().println("Time: "+elapsedTimeAsString(runTime));
+    }
+        
+    /** */
+    protected void printFooter(TestResult result) {
+        if (result.wasSuccessful()) {
+            getWriter().print("OK");
+            getWriter().println (" (" + result.runCount() + " test" + (result.runCount() == 1 ? "": "s") + ")");
+                
+        } else {
+            getWriter().println("FAILURES!!!");
+            getWriter().println("Tests run: "+result.runCount()+ 
+                                ",  Failures: "+result.failureCount()+
+                                ",  Errors: "+result.errorCount());
+        }
+    }
+        
+    // helper method
+        
+    /** 
+     * @return Name of the class of the given object without package prefix
+     */
+    private String getClassBaseName(Object obj) {
+        if (obj == null) return null;
+        String className = obj.getClass().getName();
+        int index = className.lastIndexOf('.');
+        if (index != -1) {
+            className = className.substring(index + 1);
+        }
+        return className;
+    }
+        
+}
+
+

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchResultPrinter.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchTestRunner.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchTestRunner.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchTestRunner.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchTestRunner.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,175 @@
+/*
+ * 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.util;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.io.PrintStream;
+import java.util.Arrays;
+
+import junit.framework.Test;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+import junit.textui.ResultPrinter;
+import junit.textui.TestRunner;
+
+/**
+ * TestRunner class for running a single test or a test suite in batch
+ * mode. The format of the test output is specified by the result printer
+ * class. The main method sets an exit code according to the test result:
+ * <ul>
+ * <li><code>0</code>: success
+ * <li><code>1</code>: failure, the test shows an unexpected behavior
+ * <li><code>2</code>: exception, the test throws an unhandled excption 
+ * </ul>
+ * 
+ * @author Michael Bouschen
+ */
+public class BatchTestRunner
+    extends TestRunner
+{
+    /** Name of the system property to specify the result printer class. */
+    public static final String RESULTPRINTER_PROPERTY = "ResultPrinterClass"; 
+    
+    /** Default of the system property ResultPrinterClass. */
+    public static final String RESULTPRINTER_DEFAULT = BatchResultPrinter.class.getName();
+    
+    /** 
+     * Constructor. 
+     * It creates a result printer instance based on the system property
+     * and delegates to the constructor taking a result printer argument. 
+     */
+    public BatchTestRunner() {
+        super();
+        setPrinter(getResultPrinter());
+    }
+    
+    /**  
+     * Constructor. Uses the specified resultPrinter to format the test result.
+     */
+    public BatchTestRunner(ResultPrinter resultPrinter) {
+        super(resultPrinter);
+    }
+
+    /** Runs all test methods from the specified class. */
+    public static void run(Class clazz) {
+        run(new TestSuite(clazz));
+    }
+    
+    /** Runs the specified test. */
+    public static TestResult run(Test test) {
+        return new BatchTestRunner().doRun(test);
+    }
+
+    /** Runs the specified test and waits until the user types RETURN. */
+    public static void runAndWait(Test suite) {
+        new BatchTestRunner().doRun(suite, true);
+    }
+
+    /** 
+     * Runs in batch mode and sets an exit code. If the specified String
+     * array includes a single fully qualified class name, this test class
+     * is executed. If it is empty it runs the TestListSuite.
+     */
+    public static void main(String args[]) {
+        try {
+            TestResult r = new BatchTestRunner().start(args);
+            if (!r.wasSuccessful()) 
+                System.exit(FAILURE_EXIT);
+            System.exit(SUCCESS_EXIT);
+        } catch(Exception e) {
+            System.err.println(e.getMessage());
+            System.exit(EXCEPTION_EXIT);
+        }
+    }
+
+    /** */
+    public TestResult start(String[] args) {
+        Test suite = null;
+        if ((args == null) || args.length == 0) {
+            suite = getTest(TestListSuite.class.getName());
+        }
+        else if (args.length == 1) {
+            suite = getTest(args[0]);
+        }
+        else {
+            suite = new TestListSuite("JDO TCK", Arrays.asList(args));
+        }
+        return doRun(suite);
+    }
+
+    /** 
+     * Returns a result printer instance. The system property
+     * ResultPrinterClass specifies the class of the returned instanec. The
+     * class must extend junit.textui.ResultPrinter.
+     */
+    protected ResultPrinter getResultPrinter() {
+        String className =  System.getProperty(RESULTPRINTER_PROPERTY);
+        if (className != null) {
+            className = className.trim();
+            if (className.length() != 0) {
+                String msg = null;
+                try {
+                    // get class instance
+                    Class clazz = Class.forName(className);
+                    // constructor taking PrintStream arg
+                    Constructor ctor = clazz.getConstructor(
+                        new Class[] { PrintStream.class } );
+                    // create instance
+                    return (ResultPrinter)ctor.newInstance(
+                        new Object[] { System.out });
+                }
+                catch (ClassNotFoundException ex) {
+                    // specified ResultPrinter class not 
+                    msg = "Cannot find specified result printer class " + 
+                        className + ".";
+                }
+                catch (NoSuchMethodException ex) {
+                    msg = "Class " + className + 
+                        " does not provide constructor taking a PrintStream.";
+                }
+                catch (InstantiationException ex) {
+                    msg = "Class " + className + " is abstract.";
+                }
+                catch (IllegalAccessException ex) {
+                    msg = "Constructor taking a PrintStream of class " + 
+                        className + " is not accessible.";
+                }
+                catch (InvocationTargetException ex) {
+                    msg = "Constructor call results in exception " + ex + ".";
+                }
+
+                // ResultPrinter class specified, but not avaiable
+                System.out.println(msg);
+                ResultPrinter printer = getDefaultResultPrinter();
+                System.out.println("Using default result printer of class " + 
+                                   printer.getClass().getName());
+            }
+        }
+        
+        // ResultPrinter class not specified => use default
+        return getDefaultResultPrinter();
+    }
+
+    /** 
+     * Returns an instance of the default result printer class
+     * BatchResultPrinter.
+     */
+    protected ResultPrinter getDefaultResultPrinter() {
+        return new BatchResultPrinter(System.out);
+    }
+}

Propchange: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/BatchTestRunner.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ClassGenerator.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ClassGenerator.java?view=auto&rev=160090
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ClassGenerator.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ClassGenerator.java Mon Apr  4 12:41:23 2005
@@ -0,0 +1,916 @@
+/*
+ * 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.
+ */
+ 
+
+//Title:        Your Product Name
+//Version:
+//Copyright:    Copyright (c) 1998
+//Author:
+//Company:      Your Company
+//Description:  Your description
+
+
+package org.apache.jdo.tck.util;
+
+import java.io.*;
+
+public class ClassGenerator {
+  private final String [] fieldTypes       = {"boolean", "byte", "short", "int", "long",
+                                              "char", "float", "double",
+                                              "Boolean", "Character", "Byte", "Short", "Integer",
+                                              "Long", "Float", "Double", "String",
+                                              "Locale", "Date", "BigDecimal", "BigInteger",
+                                              "Object", "SimpleClass", "SimpleInterface"
+                                              };
+  //includes a place holder for default package access
+  private final String [] accessSpecifiers = {"private ", "public ", "protected ", "" };
+
+  private final String [] fieldModifiers   = {"", "static ", "transient ", "final ", "volatile ",
+                                              "static transient ", "static final ", "static volatile ",
+                                              "transient final ", "transient volatile ",
+                                              "static transient final ", "static transient volatile " };
+
+  private final String [] xmlPersistenceModifiers = {"", "persistence-modifier=\"none\"",
+                                                      "persistence-modifier=\"persistent\"",
+                                                      "persistence-modifier=\"transactional\""};
+
+  private final String [] xmlEmbeddedModifiers    = {"", "embedded=\"true\"", "embedded=\"false\""};
+
+  private final String [] collectionTypes    = {"Collection", "Map", "Set", "List",
+                                               "HashSet", "ArrayList", "HashMap", "Hashtable",
+                                               "LinkedList", "TreeMap", "TreeSet", "Vector", "Array"};
+
+  //Note: Any updates to elementtypes should include an update to elementsWithPackageInfo
+  private final String [] elementTypes    = {"Object", "SimpleClass", "SimpleInterface", "String",
+                                            "Date", "Locale", "BigDecimal", "BigInteger",
+                                            "Byte", "Double", "Float", "Integer", "Long",
+                                            "Short"};
+
+  private final String [] elementsWithPackageInfo = {"java.lang.Object",
+                                                    "org.apache.jdo.tck.pc.fieldtypes.SimpleClass",
+                                                    "org.apache.jdo.tck.pc.fieldtypes.SimpleInterface",
+                                                    "java.lang.String", "java.util.Date",
+                                                    "java.util.Locale", "java.math.BigDecimal",
+                                                    "java.math.BigInteger", "java.lang.Byte",
+                                                    "java.lang.Double", "java.lang.Float",
+                                                    "java.lang.Integer","java.lang.Long",
+                                                    "java.lang.Short"};
+
+  private StringBuffer fieldSpecs = new StringBuffer(2000);
+  private StringBuffer isPersistent = new StringBuffer(200);
+  private StringBuffer isStatic   = new StringBuffer(200);
+  private StringBuffer isFinalArray = new StringBuffer(2000);
+      
+  // can accomodate only 4000 fields, have to increase the capacity if the fields exceed 4000
+  private static boolean [] isFinal = new boolean[4000];
+
+  void generate() throws Exception
+  {
+    final String twoSpaces = "  ";
+    final String space = " ";
+
+    for (int i=0; i < fieldTypes.length; i++)
+    {
+      String classFile = (isPrimitive(fieldTypes[i]) ? "FieldsOfPrimitive" : "FieldsOf") + fieldTypes[i];
+
+      FileOutputStream xmlFout = new FileOutputStream(classFile + ".jdo.n");
+      PrintWriter xmlPw = new PrintWriter(xmlFout);
+      FileOutputStream xmlFout1 = new FileOutputStream(classFile + ".jdo.a");
+      PrintWriter xmlPw1 = new PrintWriter(xmlFout1);
+      FileOutputStream xmlFout2 = new FileOutputStream(classFile + ".jdo.d");
+      PrintWriter xmlPw2 = new PrintWriter(xmlFout2);
+      startXmlMetaData(xmlPw);
+      startXmlMetaData(xmlPw1);
+      startXmlMetaData(xmlPw2);
+
+      startXmlClass(xmlPw,  classFile, 0);
+      startXmlClass(xmlPw1, classFile, 1);
+      startXmlClass(xmlPw2, classFile, 2);
+
+      FileOutputStream fout = new FileOutputStream(classFile + ".java");
+      PrintWriter pw = new PrintWriter(fout);
+      startClass(pw, classFile);
+      int fieldCounter = 0;
+      for(int j=0; j < accessSpecifiers.length; j++)
+      {
+        for (int k=0; k < fieldModifiers.length; k++)
+        {
+          for(int l = 0; l < xmlPersistenceModifiers.length; l++)
+          {
+             // do not generate persistence modifiers (persistent or transactional or none)
+             // for fields that cannot be persisted
+
+
+         if( (fieldModifiers[k].indexOf("static") >= 0 || fieldModifiers[k].indexOf("final") >= 0 ) &&
+            !xmlPersistenceModifiers[l].equals(""))
+                continue;                
+             
+/*        original code
+         if(!isPersistenceCapable(fieldModifiers[k])
+                  && !xmlPersistenceModifiers[l].equals(""))
+                continue;
+*/
+             for(int m=0; m < xmlEmbeddedModifiers.length; m++) {
+                 // generate persistence modifiers (persistent or transactional or none)
+                 // only for fields that can be persisted
+                 // generate embedded modifiers only for persistent fields
+                 
+                 boolean fieldIsPersistent = !( fieldModifiers[k].indexOf("static") >= 0 ||
+                                                fieldModifiers[k].indexOf("final")  >= 0 ||
+                                                xmlPersistenceModifiers[l].indexOf("none") >= 0 ||
+                                                xmlPersistenceModifiers[l].indexOf("transactional") >= 0 ||
+                                                (fieldModifiers[k].indexOf("transient") >= 0 && xmlPersistenceModifiers[l].indexOf("persistent") == -1)
+                                              ); 
+                                                
+                 if(!xmlEmbeddedModifiers[m].equals("") && !fieldIsPersistent )
+                  continue;
+
+                 StringBuffer sb = new StringBuffer();
+                 sb.append(twoSpaces);
+                 sb.append(accessSpecifiers[j]);
+                 sb.append(fieldModifiers[k]);
+                 sb.append(fieldTypes[i]);
+                 sb.append(space);
+                 String fieldName = (fieldTypes[i] + fieldCounter++);
+//temporary fix to get around the bug in the enhancer code
+if(!(xmlEmbeddedModifiers[m].equals("") &&  xmlPersistenceModifiers[l].equals("")))
+{
+                 printXmlField(xmlPw, "name=\"" + fieldName + "\" "
+                               + xmlPersistenceModifiers[l]+ " "
+                               + xmlEmbeddedModifiers[m]);
+                 printXmlField(xmlPw1, "name=\"" + fieldName + "\" "
+                               + xmlPersistenceModifiers[l]+ " "
+                               + xmlEmbeddedModifiers[m]);
+                 printXmlField(xmlPw2, "name=\"" + fieldName + "\" "
+                               + xmlPersistenceModifiers[l]+ " "
+                               + xmlEmbeddedModifiers[m]);
+}//end temporary fix
+                 sb.append(fieldName);
+                 buildisPersistentArray(fieldIsPersistent); // add to isPersistentArray
+                 buildisStaticArray(isStatic(fieldModifiers[k])); // add to isStaticArray
+                 buildFieldSpecs(xmlPersistenceModifiers[l].replace('"',' ') + " " +
+                                 xmlEmbeddedModifiers[m].replace('"',' ') +
+                                 sb.toString()); // add to the field specs array
+                 isFinal[fieldCounter-1] = fieldModifiers[k].indexOf("final") >= 0;
+                 if(isFinal[fieldCounter-1])
+                   sb.append(getInitializerForFinalTypes(fieldTypes[i]));
+                 buildisFinalArray(isFinal[fieldCounter-1]);
+                 sb.append(";");
+                 pw.println(sb.toString());
+             }
+           }
+         }
+       }
+       writeisPersistentArray(pw);
+       writeisStaticArray(pw);
+       writeisFinalArray(pw);
+       writeFieldSpecs(pw);
+       writeMethodGetLength(pw);
+       writeMethodGet(pw, fieldTypes[i], fieldCounter);
+       writeMethodSet(pw, fieldTypes[i], fieldCounter);
+       endClass(pw);
+       pw.close();
+       fout.close();
+
+       endXmlClass(xmlPw);
+       endXmlClass(xmlPw1);
+       endXmlClass(xmlPw2);
+       endXmlMetaDeta(xmlPw);
+       endXmlMetaDeta(xmlPw1);
+       endXmlMetaDeta(xmlPw2);
+       xmlPw.close();
+       xmlFout.close();
+       xmlPw1.close();
+       xmlFout1.close();
+       xmlPw2.close();
+       xmlFout2.close();
+     }
+ }
+
+
+  private void startClass(PrintWriter pw, String className)
+  {
+    pw.println("package org.apache.jdo.tck.pc.fieldtypes;");
+    pw.println("");
+    pw.println(getImportStatements(className));
+    pw.println("public class " + className + " { " );
+    pw.println("  public int identifier;");
+  }
+
+  private void endClass(PrintWriter pw)
+  {
+    pw.println("");
+    pw.println("}");
+  }
+
+  private void startXmlMetaData(PrintWriter pw)
+  {
+    pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+    pw.println("<!DOCTYPE jdo SYSTEM \"jdo.dtd\">");
+    pw.println("<jdo>");
+    pw.println("<package name=\"org.apache.jdo.tck.pc.fieldtypes\">");
+  }
+
+  private void endXmlMetaDeta(PrintWriter pw)
+  {
+    pw.println("</package>");
+    pw.println("</jdo>");
+  }
+
+  private void startXmlClass(PrintWriter pw, String className, int type)
+  {
+    switch(type)
+    {
+      case(0):
+        pw.println("<class name=\"" + className + "\">");
+        break;
+      case(1):
+        pw.println("<class name=\"" + className + "\" identity-type=\"application\">");
+        break;
+      case(2):
+        pw.println("<class name=\"" + className + "\" identity-type=\"datastore\">");
+        break;
+      default:
+        System.out.println("Unsupported Type");
+    }
+  }
+
+  private void endXmlClass(PrintWriter pw)
+  {
+    pw.println("</class>");
+  }
+
+  // need to check if we should support extents
+  // fieldName includes modifiers
+  private void printXmlField(PrintWriter pw, String fieldName)
+  {
+    pw.println("<field " + fieldName  + ">");
+    pw.println("</field>");
+  }
+
+  // fieldname does not include any modifiers.
+  // element type includes package informaiton.
+  private void printXmlCollectionFieldWithEmbeddedElement(PrintWriter pw, String fieldName,
+                                                          String elementType, String embeddedValue)
+  {
+    pw.println("<field name=\"" + fieldName + "\" " + ">");
+    pw.print("<collection element-type=" + "\"" + elementType + "\"");
+    if(!embeddedValue.equals(""))
+      pw.print(" embedded-element=" + "\"" + embeddedValue + "\"");
+    pw.println(">");
+    pw.println("</collection>");
+    pw.println("</field>");
+  }
+
+  private void printXmlArrayFieldWithEmbeddedElement(PrintWriter pw, String fieldName,
+                                                     String embeddedValue)
+  {
+    pw.println("<field name=\"" + fieldName + "\" " + ">");
+    pw.println("<array embedded-element=" +  "\"" + embeddedValue + "\"" + ">");
+    pw.println("</array>");
+    pw.println("</field>");
+  }
+
+  private void printXmlMapField(PrintWriter pw, String fieldName, String keyType,
+                                String embeddedKey, String valueType, String embeddedValue)
+  {
+    pw.println("<field name=\"" + fieldName + "\" " + ">");
+    pw.print("<map ");
+    if(!keyType.equals(""))
+      pw.print(" key-type=" + "\"" + keyType + "\"");
+    if(!embeddedKey.equals(""))
+      pw.print(" embedded-key=" + "\"" + embeddedKey + "\"");
+    if(!valueType.equals(""))
+      pw.print(" value-type=" + "\"" + valueType + "\"");
+    if(!embeddedValue.equals(""))
+      pw.print(" embedded-value=" + "\"" + embeddedValue + "\"");
+    pw.println(">");
+    pw.println("</map>");
+    pw.println("</field>");
+  }
+
+  private String getInitializerForFinalTypes(String fieldType) throws Exception
+  {
+    if (fieldType.equals("char"))
+      return " = 'a'"; //primitive character, return 'a';
+    else if (fieldType.equals("boolean"))
+      return " = false"; //primitive boolean, return 'a';
+    else if (Character.isLowerCase(fieldType.charAt(0)))
+      return " = 5"; // return 0 for all other primitive types
+    else if (fieldType.equals("Byte"))
+      return " = new Byte((byte)5)";
+    else if (fieldType.equals("Boolean"))
+      return " = new Boolean(false)";
+    else if (fieldType.equals("Character"))
+      return " = new Character('a')";
+    else if (fieldType.equals("Short"))
+      return " = new Short((short)5)";
+    else if (fieldType.equals("Integer"))
+      return " = new Integer((int)5)";
+    else if (fieldType.equals("Long"))
+      return " = new Long((long)5)";
+    else if (fieldType.equals("Float"))
+      return " = new Float((float)5)";
+    else if (fieldType.equals("Double"))
+      return " = new Double((double)5)";
+    else if (fieldType.equals("String"))
+      return " = new String(\"JDO TCK\")";
+    else if (fieldType.equals("Locale"))
+      return " = Locale.US";
+    else if (fieldType.equals("BigDecimal"))
+      return " = new BigDecimal(100.15)";
+    else if (fieldType.equals("BigInteger"))
+      return " = new BigInteger(\"100\")";
+    else if (fieldType.equals("Collection"))
+      return " = new HashSet()";
+    else if (fieldType.equals("Set"))
+      return " = new HashSet()";
+    else if (fieldType.equals("HashSet"))
+      return " = new HashSet()";
+   else if (fieldType.equals("Object"))
+      return " = new Object()";
+    else if (fieldType.equals("SimpleClass"))
+      return " = new SimpleClass()";
+    else if (fieldType.equals("SimpleInterface"))
+      return " = new SimpleClass()";
+    else if (fieldType.equals("Date"))
+      return " = new Date()";
+    else
+      throw new Exception("Unsupported FieldType " + fieldType);
+  }
+
+  private String getImportStatements(String fieldType)
+  {
+    if (fieldType.equals("FieldsOfLocale"))
+      return "import java.util.*;";
+    if (fieldType.equals("FieldsOfDate"))
+      return "import java.util.*;";
+    else if (fieldType.equals("FieldsOfBigDecimal"))
+      return "import java.math.*;";
+    else if (fieldType.equals("FieldsOfBigInteger"))
+      return "import java.math.*;";
+    else if (fieldType.equals("FieldsOfCollection"))
+      return "import java.util.*;";
+    else if (fieldType.equals("FieldsOfSet"))
+      return "import java.util.*;";
+    else if (fieldType.equals("FieldsOfHashSet"))
+      return "import java.util.*;";
+    else if (fieldType.indexOf("Collections") >=0)
+      return "import java.util.*;\r\nimport java.math.*;";
+    else
+      return "";
+  }
+
+  private boolean isPrimitive(String fieldType)
+  {
+     if (Character.isUpperCase(fieldType.charAt(0)))
+      return false;
+     else
+      return true;
+  }
+
+  private boolean isPersistenceCapable(String fieldModifier)
+  {
+     if (fieldModifier.indexOf("static") >= 0
+         || fieldModifier.indexOf("final") >= 0
+         || fieldModifier.indexOf("transient") >= 0)
+       return false;
+     else
+       return true;
+  }
+
+ private boolean isStatic(String fieldModifier)
+  {
+     if (fieldModifier.indexOf("static") >= 0)
+       return true;
+     else
+       return false;
+  }
+  private boolean isFinal(String fieldModifier)
+  {
+      return fieldModifier.indexOf("final") >= 0;
+  }
+  private void buildisPersistentArray(boolean value)
+  {
+    if(isPersistent.length() != 0)
+      isPersistent.append(",");
+    if(value)
+      isPersistent.append("true");
+    else
+      isPersistent.append("false");
+  }
+
+  private void buildisStaticArray(boolean value)
+  {
+    if(isStatic.length() != 0)
+      isStatic.append(",");
+    if(value)
+      isStatic.append("true");
+    else
+      isStatic.append("false");
+  }
+
+  private void buildisFinalArray(boolean value)
+  {
+    if(isFinalArray.length() != 0)
+      isFinalArray.append(",");
+    if(value)
+      isFinalArray.append("true");
+    else
+      isFinalArray.append("false");
+  }
+
+
+  private void writeisPersistentArray(PrintWriter pw)
+  {
+     // have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
+     // 1024 characters
+     char [] charArray = new char[isPersistent.length()];
+     isPersistent.getChars(0,isPersistent.length(),charArray,0);
+     pw.println("");
+     pw.println("public static final boolean [] isPersistent = { ");
+
+     int fieldCounter=0;
+     for(int i = 0; i < charArray.length; i++)
+     {
+        pw.print(charArray[i]);
+        if(charArray[i] == ',')
+        {
+          fieldCounter++;
+          if(fieldCounter == 10)
+          {
+            pw.println("");
+            pw.flush();
+            fieldCounter = 0;
+          }
+        }
+     }
+     pw.println("");
+     pw.println(" };");
+     isPersistent = new StringBuffer(2000);
+   }
+
+
+  private void writeisStaticArray(PrintWriter pw)
+  {
+     // have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
+     // 1024 characters
+     char [] charArray = new char[isStatic.length()];
+     isStatic.getChars(0,isStatic.length(),charArray,0);
+     pw.println("");
+     pw.println("public static final boolean [] isStatic = { ");
+
+     int fieldCounter=0;
+     for(int i = 0; i < charArray.length; i++)
+     {
+        pw.print(charArray[i]);
+        if(charArray[i] == ',')
+        {
+          fieldCounter++;
+          if(fieldCounter == 10)
+          {
+            pw.println("");
+            pw.flush();
+            fieldCounter = 0;
+          }
+        }
+     }
+     pw.println("");
+     pw.println(" };");
+     isStatic = new StringBuffer(2000);
+   }
+  private void writeisFinalArray(PrintWriter pw)
+  {
+     // have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
+     // 1024 characters
+     char [] charArray = new char[isFinalArray.length()];
+     isFinalArray.getChars(0,isFinalArray.length(),charArray,0);
+     pw.println("");
+     pw.println("public static final boolean [] isFinal = { ");
+
+     int fieldCounter=0;
+     for(int i = 0; i < charArray.length; i++)
+     {
+        pw.print(charArray[i]);
+        if(charArray[i] == ',')
+        {
+          fieldCounter++;
+          if(fieldCounter == 10)
+          {
+            pw.println("");
+            pw.flush();
+            fieldCounter = 0;
+          }
+        }
+     }
+     pw.println("");
+     pw.println(" };");
+     isFinalArray = new StringBuffer(2000);
+   }
+
+  private void buildFieldSpecs(String field)
+  {
+    if(fieldSpecs.length() != 0)
+      fieldSpecs.append(",");
+
+    fieldSpecs.append("\"");
+    fieldSpecs.append(field.trim());
+    fieldSpecs.append("\"");
+  }
+
+
+  private void writeFieldSpecs(PrintWriter pw)
+  {
+    // have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
+    // 1024 characters
+    char [] charArray = new char[fieldSpecs.length()];
+    fieldSpecs.getChars(0,fieldSpecs.length(),charArray,0);
+    pw.println("");
+    pw.println("  public static final String [] fieldSpecs = { ");
+
+    pw.print("  ");
+    for(int i = 0; i < charArray.length; i++)
+    {
+       pw.print(charArray[i]);
+       if(charArray[i] == ',')
+       {
+         pw.println("");
+         pw.print("  ");
+         pw.flush();
+       }
+    }
+    pw.println("");
+    pw.println("  };");
+    fieldSpecs = new StringBuffer(2000);
+  }
+
+  private void writeMethodGetLength(PrintWriter pw)
+  {
+     pw.println("  public int getLength()");
+     pw.println("  {");
+     pw.println("    return fieldSpecs.length;");
+     pw.println("  }");
+  }
+
+  private void writeMethodGet(PrintWriter pw, String fieldType, int numberOfFields)
+  {
+     pw.println("  public " +fieldType+ " get(int index)");
+     pw.println("  {");
+
+     pw.println("    switch (index)");
+     pw.println("    {");
+     for(int i = 0; i < numberOfFields; i++)
+     {
+       pw.println("      case(" + i + "):");
+       pw.println("        return " + fieldType + i +";");
+     }
+     pw.println("      default:");
+     pw.println("        throw new IndexOutOfBoundsException();");
+     pw.println("    }");
+     pw.println("  }");
+  }
+
+  private void writeMethodGet(PrintWriter pw, String fieldType, String[] fieldNames, int numFields)
+  {
+     pw.println("  public " +fieldType+ " get(int index)");
+     pw.println("  {");
+
+     pw.println("    switch (index)");
+     pw.println("    {");
+     for(int i = 0; i < numFields; i++)
+     {
+       pw.println("      case(" + i + "):");
+       pw.println("        return " + fieldNames[i] +";");
+     }
+     pw.println("      default:");
+     pw.println("        throw new IndexOutOfBoundsException();");
+     pw.println("    }");
+     pw.println("  }");
+  }
+  private void writeMethodSet(PrintWriter pw, String fieldType, int numberOfFields)
+  {
+     pw.println("  public boolean set(int index," + fieldType + " value"+ ")");
+     pw.println("  {");
+     pw.println("    if(fieldSpecs[index].indexOf(\"final\") != -1)");
+     pw.println("      return false;");
+
+     pw.println("    switch (index)");
+     pw.println("    {");
+     for(int i = 0; i < numberOfFields; i++)
+     {
+       if(!isFinal[i])
+       {
+         pw.println("      case(" + i + "):");
+         pw.println("        " + fieldType + i + "= value" + ";");
+         pw.println("         break;" );
+       }
+     }
+     pw.println("      default:");
+     pw.println("        throw new IndexOutOfBoundsException();");
+     pw.println("    }");
+     pw.println("    return true;");
+     pw.println("  }");
+  }
+
+  private void writeMethodSet(PrintWriter pw, String fieldType, String [] fieldNames, int numFields)
+  {
+     pw.println("  public boolean set(int index," + fieldType + " value"+ ")");
+     pw.println("  {");
+     pw.println("    if(fieldSpecs[index].indexOf(\"final\") != -1)");
+     pw.println("      return false;");
+
+     pw.println("    switch (index)");
+     pw.println("    {");
+     for(int i = 0; i < numFields; i++)
+     {
+//       if(!isFinal[i]) {
+         pw.println("      case(" + i + "):");
+         pw.println("        " + fieldNames[i] + "= value" + ";");
+         pw.println("         break;" );
+//       }
+     }
+     pw.println("      default:");
+     pw.println("        throw new IndexOutOfBoundsException();");
+     pw.println("    }");
+     pw.println("    return true;");
+     pw.println("  }");
+  }
+
+
+  private void writeMethodSetForArray(PrintWriter pw, String fieldType, String [] fieldNames, int numFields)
+  {
+     pw.println("  public boolean set(int index," + fieldType + " value"+ ")");
+     pw.println("  {");
+     pw.println("    if(fieldSpecs[index].indexOf(\"final\") != -1)");
+     pw.println("      return false;");
+
+     pw.println("    switch (index)");
+     pw.println("    {");
+     for(int i = 0; i < numFields; i++)
+     {
+//       if(!isFinal[i]) {
+         String fieldName = fieldNames[i];
+         String valueType;
+         pw.println("      case(" + i + "):");
+         int indexOfValueType = fieldName.indexOf("Of") + 2;
+         String valueTypeWithNumber = fieldName.substring(indexOfValueType);
+         int lastIndexOfValueType = 0;
+         for (int j=valueTypeWithNumber.length() -1; j>=0; j--)
+         {
+           if (Character.isDigit(valueTypeWithNumber.charAt(j)))
+           {
+             continue;
+           }else {
+            lastIndexOfValueType = j;
+            break;
+           }
+         }
+         valueType =  valueTypeWithNumber.substring(0, lastIndexOfValueType+1);
+         pw.println("        " + fieldNames[i] + "= (" +valueType + " []) value ;");
+         pw.println("         break;" );
+//       }
+     }
+     pw.println("      default:");
+     pw.println("        throw new IndexOutOfBoundsException();");
+     pw.println("    }");
+     pw.println("    return true;");
+     pw.println("  }");
+  }
+
+  // generates Collection files for the different collectionTypes
+  // also, updates the corresponding xml files
+  // called by generate, after it is done dealing with the generic field types
+  void generateCollections() throws Exception
+  {
+    final String [] embeddedElements = {"", "true", "false"};
+    final String [] embeddedElementsForFieldSpec = {"", "embedded-element=true", "embedded-element=false"};
+    for(int i=0; i < collectionTypes.length; i++)
+    {
+          // Map has a lot of combinations, generate it separately
+      if(collectionTypes[i].indexOf("Map") >= 0 || collectionTypes[i].equals("Hashtable"))
+      {
+        generateMapCollection(collectionTypes[i]);
+      }
+      else // Array and the other collections
+      {
+        String classFile = collectionTypes[i] + "Collections";
+        FileOutputStream fout = new FileOutputStream(classFile + ".java");
+        PrintWriter pw = new PrintWriter(fout);
+        FileOutputStream xmlFout = new FileOutputStream(classFile + ".jdo.n");
+        PrintWriter xmlPw = new PrintWriter(xmlFout);
+        FileOutputStream xmlFout1 = new FileOutputStream(classFile + ".jdo.a");
+        PrintWriter xmlPw1 = new PrintWriter(xmlFout1);
+        FileOutputStream xmlFout2 = new FileOutputStream(classFile + ".jdo.d");
+        PrintWriter xmlPw2 = new PrintWriter(xmlFout2);
+
+        startClass(pw, classFile);
+        startXmlMetaData(xmlPw);
+        startXmlMetaData(xmlPw1);
+        startXmlMetaData(xmlPw2);
+
+        startXmlClass(xmlPw,  classFile, 0);
+        startXmlClass(xmlPw1, classFile, 1);
+        startXmlClass(xmlPw2, classFile, 2);
+
+        int fieldCounter=0;
+        String fieldNames [] = new String [elementTypes.length * embeddedElements.length];
+        for(int j=0; j < elementTypes.length; j++)
+        {
+            if( elementTypes[j].equals("Locale") && collectionTypes[i].equals("TreeSet") )
+                continue;
+          for(int k=0; k < embeddedElements.length; k++)
+          {
+            if(collectionTypes[i].equals("Array"))
+            {
+              if(!embeddedElements[k].equals(""))
+              {
+                fieldNames[fieldCounter] = collectionTypes[i] + "Of" + elementTypes[j] + fieldCounter;
+//                pw.println("  public " + "Object [] "+ fieldNames[fieldCounter] +";");
+                pw.println("  public " + elementTypes[j] +" [] " + fieldNames[fieldCounter] +";");
+                printXmlArrayFieldWithEmbeddedElement(xmlPw,  fieldNames[fieldCounter], embeddedElements[k]);
+                printXmlArrayFieldWithEmbeddedElement(xmlPw1, fieldNames[fieldCounter], embeddedElements[k]);
+                printXmlArrayFieldWithEmbeddedElement(xmlPw2, fieldNames[fieldCounter], embeddedElements[k]);
+                buildFieldSpecs(embeddedElementsForFieldSpec[k] + " " +
+                                "public " + elementTypes[j] +" [] " + fieldNames[fieldCounter]); // add to the field specs array*/
+
+                fieldCounter++;
+              }
+            }
+            else // Collection
+            {
+              fieldNames[fieldCounter] = collectionTypes[i] + "Of" + elementTypes[j] + fieldCounter;
+              pw.println("  public " + collectionTypes[i] +" "+ fieldNames[fieldCounter] +";");
+              printXmlCollectionFieldWithEmbeddedElement(xmlPw, fieldNames[fieldCounter], elementsWithPackageInfo[j],
+                                                         embeddedElements[k]);
+              printXmlCollectionFieldWithEmbeddedElement(xmlPw1, fieldNames[fieldCounter], elementsWithPackageInfo[j],
+                                                         embeddedElements[k]);
+              printXmlCollectionFieldWithEmbeddedElement(xmlPw2, fieldNames[fieldCounter], elementsWithPackageInfo[j],
+                                                         embeddedElements[k]);
+              buildFieldSpecs(embeddedElementsForFieldSpec[k] + " " +
+                              "public " + collectionTypes[i] +" "+ fieldNames[fieldCounter]); // add to the field specs array*/
+              fieldCounter++;
+
+            }
+          }
+        }
+        writeFieldSpecs(pw);
+        writeMethodGetLength(pw);
+        writeMethodGet(pw, collectionTypes[i].equals("Array")? "Object [] " : collectionTypes[i], fieldNames, fieldCounter);
+        if(collectionTypes[i].equals("Array"))
+          writeMethodSetForArray(pw, "Object [] ", fieldNames, fieldCounter);
+        else
+         writeMethodSet(pw, collectionTypes[i], fieldNames, fieldCounter);
+
+        endClass(pw);
+        pw.close();
+        fout.close();
+        endXmlClass(xmlPw);
+        endXmlClass(xmlPw1);
+        endXmlClass(xmlPw2);
+        endXmlMetaDeta(xmlPw);
+        endXmlMetaDeta(xmlPw1);
+        endXmlMetaDeta(xmlPw2);
+        xmlPw.close();
+        xmlFout.close();
+        xmlPw1.close();
+        xmlFout1.close();
+        xmlPw2.close();
+        xmlFout2.close();
+      }
+    }
+  }
+
+  private void generateMapCollection(String mapName) throws Exception
+  {
+    final String [] keyTypes1 = {"String"};
+    final String [] valueTypes1 = {"Object", "SimpleClass", "SimpleInterface", "String",
+                                "Date", "Locale", "BigDecimal", "BigInteger",
+                                "Byte", "Double", "Float", "Integer", "Long",
+                                "Short"};
+    final String [] keyTypes2 = {"Object", "SimpleClass", "SimpleInterface", "String",
+                                "Date", "BigDecimal", "BigInteger",
+                                "Byte", "Double", "Float", "Integer", "Long",
+                                "Short"};
+    final String [] valueTypes2 = {"String"};
+
+    final String [][] keyTypes = {keyTypes1, keyTypes2};
+    final String [][] valueTypes = {valueTypes1, valueTypes2};
+
+    String [] classNameArray =   {mapName + "StringKey" + "Collections",
+                                  mapName + "StringValue" + "Collections"};
+
+    for(int i=0; i < classNameArray.length; i++)
+    {
+      String classFile = classNameArray[i];
+      FileOutputStream fout = new FileOutputStream(classFile + ".java");
+      PrintWriter pw = new PrintWriter(fout);
+      FileOutputStream xmlFout = new FileOutputStream(classFile + ".jdo.n");
+      PrintWriter xmlPw = new PrintWriter(xmlFout);
+      FileOutputStream xmlFout1 = new FileOutputStream(classFile + ".jdo.a");
+      PrintWriter xmlPw1 = new PrintWriter(xmlFout1);
+      FileOutputStream xmlFout2 = new FileOutputStream(classFile + ".jdo.d");
+      PrintWriter xmlPw2 = new PrintWriter(xmlFout2);
+
+      startClass(pw, classFile);
+      startXmlMetaData(xmlPw);
+      startXmlMetaData(xmlPw1);
+      startXmlMetaData(xmlPw2);
+
+      startXmlClass(xmlPw,  classFile, 0);
+      startXmlClass(xmlPw1, classFile, 1);
+      startXmlClass(xmlPw2, classFile, 2);
+
+      fillMapCollection(keyTypes[i], valueTypes[i],mapName, pw, xmlPw, xmlPw1, xmlPw2);
+
+      endClass(pw);
+      pw.close();
+      fout.close();
+      endXmlClass(xmlPw);
+      endXmlClass(xmlPw1);
+      endXmlClass(xmlPw2);
+      endXmlMetaDeta(xmlPw);
+      endXmlMetaDeta(xmlPw1);
+      endXmlMetaDeta(xmlPw2);
+      xmlPw.close();
+      xmlFout.close();
+      xmlPw1.close();
+      xmlFout1.close();
+      xmlPw2.close();
+      xmlFout2.close();
+    }
+  }
+
+  private void fillMapCollection(String [] keyTypes, String [] valueTypes,
+                                 String mapName, PrintWriter pw, PrintWriter xmlPw,
+                                 PrintWriter xmlPw1, PrintWriter xmlPw2)
+  {
+    final String [] embeddedKeys = {"", "true", "false"};
+    final String [] embeddedValues = embeddedKeys;
+    final String [] embeddedKeyForFieldSpec = {"", "embedded-key=true", "embedded-key=false"};
+    final String [] embeddedValueForFieldSpec = {"", "embedded-value=true", "embedded-value=false"};
+
+    int fieldCounter=0;
+    String fieldNames [] = new String [keyTypes.length * embeddedKeys.length
+                                       * valueTypes.length * embeddedValues.length];
+    for(int i = 0; i < keyTypes.length; i++)
+    {
+      for(int j = 0; j < embeddedKeys.length; j++)
+      {
+        for(int k = 0; k < valueTypes.length; k++)
+        {
+          for(int l = 0; l < embeddedValues.length; l++)
+          {
+            if( keyTypes[i].equals("") && embeddedKeys[j].equals("")
+              && valueTypes[k].equals("") && embeddedValues[l].equals(""))
+              continue;
+            fieldNames[fieldCounter] = mapName+ "Of" + keyTypes[i] +"_"+valueTypes[k] + fieldCounter;
+            pw.println("  public " + mapName +" " + fieldNames[fieldCounter] +";");
+            printXmlMapField(xmlPw, fieldNames[fieldCounter], keyTypes[i], embeddedKeys[j],
+                             valueTypes[k], embeddedValues[l]);
+            printXmlMapField(xmlPw1, fieldNames[fieldCounter], keyTypes[i], embeddedKeys[j],
+                             valueTypes[k], embeddedValues[l]);
+            printXmlMapField(xmlPw2, fieldNames[fieldCounter], keyTypes[i], embeddedKeys[j],
+                             valueTypes[k], embeddedValues[l]);
+            buildFieldSpecs(embeddedKeyForFieldSpec[j] + " " +
+                            embeddedValueForFieldSpec[l] + " " +
+                            "public " + mapName +" "+ fieldNames[fieldCounter]); // add to the field specs array*/
+            fieldCounter++;
+
+           }
+        }
+      }
+    }
+    writeFieldSpecs(pw);
+    writeMethodGetLength(pw);
+    writeMethodGet(pw, mapName, fieldNames, fieldCounter);
+    writeMethodSet(pw, mapName, fieldNames, fieldCounter);
+  }
+
+  public static void main(String[] args)
+  {
+    ClassGenerator classGenerator = new ClassGenerator();
+    try
+    {
+        classGenerator.generate();
+        classGenerator.generateCollections();
+    }
+    catch (Exception e)
+    {
+      System.out.println(e);
+      e.printStackTrace();
+    }
+  }
+}