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.