You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/05/08 09:14:18 UTC

git commit: ISIS-769: precommit and commit

Repository: isis
Updated Branches:
  refs/heads/ISIS-769 [created] a51496d3f


ISIS-769: precommit and commit

1. First the precommit commits any outstanding updates for configured applib services.
2. Then the JDO commit is performed.
3. Then the IsisTransaction state is set to committed.

Previously the order was 1, 3, 2.  Any exception in the JDO commit would then cause things to get out of whack; see http://isis.markmail.org/thread/anln67ohbvkx4r4s .


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

Branch: refs/heads/ISIS-769
Commit: a51496d3fc91a5cec10a99b7ff9acb214f289098
Parents: 31acb0f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue May 6 08:50:46 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue May 6 08:50:46 2014 +0100

----------------------------------------------------------------------
 .../system/transaction/IsisTransaction.java     | 65 +++++++++++++-------
 .../transaction/IsisTransactionManager.java     | 13 +++-
 .../system/transaction/IsisTransactionTest.java | 20 ++++++
 .../webapp/src/main/resources/webapp/realm1.ini |  2 +-
 .../webapp/src/main/resources/webapp/realm2.ini |  2 +-
 5 files changed, 78 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a51496d3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index a60f64f..c402c61 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -705,16 +705,15 @@ public class IsisTransaction implements TransactionScopedComponent {
 
     
     // ////////////////////////////////////////////////////////////////
-    // commit
+    // preCommit, commit
     // ////////////////////////////////////////////////////////////////
 
-    public synchronized final void commit() {
-
+    synchronized void preCommit() {
         ensureThatState(getState().canCommit(), is(true), "state is: " + getState());
         ensureThatState(abortCause, is(nullValue()), "cannot commit: an abort cause has been set");
 
         if (LOG.isDebugEnabled()) {
-            LOG.debug("commit transaction " + this);
+            LOG.debug("preCommit transaction " + this);
         }
 
         if (getState() == State.COMMITTED) {
@@ -723,24 +722,9 @@ public class IsisTransaction implements TransactionScopedComponent {
             }
             return;
         }
-        
 
         try {
-            doAudit(getChangedObjectProperties());
-            
-            final String currentUser = getTransactionManager().getAuthenticationSession().getUserName();
-            final Timestamp endTimestamp = Clock.getTimeAsJavaSqlTimestamp();
-            
-            publishActionIfRequired(currentUser, endTimestamp);
-            doFlush();
-            
-            publishedChangedObjectsIfRequired(currentUser, endTimestamp);
-            doFlush();
-            
-            closeServices();
-            doFlush();
-            
-            setState(State.COMMITTED);
+            preCommitServices();
         } catch (final RuntimeException ex) {
             setAbortCause(new IsisTransactionManagerException(ex));
             clearCommandServiceIfConfigured();
@@ -748,7 +732,23 @@ public class IsisTransaction implements TransactionScopedComponent {
         }
     }
 
-    
+
+    private void preCommitServices() {
+        doAudit(getChangedObjectProperties());
+        
+        final String currentUser = getTransactionManager().getAuthenticationSession().getUserName();
+        final Timestamp endTimestamp = Clock.getTimeAsJavaSqlTimestamp();
+        
+        publishActionIfRequired(currentUser, endTimestamp);
+        doFlush();
+        
+        publishedChangedObjectsIfRequired(currentUser, endTimestamp);
+        doFlush();
+        
+        closeServices();
+        doFlush();
+    }
+
     private void clearCommandServiceIfConfigured() {
         completeCommandIfConfigured();
     }
@@ -788,6 +788,29 @@ public class IsisTransaction implements TransactionScopedComponent {
         }
     }
 
+
+    // ////////////////////////////////////////////////////////////////
+
+    public synchronized void commit() {
+        ensureThatState(getState().canCommit(), is(true), "state is: " + getState());
+        ensureThatState(abortCause, is(nullValue()), "cannot commit: an abort cause has been set");
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("postCommit transaction " + this);
+        }
+
+        if (getState() == State.COMMITTED) {
+            if (LOG.isInfoEnabled()) {
+                LOG.info("already committed; ignoring");
+            }
+            return;
+        }
+
+        setState(State.COMMITTED);
+    }
+
+
+    
     // ////////////////////////////////////////////////////////////////
     // markAsAborted
     // ////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/a51496d3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
index 6c867ff..1ac5b64 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
@@ -380,7 +380,7 @@ public class IsisTransactionManager implements SessionScopedComponent {
             if(abortCause == null) {
                 
                 try {
-                    getTransaction().commit();
+                    getTransaction().preCommit();
                 } catch(RuntimeException ex) {
                     // just in case any new exception was raised...
                     abortCause = ex;
@@ -400,7 +400,18 @@ public class IsisTransactionManager implements SessionScopedComponent {
                     getTransaction().setAbortCause(new IsisTransactionManagerException(ex));
                 }
             }
+
+            if(abortCause == null) {
+                try {
+                    getTransaction().commit();
+                } catch(RuntimeException ex) {
+                    // just in case any new exception was raised...
+                    abortCause = ex;
+                    transactionLevel = 1; // because the transactionLevel was decremented earlier
+                }
+            }
             
+
             if(abortCause != null) {
                 
                 if (LOG.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/a51496d3/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
index e8484d7..543f1b8 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
@@ -277,6 +277,8 @@ public class IsisTransactionTest {
         
         transaction.addCommand(command);
         transaction.addCommand(command2);
+        
+        transaction.preCommit();
         transaction.commit();
     }
 
@@ -298,6 +300,8 @@ public class IsisTransactionTest {
         
         transaction.addCommand(command);
         transaction.addCommand(command2);
+
+        transaction.preCommit();
         transaction.commit();
     }
 
@@ -320,6 +324,8 @@ public class IsisTransactionTest {
         
         transaction.addCommand(command);
         transaction.addCommand(command2);
+
+        transaction.preCommit();
         transaction.commit();
     }
 
@@ -343,6 +349,8 @@ public class IsisTransactionTest {
         transaction.addCommand(command);
         transaction.addCommand(command2);
         transaction.addCommand(command3);
+
+        transaction.preCommit();
         transaction.commit();
     }
 
@@ -366,6 +374,8 @@ public class IsisTransactionTest {
         transaction.addCommand(command);
         transaction.addCommand(command2);
         transaction.addCommand(command3);
+
+        transaction.preCommit();
         transaction.commit();
     }
 
@@ -382,6 +392,8 @@ public class IsisTransactionTest {
             }
         });
 
+
+        transaction.preCommit();
         transaction.commit();
     }
 
@@ -397,6 +409,8 @@ public class IsisTransactionTest {
     public void shouldThrowExceptionIfAttemptToCommitAnAlreadyAbortedTransaction() throws Exception {
         transaction.markAsAborted();
 
+
+        transaction.preCommit();
         transaction.commit();
     }
 
@@ -412,6 +426,8 @@ public class IsisTransactionTest {
             }
         });
 
+
+        transaction.preCommit();
         transaction.commit();
 
         transaction.markAsAborted();
@@ -428,8 +444,12 @@ public class IsisTransactionTest {
                 oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList())));
             }
         });
+
+        transaction.preCommit();
         transaction.commit();
 
+
+        transaction.preCommit();
         transaction.commit();
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a51496d3/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm1.ini
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm1.ini b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm1.ini
index 3a98d2a..13246ad 100644
--- a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm1.ini
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm1.ini
@@ -63,6 +63,6 @@ user_role = *:ToDoItems:*:*,\
 analysis_role = *:ToDoItemAnalysis:*:*,\
             *:ToDoItemsByCategoryViewModel:*:*,\
             *:ToDoItemsByDateRangeViewModel:*:*
-self-install_role = *:ToDoItemsFixturesService:install:*
+self-install_role = *:ToDoItemsFixturesService:installFixtures:*
 admin_role = *
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a51496d3/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm2.ini
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm2.ini b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm2.ini
index 5bae28b..fd0ee8f 100644
--- a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm2.ini
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/resources/webapp/realm2.ini
@@ -61,6 +61,6 @@ user_role = *:ToDoItems:*:*,\
 analysis_role = *:ToDoItemAnalysis:*:*,\
             *:ToDoItemsByCategoryViewModel:*:*,\
             *:ToDoItemsByDateRangeViewModel:*:*
-self-install_role = *:ToDoItemsFixturesService:install:*
+self-install_role = *:ToDoItemsFixturesService:installFixtures:*
 admin_role = *