]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix for #7186 - it is now possible to continue using the SQLContainer after an Optimi...
authorJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Mon, 5 Sep 2011 11:19:34 +0000 (11:19 +0000)
committerJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Mon, 5 Sep 2011 11:19:34 +0000 (11:19 +0000)
svn changeset:20844/svn branch:6.7

src/com/vaadin/data/util/sqlcontainer/SQLContainer.java
tests/src/com/vaadin/tests/server/container/sqlcontainer/AllTests.java
tests/src/com/vaadin/tests/server/container/sqlcontainer/query/TableQueryTest.java

index 8d00d6f4953ad86190a990c2e6946318c5c3b97a..f25252b8c0cacaa2f82ab0a8251f82251003b887 100644 (file)
@@ -414,6 +414,17 @@ public class SQLContainer implements Container, Container.Filterable,
                             ee);
                 }
                 return false;
+            } catch (OptimisticLockException e) {
+                logger.log(Level.WARNING, "Failed to remove row, rolling back",
+                        e);
+                try {
+                    delegate.rollback();
+                } catch (SQLException ee) {
+                    /* Nothing can be done here */
+                    logger.log(Level.SEVERE, "Failed to rollback row removal",
+                            ee);
+                }
+                throw e;
             }
         } else {
             removedItems.put((RowId) itemId, (RowItem) getItem(itemId));
@@ -460,6 +471,16 @@ public class SQLContainer implements Container, Container.Filterable,
                     logger.log(Level.SEVERE, "Failed to roll back", ee);
                 }
                 return false;
+            } catch (OptimisticLockException e) {
+                logger.log(Level.WARNING,
+                        "removeAllItems() failed, rolling back", e);
+                try {
+                    delegate.rollback();
+                } catch (SQLException ee) {
+                    /* Nothing can be done here */
+                    logger.log(Level.SEVERE, "Failed to roll back", ee);
+                }
+                throw e;
             }
         } else {
             for (Object id : getItemIds()) {
@@ -891,6 +912,9 @@ public class SQLContainer implements Container, Container.Filterable,
         } catch (SQLException e) {
             delegate.rollback();
             throw e;
+        } catch (OptimisticLockException e) {
+            delegate.rollback();
+            throw e;
         }
     }
 
index f985fa2ad9ab3be1577f76c09d858d3cbb89eb40..5191fcc3413e3735a2889eebc8b1471c23b57292 100644 (file)
@@ -19,12 +19,11 @@ import com.vaadin.tests.server.container.sqlcontainer.query.TableQueryTest;
 
 @RunWith(Suite.class)
 @SuiteClasses({ SimpleJDBCConnectionPoolTest.class,
-        J2EEConnectionPoolTest.class, LikeTest.class,
-        QueryBuilderTest.class, FreeformQueryTest.class,
-        RowIdTest.class, SQLContainerTest.class,
+        J2EEConnectionPoolTest.class, LikeTest.class, QueryBuilderTest.class,
+        FreeformQueryTest.class, RowIdTest.class, SQLContainerTest.class,
         SQLContainerTableQueryTest.class, ColumnPropertyTest.class,
         TableQueryTest.class, SQLGeneratorsTest.class, UtilTest.class,
-        TicketTests.class, BetweenTest.class, ReadOnlyRowIdTest.class})
+        TicketTests.class, BetweenTest.class, ReadOnlyRowIdTest.class })
 public class AllTests {
     /* Set the DB used for testing here! */
     public enum DB {
@@ -83,7 +82,7 @@ public class AllTests {
             versionStatements = new String[] {
                     "create table VERSIONED (ID integer auto_increment not null, TEXT varchar(255), VERSION tinyint default 0, primary key(ID))",
                     "CREATE TRIGGER upd_version BEFORE UPDATE ON VERSIONED"
-                            + " FOR EACH ROW SET NEW.VERSION = @VERSION+1" };
+                            + " FOR EACH ROW SET NEW.VERSION = OLD.VERSION+1" };
             break;
         case POSTGRESQL:
             offset = 1;
index a3b2b20ffef21b88a65a80ede8712ee130d80ba3..d6f5ce1cbc32168362770e4f66efdff93d57a4cd 100644 (file)
@@ -616,4 +616,48 @@ public class TableQueryTest {
         container.commit();\r
     }\r
 \r
+    @Test\r
+    public void removeRow_throwsOptimisticLockException_shouldStillWork()\r
+            throws SQLException {\r
+        if (AllTests.db == AllTests.DB.HSQLDB) {\r
+            // HSQLDB doesn't support versioning, so this is to make the test\r
+            // green.\r
+            return;\r
+        }\r
+        DataGenerator.addVersionedData(connectionPool);\r
+\r
+        TableQuery tQuery = new TableQuery("versioned", connectionPool,\r
+                AllTests.sqlGen);\r
+        tQuery.setVersionColumn("VERSION");\r
+        SQLContainer container = new SQLContainer(tQuery);\r
+        RowItem row = (RowItem) container.getItem(container.firstItemId());\r
+        Assert.assertEquals("Junk", row.getItemProperty("TEXT").getValue());\r
+\r
+        // Update the version using another connection.\r
+        Connection conn = connectionPool.reserveConnection();\r
+        PreparedStatement stmt = conn\r
+                .prepareStatement("UPDATE VERSIONED SET \"TEXT\" = ? WHERE \"ID\" = ?");\r
+        stmt.setString(1, "asdf");\r
+        stmt.setObject(2, row.getItemProperty("ID").getValue());\r
+        stmt.executeUpdate();\r
+        stmt.close();\r
+        conn.commit();\r
+        connectionPool.releaseConnection(conn);\r
+\r
+        Object itemToRemove = container.firstItemId();\r
+        try {\r
+            container.removeItem(itemToRemove);\r
+            container.commit();\r
+        } catch (OptimisticLockException e) {\r
+            // This is expected, refresh and try again.\r
+            container.rollback();\r
+            container.removeItem(itemToRemove);\r
+            container.commit();\r
+        }\r
+        Object id = container.addItem();\r
+        RowItem item = (RowItem) container.getItem(id);\r
+        item.getItemProperty("TEXT").setValue("foo");\r
+        container.commit();\r
+    }\r
+\r
 }
\ No newline at end of file