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);
             }