Updated Branches:
  refs/heads/master 0be323f0d -> 12186266c

CAMEL-6144: Added support for optimistick locking in JDBC based aggregation 
repository.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/12186266
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/12186266
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/12186266

Branch: refs/heads/master
Commit: 12186266cef2b9fd627a99d7b191f07901d763b7
Parents: 0be323f
Author: Claus Ibsen <davscl...@apache.org>
Authored: Wed Jul 24 13:54:21 2013 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Wed Jul 24 13:54:21 2013 +0200

----------------------------------------------------------------------
 ...ultJdbcOptimisticLockingExceptionMapper.java | 28 ++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/12186266/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/DefaultJdbcOptimisticLockingExceptionMapper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/DefaultJdbcOptimisticLockingExceptionMapper.java
 
b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/DefaultJdbcOptimisticLockingExceptionMapper.java
index 805397f..ed3c8fb 100644
--- 
a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/DefaultJdbcOptimisticLockingExceptionMapper.java
+++ 
b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/DefaultJdbcOptimisticLockingExceptionMapper.java
@@ -16,17 +16,25 @@
  */
 package org.apache.camel.processor.aggregate.jdbc;
 
+import java.sql.SQLException;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
 import org.apache.camel.util.ObjectHelper;
+import org.springframework.dao.DataIntegrityViolationException;
 
 /**
  * A default {@link JdbcOptimisticLockingExceptionMapper} which checks the 
caused exception (and its nested)
- * whether any of them has <tt>ConstraintViolation</tt> in the class name. If 
there is such a class name
- * then {@link #isOptimisticLocking(Exception)} returns <tt>true</tt>.
+ * whether any of them is a constraint violation exception.
  * <p/>
+ * The following check is done:
+ * <ul>
+ *     <li>If the caused exception is an {@link SQLException}</li> then the 
SQLState is checked if starts with <tt>23</tt>.
+ *     <li>If the caused exception is a {@link 
DataIntegrityViolationException}</li>
+ *     <li>If the caused exception class name has 
<tt>ConstraintViolation</tt></li> in its name.
+ *     <li>optional checking for FQN class name matches if any class names has 
been configured</li>
+ * </ul>
  * In addition you can add FQN classnames using the {@link 
#addClassName(String)} or {@link #setClassNames(java.util.Set)}
  * methods. These class names is also matched. This allows to add vendor 
specific exception classes.
  */
@@ -38,6 +46,18 @@ public class DefaultJdbcOptimisticLockingExceptionMapper 
implements JdbcOptimist
     public boolean isOptimisticLocking(Exception cause) {
         Iterator<Throwable> it = ObjectHelper.createExceptionIterator(cause);
         while (it.hasNext()) {
+            // if its a SQL exception
+            if (it instanceof SQLException) {
+                SQLException se = (SQLException) it;
+                if (isConstraintViolation(se)) {
+                    return true;
+                }
+            }
+            if (it instanceof DataIntegrityViolationException) {
+                return true;
+            }
+
+            // fallback to names
             String name = it.next().getClass().getName();
             if (name.contains("ConstraintViolation") || hasClassName(name)) {
                 return true;
@@ -47,6 +67,10 @@ public class DefaultJdbcOptimisticLockingExceptionMapper 
implements JdbcOptimist
         return false;
     }
 
+    public static boolean isConstraintViolation(SQLException e) {
+        return e.getSQLState().startsWith("23");
+    }
+
     private boolean hasClassName(String name) {
         for (String className : classNames) {
             if (className.equals(name)) {

Reply via email to