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 2018/02/07 18:26:55 UTC

[isis] branch maint-1.16.1 updated: ISIS-1569: ensures that transaction CommandExecutorService is run in a xactn with the command to be executed as the context of that xactn.

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch maint-1.16.1
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/maint-1.16.1 by this push:
     new 0b249c8  ISIS-1569: ensures that transaction CommandExecutorService is run in a xactn with the command to be executed as the context of that xactn.
0b249c8 is described below

commit 0b249c8d90120cc5b2f44855d577973f818b2d34
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Feb 7 18:26:44 2018 +0000

    ISIS-1569: ensures that transaction CommandExecutorService is run in a xactn with the command to be executed as the context of that xactn.
    
    To support this, extends TransactionService3 API.
---
 .../applib/services/xactn/TransactionService3.java | 14 ++++++++++
 .../PersistenceSessionServiceInternal.java         |  4 +++
 .../PersistenceSessionServiceInternalNoop.java     |  6 +++++
 .../services/xactn/TransactionServiceDefault.java  | 15 +++++++++--
 .../background/CommandExecutionAbstract.java       |  2 +-
 .../background/CommandExecutorServiceDefault.java  | 30 +++++++++++++---------
 .../PersistenceSessionServiceInternalDefault.java  |  8 +++++-
 7 files changed, 63 insertions(+), 16 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService3.java b/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService3.java
index c8683ba..58fdd92 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService3.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionService3.java
@@ -20,6 +20,8 @@
 package org.apache.isis.applib.services.xactn;
 
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
 
 public interface TransactionService3 extends TransactionService2 {
 
@@ -66,6 +68,18 @@ public interface TransactionService3 extends TransactionService2 {
     @Programmatic
     void nextTransaction(Policy policy);
 
+    /**
+     * If the current transaction does not use the specified {@link Command} as its
+     * {@link CommandContext#getCommand() command context}, then commit and start a new one.
+     * @param command
+     */
+    void nextTransaction(Command command);
+
+    /**
+     * As per {@link #nextTransaction(Policy)} and {@link #nextTransaction(Command)}.
+     */
+    void nextTransaction(Policy policy, Command command);
+
     public enum Policy {
         UNLESS_MARKED_FOR_ABORT,
         ALWAYS
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
index 4d9908b..09107b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
@@ -22,6 +22,7 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService2;
+import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.xactn.Transaction2;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -93,6 +94,9 @@ public interface PersistenceSessionServiceInternal extends AdapterManager {
     @Programmatic
     void beginTran();
 
+    @Programmatic
+    void beginTran(final Command commandIfAny);
+
     /**
      * Provided by <tt>TransactionManager</tt> when used by framework.
      *
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java
index 77ac9dd..05454f8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternalNoop.java
@@ -25,6 +25,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService2;
+import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.xactn.Transaction2;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -116,6 +117,11 @@ public class PersistenceSessionServiceInternalNoop implements PersistenceSession
     }
 
     @Override
+    public void beginTran(final Command commandIfAny) {
+        throw new UnsupportedOperationException("Not supported by this implementation of PersistenceSessionServiceInternal");
+    }
+
+    @Override
     public boolean flush() {
         throw new UnsupportedOperationException("Not supported by this implementation of PersistenceSessionServiceInternal");
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/xactn/TransactionServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/xactn/TransactionServiceDefault.java
index 68b1fb4..59946d5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/xactn/TransactionServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/xactn/TransactionServiceDefault.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.services.xactn;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.xactn.Transaction2;
 import org.apache.isis.applib.services.xactn.TransactionService3;
 import org.apache.isis.applib.services.xactn.TransactionState;
@@ -41,11 +42,21 @@ public class TransactionServiceDefault implements TransactionService3 {
 
     @Override
     public void nextTransaction() {
-        nextTransaction(TransactionService3.Policy.UNLESS_MARKED_FOR_ABORT);
+        nextTransaction((Command)null);
+    }
+
+    @Override
+    public void nextTransaction(final Command command) {
+        nextTransaction(TransactionService3.Policy.UNLESS_MARKED_FOR_ABORT, command);
     }
 
     @Override
     public void nextTransaction(TransactionService3.Policy policy) {
+        nextTransaction(policy, null);
+    }
+
+    @Override
+    public void nextTransaction(TransactionService3.Policy policy, final Command commandIfAny) {
         final TransactionState transactionState = getTransactionState();
         switch (transactionState) {
         case NONE:
@@ -69,7 +80,7 @@ public class TransactionServiceDefault implements TransactionService3 {
             break;
         }
 
-        persistenceSessionServiceInternal.beginTran();
+        persistenceSessionServiceInternal.beginTran(commandIfAny);
     }
 
     @Override
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java
index 3f1fffc..e12a154 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java
@@ -50,7 +50,7 @@ public abstract class CommandExecutionAbstract extends AbstractIsisSessionTempla
             final IsisTransactionManager transactionManager,
             final CommandWithDto commandWithDto) {
 
-        transactionManager.startTransaction();
+        transactionManager.startTransaction(commandWithDto);
 
         // the executor service will handle any exceptions thrown.
         commandExecutorService.executeCommand(sudoPolicy, commandWithDto);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java
index c46f738..63737b5 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java
@@ -35,11 +35,11 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService2;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.applib.services.command.CommandExecutorService;
 import org.apache.isis.applib.services.command.CommandWithDto;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionContext;
-import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.applib.services.xactn.Transaction2;
 import org.apache.isis.applib.services.xactn.TransactionService3;
@@ -84,8 +84,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
             final CommandExecutorService.SudoPolicy sudoPolicy,
             final CommandWithDto commandWithDto) {
 
-        // make sure that the service has been called with a 'in progress' transaction already set up
-        ensureTransactionInProgress();
+        ensureTransactionInProgressWithContext(commandWithDto);
 
         switch (sudoPolicy) {
         case NO_SWITCH:
@@ -108,6 +107,17 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
         ensureTransactionInProgress();
     }
 
+    private void ensureTransactionInProgressWithContext(final Command command) {
+
+        ensureTransactionInProgress();
+
+        // check the required command is used as the context.
+        // this will ensure that any audit entries also inherit from this existing command.
+        if(commandContext.getCommand() != command) {
+            transactionService.nextTransaction(command);
+        }
+    }
+
     private void ensureTransactionInProgress() {
         final Transaction2 currentTransaction = transactionService.currentTransaction();
         if(currentTransaction == null) {
@@ -139,17 +149,13 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
             // Therefore instead we copy down from the backgroundInteraction (similar to how we populate the
             // completedAt at the end)
             final Interaction.Execution priorExecution = interaction.getPriorExecution();
+            final Interaction.Execution currentExecution = interaction.getCurrentExecution();
 
-            final Timestamp startedAt = priorExecution != null
+            final Timestamp startedAt = currentExecution != null
                     ? priorExecution.getStartedAt()
                     : clockService.nowAsJavaSqlTimestamp();
-            final Timestamp completedAt =
-                    priorExecution != null
-                            ? priorExecution.getCompletedAt()
-                            : clockService.nowAsJavaSqlTimestamp();  // close enough...
 
             commandWithDto.setStartedAt(startedAt);
-            commandWithDto.setCompletedAt(completedAt);
 
             final CommandDto dto = commandWithDto.asDto();
 
@@ -408,9 +414,6 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
     BookmarkService2 bookmarkService;
 
     @javax.inject.Inject
-    JaxbService jaxbService;
-
-    @javax.inject.Inject
     InteractionContext interactionContext;
 
     @javax.inject.Inject
@@ -422,4 +425,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
     @javax.inject.Inject
     TransactionService3 transactionService;
 
+    @javax.inject.Inject
+    CommandContext commandContext;
+
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
index d29662c..d2dfeed 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService2;
+import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.xactn.Transaction2;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -148,7 +149,12 @@ public class PersistenceSessionServiceInternalDefault implements PersistenceSess
 
     @Override
     public void beginTran() {
-        getTransactionManager().startTransaction();
+        beginTran(null);
+    }
+
+    @Override
+    public void beginTran(final Command commandIfAny) {
+        getTransactionManager().startTransaction(commandIfAny);
     }
 
     @Override

-- 
To stop receiving notification emails like this one, please contact
danhaywood@apache.org.