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!