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 2020/01/05 17:54:53 UTC
[isis] 01/04: ISIS-2254: adds events emitted by
IsisPlatformManagerForJdo
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 60a53b61baecbf51ce2f381e087b02aefd19f5e8
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Jan 5 15:51:06 2020 +0000
ISIS-2254: adds events emitted by IsisPlatformManagerForJdo
so can perform the necessary steps.
---
.../isis/metamodel/context/MetaModelContext.java | 4 +--
.../context/MetaModelContext_usingIoc.java | 3 +-
.../specloader/specimpl/ObjectActionDefault.java | 8 +++++
.../specimpl/OneToOneAssociationDefault.java | 8 +++++
.../IsisPlatformTransactionManagerForJdo.java | 26 ++++++++++++++-
.../handlers/DomainObjectInvocationHandler.java | 2 +-
.../events/TransactionAfterBeginEvent.java | 13 ++++++++
.../events/TransactionAfterCommitEvent.java | 14 ++++++++
.../events/TransactionAfterRollbackEvent.java | 14 ++++++++
.../events/TransactionBeforeBeginEvent.java | 11 +++++++
.../events/TransactionBeforeCommitEvent.java | 14 ++++++++
.../events/TransactionBeforeRollbackEvent.java | 14 ++++++++
.../events/TransactionEventAbstract.java | 38 ++++++++++++++++++++++
.../IsisIntegrationTestAbstract.java | 34 +++++++++++++++++++
14 files changed, 198 insertions(+), 5 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext.java
index e2ecb1d..ca84ccd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext.java
@@ -20,6 +20,7 @@ package org.apache.isis.metamodel.context;
import java.util.stream.Stream;
+import org.apache.isis.applib.services.command.CommandContext;
import org.apache.isis.applib.services.i18n.TranslationService;
import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -53,8 +54,7 @@ public interface MetaModelContext {
* Configuration 'beans' with meta-data (IDE-support).
*
* @see <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html">spring.io</a>
- * @apiNote should ultimately replace {@link #getConfigurationLegacy()}
- *
+ *
*/
IsisConfiguration getConfiguration();
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext_usingIoc.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext_usingIoc.java
index 1ce14d8..6f5a906 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext_usingIoc.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/context/MetaModelContext_usingIoc.java
@@ -23,6 +23,7 @@ import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.apache.isis.applib.services.command.CommandContext;
import org.apache.isis.applib.services.i18n.TranslationService;
import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -77,7 +78,7 @@ class MetaModelContext_usingIoc implements MetaModelContext {
private final SpecificationLoader specificationLoader =
getSingletonElseFail(SpecificationLoader.class);
- @Getter(lazy=true)
+ @Getter(lazy=true)
private final AuthenticationSessionProvider authenticationSessionProvider =
getSingletonElseFail(AuthenticationSessionProvider.class);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
index 5ea211f..f7bd86b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.RecoverableException;
import org.apache.isis.applib.annotation.SemanticsOf;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
import org.apache.isis.commons.collections.Can;
import org.apache.isis.commons.exceptions.UnknownTypeException;
import org.apache.isis.commons.internal._Constants;
@@ -614,6 +615,13 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
final ManagedObject targetAdapter,
final Can<ManagedObject> argumentAdapters) {
+ final CommandContext commandContext = getCommandContext();
+ final Command command = commandContext.getCommand();
+
+ if (command.getExecutor() != Command.Executor.USER) {
+ return;
+ }
+
setupCommandTarget(targetAdapter, argumentAdapters);
setupCommandMemberIdentifier();
setupCommandMementoAndExecutionContext(targetAdapter, argumentAdapters);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index 9cb2e8b..a8b380f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -23,6 +23,7 @@ import java.util.Collections;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
import org.apache.isis.commons.collections.Can;
import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.metamodel.commons.ToString;
@@ -311,6 +312,13 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
final ManagedObject targetAdapter,
final ManagedObject valueAdapterOrNull) {
+ final CommandContext commandContext = getCommandContext();
+ final Command command = commandContext.getCommand();
+
+ if (command.getExecutor() != Command.Executor.USER) {
+ return;
+ }
+
setupCommandTarget(targetAdapter, valueAdapterOrNull);
setupCommandMemberIdentifier();
setupCommandMementoAndExecutionContext(targetAdapter, valueAdapterOrNull);
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
index ee989f4..3e788bd 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPlatformTransactionManagerForJdo.java
@@ -31,10 +31,17 @@ import org.springframework.transaction.support.AbstractPlatformTransactionManage
import org.springframework.transaction.support.DefaultTransactionStatus;
import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.applib.services.eventbus.EventBusService;
import org.apache.isis.applib.services.registry.ServiceRegistry;
import org.apache.isis.runtime.persistence.session.PersistenceSession;
import org.apache.isis.runtime.persistence.transaction.IsisTransactionAspectSupport;
import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+import org.apache.isis.runtime.persistence.transaction.events.TransactionAfterBeginEvent;
+import org.apache.isis.runtime.persistence.transaction.events.TransactionAfterCommitEvent;
+import org.apache.isis.runtime.persistence.transaction.events.TransactionAfterRollbackEvent;
+import org.apache.isis.runtime.persistence.transaction.events.TransactionBeforeBeginEvent;
+import org.apache.isis.runtime.persistence.transaction.events.TransactionBeforeCommitEvent;
+import org.apache.isis.runtime.persistence.transaction.events.TransactionBeforeRollbackEvent;
import org.apache.isis.runtime.session.IsisSession;
import org.apache.isis.runtime.session.IsisSessionFactory;
import org.apache.isis.runtime.session.init.InitialisationSession;
@@ -51,15 +58,21 @@ import lombok.extern.log4j.Log4j2;
@Log4j2
public class IsisPlatformTransactionManagerForJdo extends AbstractPlatformTransactionManager {
+
private static final long serialVersionUID = 1L;
private final IsisSessionFactory isisSessionFactory;
private final ServiceRegistry serviceRegistry;
+ private final EventBusService eventBusService;
@Inject
- public IsisPlatformTransactionManagerForJdo(IsisSessionFactory isisSessionFactory, ServiceRegistry serviceRegistry) {
+ public IsisPlatformTransactionManagerForJdo(
+ final IsisSessionFactory isisSessionFactory,
+ final ServiceRegistry serviceRegistry,
+ final EventBusService eventBusService) {
this.isisSessionFactory = isisSessionFactory;
this.serviceRegistry = serviceRegistry;
+ this.eventBusService = eventBusService;
}
@Override
@@ -95,10 +108,13 @@ public class IsisPlatformTransactionManagerForJdo extends AbstractPlatformTransa
IsisTransactionObject txObject = (IsisTransactionObject) transaction;
log.debug("doBegin {}", definition);
+ eventBusService.post(new TransactionBeforeBeginEvent(txObject));
val tx = transactionManagerJdo().beginTransaction();
txObject.setCurrentTransaction(tx);
IsisTransactionAspectSupport.putTransactionObject(txObject);
+
+ eventBusService.post(new TransactionAfterBeginEvent(txObject));
}
@Override
@@ -106,8 +122,12 @@ public class IsisPlatformTransactionManagerForJdo extends AbstractPlatformTransa
IsisTransactionObject txObject = (IsisTransactionObject) status.getTransaction();
log.debug("doCommit {}", status);
+ eventBusService.post(new TransactionBeforeCommitEvent(txObject));
transactionManagerJdo().commitTransaction(txObject);
+
+ eventBusService.post(new TransactionAfterCommitEvent(txObject));
+
txObject.getCountDownLatch().countDown();
txObject.setCurrentTransaction(null);
IsisTransactionAspectSupport.clearTransactionObject();
@@ -118,8 +138,12 @@ public class IsisPlatformTransactionManagerForJdo extends AbstractPlatformTransa
IsisTransactionObject txObject = (IsisTransactionObject) status.getTransaction();
log.debug("doRollback {}", status);
+ eventBusService.post(new TransactionBeforeRollbackEvent(txObject));
transactionManagerJdo().abortTransaction(txObject);
+
+ eventBusService.post(new TransactionAfterRollbackEvent(txObject));
+
txObject.getCountDownLatch().countDown();
txObject.setCurrentTransaction(null);
IsisTransactionAspectSupport.clearTransactionObject();
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
index bb1b511..fa7286b 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -29,6 +29,7 @@ import java.util.function.Supplier;
import java.util.stream.Stream;
import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.command.Command;
import org.apache.isis.applib.services.wrapper.DisabledException;
import org.apache.isis.applib.services.wrapper.HiddenException;
import org.apache.isis.applib.services.wrapper.InteractionException;
@@ -244,7 +245,6 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
}
return handleActionMethod(actualTargetAdapter, args, actualObjectAction, contributeeMember);
-
}
throw new UnsupportedOperationException(String.format("Unknown member type '%s'", objectMember));
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterBeginEvent.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterBeginEvent.java
new file mode 100644
index 0000000..9152adc
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterBeginEvent.java
@@ -0,0 +1,13 @@
+package org.apache.isis.runtime.persistence.transaction.events;
+
+import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+
+import lombok.Getter;
+
+public class TransactionAfterBeginEvent extends TransactionEventAbstract {
+
+ public TransactionAfterBeginEvent(final IsisTransactionObject source) {
+ super(source, Type.AFTER_BEGIN);
+ }
+
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterCommitEvent.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterCommitEvent.java
new file mode 100644
index 0000000..b4b7498
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterCommitEvent.java
@@ -0,0 +1,14 @@
+package org.apache.isis.runtime.persistence.transaction.events;
+
+import java.util.EventObject;
+
+import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+
+import lombok.Getter;
+
+public class TransactionAfterCommitEvent extends TransactionEventAbstract {
+
+ public TransactionAfterCommitEvent(final IsisTransactionObject source) {
+ super(source, Type.AFTER_COMMIT);
+ }
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterRollbackEvent.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterRollbackEvent.java
new file mode 100644
index 0000000..909c2a9
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionAfterRollbackEvent.java
@@ -0,0 +1,14 @@
+package org.apache.isis.runtime.persistence.transaction.events;
+
+import java.util.EventObject;
+
+import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+
+import lombok.Getter;
+
+public class TransactionAfterRollbackEvent extends TransactionEventAbstract {
+
+ public TransactionAfterRollbackEvent(final IsisTransactionObject source) {
+ super(source, Type.AFTER_ROLLBACK);
+ }
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeBeginEvent.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeBeginEvent.java
new file mode 100644
index 0000000..4e24886
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeBeginEvent.java
@@ -0,0 +1,11 @@
+package org.apache.isis.runtime.persistence.transaction.events;
+
+import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+
+public class TransactionBeforeBeginEvent extends TransactionEventAbstract {
+
+ public TransactionBeforeBeginEvent(final IsisTransactionObject source) {
+ super(source, Type.BEFORE_BEGIN);
+ }
+
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeCommitEvent.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeCommitEvent.java
new file mode 100644
index 0000000..cf972c6
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeCommitEvent.java
@@ -0,0 +1,14 @@
+package org.apache.isis.runtime.persistence.transaction.events;
+
+import java.util.EventObject;
+
+import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+
+import lombok.Getter;
+
+public class TransactionBeforeCommitEvent extends TransactionEventAbstract {
+
+ public TransactionBeforeCommitEvent(final IsisTransactionObject source) {
+ super(source, Type.BEFORE_COMMIT);
+ }
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeRollbackEvent.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeRollbackEvent.java
new file mode 100644
index 0000000..49a77d2
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionBeforeRollbackEvent.java
@@ -0,0 +1,14 @@
+package org.apache.isis.runtime.persistence.transaction.events;
+
+import java.util.EventObject;
+
+import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+
+import lombok.Getter;
+
+public class TransactionBeforeRollbackEvent extends TransactionEventAbstract {
+
+ public TransactionBeforeRollbackEvent(final IsisTransactionObject source) {
+ super(source, Type.BEFORE_ROLLBACK);
+ }
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionEventAbstract.java b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionEventAbstract.java
new file mode 100644
index 0000000..0095145
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/persistence/transaction/events/TransactionEventAbstract.java
@@ -0,0 +1,38 @@
+package org.apache.isis.runtime.persistence.transaction.events;
+
+import java.util.EventObject;
+
+import org.apache.isis.runtime.persistence.transaction.IsisTransactionObject;
+
+import lombok.Getter;
+
+public abstract class TransactionEventAbstract extends EventObject {
+
+ public enum Type {
+ BEFORE_BEGIN,
+ AFTER_BEGIN,
+ BEFORE_COMMIT,
+ AFTER_COMMIT,
+ BEFORE_ROLLBACK,
+ AFTER_ROLLBACK,
+ }
+
+ /**
+ * Same as {@link #getSource()}.
+ */
+ @Getter
+ private final IsisTransactionObject isisTransactionObject;
+
+ @Getter
+ private final Type type;
+
+ public TransactionEventAbstract(
+ final IsisTransactionObject source,
+ final Type type) {
+ super(source);
+ this.isisTransactionObject = source;
+ this.type = type;
+ }
+
+
+}
diff --git a/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/IsisIntegrationTestAbstract.java b/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/IsisIntegrationTestAbstract.java
index ac48e50..bedb4eb 100644
--- a/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/IsisIntegrationTestAbstract.java
+++ b/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/IsisIntegrationTestAbstract.java
@@ -20,6 +20,13 @@ package org.apache.isis.integtestsupport;
import javax.inject.Inject;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
import org.apache.isis.applib.services.factory.FactoryService;
import org.apache.isis.applib.services.metamodel.MetaModelService;
import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -28,6 +35,7 @@ import org.apache.isis.applib.services.sessmgmt.SessionManagementService;
import org.apache.isis.applib.services.user.UserService;
import org.apache.isis.applib.services.wrapper.WrapperFactory;
import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.runtime.persistence.transaction.events.TransactionAfterBeginEvent;
/**
* Convenient base class to extend for integration tests.
@@ -36,6 +44,32 @@ import org.apache.isis.applib.services.xactn.TransactionService;
*/
public abstract class IsisIntegrationTestAbstract {
+ @Service
+ @Order(OrderPrecedence.MIDPOINT)
+ public static class CommandSupport {
+
+ private final CommandContext commandContext;
+
+ @Inject
+ public CommandSupport(final CommandContext commandContext) {
+ this.commandContext = commandContext;
+ }
+
+ @EventListener
+ public void on(final TransactionAfterBeginEvent event) {
+ final Command command = commandContext.getCommand();
+ if(command == null) {
+ return;
+ }
+ final Command.Executor executor = command.getExecutor();
+ if(executor != Command.Executor.OTHER) {
+ return;
+ }
+
+ command.internal().setExecutor(Command.Executor.USER);
+ }
+ }
+
/**
* Convenience method, simply delegates to {@link WrapperFactory#wrap(Object)}
*/