db-jdo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Bouschen <mbo.t...@spree.de>
Subject 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
Date Thu, 09 Mar 2006 22:45:03 GMT
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			


Mime
View raw message