You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2009/03/30 19:21:58 UTC
svn commit: r760056 - in /openjpa/trunk:
openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/
openjpa-kernel/src/main/resources...
Author: jrbauer
Date: Mon Mar 30 17:21:57 2009
New Revision: 760056
URL: http://svn.apache.org/viewvc?rev=760056&view=rev
Log:
OPENJPA-990 Committing code and test updates contributed by Donald Woods
Modified:
openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryTimeout.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties?rev=760056&r1=760055&r2=760056&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties Mon Mar 30 17:21:57 2009
@@ -186,4 +186,6 @@
long-seq-name: Sequence name "{0}" is {1}-character long. The database allows \
maximum {2}-character for a sequence name.
null-blob-in-not-nullable: Can not set null value on column "{0}" \
- because the corresponding field is set to be non-nullable.
\ No newline at end of file
+ because the corresponding field is set to be non-nullable.
+invalid-timeout: An invalid timeout of {0} milliseconds was ignored. \
+ Expected a value that is greater than or equal to zero.
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java?rev=760056&r1=760055&r2=760056&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java Mon Mar 30 17:21:57 2009
@@ -423,8 +423,14 @@
public FetchConfiguration setLockTimeout(int timeout) {
if (timeout == DEFAULT && _state.ctx != null)
_state.lockTimeout = _state.ctx.getConfiguration().getLockTimeout();
- else if (timeout != DEFAULT)
- _state.lockTimeout = timeout;
+ else if (timeout != DEFAULT) {
+ if (timeout < -1) {
+ throw new IllegalArgumentException(_loc.get("invalid-timeout",
+ timeout).getMessage());
+ } else {
+ _state.lockTimeout = timeout;
+ }
+ }
return this;
}
@@ -434,9 +440,16 @@
public FetchConfiguration setQueryTimeout(int timeout) {
if (timeout == DEFAULT && _state.ctx != null)
- _state.queryTimeout = _state.ctx.getConfiguration().getQueryTimeout();
- else if (timeout != DEFAULT)
- _state.queryTimeout = timeout;
+ _state.queryTimeout = _state.ctx.getConfiguration().
+ getQueryTimeout();
+ else if (timeout != DEFAULT) {
+ if (timeout < -1) {
+ throw new IllegalArgumentException(_loc.get("invalid-timeout",
+ timeout).getMessage());
+ } else {
+ _state.queryTimeout = timeout;
+ }
+ }
return this;
}
Modified: openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties?rev=760056&r1=760055&r2=760056&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties (original)
+++ openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties Mon Mar 30 17:21:57 2009
@@ -406,4 +406,6 @@
bound parameters with following values "{3}". This can happen if you have \
declared but missed to bind values for one or more parameters.
query-execution-error: Failed to execute query "{0}". Check the query syntax \
- for correctness. See nested exception for details.
\ No newline at end of file
+ for correctness. See nested exception for details.
+invalid-timeout: An invalid timeout of {0} milliseconds was ignored. \
+ Expected a value that is greater than or equal to -1.
Modified: openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties?rev=760056&r1=760055&r2=760056&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties (original)
+++ openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties Mon Mar 30 17:21:57 2009
@@ -75,5 +75,3 @@
abstract class "{0}".
query-failed: A query statement timeout has occurred.
query-timeout: A query statement timeout (set to {0} milliseconds) has occurred.
-invalid-timeout: An invalid timeout of {0} milliseconds was ignored. \
- Expected a value that is greater than or equal to zero.
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java?rev=760056&r1=760055&r2=760056&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java Mon Mar 30 17:21:57 2009
@@ -142,6 +142,24 @@
assertEquals(5671, query.getFetchPlan().getLockTimeout());
assertEquals(7500, query.getFetchPlan().getQueryTimeout());
}
+
+ public void testInvalidLockTimeoutHint() {
+ try {
+ query.setHint("javax.persistence.lock.timeout", -5671);
+ fail("Expected setHint to fail with an IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
+
+ public void testInvalidQueryTimeoutHint() {
+ try {
+ query.setHint("javax.persistence.query.timeout", -7500);
+ fail("Expected setHint to fail with an IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
public void testParts() {
HintHandler.HintKeyComparator test = new HintHandler.HintKeyComparator();
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryTimeout.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryTimeout.java?rev=760056&r1=760055&r2=760056&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryTimeout.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryTimeout.java Mon Mar 30 17:21:57 2009
@@ -59,8 +59,9 @@
* b) getSingleResult()
* c) executeUpdate()
* Other behaviors to test for:
- * 4) Setting timeout to < 0 should be treated as no timeout supplied
- * 5) Updates after EM.find()/findAll() are not affected by query timeout
+ * 4) Setting timeout to -1 should be treated as no timeout supplied
+ * 5) Setting timeout to < -1 should throw an IllegalArgumentExpection
+ * 6) Updates after EM.find()/findAll() are not affected by query timeout
* Exception generation to test for:
* If the DB query timeout does not cause a transaction rollback, then a
* QueryTimeoutException should be thrown.
@@ -222,7 +223,8 @@
try {
em = emf.createEntityManager();
assertNotNull(em);
- Query q = em.createQuery("UPDATE QTimeout q SET q.stringField = :strVal WHERE q.id = 1");
+ Query q = em.createQuery("UPDATE QTimeout q SET q.stringField = " +
+ ":strVal WHERE q.id = 1");
q.setParameter("strVal", new String("updated"));
// verify no default javax.persistence.query.timeout is supplied
Map<String, Object> hints = q.getHints();
@@ -341,8 +343,8 @@
List results = q.getResultList();
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
- getLog().trace("testQueryTimeout22a() - Hint0msec runTime msecs="
- + runTime);
+ getLog().trace("testQueryTimeout22a() - Hint0msec runTime " +
+ "msecs=" + runTime);
// Hack - Windows sometimes returns 5999 instead of 6000+
assertTrue("Should have taken 6+ secs, but was msecs=" +
runTime, runTime > 5900);
@@ -422,7 +424,8 @@
if (skipTests) {
return;
}
- getLog().trace("testQueryTimeout31c() - PU(timeout=1000), executeUpdate timeout");
+ getLog().trace("testQueryTimeout31c() - PU(timeout=1000), " +
+ "executeUpdate timeout");
OpenJPAEntityManagerFactory emf = null;
OpenJPAEntityManager em = null;
Integer setTime = new Integer(1000);
@@ -440,7 +443,8 @@
// create EM and Query
em = emf.createEntityManager();
assertNotNull(em);
- OpenJPAQuery q = em.createNativeQuery("UPDATE QTimeout SET stringField = ? WHERE mod(DELAY(2,id),2)=0");
+ OpenJPAQuery q = em.createNativeQuery("UPDATE QTimeout SET " +
+ "stringField = ? WHERE mod(DELAY(2,id),2)=0");
q.setParameter(1, new String("updated"));
// verify no default javax.persistence.query.timeout is supplied
Map<String, Object> hints = q.getHints();
@@ -457,8 +461,8 @@
em.getTransaction().commit();
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
- getLog().trace("testQueryTimeout31c() - executeUpdate runTime " +
- "msecs=" + runTime);
+ getLog().trace("testQueryTimeout31c() - executeUpdate " +
+ "runTime msecs=" + runTime);
fail("QueryTimeout for executeUpdate failed to cause an " +
"Exception in testQueryTimeout31c(" + setTime +
" mscs), runTime msecs=" + runTime);
@@ -485,7 +489,8 @@
if (skipTests) {
return;
}
- getLog().trace("testQueryTimeout32a() - PU(1000), Map(0), QueryHint(1000)");
+ getLog().trace("testQueryTimeout32a() - PU(1000), Map(0), " +
+ "QueryHint(1000)");
OpenJPAEntityManagerFactory emf = null;
OpenJPAEntityManager em = null;
Integer setTime = new Integer(0);
@@ -587,7 +592,8 @@
getLog().trace(
"testQueryTimeout33b() - NoHintSingle runTime msecs="
+ runTime);
- //assertNull("Should never get valid result due to the timeout.", result);
+ //assertNull("Should never get valid result due to the timeout."
+ // , result);
fail("QueryTimeout annotation failed to cause an Exception " +
"in testQueryTimeout33b(" + setTime +
" mscs), runTime msecs=" + runTime);
@@ -612,7 +618,8 @@
if (skipTests) {
return;
}
- getLog().trace("testQueryTimeout33c() - PU(timeout=0), setHint(1000), executeUpdate timeout");
+ getLog().trace("testQueryTimeout33c() - PU(timeout=0), setHint(1000)," +
+ " executeUpdate timeout");
OpenJPAEntityManagerFactory emf = null;
OpenJPAEntityManager em = null;
Integer setTime = new Integer(0);
@@ -631,13 +638,16 @@
em = emf.createEntityManager();
assertNotNull(em);
// Following fails to cause a SQLException, but takes 2+ secs
- // Query q = em.createQuery("UPDATE QTimeout q SET q.stringField = :strVal WHERE q.id > 0");
+ // Query q = em.createQuery("UPDATE QTimeout q SET q.stringField =
+ // + ":strVal WHERE q.id > 0");
// q.setParameter("strVal", new String("updated"));
// Following fails to cause a SQLException, but takes 2+ secs
- // Query q = em.createNativeQuery("INSERT INTO QTimeout (id, stringField) VALUES (?,?)");
+ // Query q = em.createNativeQuery("INSERT INTO QTimeout (id, " +
+ // "stringField) VALUES (?,?)");
// q.setParameter(1, 99);
// q.setParameter(2, new String("inserted"));
- OpenJPAQuery q = em.createNativeQuery("UPDATE QTimeout SET stringField = ? WHERE mod(DELAY(2,id),2)=0");
+ OpenJPAQuery q = em.createNativeQuery("UPDATE QTimeout SET " +
+ "stringField = ? WHERE mod(DELAY(2,id),2)=0");
q.setParameter(1, new String("updated"));
// verify no default javax.persistence.query.timeout is supplied
Map<String, Object> hints = q.getHints();
@@ -663,8 +673,8 @@
em.getTransaction().commit();
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
- getLog().trace("testQueryTimeout33c() - executeUpdate runTime " +
- "msecs=" + runTime);
+ getLog().trace("testQueryTimeout33c() - executeUpdate " +
+ "runTime msecs=" + runTime);
fail("QueryTimeout for executeUpdate failed to cause an " +
"Exception in testQueryTimeout33c(" + setTime +
" mscs), runTime msecs=" + runTime);
@@ -682,8 +692,8 @@
}
/**
- * Scenario being tested: 4) Timeouts < 0 are ignored and treated as the
- * default no timeout scenario.
+ * Scenario being tested: 4) Timeout of -1 should be treated the same
+ * as the default no timeout scenario.
* Expected Results: The DELAY function is being called and the query
* takes 2000+ msecs to complete.
*/
@@ -691,7 +701,7 @@
if (skipTests) {
return;
}
- Integer setTime = new Integer(-2000);
+ Integer setTime = new Integer(-1);
getLog().trace("testQueryTimeout4() - setHint(" + setTime + ")");
EntityManager em = null;
try {
@@ -703,7 +713,7 @@
Map<String, Object> hints = q.getHints();
assertFalse(hints.containsKey("javax.persistence.query.timeout"));
- // update the timeout value to -2000 and verify it was set
+ // update the timeout value to -1 and verify it was set
getLog().trace("testQueryTimeout4() - Setting hint " +
"javax.persistence.query.timeout="
+ setTime);
@@ -740,16 +750,55 @@
}
/**
- * Scenario being tested: 5) PU Query timeout hints do not affect EM
+ * Scenario being tested: 5) Setting timeout to < -1 should throw an
+ * IllegalArgumentExpection
+ * Expected Results: IllegalArgumentException
+ */
+ public void testQueryTimeout5() {
+ if (skipTests) {
+ return;
+ }
+ Integer setTime = new Integer(-2000);
+ getLog().trace("testQueryTimeout5() - setHint(" + setTime + ")");
+ EntityManager em = null;
+ try {
+ em = emf.createEntityManager();
+ assertNotNull(em);
+ Query q = em.createNamedQuery("NoHintSingle");
+
+ // verify no default javax.persistence.query.timeout is supplied
+ Map<String, Object> hints = q.getHints();
+ assertFalse(hints.containsKey("javax.persistence.query.timeout"));
+
+ // update the timeout value to -2000 and verify it was set
+ getLog().trace("testQueryTimeout5() - Setting hint " +
+ "javax.persistence.query.timeout="
+ + setTime);
+ q.setHint("javax.persistence.query.timeout", setTime);
+ fail("Expected testQueryTimeout5() to throw a " +
+ "IllegalArgumentException");
+ } catch (Exception e) {
+ // expected - setHint(-2000) should cause an IllegalArgumentException
+ checkException("testQueryTimeout5()", e,
+ IllegalArgumentException.class, "Invalid value" );
+ } finally {
+ if ((em != null) && em.isOpen()) {
+ em.close();
+ }
+ }
+ }
+
+ /**
+ * Scenario being tested: 6) PU Query timeout hints do not affect EM
* operations like updating Entities returned by EM.find()/findAll()
* Expected Results: The DELAY function is being called and the update
* takes 2000+ msecs to complete.
*/
- public void testQueryTimeout5() {
+ public void testQueryTimeout6() {
if (skipTests) {
return;
}
- getLog().trace("testQueryTimeout5() - No EM.find() update timeout");
+ getLog().trace("testQueryTimeout6() - No EM.find() update timeout");
OpenJPAEntityManagerFactory emf = null;
OpenJPAEntityManager em = null;
Integer setTime = new Integer(1000);
@@ -777,7 +826,7 @@
em.getTransaction().commit();
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
- getLog().trace("testQueryTimeout1d() - EM find/update runTime" +
+ getLog().trace("testQueryTimeout6() - EM find/update runTime" +
" msecs=" + runTime);
// Hack - Windows sometimes returns 1999 instead of 2000+
assertTrue("Should have taken 2+ secs, but was msecs=" +
@@ -789,7 +838,7 @@
} catch (Exception e) {
// setting a timeout property via PU or Map shouldn't cause a
// timeout exception
- fail("Unexpected testQueryTimeout5() exception = " + e);
+ fail("Unexpected testQueryTimeout6() exception = " + e);
}
} finally {
if ((em != null) && em.isOpen()) {
@@ -857,10 +906,11 @@
* @param e
*/
private void checkException(String test, Exception e) {
+ String eStr = new String("query statement timeout");
// no easy way to determine exact Exception type for all DBs
assertTrue(test + " - UNEXPECTED Exception = " + e,
- matchesExpectedException(QueryTimeoutException.class, e) ||
- matchesExpectedException(PersistenceException.class, e));
+ matchesExpectedException(QueryTimeoutException.class, e, eStr) ||
+ matchesExpectedException(PersistenceException.class, e, eStr));
getLog().trace(test + " - Caught expected Exception = " + e);
}
@@ -868,21 +918,38 @@
* Internal convenience method for checking that the given Exception matches
* the expected type.
*
+ * @param test case name
+ * @param tested exception type
+ * @param expected exception type
+ * @param eStr an optional substring to match in the exception text
+ */
+ private void checkException(String test, Exception tested, Class expected,
+ String eStr) {
+ assertTrue(test + " - UNEXPECTED Exception = " + tested,
+ matchesExpectedException(expected, tested, eStr));
+ getLog().trace(test + " - Caught expected Exception = " + tested);
+ }
+
+ /**
+ * Internal convenience method for checking that the given Exception matches
+ * the expected type.
+ *
* @param expected
* @param tested
- * @return
+ * @param eStr an optional substring to match in the exception text
+ * @return true if the exception matched, false otherwise
*/
private boolean matchesExpectedException(Class<?> expected,
- Exception tested) {
+ Exception tested, String eStr) {
assertNotNull(expected);
boolean exMatched = false;
if (tested != null) {
Class<?> testExClass = tested.getClass();
exMatched = expected.isAssignableFrom(testExClass);
- if (exMatched) {
+ if (exMatched && eStr != null) {
// make sure it is our expected exception text from
// localizer.properties
- exMatched = (tested.getMessage().indexOf("query statement timeout") != -1);
+ exMatched = (tested.getMessage().indexOf(eStr) != -1);
}
}
return exMatched;