You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-dev@db.apache.org by Michael Bouschen <mb...@spree.de> on 2006/03/09 23:45:03 UTC

Re: svn commit: r384378 - in /db/jdo/trunk/tck20/src: conf/pm.conf java/org/apache/jdo/tck/JDO_Test.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java

Hi Craig,

I think with this JDO_Test change we have to extend the StateTransitions 
test case and add the new lifecycle states 
PERSISTENT_NONTRANSACTIONAL_DIRTY and DETACHED there. Class 
StateTransitions iterates over all states using the constant NUM_STATES 
(see line 297) and expects to find the new state after a transition in 
the transitions array. Unfortunately, the transitions array does not 
have entries for the new states which results in a 
ArrayIndexOutOfBoundsException during the lifecycle test.

Regards Michael

>Author: clr
>Date: Wed Mar  8 15:45:25 2006
>New Revision: 384378
>
>URL: http://svn.apache.org/viewcvs?rev=384378&view=rev
>Log:
>JDO-191 Added tests for DataStoreConnection
>
>Added:
>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java
>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java
>Modified:
>    db/jdo/trunk/tck20/src/conf/pm.conf
>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java
>
>Modified: db/jdo/trunk/tck20/src/conf/pm.conf
>URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/conf/pm.conf?rev=384378&r1=384377&r2=384378&view=diff
>==============================================================================
>--- db/jdo/trunk/tck20/src/conf/pm.conf (original)
>+++ db/jdo/trunk/tck20/src/conf/pm.conf Wed Mar  8 15:45:25 2006
>@@ -9,6 +9,8 @@
> org.apache.jdo.tck.api.persistencemanager.ConcurrentPersistenceManagersSameClasses \
> org.apache.jdo.tck.api.persistencemanager.CurrentTransaction \
> org.apache.jdo.tck.api.persistencemanager.DataStoreCacheTest \
>+org.apache.jdo.tck.api.persistencemanager.DataStoreConnection \
>+org.apache.jdo.tck.api.persistencemanager.DataStoreConnectionThrows \
> org.apache.jdo.tck.api.persistencemanager.DeletePersistent \
> org.apache.jdo.tck.api.persistencemanager.DeletePersistentAllFails \
> org.apache.jdo.tck.api.persistencemanager.DeletePersistentFailsIfInstanceIsTransient \
>
>Modified: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java
>URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java?rev=384378&r1=384377&r2=384378&view=diff
>==============================================================================
>--- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java (original)
>+++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java Wed Mar  8 15:45:25 2006
>@@ -62,8 +62,10 @@
>     public static final int PERSISTENT_NEW_DELETED      = 7;
>     public static final int PERSISTENT_DELETED          = 8;
>     public static final int PERSISTENT_NONTRANSACTIONAL = 9;
>-    public static final int NUM_STATES = 10;
>-    public static final int ILLEGAL_STATE = 10;
>+    public static final int PERSISTENT_NONTRANSACTIONAL_DIRTY = 10;
>+    public static final int DETACHED = 11;
>+    public static final int NUM_STATES = 12;
>+    public static final int ILLEGAL_STATE = 12;
> 
>     public static final String[] states = {
>         "transient",
>@@ -76,6 +78,8 @@
>         "persistent-new-deleted",
>         "persistent-deleted",
>         "persistent-nontransactional",
>+        "persistent-nontransactional-dirty",
>+        "detached",
>         "illegal"
>     };
>     private static final int IS_PERSISTENT       = 0;
>@@ -83,7 +87,8 @@
>     private static final int IS_DIRTY            = 2;
>     private static final int IS_NEW              = 3;
>     private static final int IS_DELETED          = 4;
>-    private static final int NUM_STATUSES        = 5;
>+    private static final int IS_DETACHED         = 5;
>+    private static final int NUM_STATUSES        = 6;
> 
>     /*
>      * This table indicates the values returned by the status interrogation
>@@ -91,36 +96,42 @@
>      * state of an object.
>      */
>     private static final boolean state_statuses[][] = {
>-        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY      IS_NEW      IS_DELETED
>+        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY      IS_NEW      IS_DELETED  IS_DETACHED
>         // transient
>-        {   false,          false,              false,      false,      false},
>+        {   false,          false,              false,      false,      false,        false},
> 
>         // persistent-new
>-        {   true,           true,               true,       true,       false},
>+        {   true,           true,               true,       true,       false,        false},
> 
>         // persistent-clean
>-        {   true,           true,               false,      false,      false},
>+        {   true,           true,               false,      false,      false,        false},
> 
>         // persistent-dirty
>-        {   true,           true,               true,       false,      false},
>+        {   true,           true,               true,       false,      false,        false},
> 
>         // hollow
>-        {   true,           false,              false,      false,      false},
>+        {   true,           false,              false,      false,      false,        false},
> 
>         // transient-clean
>-        {   false,          true,               false,      false,      false},
>+        {   false,          true,               false,      false,      false,        false},
> 
>         // transient-dirty
>-        {   false,          true,               true,       false,      false},
>+        {   false,          true,               true,       false,      false,        false},
> 
>         // persistent-new-deleted
>-        {   true,           true,               true,       true,       true},
>+        {   true,           true,               true,       true,       true,         false},
> 
>         // persistent-deleted
>-        {   true,           true,               true,       false,      true},
>+        {   true,           true,               true,       false,      true,         false},
> 
>         // persistent-nontransactional
>-        {   true,           false,              false,      false,      false}
>+        {   true,           false,              false,      false,      false,        false},
>+
>+        // persistent-nontransactional-dirty
>+        {   true,           true,               false,      false,      false,        false},
>+
>+        // detached
>+        {   false,          false,              false,      false,      false,        true}
>     };
>   
>     /** identitytype value for applicationidentity. */
>@@ -706,6 +717,30 @@
>             "javax.jdo.query.SQL");
>     }
>     
>+    /** Reports whether getting the DataStoreConnection is supported. */
>+    public boolean isDataStoreConnectionSupported() {
>+        return getPMF().supportedOptions().contains(
>+            "javax.jdo.option.GetDataStoreConnection");
>+    }
>+    
>+    /**
>+     * Determine if a class is loadable in the current environment.
>+     */
>+    public static boolean isClassLoadable(String className) {
>+        try {
>+            Class.forName(className);
>+            return true;
>+        } catch (ClassNotFoundException ex) {
>+            return false;
>+        }
>+    }
>+
>+    /** 
>+     * Determine if the environment is 1.4 version of JRE or better.
>+     */
>+    public static boolean isJRE14orBetter() {
>+        return isClassLoadable("java.util.Currency");
>+    }
> 
>     /**
>      * This utility method returns a <code>String</code> that indicates the
>@@ -741,6 +776,10 @@
>             if( existingEntries ) buff.append(", ");
>             buff.append("deleted");
>         }
>+        if( JDOHelper.isDetached(o) ){
>+            if( existingEntries ) buff.append(", ");
>+            buff.append("detached");
>+        }
>         buff.append("}");
>         return buff.toString();
>     }
>@@ -750,12 +789,13 @@
>      */
>     public static int currentState(Object o)
>     {
>-        boolean[] status = new boolean[5];
>+        boolean[] status = new boolean[NUM_STATUSES];
>         status[IS_PERSISTENT]       = JDOHelper.isPersistent(o);
>         status[IS_TRANSACTIONAL]    = JDOHelper.isTransactional(o);
>         status[IS_DIRTY]            = JDOHelper.isDirty(o);
>         status[IS_NEW]              = JDOHelper.isNew(o);
>         status[IS_DELETED]          = JDOHelper.isDeleted(o);
>+        status[IS_DETACHED]         = JDOHelper.isDetached(o);
>         int i, j;
>     outerloop:
>         for( i = 0; i < NUM_STATES; ++i ){
>
>Added: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java
>URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java?rev=384378&view=auto
>==============================================================================
>--- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java (added)
>+++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java Wed Mar  8 15:45:25 2006
>@@ -0,0 +1,130 @@
>+/*
>+ * Copyright 2005 The Apache Software Foundation.
>+ * 
>+ * Licensed under the Apache License, Version 2.0 (the "License");
>+ * you may not use this file except in compliance with the License.
>+ * You may obtain a copy of the License at 
>+ * 
>+ *     http://www.apache.org/licenses/LICENSE-2.0
>+ * 
>+ * Unless required by applicable law or agreed to in writing, software 
>+ * distributed under the License is distributed on an "AS IS" BASIS, 
>+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
>+ * See the License for the specific language governing permissions and 
>+ * limitations under the License.
>+ */
>+
>+package org.apache.jdo.tck.api.persistencemanager;
>+
>+import java.sql.Connection;
>+import java.sql.PreparedStatement;
>+import java.sql.ResultSet;
>+
>+import java.util.Collection;
>+import java.util.HashSet;
>+
>+import javax.jdo.datastore.JDOConnection;
>+
>+import org.apache.jdo.tck.pc.mylib.PCPoint;
>+
>+import org.apache.jdo.tck.util.BatchTestRunner;
>+
>+/**
>+ *<B>Title:</B> DataStoreConnection
>+ *<BR>
>+ *<B>Keywords:</B>
>+ *<BR>
>+ *<B>Assertion ID:</B> A12.5.2-1
>+ *<BR>
>+ *<B>Assertion Description: </B>
>+In order for the application to perform some 
>+datastore-specific functions, such as to execute 
>+a query that is not directly supported by JDO, 
>+applications might need access to the 
>+datastore connection used by the JDO implementation. 
>+This method returns a wrapped 
>+connection that can be cast to the appropriate 
>+datastore connection and used by the application. 
>+The capability to get the datastore connection is 
>+indicated by the optional feature string 
>+javax.jdo.option.GetDataStoreConnection. 
>+
>+ */
>+
>+public class DataStoreConnection extends PersistenceManagerTest {
>+
>+    /** */
>+    private static final String ASSERTION_FAILED = 
>+        "Assertion A12.5.2-1 (DataStoreConnection) failed: ";
>+    
>+    protected PCPoint goldenPoint;
>+    
>+    /**
>+     * 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(DataStoreConnection.class);
>+    }
>+    
>+    /** */
>+    protected void localSetUp() {
>+        addTearDownClass(PCPoint.class);
>+        PCPoint point = new PCPoint(50, 100);
>+        goldenPoint = new PCPoint(point.getX(), point.getY());
>+        getPM().currentTransaction().begin();
>+        pm.makePersistent(point);
>+        pm.currentTransaction().commit();
>+    }
>+
>+    /** */
>+    public void testDataStoreConnection() {
>+        if (!(isDataStoreConnectionSupported() && isSQLSupported())) {
>+            printUnsupportedOptionalFeatureNotTested(
>+                    this.getClass().getName(),
>+                    "getDataStoreConnection AND SQLSupported.");
>+            return;
>+        }
>+        String schema = getPMFProperty("javax.jdo.mapping.Schema");
>+        String sql = "SELECT X, Y FROM " + schema + ".PCPoint";
>+        JDOConnection jconn = pm.getDataStoreConnection();
>+        try {
>+            getPM().currentTransaction().begin();
>+            jconn = pm.getDataStoreConnection();
>+            Connection conn = (Connection)jconn.getNativeConnection();
>+            if (conn.getAutoCommit()) {
>+                appendMessage(ASSERTION_FAILED + 
>+                        "Autocommit must not be true in native connection.");
>+            };
>+            PreparedStatement ps = conn.prepareStatement(sql);
>+            ResultSet rs = ps.executeQuery();
>+            Collection actuals = new HashSet();
>+            while (rs.next()) {
>+                PCPoint p = new PCPoint(rs.getInt(1), rs.getInt(2));
>+                actuals.add(p);
>+            }
>+            if (actuals.size() != 1) {
>+                appendMessage(ASSERTION_FAILED + "Wrong size of result of " +
>+                        sql + NL + "expected: 1, actual: " + actuals.size());
>+            } else {
>+                PCPoint actual = (PCPoint)actuals.iterator().next();
>+                if (goldenPoint.getX() != actual.getX() ||
>+                        !goldenPoint.getY().equals(actual.getY())) {
>+                    appendMessage(ASSERTION_FAILED + 
>+                            "Wrong values of PCPoint from SQL" +
>+                            "expected x: " + goldenPoint.getX() +
>+                            ", y: " + goldenPoint.getX() + NL +
>+                            "actual x: " + actual.getX() +
>+                            ", y: " + actual.getX()
>+                            );
>+                }
>+            }
>+        } catch (Exception ex) {
>+            appendMessage(ASSERTION_FAILED + " caught exception:" + ex);
>+        } finally {
>+            jconn.close();
>+            failOnError();
>+        }
>+    }
>+}
>
>Added: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java
>URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java?rev=384378&view=auto
>==============================================================================
>--- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java (added)
>+++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java Wed Mar  8 15:45:25 2006
>@@ -0,0 +1,187 @@
>+/*
>+ * Copyright 2005 The Apache Software Foundation.
>+ * 
>+ * Licensed under the Apache License, Version 2.0 (the "License");
>+ * you may not use this file except in compliance with the License.
>+ * You may obtain a copy of the License at 
>+ * 
>+ *     http://www.apache.org/licenses/LICENSE-2.0
>+ * 
>+ * Unless required by applicable law or agreed to in writing, software 
>+ * distributed under the License is distributed on an "AS IS" BASIS, 
>+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
>+ * See the License for the specific language governing permissions and 
>+ * limitations under the License.
>+ */
>+
>+package org.apache.jdo.tck.api.persistencemanager;
>+
>+import java.sql.Connection;
>+import java.sql.PreparedStatement;
>+import java.sql.ResultSet;
>+import java.sql.SQLException;
>+
>+import java.util.Collection;
>+import java.util.HashMap;
>+import java.util.HashSet;
>+
>+import javax.jdo.datastore.JDOConnection;
>+
>+import org.apache.jdo.tck.pc.mylib.PCPoint;
>+
>+import org.apache.jdo.tck.util.BatchTestRunner;
>+
>+/**
>+ *<B>Title:</B> DataStoreConnectionThrows
>+ *<BR>
>+ *<B>Keywords:</B>
>+ *<BR>
>+ *<B>Assertion ID:</B> A12.16-2
>+ *<BR>
>+ *<B>Assertion Description: </B>
>+For portability, a JDBC-based JDO implementation 
>+will return an instance that implements 
>+java.sql.Connection. The instance 
>+will throw an exception for any of the 
>+following method calls: commit, getMetaData, 
>+releaseSavepoint, rollback, setAutoCommit, 
>+setCatalog, setHoldability, setReadOnly, 
>+setSavepoint, setTransactionIsolation, and 
>+setTypeMap.
>+ */
>+
>+public class DataStoreConnectionThrows extends PersistenceManagerTest {
>+
>+    /** */
>+    private static final String ASSERTION_FAILED = 
>+        "Assertion A12.16-2 (DataStoreConnectionThrows) failed: ";
>+    
>+    protected PCPoint goldenPoint;
>+    
>+    /**
>+     * 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(DataStoreConnectionThrows.class);
>+    }
>+    
>+    /** */
>+    protected void checkThrow(Connection conn, Call call) {
>+        try {
>+            call.execute(conn);
>+            appendMessage(ASSERTION_FAILED +
>+                    "Failed to throw an exception for " + call.getName());
>+        } catch (SQLException ex) {
>+            appendMessage(ASSERTION_FAILED +
>+                    "Threw a SQLException for " + call.getName() + NL + ex);
>+            return;
>+        } catch (Exception ex) {
>+            return;
>+        }
>+    }
>+
>+    /** */
>+    interface Call {
>+        String getName();
>+        void execute(Connection conn) throws SQLException;
>+    }
>+
>+    /** */
>+    public void testDataStoreConnectionThrows() {
>+        if (!(isDataStoreConnectionSupported() && isSQLSupported())) {
>+            printUnsupportedOptionalFeatureNotTested(
>+                    this.getClass().getName(),
>+                    "getDataStoreConnection AND SQLSupported.");
>+            return;
>+        }
>+        JDOConnection jconn = getPM().getDataStoreConnection();
>+        Connection conn = (Connection)jconn.getNativeConnection();
>+        check13Methods(conn);
>+        if (isJRE14orBetter()) {
>+            check14Methods(conn);
>+        }
>+        jconn.close();
>+        failOnError();
>+    }
>+
>+   /** 
>+    * These methods are defined in Java 1.3 Connection.
>+    */
>+    protected void check13Methods(Connection conn) {
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "commit";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {conn.commit();}
>+                }
>+            );
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "rollback";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {conn.rollback();}
>+                }
>+            );
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "setTransactionIsolation";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {
>+                        conn.setTransactionIsolation(
>+                                Connection.TRANSACTION_READ_COMMITTED);}
>+                }
>+            );
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "setAutoCommit";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {conn.setAutoCommit(true);}
>+                }
>+            );
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "setCatalog";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {conn.setCatalog("NONE");}
>+                }
>+            );
>+    }
>+
>+    /**
>+     * These methods are defined in Java 1.4 Connection.
>+     */
>+    protected void check14Methods(Connection conn) {
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "setSavepoint";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {conn.setSavepoint();}
>+                }
>+            );
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "releaseSavepoint";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {conn.releaseSavepoint(null);}
>+                }
>+            );
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "setHoldability";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {
>+                        conn.setHoldability(
>+                                ResultSet.CLOSE_CURSORS_AT_COMMIT);}
>+                }
>+            );
>+        checkThrow(conn,
>+                new Call() {
>+                    public String getName() {return "setTypeMap";}
>+                    public void execute(Connection conn) 
>+                        throws SQLException {conn.setTypeMap(new HashMap());}
>+                }
>+            );
>+     }
>+}
>
>  
>


-- 
Michael Bouschen		Tech@Spree Engineering GmbH
mailto:mbo.tech@spree.de	http://www.tech.spree.de/
Tel.:++49/30/235 520-33		Buelowstr. 66			
Fax.:++49/30/2175 2012		D-10783 Berlin			


Re: svn commit: r384378 - in /db/jdo/trunk/tck20/src: conf/pm.conf java/org/apache/jdo/tck/JDO_Test.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java

Posted by Craig L Russell <Cr...@Sun.COM>.
Hi Michael,

Yes, Martin is looking at your patch as the basis for the state  
transition tests for detached and persistent nontransactional dirty.

Thanks,

Craig

On Mar 10, 2006, at 2:57 AM, Michael Watzek wrote:

> Hi Craig,
>
> the patch attached to JDO-273 also considers new life cycle states  
> for PERSISTENT_NONTRANSACTIONAL_DIRTY, DETACHED_CLEAN, and  
> DETACHED_DIRTY in classes JDO_Test and StateTransitions. Probably  
> it makes sense to review that patch asap, preventing merge conflicts.
>
> Regards,
> Michael
>
> Craig L Russell wrote:
>> Hi Michael,
>> Right. I had checked all usages of the array in JDO_Test but not  
>> the variables that define the limits of the arrays used in other  
>> tests. I'll update this test.
>> Thanks,
>> Craig
>> On Mar 9, 2006, at 2:45 PM, Michael Bouschen wrote:
>>> Hi Craig,
>>>
>>> I think with this JDO_Test change we have to extend the  
>>> StateTransitions test case and add the new lifecycle states  
>>> PERSISTENT_NONTRANSACTIONAL_DIRTY and DETACHED there. Class  
>>> StateTransitions iterates over all states using the constant  
>>> NUM_STATES (see line 297) and expects to find the new state after  
>>> a transition in the transitions array. Unfortunately, the  
>>> transitions array does not have entries for the new states which  
>>> results in a ArrayIndexOutOfBoundsException during the lifecycle  
>>> test.
>>>
>>> Regards Michael
>>>
>>>> Author: clr
>>>> Date: Wed Mar  8 15:45:25 2006
>>>> New Revision: 384378
>>>>
>>>> URL: http://svn.apache.org/viewcvs?rev=384378&view=rev
>>>> Log:
>>>> JDO-191 Added tests for DataStoreConnection
>>>>
>>>> Added:
>>>>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnection.java
>>>>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnectionThrows.java
>>>> Modified:
>>>>    db/jdo/trunk/tck20/src/conf/pm.conf
>>>>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java
>>>>
>>>> Modified: db/jdo/trunk/tck20/src/conf/pm.conf
>>>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/conf/ 
>>>> pm.conf?rev=384378&r1=384377&r2=384378&view=diff
>>>> =================================================================== 
>>>> ===========
>>>> --- db/jdo/trunk/tck20/src/conf/pm.conf (original)
>>>> +++ db/jdo/trunk/tck20/src/conf/pm.conf Wed Mar  8 15:45:25 2006
>>>> @@ -9,6 +9,8 @@
>>>> org.apache.jdo.tck.api.persistencemanager.ConcurrentPersistenceMana 
>>>> gersSameClasses \
>>>> org.apache.jdo.tck.api.persistencemanager.CurrentTransaction \
>>>> org.apache.jdo.tck.api.persistencemanager.DataStoreCacheTest \
>>>> +org.apache.jdo.tck.api.persistencemanager.DataStoreConnection \
>>>> +org.apache.jdo.tck.api.persistencemanager.DataStoreConnectionThrow 
>>>> s \
>>>> org.apache.jdo.tck.api.persistencemanager.DeletePersistent \
>>>> org.apache.jdo.tck.api.persistencemanager.DeletePersistentAllFails  
>>>> \
>>>> org.apache.jdo.tck.api.persistencemanager.DeletePersistentFailsIfIn 
>>>> stanceIsTransient \
>>>>
>>>> Modified: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/ 
>>>> JDO_Test.java
>>>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/ 
>>>> org/apache/jdo/tck/JDO_Test.java? 
>>>> rev=384378&r1=384377&r2=384378&view=diff
>>>> =================================================================== 
>>>> ===========
>>>> --- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java  
>>>> (original)
>>>> +++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java  
>>>> Wed Mar  8 15:45:25 2006
>>>> @@ -62,8 +62,10 @@
>>>>     public static final int PERSISTENT_NEW_DELETED      = 7;
>>>>     public static final int PERSISTENT_DELETED          = 8;
>>>>     public static final int PERSISTENT_NONTRANSACTIONAL = 9;
>>>> -    public static final int NUM_STATES = 10;
>>>> -    public static final int ILLEGAL_STATE = 10;
>>>> +    public static final int PERSISTENT_NONTRANSACTIONAL_DIRTY =  
>>>> 10;
>>>> +    public static final int DETACHED = 11;
>>>> +    public static final int NUM_STATES = 12;
>>>> +    public static final int ILLEGAL_STATE = 12;
>>>>     public static final String[] states = {
>>>>         "transient",
>>>> @@ -76,6 +78,8 @@
>>>>         "persistent-new-deleted",
>>>>         "persistent-deleted",
>>>>         "persistent-nontransactional",
>>>> +        "persistent-nontransactional-dirty",
>>>> +        "detached",
>>>>         "illegal"
>>>>     };
>>>>     private static final int IS_PERSISTENT       = 0;
>>>> @@ -83,7 +87,8 @@
>>>>     private static final int IS_DIRTY            = 2;
>>>>     private static final int IS_NEW              = 3;
>>>>     private static final int IS_DELETED          = 4;
>>>> -    private static final int NUM_STATUSES        = 5;
>>>> +    private static final int IS_DETACHED         = 5;
>>>> +    private static final int NUM_STATUSES        = 6;
>>>>     /*
>>>>      * This table indicates the values returned by the status  
>>>> interrogation
>>>> @@ -91,36 +96,42 @@
>>>>      * state of an object.
>>>>      */
>>>>     private static final boolean state_statuses[][] = {
>>>> -        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY       
>>>> IS_NEW      IS_DELETED
>>>> +        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY       
>>>> IS_NEW      IS_DELETED  IS_DETACHED
>>>>         // transient
>>>> -        {   false,          false,              false,       
>>>> false,      false},
>>>> +        {   false,          false,              false,       
>>>> false,      false,        false},
>>>>         // persistent-new
>>>> -        {   true,           true,               true,        
>>>> true,       false},
>>>> +        {   true,           true,               true,        
>>>> true,       false,        false},
>>>>         // persistent-clean
>>>> -        {   true,           true,               false,       
>>>> false,      false},
>>>> +        {   true,           true,               false,       
>>>> false,      false,        false},
>>>>         // persistent-dirty
>>>> -        {   true,           true,               true,        
>>>> false,      false},
>>>> +        {   true,           true,               true,        
>>>> false,      false,        false},
>>>>         // hollow
>>>> -        {   true,           false,              false,       
>>>> false,      false},
>>>> +        {   true,           false,              false,       
>>>> false,      false,        false},
>>>>         // transient-clean
>>>> -        {   false,          true,               false,       
>>>> false,      false},
>>>> +        {   false,          true,               false,       
>>>> false,      false,        false},
>>>>         // transient-dirty
>>>> -        {   false,          true,               true,        
>>>> false,      false},
>>>> +        {   false,          true,               true,        
>>>> false,      false,        false},
>>>>         // persistent-new-deleted
>>>> -        {   true,           true,               true,        
>>>> true,       true},
>>>> +        {   true,           true,               true,        
>>>> true,       true,         false},
>>>>         // persistent-deleted
>>>> -        {   true,           true,               true,        
>>>> false,      true},
>>>> +        {   true,           true,               true,        
>>>> false,      true,         false},
>>>>         // persistent-nontransactional
>>>> -        {   true,           false,              false,       
>>>> false,      false}
>>>> +        {   true,           false,              false,       
>>>> false,      false,        false},
>>>> +
>>>> +        // persistent-nontransactional-dirty
>>>> +        {   true,           true,               false,       
>>>> false,      false,        false},
>>>> +
>>>> +        // detached
>>>> +        {   false,          false,              false,       
>>>> false,      false,        true}
>>>>     };
>>>>       /** identitytype value for applicationidentity. */
>>>> @@ -706,6 +717,30 @@
>>>>             "javax.jdo.query.SQL");
>>>>     }
>>>>     +    /** Reports whether getting the DataStoreConnection is  
>>>> supported. */
>>>> +    public boolean isDataStoreConnectionSupported() {
>>>> +        return getPMF().supportedOptions().contains(
>>>> +            "javax.jdo.option.GetDataStoreConnection");
>>>> +    }
>>>> +    +    /**
>>>> +     * Determine if a class is loadable in the current  
>>>> environment.
>>>> +     */
>>>> +    public static boolean isClassLoadable(String className) {
>>>> +        try {
>>>> +            Class.forName(className);
>>>> +            return true;
>>>> +        } catch (ClassNotFoundException ex) {
>>>> +            return false;
>>>> +        }
>>>> +    }
>>>> +
>>>> +    /** +     * Determine if the environment is 1.4 version of  
>>>> JRE or better.
>>>> +     */
>>>> +    public static boolean isJRE14orBetter() {
>>>> +        return isClassLoadable("java.util.Currency");
>>>> +    }
>>>>     /**
>>>>      * This utility method returns a <code>String</code> that  
>>>> indicates the
>>>> @@ -741,6 +776,10 @@
>>>>             if( existingEntries ) buff.append(", ");
>>>>             buff.append("deleted");
>>>>         }
>>>> +        if( JDOHelper.isDetached(o) ){
>>>> +            if( existingEntries ) buff.append(", ");
>>>> +            buff.append("detached");
>>>> +        }
>>>>         buff.append("}");
>>>>         return buff.toString();
>>>>     }
>>>> @@ -750,12 +789,13 @@
>>>>      */
>>>>     public static int currentState(Object o)
>>>>     {
>>>> -        boolean[] status = new boolean[5];
>>>> +        boolean[] status = new boolean[NUM_STATUSES];
>>>>         status[IS_PERSISTENT]       = JDOHelper.isPersistent(o);
>>>>         status[IS_TRANSACTIONAL]    = JDOHelper.isTransactional(o);
>>>>         status[IS_DIRTY]            = JDOHelper.isDirty(o);
>>>>         status[IS_NEW]              = JDOHelper.isNew(o);
>>>>         status[IS_DELETED]          = JDOHelper.isDeleted(o);
>>>> +        status[IS_DETACHED]         = JDOHelper.isDetached(o);
>>>>         int i, j;
>>>>     outerloop:
>>>>         for( i = 0; i < NUM_STATES; ++i ){
>>>>
>>>> Added: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnection.java
>>>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/ 
>>>> org/apache/jdo/tck/api/persistencemanager/ 
>>>> DataStoreConnection.java?rev=384378&view=auto
>>>> =================================================================== 
>>>> ===========
>>>> --- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnection.java (added)
>>>> +++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnection.java Wed Mar  8 15:45:25  
>>>> 2006
>>>> @@ -0,0 +1,130 @@
>>>> +/*
>>>> + * Copyright 2005 The Apache Software Foundation.
>>>> + * + * Licensed under the Apache License, Version 2.0 (the  
>>>> "License");
>>>> + * you may not use this file except in compliance with the  
>>>> License.
>>>> + * You may obtain a copy of the License at + * + *     http:// 
>>>> www.apache.org/licenses/LICENSE-2.0
>>>> + * + * Unless required by applicable law or agreed to in  
>>>> writing, software + * distributed under the License is  
>>>> distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR  
>>>> CONDITIONS OF ANY KIND, either express or implied. + * See the  
>>>> License for the specific language governing permissions and + *  
>>>> limitations under the License.
>>>> + */
>>>> +
>>>> +package org.apache.jdo.tck.api.persistencemanager;
>>>> +
>>>> +import java.sql.Connection;
>>>> +import java.sql.PreparedStatement;
>>>> +import java.sql.ResultSet;
>>>> +
>>>> +import java.util.Collection;
>>>> +import java.util.HashSet;
>>>> +
>>>> +import javax.jdo.datastore.JDOConnection;
>>>> +
>>>> +import org.apache.jdo.tck.pc.mylib.PCPoint;
>>>> +
>>>> +import org.apache.jdo.tck.util.BatchTestRunner;
>>>> +
>>>> +/**
>>>> + *<B>Title:</B> DataStoreConnection
>>>> + *<BR>
>>>> + *<B>Keywords:</B>
>>>> + *<BR>
>>>> + *<B>Assertion ID:</B> A12.5.2-1
>>>> + *<BR>
>>>> + *<B>Assertion Description: </B>
>>>> +In order for the application to perform some +datastore- 
>>>> specific functions, such as to execute +a query that is not  
>>>> directly supported by JDO, +applications might need access to  
>>>> the +datastore connection used by the JDO implementation. +This  
>>>> method returns a wrapped +connection that can be cast to the  
>>>> appropriate +datastore connection and used by the application.  
>>>> +The capability to get the datastore connection is +indicated by  
>>>> the optional feature string  
>>>> +javax.jdo.option.GetDataStoreConnection. +
>>>> + */
>>>> +
>>>> +public class DataStoreConnection extends PersistenceManagerTest {
>>>> +
>>>> +    /** */
>>>> +    private static final String ASSERTION_FAILED = +         
>>>> "Assertion A12.5.2-1 (DataStoreConnection) failed: ";
>>>> +    +    protected PCPoint goldenPoint;
>>>> +    +    /**
>>>> +     * 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(DataStoreConnection.class);
>>>> +    }
>>>> +    +    /** */
>>>> +    protected void localSetUp() {
>>>> +        addTearDownClass(PCPoint.class);
>>>> +        PCPoint point = new PCPoint(50, 100);
>>>> +        goldenPoint = new PCPoint(point.getX(), point.getY());
>>>> +        getPM().currentTransaction().begin();
>>>> +        pm.makePersistent(point);
>>>> +        pm.currentTransaction().commit();
>>>> +    }
>>>> +
>>>> +    /** */
>>>> +    public void testDataStoreConnection() {
>>>> +        if (!(isDataStoreConnectionSupported() && isSQLSupported 
>>>> ())) {
>>>> +            printUnsupportedOptionalFeatureNotTested(
>>>> +                    this.getClass().getName(),
>>>> +                    "getDataStoreConnection AND SQLSupported.");
>>>> +            return;
>>>> +        }
>>>> +        String schema = getPMFProperty 
>>>> ("javax.jdo.mapping.Schema");
>>>> +        String sql = "SELECT X, Y FROM " + schema + ".PCPoint";
>>>> +        JDOConnection jconn = pm.getDataStoreConnection();
>>>> +        try {
>>>> +            getPM().currentTransaction().begin();
>>>> +            jconn = pm.getDataStoreConnection();
>>>> +            Connection conn = (Connection) 
>>>> jconn.getNativeConnection();
>>>> +            if (conn.getAutoCommit()) {
>>>> +                appendMessage(ASSERTION_FAILED +  
>>>> +                        "Autocommit must not be true in native  
>>>> connection.");
>>>> +            };
>>>> +            PreparedStatement ps = conn.prepareStatement(sql);
>>>> +            ResultSet rs = ps.executeQuery();
>>>> +            Collection actuals = new HashSet();
>>>> +            while (rs.next()) {
>>>> +                PCPoint p = new PCPoint(rs.getInt(1), rs.getInt 
>>>> (2));
>>>> +                actuals.add(p);
>>>> +            }
>>>> +            if (actuals.size() != 1) {
>>>> +                appendMessage(ASSERTION_FAILED + "Wrong size of  
>>>> result of " +
>>>> +                        sql + NL + "expected: 1, actual: " +  
>>>> actuals.size());
>>>> +            } else {
>>>> +                PCPoint actual = (PCPoint)actuals.iterator 
>>>> ().next();
>>>> +                if (goldenPoint.getX() != actual.getX() ||
>>>> +                        !goldenPoint.getY().equals(actual.getY 
>>>> ())) {
>>>> +                    appendMessage(ASSERTION_FAILED +  
>>>> +                            "Wrong values of PCPoint from SQL" +
>>>> +                            "expected x: " + goldenPoint.getX() +
>>>> +                            ", y: " + goldenPoint.getX() + NL +
>>>> +                            "actual x: " + actual.getX() +
>>>> +                            ", y: " + actual.getX()
>>>> +                            );
>>>> +                }
>>>> +            }
>>>> +        } catch (Exception ex) {
>>>> +            appendMessage(ASSERTION_FAILED + " caught  
>>>> exception:" + ex);
>>>> +        } finally {
>>>> +            jconn.close();
>>>> +            failOnError();
>>>> +        }
>>>> +    }
>>>> +}
>>>>
>>>> Added: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnectionThrows.java
>>>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/ 
>>>> org/apache/jdo/tck/api/persistencemanager/ 
>>>> DataStoreConnectionThrows.java?rev=384378&view=auto
>>>> =================================================================== 
>>>> ===========
>>>> --- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnectionThrows.java (added)
>>>> +++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>>>> persistencemanager/DataStoreConnectionThrows.java Wed Mar  8  
>>>> 15:45:25 2006
>>>> @@ -0,0 +1,187 @@
>>>> +/*
>>>> + * Copyright 2005 The Apache Software Foundation.
>>>> + * + * Licensed under the Apache License, Version 2.0 (the  
>>>> "License");
>>>> + * you may not use this file except in compliance with the  
>>>> License.
>>>> + * You may obtain a copy of the License at + * + *     http:// 
>>>> www.apache.org/licenses/LICENSE-2.0
>>>> + * + * Unless required by applicable law or agreed to in  
>>>> writing, software + * distributed under the License is  
>>>> distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR  
>>>> CONDITIONS OF ANY KIND, either express or implied. + * See the  
>>>> License for the specific language governing permissions and + *  
>>>> limitations under the License.
>>>> + */
>>>> +
>>>> +package org.apache.jdo.tck.api.persistencemanager;
>>>> +
>>>> +import java.sql.Connection;
>>>> +import java.sql.PreparedStatement;
>>>> +import java.sql.ResultSet;
>>>> +import java.sql.SQLException;
>>>> +
>>>> +import java.util.Collection;
>>>> +import java.util.HashMap;
>>>> +import java.util.HashSet;
>>>> +
>>>> +import javax.jdo.datastore.JDOConnection;
>>>> +
>>>> +import org.apache.jdo.tck.pc.mylib.PCPoint;
>>>> +
>>>> +import org.apache.jdo.tck.util.BatchTestRunner;
>>>> +
>>>> +/**
>>>> + *<B>Title:</B> DataStoreConnectionThrows
>>>> + *<BR>
>>>> + *<B>Keywords:</B>
>>>> + *<BR>
>>>> + *<B>Assertion ID:</B> A12.16-2
>>>> + *<BR>
>>>> + *<B>Assertion Description: </B>
>>>> +For portability, a JDBC-based JDO implementation +will return  
>>>> an instance that implements +java.sql.Connection. The instance  
>>>> +will throw an exception for any of the +following method calls:  
>>>> commit, getMetaData, +releaseSavepoint, rollback, setAutoCommit,  
>>>> +setCatalog, setHoldability, setReadOnly, +setSavepoint,  
>>>> setTransactionIsolation, and +setTypeMap.
>>>> + */
>>>> +
>>>> +public class DataStoreConnectionThrows extends  
>>>> PersistenceManagerTest {
>>>> +
>>>> +    /** */
>>>> +    private static final String ASSERTION_FAILED = +         
>>>> "Assertion A12.16-2 (DataStoreConnectionThrows) failed: ";
>>>> +    +    protected PCPoint goldenPoint;
>>>> +    +    /**
>>>> +     * 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(DataStoreConnectionThrows.class);
>>>> +    }
>>>> +    +    /** */
>>>> +    protected void checkThrow(Connection conn, Call call) {
>>>> +        try {
>>>> +            call.execute(conn);
>>>> +            appendMessage(ASSERTION_FAILED +
>>>> +                    "Failed to throw an exception for " +  
>>>> call.getName());
>>>> +        } catch (SQLException ex) {
>>>> +            appendMessage(ASSERTION_FAILED +
>>>> +                    "Threw a SQLException for " + call.getName 
>>>> () + NL + ex);
>>>> +            return;
>>>> +        } catch (Exception ex) {
>>>> +            return;
>>>> +        }
>>>> +    }
>>>> +
>>>> +    /** */
>>>> +    interface Call {
>>>> +        String getName();
>>>> +        void execute(Connection conn) throws SQLException;
>>>> +    }
>>>> +
>>>> +    /** */
>>>> +    public void testDataStoreConnectionThrows() {
>>>> +        if (!(isDataStoreConnectionSupported() && isSQLSupported 
>>>> ())) {
>>>> +            printUnsupportedOptionalFeatureNotTested(
>>>> +                    this.getClass().getName(),
>>>> +                    "getDataStoreConnection AND SQLSupported.");
>>>> +            return;
>>>> +        }
>>>> +        JDOConnection jconn = getPM().getDataStoreConnection();
>>>> +        Connection conn = (Connection)jconn.getNativeConnection();
>>>> +        check13Methods(conn);
>>>> +        if (isJRE14orBetter()) {
>>>> +            check14Methods(conn);
>>>> +        }
>>>> +        jconn.close();
>>>> +        failOnError();
>>>> +    }
>>>> +
>>>> +   /** +    * These methods are defined in Java 1.3 Connection.
>>>> +    */
>>>> +    protected void check13Methods(Connection conn) {
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return "commit";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {conn.commit();}
>>>> +                }
>>>> +            );
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return "rollback";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {conn.rollback();}
>>>> +                }
>>>> +            );
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return  
>>>> "setTransactionIsolation";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {
>>>> +                        conn.setTransactionIsolation(
>>>> +                                 
>>>> Connection.TRANSACTION_READ_COMMITTED);}
>>>> +                }
>>>> +            );
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return  
>>>> "setAutoCommit";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {conn.setAutoCommit 
>>>> (true);}
>>>> +                }
>>>> +            );
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return "setCatalog";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {conn.setCatalog 
>>>> ("NONE");}
>>>> +                }
>>>> +            );
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * These methods are defined in Java 1.4 Connection.
>>>> +     */
>>>> +    protected void check14Methods(Connection conn) {
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return  
>>>> "setSavepoint";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {conn.setSavepoint();}
>>>> +                }
>>>> +            );
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return  
>>>> "releaseSavepoint";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException  
>>>> {conn.releaseSavepoint(null);}
>>>> +                }
>>>> +            );
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return  
>>>> "setHoldability";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {
>>>> +                        conn.setHoldability(
>>>> +                                 
>>>> ResultSet.CLOSE_CURSORS_AT_COMMIT);}
>>>> +                }
>>>> +            );
>>>> +        checkThrow(conn,
>>>> +                new Call() {
>>>> +                    public String getName() {return "setTypeMap";}
>>>> +                    public void execute(Connection conn)  
>>>> +                        throws SQLException {conn.setTypeMap 
>>>> (new HashMap());}
>>>> +                }
>>>> +            );
>>>> +     }
>>>> +}
>>>>
>>>>
>>>
>>>
>>> --Michael Bouschen        Tech@Spree Engineering GmbH
>>> mailto:mbo.tech@spree.de    http://www.tech.spree.de/
>>> Tel.:++49/30/235 520-33        Buelowstr. 66           Fax.:+ 
>>> +49/30/2175 2012        D-10783 Berlin
>> Craig Russell
>> Architect, Sun Java Enterprise System http://java.sun.com/products/ 
>> jdo
>> 408 276-5638 mailto:Craig.Russell@sun.com
>> P.S. A good JDO? O, Gasp!
>
>
> -- 
> -------------------------------------------------------------------
> Michael Watzek                  Tech@Spree Engineering GmbH
> mailto:mwa.tech@spree.de        Buelowstr. 66
> Tel.:  ++49/30/235 520 36       10783 Berlin - Germany
> Fax.:  ++49/30/217 520 12       http://www.spree.de/
> -------------------------------------------------------------------

Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:Craig.Russell@sun.com
P.S. A good JDO? O, Gasp!


Re: svn commit: r384378 - in /db/jdo/trunk/tck20/src: conf/pm.conf java/org/apache/jdo/tck/JDO_Test.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java

Posted by Michael Watzek <mw...@spree.de>.
Hi Craig,

the patch attached to JDO-273 also considers new life cycle states for 
PERSISTENT_NONTRANSACTIONAL_DIRTY, DETACHED_CLEAN, and DETACHED_DIRTY in 
classes JDO_Test and StateTransitions. Probably it makes sense to review 
that patch asap, preventing merge conflicts.

Regards,
Michael

Craig L Russell wrote:
> Hi Michael,
> 
> Right. I had checked all usages of the array in JDO_Test but not the 
> variables that define the limits of the arrays used in other tests. I'll 
> update this test.
> 
> Thanks,
> 
> Craig
> 
> On Mar 9, 2006, at 2:45 PM, Michael Bouschen wrote:
> 
>> Hi Craig,
>>
>> I think with this JDO_Test change we have to extend the 
>> StateTransitions test case and add the new lifecycle states 
>> PERSISTENT_NONTRANSACTIONAL_DIRTY and DETACHED there. Class 
>> StateTransitions iterates over all states using the constant 
>> NUM_STATES (see line 297) and expects to find the new state after a 
>> transition in the transitions array. Unfortunately, the transitions 
>> array does not have entries for the new states which results in a 
>> ArrayIndexOutOfBoundsException during the lifecycle test.
>>
>> Regards Michael
>>
>>> Author: clr
>>> Date: Wed Mar  8 15:45:25 2006
>>> New Revision: 384378
>>>
>>> URL: http://svn.apache.org/viewcvs?rev=384378&view=rev
>>> Log:
>>> JDO-191 Added tests for DataStoreConnection
>>>
>>> Added:
>>>    
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java 
>>>
>>>    
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java 
>>>
>>> Modified:
>>>    db/jdo/trunk/tck20/src/conf/pm.conf
>>>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java
>>>
>>> Modified: db/jdo/trunk/tck20/src/conf/pm.conf
>>> URL: 
>>> http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/conf/pm.conf?rev=384378&r1=384377&r2=384378&view=diff 
>>>
>>> ============================================================================== 
>>>
>>> --- db/jdo/trunk/tck20/src/conf/pm.conf (original)
>>> +++ db/jdo/trunk/tck20/src/conf/pm.conf Wed Mar  8 15:45:25 2006
>>> @@ -9,6 +9,8 @@
>>> org.apache.jdo.tck.api.persistencemanager.ConcurrentPersistenceManagersSameClasses 
>>> \
>>> org.apache.jdo.tck.api.persistencemanager.CurrentTransaction \
>>> org.apache.jdo.tck.api.persistencemanager.DataStoreCacheTest \
>>> +org.apache.jdo.tck.api.persistencemanager.DataStoreConnection \
>>> +org.apache.jdo.tck.api.persistencemanager.DataStoreConnectionThrows \
>>> org.apache.jdo.tck.api.persistencemanager.DeletePersistent \
>>> org.apache.jdo.tck.api.persistencemanager.DeletePersistentAllFails \
>>> org.apache.jdo.tck.api.persistencemanager.DeletePersistentFailsIfInstanceIsTransient 
>>> \
>>>
>>> Modified: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java
>>> URL: 
>>> http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java?rev=384378&r1=384377&r2=384378&view=diff 
>>>
>>> ============================================================================== 
>>>
>>> --- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java 
>>> (original)
>>> +++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java Wed 
>>> Mar  8 15:45:25 2006
>>> @@ -62,8 +62,10 @@
>>>     public static final int PERSISTENT_NEW_DELETED      = 7;
>>>     public static final int PERSISTENT_DELETED          = 8;
>>>     public static final int PERSISTENT_NONTRANSACTIONAL = 9;
>>> -    public static final int NUM_STATES = 10;
>>> -    public static final int ILLEGAL_STATE = 10;
>>> +    public static final int PERSISTENT_NONTRANSACTIONAL_DIRTY = 10;
>>> +    public static final int DETACHED = 11;
>>> +    public static final int NUM_STATES = 12;
>>> +    public static final int ILLEGAL_STATE = 12;
>>>     public static final String[] states = {
>>>         "transient",
>>> @@ -76,6 +78,8 @@
>>>         "persistent-new-deleted",
>>>         "persistent-deleted",
>>>         "persistent-nontransactional",
>>> +        "persistent-nontransactional-dirty",
>>> +        "detached",
>>>         "illegal"
>>>     };
>>>     private static final int IS_PERSISTENT       = 0;
>>> @@ -83,7 +87,8 @@
>>>     private static final int IS_DIRTY            = 2;
>>>     private static final int IS_NEW              = 3;
>>>     private static final int IS_DELETED          = 4;
>>> -    private static final int NUM_STATUSES        = 5;
>>> +    private static final int IS_DETACHED         = 5;
>>> +    private static final int NUM_STATUSES        = 6;
>>>     /*
>>>      * This table indicates the values returned by the status 
>>> interrogation
>>> @@ -91,36 +96,42 @@
>>>      * state of an object.
>>>      */
>>>     private static final boolean state_statuses[][] = {
>>> -        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY      
>>> IS_NEW      IS_DELETED
>>> +        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY      
>>> IS_NEW      IS_DELETED  IS_DETACHED
>>>         // transient
>>> -        {   false,          false,              false,      
>>> false,      false},
>>> +        {   false,          false,              false,      
>>> false,      false,        false},
>>>         // persistent-new
>>> -        {   true,           true,               true,       
>>> true,       false},
>>> +        {   true,           true,               true,       
>>> true,       false,        false},
>>>         // persistent-clean
>>> -        {   true,           true,               false,      
>>> false,      false},
>>> +        {   true,           true,               false,      
>>> false,      false,        false},
>>>         // persistent-dirty
>>> -        {   true,           true,               true,       
>>> false,      false},
>>> +        {   true,           true,               true,       
>>> false,      false,        false},
>>>         // hollow
>>> -        {   true,           false,              false,      
>>> false,      false},
>>> +        {   true,           false,              false,      
>>> false,      false,        false},
>>>         // transient-clean
>>> -        {   false,          true,               false,      
>>> false,      false},
>>> +        {   false,          true,               false,      
>>> false,      false,        false},
>>>         // transient-dirty
>>> -        {   false,          true,               true,       
>>> false,      false},
>>> +        {   false,          true,               true,       
>>> false,      false,        false},
>>>         // persistent-new-deleted
>>> -        {   true,           true,               true,       
>>> true,       true},
>>> +        {   true,           true,               true,       
>>> true,       true,         false},
>>>         // persistent-deleted
>>> -        {   true,           true,               true,       
>>> false,      true},
>>> +        {   true,           true,               true,       
>>> false,      true,         false},
>>>         // persistent-nontransactional
>>> -        {   true,           false,              false,      
>>> false,      false}
>>> +        {   true,           false,              false,      
>>> false,      false,        false},
>>> +
>>> +        // persistent-nontransactional-dirty
>>> +        {   true,           true,               false,      
>>> false,      false,        false},
>>> +
>>> +        // detached
>>> +        {   false,          false,              false,      
>>> false,      false,        true}
>>>     };
>>>       /** identitytype value for applicationidentity. */
>>> @@ -706,6 +717,30 @@
>>>             "javax.jdo.query.SQL");
>>>     }
>>>     +    /** Reports whether getting the DataStoreConnection is 
>>> supported. */
>>> +    public boolean isDataStoreConnectionSupported() {
>>> +        return getPMF().supportedOptions().contains(
>>> +            "javax.jdo.option.GetDataStoreConnection");
>>> +    }
>>> +    +    /**
>>> +     * Determine if a class is loadable in the current environment.
>>> +     */
>>> +    public static boolean isClassLoadable(String className) {
>>> +        try {
>>> +            Class.forName(className);
>>> +            return true;
>>> +        } catch (ClassNotFoundException ex) {
>>> +            return false;
>>> +        }
>>> +    }
>>> +
>>> +    /** +     * Determine if the environment is 1.4 version of JRE 
>>> or better.
>>> +     */
>>> +    public static boolean isJRE14orBetter() {
>>> +        return isClassLoadable("java.util.Currency");
>>> +    }
>>>     /**
>>>      * This utility method returns a <code>String</code> that 
>>> indicates the
>>> @@ -741,6 +776,10 @@
>>>             if( existingEntries ) buff.append(", ");
>>>             buff.append("deleted");
>>>         }
>>> +        if( JDOHelper.isDetached(o) ){
>>> +            if( existingEntries ) buff.append(", ");
>>> +            buff.append("detached");
>>> +        }
>>>         buff.append("}");
>>>         return buff.toString();
>>>     }
>>> @@ -750,12 +789,13 @@
>>>      */
>>>     public static int currentState(Object o)
>>>     {
>>> -        boolean[] status = new boolean[5];
>>> +        boolean[] status = new boolean[NUM_STATUSES];
>>>         status[IS_PERSISTENT]       = JDOHelper.isPersistent(o);
>>>         status[IS_TRANSACTIONAL]    = JDOHelper.isTransactional(o);
>>>         status[IS_DIRTY]            = JDOHelper.isDirty(o);
>>>         status[IS_NEW]              = JDOHelper.isNew(o);
>>>         status[IS_DELETED]          = JDOHelper.isDeleted(o);
>>> +        status[IS_DETACHED]         = JDOHelper.isDetached(o);
>>>         int i, j;
>>>     outerloop:
>>>         for( i = 0; i < NUM_STATES; ++i ){
>>>
>>> Added: 
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java 
>>>
>>> URL: 
>>> http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java?rev=384378&view=auto 
>>>
>>> ============================================================================== 
>>>
>>> --- 
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java 
>>> (added)
>>> +++ 
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java 
>>> Wed Mar  8 15:45:25 2006
>>> @@ -0,0 +1,130 @@
>>> +/*
>>> + * Copyright 2005 The Apache Software Foundation.
>>> + * + * Licensed under the Apache License, Version 2.0 (the "License");
>>> + * you may not use this file except in compliance with the License.
>>> + * You may obtain a copy of the License at + * + *     
>>> http://www.apache.org/licenses/LICENSE-2.0
>>> + * + * Unless required by applicable law or agreed to in writing, 
>>> software + * distributed under the License is distributed on an "AS 
>>> IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
>>> express or implied. + * See the License for the specific language 
>>> governing permissions and + * limitations under the License.
>>> + */
>>> +
>>> +package org.apache.jdo.tck.api.persistencemanager;
>>> +
>>> +import java.sql.Connection;
>>> +import java.sql.PreparedStatement;
>>> +import java.sql.ResultSet;
>>> +
>>> +import java.util.Collection;
>>> +import java.util.HashSet;
>>> +
>>> +import javax.jdo.datastore.JDOConnection;
>>> +
>>> +import org.apache.jdo.tck.pc.mylib.PCPoint;
>>> +
>>> +import org.apache.jdo.tck.util.BatchTestRunner;
>>> +
>>> +/**
>>> + *<B>Title:</B> DataStoreConnection
>>> + *<BR>
>>> + *<B>Keywords:</B>
>>> + *<BR>
>>> + *<B>Assertion ID:</B> A12.5.2-1
>>> + *<BR>
>>> + *<B>Assertion Description: </B>
>>> +In order for the application to perform some +datastore-specific 
>>> functions, such as to execute +a query that is not directly supported 
>>> by JDO, +applications might need access to the +datastore connection 
>>> used by the JDO implementation. +This method returns a wrapped 
>>> +connection that can be cast to the appropriate +datastore connection 
>>> and used by the application. +The capability to get the datastore 
>>> connection is +indicated by the optional feature string 
>>> +javax.jdo.option.GetDataStoreConnection. +
>>> + */
>>> +
>>> +public class DataStoreConnection extends PersistenceManagerTest {
>>> +
>>> +    /** */
>>> +    private static final String ASSERTION_FAILED = +        
>>> "Assertion A12.5.2-1 (DataStoreConnection) failed: ";
>>> +    +    protected PCPoint goldenPoint;
>>> +    +    /**
>>> +     * 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(DataStoreConnection.class);
>>> +    }
>>> +    +    /** */
>>> +    protected void localSetUp() {
>>> +        addTearDownClass(PCPoint.class);
>>> +        PCPoint point = new PCPoint(50, 100);
>>> +        goldenPoint = new PCPoint(point.getX(), point.getY());
>>> +        getPM().currentTransaction().begin();
>>> +        pm.makePersistent(point);
>>> +        pm.currentTransaction().commit();
>>> +    }
>>> +
>>> +    /** */
>>> +    public void testDataStoreConnection() {
>>> +        if (!(isDataStoreConnectionSupported() && isSQLSupported())) {
>>> +            printUnsupportedOptionalFeatureNotTested(
>>> +                    this.getClass().getName(),
>>> +                    "getDataStoreConnection AND SQLSupported.");
>>> +            return;
>>> +        }
>>> +        String schema = getPMFProperty("javax.jdo.mapping.Schema");
>>> +        String sql = "SELECT X, Y FROM " + schema + ".PCPoint";
>>> +        JDOConnection jconn = pm.getDataStoreConnection();
>>> +        try {
>>> +            getPM().currentTransaction().begin();
>>> +            jconn = pm.getDataStoreConnection();
>>> +            Connection conn = (Connection)jconn.getNativeConnection();
>>> +            if (conn.getAutoCommit()) {
>>> +                appendMessage(ASSERTION_FAILED + 
>>> +                        "Autocommit must not be true in native 
>>> connection.");
>>> +            };
>>> +            PreparedStatement ps = conn.prepareStatement(sql);
>>> +            ResultSet rs = ps.executeQuery();
>>> +            Collection actuals = new HashSet();
>>> +            while (rs.next()) {
>>> +                PCPoint p = new PCPoint(rs.getInt(1), rs.getInt(2));
>>> +                actuals.add(p);
>>> +            }
>>> +            if (actuals.size() != 1) {
>>> +                appendMessage(ASSERTION_FAILED + "Wrong size of 
>>> result of " +
>>> +                        sql + NL + "expected: 1, actual: " + 
>>> actuals.size());
>>> +            } else {
>>> +                PCPoint actual = (PCPoint)actuals.iterator().next();
>>> +                if (goldenPoint.getX() != actual.getX() ||
>>> +                        !goldenPoint.getY().equals(actual.getY())) {
>>> +                    appendMessage(ASSERTION_FAILED + 
>>> +                            "Wrong values of PCPoint from SQL" +
>>> +                            "expected x: " + goldenPoint.getX() +
>>> +                            ", y: " + goldenPoint.getX() + NL +
>>> +                            "actual x: " + actual.getX() +
>>> +                            ", y: " + actual.getX()
>>> +                            );
>>> +                }
>>> +            }
>>> +        } catch (Exception ex) {
>>> +            appendMessage(ASSERTION_FAILED + " caught exception:" + 
>>> ex);
>>> +        } finally {
>>> +            jconn.close();
>>> +            failOnError();
>>> +        }
>>> +    }
>>> +}
>>>
>>> Added: 
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java 
>>>
>>> URL: 
>>> http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java?rev=384378&view=auto 
>>>
>>> ============================================================================== 
>>>
>>> --- 
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java 
>>> (added)
>>> +++ 
>>> db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java 
>>> Wed Mar  8 15:45:25 2006
>>> @@ -0,0 +1,187 @@
>>> +/*
>>> + * Copyright 2005 The Apache Software Foundation.
>>> + * + * Licensed under the Apache License, Version 2.0 (the "License");
>>> + * you may not use this file except in compliance with the License.
>>> + * You may obtain a copy of the License at + * + *     
>>> http://www.apache.org/licenses/LICENSE-2.0
>>> + * + * Unless required by applicable law or agreed to in writing, 
>>> software + * distributed under the License is distributed on an "AS 
>>> IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
>>> express or implied. + * See the License for the specific language 
>>> governing permissions and + * limitations under the License.
>>> + */
>>> +
>>> +package org.apache.jdo.tck.api.persistencemanager;
>>> +
>>> +import java.sql.Connection;
>>> +import java.sql.PreparedStatement;
>>> +import java.sql.ResultSet;
>>> +import java.sql.SQLException;
>>> +
>>> +import java.util.Collection;
>>> +import java.util.HashMap;
>>> +import java.util.HashSet;
>>> +
>>> +import javax.jdo.datastore.JDOConnection;
>>> +
>>> +import org.apache.jdo.tck.pc.mylib.PCPoint;
>>> +
>>> +import org.apache.jdo.tck.util.BatchTestRunner;
>>> +
>>> +/**
>>> + *<B>Title:</B> DataStoreConnectionThrows
>>> + *<BR>
>>> + *<B>Keywords:</B>
>>> + *<BR>
>>> + *<B>Assertion ID:</B> A12.16-2
>>> + *<BR>
>>> + *<B>Assertion Description: </B>
>>> +For portability, a JDBC-based JDO implementation +will return an 
>>> instance that implements +java.sql.Connection. The instance +will 
>>> throw an exception for any of the +following method calls: commit, 
>>> getMetaData, +releaseSavepoint, rollback, setAutoCommit, +setCatalog, 
>>> setHoldability, setReadOnly, +setSavepoint, setTransactionIsolation, 
>>> and +setTypeMap.
>>> + */
>>> +
>>> +public class DataStoreConnectionThrows extends PersistenceManagerTest {
>>> +
>>> +    /** */
>>> +    private static final String ASSERTION_FAILED = +        
>>> "Assertion A12.16-2 (DataStoreConnectionThrows) failed: ";
>>> +    +    protected PCPoint goldenPoint;
>>> +    +    /**
>>> +     * 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(DataStoreConnectionThrows.class);
>>> +    }
>>> +    +    /** */
>>> +    protected void checkThrow(Connection conn, Call call) {
>>> +        try {
>>> +            call.execute(conn);
>>> +            appendMessage(ASSERTION_FAILED +
>>> +                    "Failed to throw an exception for " + 
>>> call.getName());
>>> +        } catch (SQLException ex) {
>>> +            appendMessage(ASSERTION_FAILED +
>>> +                    "Threw a SQLException for " + call.getName() + 
>>> NL + ex);
>>> +            return;
>>> +        } catch (Exception ex) {
>>> +            return;
>>> +        }
>>> +    }
>>> +
>>> +    /** */
>>> +    interface Call {
>>> +        String getName();
>>> +        void execute(Connection conn) throws SQLException;
>>> +    }
>>> +
>>> +    /** */
>>> +    public void testDataStoreConnectionThrows() {
>>> +        if (!(isDataStoreConnectionSupported() && isSQLSupported())) {
>>> +            printUnsupportedOptionalFeatureNotTested(
>>> +                    this.getClass().getName(),
>>> +                    "getDataStoreConnection AND SQLSupported.");
>>> +            return;
>>> +        }
>>> +        JDOConnection jconn = getPM().getDataStoreConnection();
>>> +        Connection conn = (Connection)jconn.getNativeConnection();
>>> +        check13Methods(conn);
>>> +        if (isJRE14orBetter()) {
>>> +            check14Methods(conn);
>>> +        }
>>> +        jconn.close();
>>> +        failOnError();
>>> +    }
>>> +
>>> +   /** +    * These methods are defined in Java 1.3 Connection.
>>> +    */
>>> +    protected void check13Methods(Connection conn) {
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return "commit";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {conn.commit();}
>>> +                }
>>> +            );
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return "rollback";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {conn.rollback();}
>>> +                }
>>> +            );
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return 
>>> "setTransactionIsolation";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {
>>> +                        conn.setTransactionIsolation(
>>> +                                
>>> Connection.TRANSACTION_READ_COMMITTED);}
>>> +                }
>>> +            );
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return "setAutoCommit";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {conn.setAutoCommit(true);}
>>> +                }
>>> +            );
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return "setCatalog";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {conn.setCatalog("NONE");}
>>> +                }
>>> +            );
>>> +    }
>>> +
>>> +    /**
>>> +     * These methods are defined in Java 1.4 Connection.
>>> +     */
>>> +    protected void check14Methods(Connection conn) {
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return "setSavepoint";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {conn.setSavepoint();}
>>> +                }
>>> +            );
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return 
>>> "releaseSavepoint";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException 
>>> {conn.releaseSavepoint(null);}
>>> +                }
>>> +            );
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return "setHoldability";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {
>>> +                        conn.setHoldability(
>>> +                                ResultSet.CLOSE_CURSORS_AT_COMMIT);}
>>> +                }
>>> +            );
>>> +        checkThrow(conn,
>>> +                new Call() {
>>> +                    public String getName() {return "setTypeMap";}
>>> +                    public void execute(Connection conn) 
>>> +                        throws SQLException {conn.setTypeMap(new 
>>> HashMap());}
>>> +                }
>>> +            );
>>> +     }
>>> +}
>>>
>>>
>>
>>
>> --Michael Bouschen        Tech@Spree Engineering GmbH
>> mailto:mbo.tech@spree.de    http://www.tech.spree.de/
>> Tel.:++49/30/235 520-33        Buelowstr. 66           
>> Fax.:++49/30/2175 2012        D-10783 Berlin           
>>
> 
> Craig Russell
> Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
> 408 276-5638 mailto:Craig.Russell@sun.com
> P.S. A good JDO? O, Gasp!


-- 
-------------------------------------------------------------------
Michael Watzek                  Tech@Spree Engineering GmbH
mailto:mwa.tech@spree.de        Buelowstr. 66
Tel.:  ++49/30/235 520 36       10783 Berlin - Germany
Fax.:  ++49/30/217 520 12       http://www.spree.de/
-------------------------------------------------------------------

Re: svn commit: r384378 - in /db/jdo/trunk/tck20/src: conf/pm.conf java/org/apache/jdo/tck/JDO_Test.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnection.java java/org/apache/jdo/tck/api/persistencemanager/DataStoreConnectionThrows.java

Posted by Craig L Russell <Cr...@Sun.COM>.
Hi Michael,

Right. I had checked all usages of the array in JDO_Test but not the  
variables that define the limits of the arrays used in other tests.  
I'll update this test.

Thanks,

Craig

On Mar 9, 2006, at 2:45 PM, Michael Bouschen wrote:

> Hi Craig,
>
> I think with this JDO_Test change we have to extend the  
> StateTransitions test case and add the new lifecycle states  
> PERSISTENT_NONTRANSACTIONAL_DIRTY and DETACHED there. Class  
> StateTransitions iterates over all states using the constant  
> NUM_STATES (see line 297) and expects to find the new state after a  
> transition in the transitions array. Unfortunately, the transitions  
> array does not have entries for the new states which results in a  
> ArrayIndexOutOfBoundsException during the lifecycle test.
>
> Regards Michael
>
>> Author: clr
>> Date: Wed Mar  8 15:45:25 2006
>> New Revision: 384378
>>
>> URL: http://svn.apache.org/viewcvs?rev=384378&view=rev
>> Log:
>> JDO-191 Added tests for DataStoreConnection
>>
>> Added:
>>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnection.java
>>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnectionThrows.java
>> Modified:
>>    db/jdo/trunk/tck20/src/conf/pm.conf
>>    db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java
>>
>> Modified: db/jdo/trunk/tck20/src/conf/pm.conf
>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/conf/ 
>> pm.conf?rev=384378&r1=384377&r2=384378&view=diff
>> ===================================================================== 
>> =========
>> --- db/jdo/trunk/tck20/src/conf/pm.conf (original)
>> +++ db/jdo/trunk/tck20/src/conf/pm.conf Wed Mar  8 15:45:25 2006
>> @@ -9,6 +9,8 @@
>> org.apache.jdo.tck.api.persistencemanager.ConcurrentPersistenceManage 
>> rsSameClasses \
>> org.apache.jdo.tck.api.persistencemanager.CurrentTransaction \
>> org.apache.jdo.tck.api.persistencemanager.DataStoreCacheTest \
>> +org.apache.jdo.tck.api.persistencemanager.DataStoreConnection \
>> +org.apache.jdo.tck.api.persistencemanager.DataStoreConnectionThrows  
>> \
>> org.apache.jdo.tck.api.persistencemanager.DeletePersistent \
>> org.apache.jdo.tck.api.persistencemanager.DeletePersistentAllFails \
>> org.apache.jdo.tck.api.persistencemanager.DeletePersistentFailsIfInst 
>> anceIsTransient \
>>
>> Modified: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/ 
>> JDO_Test.java
>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/ 
>> apache/jdo/tck/JDO_Test.java?rev=384378&r1=384377&r2=384378&view=diff
>> ===================================================================== 
>> =========
>> --- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java  
>> (original)
>> +++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/JDO_Test.java  
>> Wed Mar  8 15:45:25 2006
>> @@ -62,8 +62,10 @@
>>     public static final int PERSISTENT_NEW_DELETED      = 7;
>>     public static final int PERSISTENT_DELETED          = 8;
>>     public static final int PERSISTENT_NONTRANSACTIONAL = 9;
>> -    public static final int NUM_STATES = 10;
>> -    public static final int ILLEGAL_STATE = 10;
>> +    public static final int PERSISTENT_NONTRANSACTIONAL_DIRTY = 10;
>> +    public static final int DETACHED = 11;
>> +    public static final int NUM_STATES = 12;
>> +    public static final int ILLEGAL_STATE = 12;
>>     public static final String[] states = {
>>         "transient",
>> @@ -76,6 +78,8 @@
>>         "persistent-new-deleted",
>>         "persistent-deleted",
>>         "persistent-nontransactional",
>> +        "persistent-nontransactional-dirty",
>> +        "detached",
>>         "illegal"
>>     };
>>     private static final int IS_PERSISTENT       = 0;
>> @@ -83,7 +87,8 @@
>>     private static final int IS_DIRTY            = 2;
>>     private static final int IS_NEW              = 3;
>>     private static final int IS_DELETED          = 4;
>> -    private static final int NUM_STATUSES        = 5;
>> +    private static final int IS_DETACHED         = 5;
>> +    private static final int NUM_STATUSES        = 6;
>>     /*
>>      * This table indicates the values returned by the status  
>> interrogation
>> @@ -91,36 +96,42 @@
>>      * state of an object.
>>      */
>>     private static final boolean state_statuses[][] = {
>> -        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY       
>> IS_NEW      IS_DELETED
>> +        // IS_PERSISTENT IS_TRANSACTIONAL    IS_DIRTY       
>> IS_NEW      IS_DELETED  IS_DETACHED
>>         // transient
>> -        {   false,          false,              false,       
>> false,      false},
>> +        {   false,          false,              false,       
>> false,      false,        false},
>>         // persistent-new
>> -        {   true,           true,               true,        
>> true,       false},
>> +        {   true,           true,               true,        
>> true,       false,        false},
>>         // persistent-clean
>> -        {   true,           true,               false,       
>> false,      false},
>> +        {   true,           true,               false,       
>> false,      false,        false},
>>         // persistent-dirty
>> -        {   true,           true,               true,        
>> false,      false},
>> +        {   true,           true,               true,        
>> false,      false,        false},
>>         // hollow
>> -        {   true,           false,              false,       
>> false,      false},
>> +        {   true,           false,              false,       
>> false,      false,        false},
>>         // transient-clean
>> -        {   false,          true,               false,       
>> false,      false},
>> +        {   false,          true,               false,       
>> false,      false,        false},
>>         // transient-dirty
>> -        {   false,          true,               true,        
>> false,      false},
>> +        {   false,          true,               true,        
>> false,      false,        false},
>>         // persistent-new-deleted
>> -        {   true,           true,               true,        
>> true,       true},
>> +        {   true,           true,               true,        
>> true,       true,         false},
>>         // persistent-deleted
>> -        {   true,           true,               true,        
>> false,      true},
>> +        {   true,           true,               true,        
>> false,      true,         false},
>>         // persistent-nontransactional
>> -        {   true,           false,              false,       
>> false,      false}
>> +        {   true,           false,              false,       
>> false,      false,        false},
>> +
>> +        // persistent-nontransactional-dirty
>> +        {   true,           true,               false,       
>> false,      false,        false},
>> +
>> +        // detached
>> +        {   false,          false,              false,       
>> false,      false,        true}
>>     };
>>       /** identitytype value for applicationidentity. */
>> @@ -706,6 +717,30 @@
>>             "javax.jdo.query.SQL");
>>     }
>>     +    /** Reports whether getting the DataStoreConnection is  
>> supported. */
>> +    public boolean isDataStoreConnectionSupported() {
>> +        return getPMF().supportedOptions().contains(
>> +            "javax.jdo.option.GetDataStoreConnection");
>> +    }
>> +    +    /**
>> +     * Determine if a class is loadable in the current environment.
>> +     */
>> +    public static boolean isClassLoadable(String className) {
>> +        try {
>> +            Class.forName(className);
>> +            return true;
>> +        } catch (ClassNotFoundException ex) {
>> +            return false;
>> +        }
>> +    }
>> +
>> +    /** +     * Determine if the environment is 1.4 version of  
>> JRE or better.
>> +     */
>> +    public static boolean isJRE14orBetter() {
>> +        return isClassLoadable("java.util.Currency");
>> +    }
>>     /**
>>      * This utility method returns a <code>String</code> that  
>> indicates the
>> @@ -741,6 +776,10 @@
>>             if( existingEntries ) buff.append(", ");
>>             buff.append("deleted");
>>         }
>> +        if( JDOHelper.isDetached(o) ){
>> +            if( existingEntries ) buff.append(", ");
>> +            buff.append("detached");
>> +        }
>>         buff.append("}");
>>         return buff.toString();
>>     }
>> @@ -750,12 +789,13 @@
>>      */
>>     public static int currentState(Object o)
>>     {
>> -        boolean[] status = new boolean[5];
>> +        boolean[] status = new boolean[NUM_STATUSES];
>>         status[IS_PERSISTENT]       = JDOHelper.isPersistent(o);
>>         status[IS_TRANSACTIONAL]    = JDOHelper.isTransactional(o);
>>         status[IS_DIRTY]            = JDOHelper.isDirty(o);
>>         status[IS_NEW]              = JDOHelper.isNew(o);
>>         status[IS_DELETED]          = JDOHelper.isDeleted(o);
>> +        status[IS_DETACHED]         = JDOHelper.isDetached(o);
>>         int i, j;
>>     outerloop:
>>         for( i = 0; i < NUM_STATES; ++i ){
>>
>> Added: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnection.java
>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/ 
>> apache/jdo/tck/api/persistencemanager/DataStoreConnection.java? 
>> rev=384378&view=auto
>> ===================================================================== 
>> =========
>> --- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnection.java (added)
>> +++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnection.java Wed Mar  8 15:45:25 2006
>> @@ -0,0 +1,130 @@
>> +/*
>> + * Copyright 2005 The Apache Software Foundation.
>> + * + * Licensed under the Apache License, Version 2.0 (the  
>> "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at + * + *     http:// 
>> www.apache.org/licenses/LICENSE-2.0
>> + * + * Unless required by applicable law or agreed to in writing,  
>> software + * distributed under the License is distributed on an  
>> "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,  
>> either express or implied. + * See the License for the specific  
>> language governing permissions and + * limitations under the License.
>> + */
>> +
>> +package org.apache.jdo.tck.api.persistencemanager;
>> +
>> +import java.sql.Connection;
>> +import java.sql.PreparedStatement;
>> +import java.sql.ResultSet;
>> +
>> +import java.util.Collection;
>> +import java.util.HashSet;
>> +
>> +import javax.jdo.datastore.JDOConnection;
>> +
>> +import org.apache.jdo.tck.pc.mylib.PCPoint;
>> +
>> +import org.apache.jdo.tck.util.BatchTestRunner;
>> +
>> +/**
>> + *<B>Title:</B> DataStoreConnection
>> + *<BR>
>> + *<B>Keywords:</B>
>> + *<BR>
>> + *<B>Assertion ID:</B> A12.5.2-1
>> + *<BR>
>> + *<B>Assertion Description: </B>
>> +In order for the application to perform some +datastore-specific  
>> functions, such as to execute +a query that is not directly  
>> supported by JDO, +applications might need access to the  
>> +datastore connection used by the JDO implementation. +This method  
>> returns a wrapped +connection that can be cast to the appropriate  
>> +datastore connection and used by the application. +The capability  
>> to get the datastore connection is +indicated by the optional  
>> feature string +javax.jdo.option.GetDataStoreConnection. +
>> + */
>> +
>> +public class DataStoreConnection extends PersistenceManagerTest {
>> +
>> +    /** */
>> +    private static final String ASSERTION_FAILED = +         
>> "Assertion A12.5.2-1 (DataStoreConnection) failed: ";
>> +    +    protected PCPoint goldenPoint;
>> +    +    /**
>> +     * 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(DataStoreConnection.class);
>> +    }
>> +    +    /** */
>> +    protected void localSetUp() {
>> +        addTearDownClass(PCPoint.class);
>> +        PCPoint point = new PCPoint(50, 100);
>> +        goldenPoint = new PCPoint(point.getX(), point.getY());
>> +        getPM().currentTransaction().begin();
>> +        pm.makePersistent(point);
>> +        pm.currentTransaction().commit();
>> +    }
>> +
>> +    /** */
>> +    public void testDataStoreConnection() {
>> +        if (!(isDataStoreConnectionSupported() && isSQLSupported 
>> ())) {
>> +            printUnsupportedOptionalFeatureNotTested(
>> +                    this.getClass().getName(),
>> +                    "getDataStoreConnection AND SQLSupported.");
>> +            return;
>> +        }
>> +        String schema = getPMFProperty("javax.jdo.mapping.Schema");
>> +        String sql = "SELECT X, Y FROM " + schema + ".PCPoint";
>> +        JDOConnection jconn = pm.getDataStoreConnection();
>> +        try {
>> +            getPM().currentTransaction().begin();
>> +            jconn = pm.getDataStoreConnection();
>> +            Connection conn = (Connection) 
>> jconn.getNativeConnection();
>> +            if (conn.getAutoCommit()) {
>> +                appendMessage(ASSERTION_FAILED +  
>> +                        "Autocommit must not be true in native  
>> connection.");
>> +            };
>> +            PreparedStatement ps = conn.prepareStatement(sql);
>> +            ResultSet rs = ps.executeQuery();
>> +            Collection actuals = new HashSet();
>> +            while (rs.next()) {
>> +                PCPoint p = new PCPoint(rs.getInt(1), rs.getInt(2));
>> +                actuals.add(p);
>> +            }
>> +            if (actuals.size() != 1) {
>> +                appendMessage(ASSERTION_FAILED + "Wrong size of  
>> result of " +
>> +                        sql + NL + "expected: 1, actual: " +  
>> actuals.size());
>> +            } else {
>> +                PCPoint actual = (PCPoint)actuals.iterator().next();
>> +                if (goldenPoint.getX() != actual.getX() ||
>> +                        !goldenPoint.getY().equals(actual.getY())) {
>> +                    appendMessage(ASSERTION_FAILED +  
>> +                            "Wrong values of PCPoint from SQL" +
>> +                            "expected x: " + goldenPoint.getX() +
>> +                            ", y: " + goldenPoint.getX() + NL +
>> +                            "actual x: " + actual.getX() +
>> +                            ", y: " + actual.getX()
>> +                            );
>> +                }
>> +            }
>> +        } catch (Exception ex) {
>> +            appendMessage(ASSERTION_FAILED + " caught exception:"  
>> + ex);
>> +        } finally {
>> +            jconn.close();
>> +            failOnError();
>> +        }
>> +    }
>> +}
>>
>> Added: db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnectionThrows.java
>> URL: http://svn.apache.org/viewcvs/db/jdo/trunk/tck20/src/java/org/ 
>> apache/jdo/tck/api/persistencemanager/ 
>> DataStoreConnectionThrows.java?rev=384378&view=auto
>> ===================================================================== 
>> =========
>> --- db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnectionThrows.java (added)
>> +++ db/jdo/trunk/tck20/src/java/org/apache/jdo/tck/api/ 
>> persistencemanager/DataStoreConnectionThrows.java Wed Mar  8  
>> 15:45:25 2006
>> @@ -0,0 +1,187 @@
>> +/*
>> + * Copyright 2005 The Apache Software Foundation.
>> + * + * Licensed under the Apache License, Version 2.0 (the  
>> "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at + * + *     http:// 
>> www.apache.org/licenses/LICENSE-2.0
>> + * + * Unless required by applicable law or agreed to in writing,  
>> software + * distributed under the License is distributed on an  
>> "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,  
>> either express or implied. + * See the License for the specific  
>> language governing permissions and + * limitations under the License.
>> + */
>> +
>> +package org.apache.jdo.tck.api.persistencemanager;
>> +
>> +import java.sql.Connection;
>> +import java.sql.PreparedStatement;
>> +import java.sql.ResultSet;
>> +import java.sql.SQLException;
>> +
>> +import java.util.Collection;
>> +import java.util.HashMap;
>> +import java.util.HashSet;
>> +
>> +import javax.jdo.datastore.JDOConnection;
>> +
>> +import org.apache.jdo.tck.pc.mylib.PCPoint;
>> +
>> +import org.apache.jdo.tck.util.BatchTestRunner;
>> +
>> +/**
>> + *<B>Title:</B> DataStoreConnectionThrows
>> + *<BR>
>> + *<B>Keywords:</B>
>> + *<BR>
>> + *<B>Assertion ID:</B> A12.16-2
>> + *<BR>
>> + *<B>Assertion Description: </B>
>> +For portability, a JDBC-based JDO implementation +will return an  
>> instance that implements +java.sql.Connection. The instance +will  
>> throw an exception for any of the +following method calls: commit,  
>> getMetaData, +releaseSavepoint, rollback, setAutoCommit,  
>> +setCatalog, setHoldability, setReadOnly, +setSavepoint,  
>> setTransactionIsolation, and +setTypeMap.
>> + */
>> +
>> +public class DataStoreConnectionThrows extends  
>> PersistenceManagerTest {
>> +
>> +    /** */
>> +    private static final String ASSERTION_FAILED = +         
>> "Assertion A12.16-2 (DataStoreConnectionThrows) failed: ";
>> +    +    protected PCPoint goldenPoint;
>> +    +    /**
>> +     * 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(DataStoreConnectionThrows.class);
>> +    }
>> +    +    /** */
>> +    protected void checkThrow(Connection conn, Call call) {
>> +        try {
>> +            call.execute(conn);
>> +            appendMessage(ASSERTION_FAILED +
>> +                    "Failed to throw an exception for " +  
>> call.getName());
>> +        } catch (SQLException ex) {
>> +            appendMessage(ASSERTION_FAILED +
>> +                    "Threw a SQLException for " + call.getName()  
>> + NL + ex);
>> +            return;
>> +        } catch (Exception ex) {
>> +            return;
>> +        }
>> +    }
>> +
>> +    /** */
>> +    interface Call {
>> +        String getName();
>> +        void execute(Connection conn) throws SQLException;
>> +    }
>> +
>> +    /** */
>> +    public void testDataStoreConnectionThrows() {
>> +        if (!(isDataStoreConnectionSupported() && isSQLSupported 
>> ())) {
>> +            printUnsupportedOptionalFeatureNotTested(
>> +                    this.getClass().getName(),
>> +                    "getDataStoreConnection AND SQLSupported.");
>> +            return;
>> +        }
>> +        JDOConnection jconn = getPM().getDataStoreConnection();
>> +        Connection conn = (Connection)jconn.getNativeConnection();
>> +        check13Methods(conn);
>> +        if (isJRE14orBetter()) {
>> +            check14Methods(conn);
>> +        }
>> +        jconn.close();
>> +        failOnError();
>> +    }
>> +
>> +   /** +    * These methods are defined in Java 1.3 Connection.
>> +    */
>> +    protected void check13Methods(Connection conn) {
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return "commit";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {conn.commit();}
>> +                }
>> +            );
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return "rollback";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {conn.rollback();}
>> +                }
>> +            );
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return  
>> "setTransactionIsolation";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {
>> +                        conn.setTransactionIsolation(
>> +                                 
>> Connection.TRANSACTION_READ_COMMITTED);}
>> +                }
>> +            );
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return  
>> "setAutoCommit";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {conn.setAutoCommit 
>> (true);}
>> +                }
>> +            );
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return "setCatalog";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {conn.setCatalog 
>> ("NONE");}
>> +                }
>> +            );
>> +    }
>> +
>> +    /**
>> +     * These methods are defined in Java 1.4 Connection.
>> +     */
>> +    protected void check14Methods(Connection conn) {
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return "setSavepoint";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {conn.setSavepoint();}
>> +                }
>> +            );
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return  
>> "releaseSavepoint";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {conn.releaseSavepoint 
>> (null);}
>> +                }
>> +            );
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return  
>> "setHoldability";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {
>> +                        conn.setHoldability(
>> +                                ResultSet.CLOSE_CURSORS_AT_COMMIT);}
>> +                }
>> +            );
>> +        checkThrow(conn,
>> +                new Call() {
>> +                    public String getName() {return "setTypeMap";}
>> +                    public void execute(Connection conn)  
>> +                        throws SQLException {conn.setTypeMap(new  
>> HashMap());}
>> +                }
>> +            );
>> +     }
>> +}
>>
>>
>
>
> -- 
> Michael Bouschen		Tech@Spree Engineering GmbH
> mailto:mbo.tech@spree.de	http://www.tech.spree.de/
> Tel.:++49/30/235 520-33		Buelowstr. 66			
> Fax.:++49/30/2175 2012		D-10783 Berlin			
>

Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:Craig.Russell@sun.com
P.S. A good JDO? O, Gasp!