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)}
      */