You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2010/03/16 19:39:02 UTC
svn commit: r923928 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/
openjpa-persistence...
Author: ppoddar
Date: Tue Mar 16 18:39:02 2010
New Revision: 923928
URL: http://svn.apache.org/viewvc?rev=923928&view=rev
Log:
OPENJPA-1565: Raise correct Query/LockTimeout exception
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/InformixDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestTimeoutException.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java Tue Mar 16 18:39:02 2010
@@ -37,6 +37,7 @@ import org.apache.openjpa.kernel.Version
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.Exceptions;
import org.apache.openjpa.util.LockException;
+import org.apache.openjpa.util.StoreException;
/**
* Lock manager that uses exclusive database locks.
@@ -137,7 +138,10 @@ public class PessimisticLockManager
checkLock(rs, sm, timeout);
}
} catch (SQLException se) {
- throw SQLExceptions.getStore(se, Exceptions.toString(sm.getPersistenceCapable()), dict, level);
+ LockException e = new LockException(sm.getPersistenceCapable(), timeout, level);
+ e.setCause(se);
+ e.setFatal(dict.isFatalException(StoreException.LOCK, se));
+ throw e;
} finally {
if (stmnt != null)
try { stmnt.close(); } catch (SQLException se) {}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java Tue Mar 16 18:39:02 2010
@@ -923,7 +923,7 @@ public class DB2Dictionary
}
@Override
- protected boolean isFatalException(int subtype, SQLException ex) {
+ public boolean isFatalException(int subtype, SQLException ex) {
String errorState = ex.getSQLState();
int errorCode = ex.getErrorCode();
if (errorCode == -952 && "57014".equals(errorState))
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Tue Mar 16 18:39:02 2010
@@ -4862,7 +4862,7 @@ public class DBDictionary
*
* @return false if the error is fatal.
*/
- protected boolean isFatalException(int subtype, SQLException ex) {
+ public boolean isFatalException(int subtype, SQLException ex) {
return true;
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java Tue Mar 16 18:39:02 2010
@@ -143,7 +143,7 @@ public class DerbyDictionary
}
@Override
- protected boolean isFatalException(int subtype, SQLException ex) {
+ public boolean isFatalException(int subtype, SQLException ex) {
int errorCode = ex.getErrorCode();
if ((subtype == StoreException.LOCK ||
subtype == StoreException.QUERY) && errorCode <= 30000) {
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/InformixDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/InformixDictionary.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/InformixDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/InformixDictionary.java Tue Mar 16 18:39:02 2010
@@ -377,7 +377,7 @@ public class InformixDictionary
}
@Override
- protected boolean isFatalException(int subtype, SQLException ex) {
+ public boolean isFatalException(int subtype, SQLException ex) {
// SQL State of IX000 is a general purpose Informix error code
// category, so only return Boolean.TRUE if we match SQL Codes
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java Tue Mar 16 18:39:02 2010
@@ -423,7 +423,7 @@ public class MySQLDictionary
}
@Override
- protected boolean isFatalException(int subtype, SQLException ex) {
+ public boolean isFatalException(int subtype, SQLException ex) {
if ((subtype == StoreException.LOCK && ex.getErrorCode() == 1205)
||(subtype == StoreException.QUERY && ex.getErrorCode() == 1317)) {
return false;
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java Tue Mar 16 18:39:02 2010
@@ -1259,7 +1259,7 @@ public class OracleDictionary
}
@Override
- protected boolean isFatalException(int subtype, SQLException ex) {
+ public boolean isFatalException(int subtype, SQLException ex) {
String errorState = ex.getSQLState();
int errorCode = ex.getErrorCode();
if ((subtype == StoreException.LOCK)
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java Tue Mar 16 18:39:02 2010
@@ -281,10 +281,10 @@ public class SQLServerDictionary extends
}
@Override
- protected boolean isFatalException(int subtype, SQLException ex) {
+ public boolean isFatalException(int subtype, SQLException ex) {
String errorState = ex.getSQLState();
- if ((subtype == StoreException.LOCK && "1222".equals(errorState))
- ||(subtype == StoreException.QUERY && "HY008".equals(errorState)))
+ if ((subtype == StoreException.LOCK || subtype == StoreException.QUERY)
+ &&("1222".equals(errorState) || "HY008".equals(errorState)))
return false;
return super.isFatalException(subtype, ex);
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestTimeoutException.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestTimeoutException.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestTimeoutException.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestTimeoutException.java Tue Mar 16 18:39:02 2010
@@ -60,16 +60,12 @@ public class TestTimeoutException extend
query.setLockMode(LockModeType.PESSIMISTIC_WRITE);
long timeout = 1000;
query.setHint("javax.persistence.query.timeout", timeout);
- assertError(new Callable<Throwable>() {
- public Throwable call() throws Exception {
- try {
- query.getResultList();
- } catch (Throwable t) {
- return t;
- }
- return null;
- }
- }, QueryTimeoutException.class, timeout);
+ try {
+ query.getResultList();
+ fail("Expected " + QueryTimeoutException.class.getName());
+ } catch (Throwable t) {
+ assertError(t, QueryTimeoutException.class, timeout);
+ }
assertTrue(em2.getTransaction().isActive());
em2.getTransaction().rollback();
@@ -90,18 +86,14 @@ public class TestTimeoutException extend
em2.getTransaction().begin();
final Object entity2 = em2.find(entityClass, oid);
final long timeout = 1000;
- assertError(new Callable<Throwable>() {
- public Throwable call() throws Exception {
- try {
- Map<String,Object> hint = new HashMap<String, Object>();
- hint.put("javax.persistence.lock.timeout", timeout);
- em2.lock(entity2, LockModeType.PESSIMISTIC_WRITE, hint);
- } catch (Throwable t) {
- return t;
- }
- return null;
- }
- }, LockTimeoutException.class, timeout);
+ try {
+ Map<String,Object> hint = new HashMap<String, Object>();
+ hint.put("javax.persistence.lock.timeout", timeout);
+ em2.lock(entity2, LockModeType.PESSIMISTIC_WRITE, hint);
+ fail("Expected " + LockTimeoutException.class.getName());
+ } catch (Throwable t) {
+ assertError(t, LockTimeoutException.class, timeout);
+ }
assertTrue(em2.getTransaction().isActive());
em2.getTransaction().rollback();
@@ -125,22 +117,13 @@ public class TestTimeoutException extend
* @param t
* @param expeceted
*/
- void assertError(Callable<Throwable> task, Class<? extends Throwable> expected, long timeout) {
- try {
- Future<Throwable> future = scheduler.submit(task);
- Throwable error = future.get();
- if (error == null) {
- throw new AssertionFailedError("No exception was raised but expected " + expected.getName());
- } else if (!expected.isAssignableFrom(error.getClass())) {
- error.printStackTrace();
- throw new AssertionFailedError(error.getClass().getName() + " was raised but expected " +
+ void assertError(Throwable actual, Class<? extends Throwable> expected, long timeout) {
+ if (!expected.isAssignableFrom(actual.getClass())) {
+ actual.printStackTrace();
+ throw new AssertionFailedError(actual.getClass().getName() + " was raised but expected " +
expected.getName());
- }
- } catch (Throwable t) {
- t.printStackTrace();
- throw new AssertionFailedError(t.getClass().getName() + " was raised but expected " +
- expected.getName());
}
+
}
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java?rev=923928&r1=923927&r2=923928&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java Tue Mar 16 18:39:02 2010
@@ -165,12 +165,10 @@ public class PersistenceExceptions
e = new org.apache.openjpa.persistence.OptimisticLockException(msg, nested, failed, fatal);
} else if (subtype == StoreException.LOCK || cause instanceof LockException) {
LockException lockEx = (LockException) (ke instanceof LockException ? ke : cause);
- if (lockEx != null && lockEx.getLockLevel() >= MixedLockLevels.LOCK_PESSIMISTIC_READ) {
- if (!lockEx.isFatal()) {
- e = new org.apache.openjpa.persistence.LockTimeoutException(msg, nested, failed);
- } else {
- e = new org.apache.openjpa.persistence.PessimisticLockException(msg, nested, failed);
- }
+ if (!lockEx.isFatal()) {
+ e = new org.apache.openjpa.persistence.LockTimeoutException(msg, nested, failed);
+ } else if (lockEx != null && lockEx.getLockLevel() >= MixedLockLevels.LOCK_PESSIMISTIC_READ) {
+ e = new org.apache.openjpa.persistence.PessimisticLockException(msg, nested, failed);
} else {
e = new org.apache.openjpa.persistence.OptimisticLockException(msg, nested, failed, fatal);
}