You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/09/26 18:20:13 UTC

[isis] branch v2 updated (c15efb2 -> 105e9b5)

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

ahuber pushed a change to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from c15efb2  ISIS-1976: further fixes tests
     new 7f0d6ce  ISIS-1976: remove deprecated Command.next()
     new 105e9b5  ISIS-1976: cleanup 'Command' API

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../applib/events/domain/ActionDomainEvent.java    |  42 ++-
 .../isis/applib/services/HasTransactionId.java     |  54 ----
 .../{HasUsername.java => HasUniqueId.java}         |  15 +-
 .../RepresentsInteractionMemberExecution.java      |   4 +-
 .../isis/applib/services/command/Command.java      | 351 +++++++++------------
 .../applib/services/command/CommandDefault.java    | 283 +++++------------
 .../services/command/spi/CommandService.java       |   2 +-
 .../isis/applib/services/iactn/Interaction.java    |  40 ++-
 .../applib/services/publish/PublishedObjects.java  |   4 +-
 .../isis/applib/services/xactn/Transaction.java    |   6 +-
 .../isis/schema/utils/InteractionDtoUtils.java     |   2 +-
 .../command/CommandContractTestAbstract.java       | 134 --------
 .../services/command/CommandDefaultTest.java       |  27 --
 .../interaction/InteractionDefaultTest_next.java   |   5 +-
 .../applib/util/ObjectContractsTest_compareTo.java |   1 -
 .../HeadlessTransactionSupportDefault.java         |   2 +-
 .../core/metamodel/facets/DomainEventHelper.java   |  11 -
 .../action/ActionAnnotationFacetFactory.java       |   6 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |   4 +-
 .../DomainObjectAnnotationFacetFactory.java        |   6 +-
 .../property/PropertyAnnotationFacetFactory.java   |   7 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |   5 +-
 .../metamodel/interactions/InteractionContext.java |   2 +-
 .../specloader/specimpl/ObjectMemberAbstract.java  |  20 +-
 .../action/ActionAnnotationFacetFactoryTest.java   |  10 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  15 +-
 .../system/persistence/PersistenceSession4.java    |  14 +-
 .../system/persistence/PersistenceSession5.java    |  16 +-
 .../services/auditing/AuditingServiceInternal.java |   2 +-
 .../background/CommandExecutorServiceDefault.java  |  14 +-
 .../changes/ChangedObjectsServiceInternal.java     |   4 +-
 .../command/CommandDtoServiceInternalDefault.java  |   4 +-
 .../ixn/InteractionDtoServiceInternalDefault.java  |   5 -
 .../services/publish/PublishedObjectsDefault.java  |  14 +-
 .../publish/PublishingServiceInternalDefault.java  |   2 +-
 .../system/transaction/IsisTransaction.java        |  11 +-
 .../system/transaction/IsisTransactionManager.java |   4 +-
 .../server/resources/ResourceAbstract.java         |   2 +-
 .../collection/bulk/BulkActionsLinkFactory.java    |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   4 +-
 40 files changed, 361 insertions(+), 795 deletions(-)
 delete mode 100644 core/applib/src/main/java/org/apache/isis/applib/services/HasTransactionId.java
 copy core/applib/src/main/java/org/apache/isis/applib/services/{HasUsername.java => HasUniqueId.java} (73%)
 delete mode 100644 core/applib/src/test/java/org/apache/isis/applib/services/command/CommandContractTestAbstract.java
 delete mode 100644 core/applib/src/test/java/org/apache/isis/applib/services/command/CommandDefaultTest.java


[isis] 02/02: ISIS-1976: cleanup 'Command' API

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 105e9b55dc2040225cd59e3387f59a60b0c9cb0e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 26 20:20:00 2018 +0200

    ISIS-1976: cleanup 'Command' API
    
    make it obvious which calls are non public API by gathering them in its
    own 'Internal' interface
    
    rename HasTransactionId -> HasUniqueId to better reflect its general
    usage
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../applib/events/domain/ActionDomainEvent.java    |  42 ++-
 .../{HasTransactionId.java => HasUniqueId.java}    |  26 +-
 .../RepresentsInteractionMemberExecution.java      |   4 +-
 .../isis/applib/services/command/Command.java      | 351 +++++++++------------
 .../applib/services/command/CommandDefault.java    | 283 +++++------------
 .../services/command/spi/CommandService.java       |   2 +-
 .../isis/applib/services/iactn/Interaction.java    |  16 +-
 .../applib/services/publish/PublishedObjects.java  |   4 +-
 .../isis/applib/services/xactn/Transaction.java    |   6 +-
 .../isis/schema/utils/InteractionDtoUtils.java     |   2 +-
 .../command/CommandContractTestAbstract.java       | 134 --------
 .../services/command/CommandDefaultTest.java       |  27 --
 .../HeadlessTransactionSupportDefault.java         |   2 +-
 .../core/metamodel/facets/DomainEventHelper.java   |  11 -
 .../action/ActionAnnotationFacetFactory.java       |   6 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |   4 +-
 .../DomainObjectAnnotationFacetFactory.java        |   6 +-
 .../property/PropertyAnnotationFacetFactory.java   |   7 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java |   5 +-
 .../specloader/specimpl/ObjectMemberAbstract.java  |  20 +-
 .../action/ActionAnnotationFacetFactoryTest.java   |  10 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  15 +-
 .../system/persistence/PersistenceSession4.java    |  14 +-
 .../system/persistence/PersistenceSession5.java    |  16 +-
 .../services/auditing/AuditingServiceInternal.java |   2 +-
 .../background/CommandExecutorServiceDefault.java  |  14 +-
 .../changes/ChangedObjectsServiceInternal.java     |   4 +-
 .../command/CommandDtoServiceInternalDefault.java  |   4 +-
 .../ixn/InteractionDtoServiceInternalDefault.java  |   5 -
 .../services/publish/PublishedObjectsDefault.java  |  14 +-
 .../publish/PublishingServiceInternalDefault.java  |   2 +-
 .../system/transaction/IsisTransaction.java        |  11 +-
 .../system/transaction/IsisTransactionManager.java |   4 +-
 .../server/resources/ResourceAbstract.java         |   2 +-
 .../collection/bulk/BulkActionsLinkFactory.java    |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   4 +-
 36 files changed, 340 insertions(+), 741 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java b/core/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
index 13264d4..9064dd5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/events/domain/ActionDomainEvent.java
@@ -21,8 +21,6 @@ package org.apache.isis.applib.events.domain;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
 
@@ -75,26 +73,26 @@ public abstract class ActionDomainEvent<S> extends AbstractDomainEvent<S> {
     public ActionDomainEvent() {
     }
 
-    // -- command
-    private Command command;
-
-    /**
-     * @deprecated - use {@link CommandContext#getCommand()} to obtain the current {@link Command}.
-     */
-    @Deprecated
-    public Command getCommand() {
-        return command;
-    }
-
-    /**
-     * Not API - set by the framework.
-     *
-     * @deprecated - the corresponding {@link #getCommand()} should not be called, instead use {@link CommandContext#getCommand()} to obtain the current {@link Command}.
-     */
-    @Deprecated
-    public void setCommand(Command command) {
-        this.command = command;
-    }
+//    // -- command
+//    private Command command;
+//
+//    /**
+//     * @deprecated - use {@link CommandContext#getCommand()} to obtain the current {@link Command}.
+//     */
+//    @Deprecated
+//    public Command getCommand() {
+//        return command;
+//    }
+//
+//    /**
+//     * Not API - set by the framework.
+//     *
+//     * @deprecated - the corresponding {@link #getCommand()} should not be called, instead use {@link CommandContext#getCommand()} to obtain the current {@link Command}.
+//     */
+//    @Deprecated
+//    public void setCommand(Command command) {
+//        this.command = command;
+//    }
 
 
     // -- actionSemantics
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/HasTransactionId.java b/core/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
similarity index 65%
rename from core/applib/src/main/java/org/apache/isis/applib/services/HasTransactionId.java
rename to core/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
index 365fb5a..70f99ff 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/HasTransactionId.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
@@ -23,32 +23,12 @@ import java.util.UUID;
  * Mix-in interface for objects (usually created by service implementations) that are be persistable,
  * and so can be associated together using a unique identifier.
  *
- * <p>
- *     Prior to 1.13.0, this identifier was the GUID of the Isis transaction in which the object was created (hence
- *     the name).  As of 1.13.0, this identifier actually is for the request/interaction in which the object was
- *     created, so is misnamed.
- * </p>
  */
-public interface HasTransactionId {
+public interface HasUniqueId {
 
     /**
-     * The unique identifier (a GUID) of the request/interaction.
+     * The unique identifier (a GUID) of the request/interaction/transaction.
      */
-    UUID getTransactionId();
+    UUID getUniqueId();
 
-    void setTransactionId(final UUID transactionId);
-
-    class TransactionIdType {
-
-        private TransactionIdType() {}
-
-        public static class Meta {
-
-            public static final int MAX_LEN = 36;
-
-            private Meta() {}
-
-        }
-
-    }
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java b/core/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
index 45c45d7..b2cb041 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
@@ -20,7 +20,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.schema.ixn.v1.InteractionDto;
 
 /**
- * Extends {@link HasTransactionId}, where the {@link HasTransactionId#getTransactionId()} is interpreted as an
+ * Extends {@link HasUniqueId}, where the {@link HasUniqueId#getUniqueId()} is interpreted as an
  * interaction (cf {@link InteractionDto}) that has at least one member execution (cf
  * {@link org.apache.isis.schema.ixn.v1.MemberExecutionDto}) and may (by way of {@link WrapperFactory}) contain
  * several.
@@ -29,7 +29,7 @@ import org.apache.isis.schema.ixn.v1.InteractionDto;
  *     Examples could include SPI services that persist published events and status messages.
  * </p>
  */
-public interface RepresentsInteractionMemberExecution extends HasTransactionId {
+public interface RepresentsInteractionMemberExecution extends HasUniqueId {
 
     int getSequence();
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index 3b4a60a..1fda804 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -17,7 +17,7 @@
 package org.apache.isis.applib.services.command;
 
 import java.sql.Timestamp;
-import java.util.List;
+import java.util.UUID;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Action;
@@ -26,7 +26,7 @@ import org.apache.isis.applib.annotation.CommandPersistence;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.background.BackgroundCommandService;
 import org.apache.isis.applib.services.background.BackgroundService;
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -62,14 +62,7 @@ import org.apache.isis.schema.cmd.v1.CommandDto;
  * </p>
  *
  */
-public interface Command extends HasTransactionId {
-
-    /**
-     * @deprecated - in previous versions this was the value for {@link #getTargetAction()} if this command represents an edit of an object's property (rather than an action); now though the property's name is used (ie same as actions).
-     */
-    @Deprecated
-    String ACTION_IDENTIFIER_FOR_EDIT = "(edit)";
-
+public interface Command extends HasUniqueId {
 
     // -- user (property)
     /**
@@ -77,14 +70,6 @@ public interface Command extends HasTransactionId {
      */
 
     String getUser();
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the Isis PersistenceSession is opened.
-     */
-    void setUser(String user);
-
 
     // -- timestamp (property)
 
@@ -92,15 +77,6 @@ public interface Command extends HasTransactionId {
      * The date/time at which this command was created.
      */
     Timestamp getTimestamp();
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the Isis PersistenceSession is opened.  Uses the applib {@link Clock}.
-     */
-    void setTimestamp(Timestamp timestamp);
-
-
 
     // -- target (property)
 
@@ -111,15 +87,6 @@ public interface Command extends HasTransactionId {
      * Will only be populated if a {@link BookmarkService} has been configured.
      */
     Bookmark getTarget();
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the action is invoked (in the ActionInvocationFacet).
-     */
-    void setTarget(Bookmark target);
-
-
 
     // -- memberIdentifier (property)
 
@@ -129,17 +96,6 @@ public interface Command extends HasTransactionId {
      */
     String getMemberIdentifier();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the action is invoked (in <tt>ActionInvocationFacet</tt>) or in
-     * property edited (in <tt>PropertySetterFacet</tt>).
-     */
-    void setMemberIdentifier(String memberIdentifier);
-
-
-
     // -- targetClass (property)
 
     /**
@@ -147,16 +103,6 @@ public interface Command extends HasTransactionId {
      */
     String getTargetClass();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</t>).
-     */
-    void setTargetClass(String targetClass);
-
-
-
     // -- targetAction (property)
 
     /**
@@ -167,18 +113,7 @@ public interface Command extends HasTransactionId {
      * </p>
      */
     String getTargetAction();
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>) or property edited
-     * (in the <tt>PropertySetterOrClearFacet</tt>).
-     */
-    void setTargetAction(String targetAction);
-
-
-
+    
     // -- arguments (property)
 
     /**
@@ -186,15 +121,6 @@ public interface Command extends HasTransactionId {
      */
     String getArguments();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>).
-     */
-    void setArguments(final String arguments);
-
-
 
     // -- memento (property)
 
@@ -203,16 +129,6 @@ public interface Command extends HasTransactionId {
      */
     String getMemento();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>).
-     */
-    void setMemento(final String memento);
-
-
-
     // -- executeIn (property)
 
     /**
@@ -222,41 +138,6 @@ public interface Command extends HasTransactionId {
      */
     CommandExecuteIn getExecuteIn();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    void setExecuteIn(final CommandExecuteIn executeIn);
-
-    /**
-     * @deprecated - use {@link Interaction#getCurrentExecution()}, {@link Interaction#getPriorExecution()}  and {@link Interaction#getExecutions()} instead.
-     */
-    @Deprecated
-    @Programmatic
-    ActionDomainEvent<?> peekActionDomainEvent();
-
-    /**
-     * @deprecated - replaced by equivalent functionality in {@link Interaction}.
-     */
-    @Deprecated
-    @Programmatic
-    void pushActionDomainEvent(ActionDomainEvent<?> event);
-
-    /**
-     * @deprecated - replaced by equivalent functionality in {@link Interaction}.
-     */
-    @Deprecated
-    @Programmatic
-    ActionDomainEvent<?> popActionDomainEvent();
-
-    /**
-     * @deprecated - use {@link Interaction#getCurrentExecution()}, {@link Interaction#getPriorExecution()}  and {@link Interaction#getExecutions()} instead.
-     */
-    @Deprecated
-    @Programmatic
-    List<ActionDomainEvent<?>> flushActionDomainEvents();
-
-
-
     // -- executor (property)
 
     enum Executor {
@@ -295,14 +176,6 @@ public interface Command extends HasTransactionId {
      */
     Executor getExecutor();
 
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    void setExecutor(final Executor executor);
-
-
-
     // -- startedAt (property)
 
     /**
@@ -320,23 +193,6 @@ public interface Command extends HasTransactionId {
      */
     Timestamp getStartedAt();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     *
-     * <p>
-     *     Previously this field was deprecated (on the basis that the completedAt is also held in
-     *     {@link Interaction.Execution#getCompletedAt()}). However, this property is now used in master/slave
-     *     replay scenarios which may query a persisted Command.
-     * </p>
-     *
-     * See also {@link Interaction#getCurrentExecution()} and
-     * {@link Interaction.Execution#setStartedAt(Timestamp)}.
-     */
-    void setStartedAt(Timestamp startedAt);
-
-
-
     // -- completedAt (property, deprecated)
 
     /**
@@ -354,22 +210,6 @@ public interface Command extends HasTransactionId {
      */
     Timestamp getCompletedAt();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * <p>
-     *     Previously this field was deprecated (on the basis that the completedAt is also held in
-     *     {@link Interaction.Execution#getCompletedAt()}). However, this property is now used in master/slave
-     *     replay scenarios which may query a persisted Command.
-     * </p>
-     *
-     * See also {@link Interaction#getCurrentExecution()} and
-     * {@link Interaction.Execution#setCompletedAt(Timestamp)}.
-     */
-    void setCompletedAt(Timestamp completedAt);
-
-
-
     // -- parent (property)
 
     /**
@@ -378,13 +218,6 @@ public interface Command extends HasTransactionId {
      */
     Command getParent();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    void setParent(final Command parent);
-
-
-
     // -- exception (property, deprecated)
 
     /**
@@ -401,13 +234,6 @@ public interface Command extends HasTransactionId {
      */
     String getException();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    void setException(String stackTrace);
-
-
-
     // -- result (property, deprecated)
 
 
@@ -424,12 +250,6 @@ public interface Command extends HasTransactionId {
      */
     Bookmark getResult();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    void setResult(Bookmark resultBookmark);
-
-
 
     // -- persistence (property)
 
@@ -458,44 +278,163 @@ public interface Command extends HasTransactionId {
      */
     CommandPersistence getPersistence();
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    void setPersistence(final CommandPersistence persistence);
-
-
     // -- persistHint (programmatic)
 
-
     /**
      * Whether that this {@link Command} should be persisted, if possible.
      */
     @Programmatic
     boolean isPersistHint();
 
+    // -- FRAMEWORK INTERNATA
+
     /**
-     * Hint that this {@link Command} should be persisted, if possible.
-     *
-     * <p>
      * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * @see #getPersistence()
      */
-    @Programmatic
-    void setPersistHint(boolean persistHint);
+    public static interface Internal {
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the Isis PersistenceSession is opened.
+         */
+        void setUser(String user);
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the Isis PersistenceSession is opened.  Uses the applib {@link Clock}.
+         */
+        void setTimestamp(Timestamp timestamp);
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the action is invoked (in the ActionInvocationFacet).
+         */
+        void setTarget(Bookmark target);
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the action is invoked (in <tt>ActionInvocationFacet</tt>) or in
+         * property edited (in <tt>PropertySetterFacet</tt>).
+         */
+        void setMemberIdentifier(String memberIdentifier);
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>) or property edited
+         * (in the <tt>PropertySetterOrClearFacet</tt>).
+         */
+        void setTargetAction(String targetAction);
+
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>).
+         */
+        void setArguments(final String arguments);
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        void setExecutor(final Executor executor);   
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        void setResult(Bookmark resultBookmark);
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        void setException(String stackTrace);
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        void setParent(final Command parent);
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         *     Previously this field was deprecated (on the basis that the completedAt is also held in
+         *     {@link Interaction.Execution#getCompletedAt()}). However, this property is now used in master/slave
+         *     replay scenarios which may query a persisted Command.
+         * </p>
+         *
+         * See also {@link Interaction#getCurrentExecution()} and
+         * {@link Interaction.Execution#setCompletedAt(Timestamp)}.
+         */
+        void setCompletedAt(Timestamp completedAt);
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         *
+         * <p>
+         *     Previously this field was deprecated (on the basis that the completedAt is also held in
+         *     {@link Interaction.Execution#getCompletedAt()}). However, this property is now used in master/slave
+         *     replay scenarios which may query a persisted Command.
+         * </p>
+         *
+         * See also {@link Interaction#getCurrentExecution()} and
+         * {@link Interaction.Execution#setStartedAt(Timestamp)}.
+         */
+        void setStartedAt(Timestamp startedAt);
 
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>).
+         */
+        void setMemento(final String memento);
 
-    // -- next (programmatic, deprecated)
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * <p>
+         * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</t>).
+         */
+        void setTargetClass(String targetClass);
+        
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        void setPersistence(final CommandPersistence persistence);
+        
+        /**
+         * Hint that this {@link Command} should be persisted, if possible.
+         *
+         * <p>
+         * <b>NOT API</b>: intended to be called only by the framework.
+         *
+         * @see #getPersistence()
+         */
+        void setPersistHint(boolean persistHint);
+        
+        /**
+         * Sets the unique identifier (a GUID) of the request/interaction.
+         */
+        void setInteractionId(final UUID interactionId);
 
+    }
+    
     /**
      * <b>NOT API</b>: intended to be called only by the framework.
-     *
-     * @deprecated - no longer used (the framework uses {@link Interaction#next(String)} instead).
      */
-    @Deprecated
     @Programmatic
-    int next(final String sequenceAbbr);
-
-
-
+    Internal internal();
+    
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandDefault.java
index de41db3..3cd425f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandDefault.java
@@ -17,33 +17,22 @@
 package org.apache.isis.applib.services.command;
 
 import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.isis.applib.annotation.CommandExecuteIn;
 import org.apache.isis.applib.annotation.CommandPersistence;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
 
 public class CommandDefault implements Command {
 
     // -- constructor
 
     public CommandDefault() {
-        setExecutor(Executor.OTHER);
+        this.executor = Executor.OTHER;
     }
 
-
-
     // -- actionIdentifier (property)
 
     private String actionIdentifier;
@@ -52,13 +41,6 @@ public class CommandDefault implements Command {
         return actionIdentifier;
     }
 
-    @Override
-    public void setMemberIdentifier(String actionIdentifier) {
-        this.actionIdentifier = actionIdentifier;
-    }
-
-
-
     // -- targetClass (property)
 
     private String targetClass;
@@ -67,13 +49,6 @@ public class CommandDefault implements Command {
         return targetClass;
     }
 
-    @Override
-    public void setTargetClass(String targetClass) {
-        this.targetClass = targetClass;
-    }
-
-
-
     // -- targetAction (property)
 
     private String targetAction;
@@ -82,13 +57,6 @@ public class CommandDefault implements Command {
         return targetAction;
     }
 
-    @Override
-    public void setTargetAction(String targetAction) {
-        this.targetAction = targetAction;
-    }
-
-
-
     // -- arguments (property)
 
     private String arguments;
@@ -97,13 +65,6 @@ public class CommandDefault implements Command {
         return arguments;
     }
 
-    @Override
-    public void setArguments(String arguments) {
-        this.arguments = arguments;
-    }
-
-
-
     // -- memento (property)
 
     private String memento;
@@ -112,12 +73,6 @@ public class CommandDefault implements Command {
     public String getMemento() {
         return memento;
     }
-    @Override
-    public void setMemento(String memento) {
-        this.memento = memento;
-    }
-
-
 
     // -- target (property)
 
@@ -126,12 +81,6 @@ public class CommandDefault implements Command {
     public Bookmark getTarget() {
         return target;
     }
-    @Override
-    public void setTarget(Bookmark target) {
-        this.target = target;
-    }
-
-
 
     // -- timestamp (property)
 
@@ -141,13 +90,6 @@ public class CommandDefault implements Command {
         return timestamp;
     }
 
-    @Override
-    public void setTimestamp(Timestamp timestamp) {
-        this.timestamp = timestamp;
-    }
-
-
-
     // -- startedAt (property)
 
     private Timestamp startedAt;
@@ -155,12 +97,6 @@ public class CommandDefault implements Command {
     public Timestamp getStartedAt() {
         return startedAt;
     }
-    @Override
-    public void setStartedAt(Timestamp startedAt) {
-        this.startedAt = startedAt;
-    }
-
-
 
     // -- completedAt (property)
 
@@ -171,13 +107,6 @@ public class CommandDefault implements Command {
         return completedAt;
     }
 
-    @Override
-    public void setCompletedAt(final Timestamp completed) {
-        this.completedAt = completed;
-    }
-
-
-
     // -- user (property)
 
     private String user;
@@ -186,46 +115,6 @@ public class CommandDefault implements Command {
         return user;
     }
 
-    @Override
-    public void setUser(String user) {
-        this.user = user;
-    }
-
-
-
-    // -- actionDomainEvent (peek/pop/flush)
-
-    private final LinkedList<ActionDomainEvent<?>> actionDomainEvents = _Lists.newLinkedList();
-
-    @Override
-    public ActionDomainEvent<?> peekActionDomainEvent() {
-        return actionDomainEvents.isEmpty()? null: actionDomainEvents.getLast();
-    }
-
-    @Override
-    public void pushActionDomainEvent(ActionDomainEvent<?> event) {
-        if(peekActionDomainEvent() == event) {
-            return;
-        }
-        this.actionDomainEvents.add(event);
-    }
-
-    @Override
-    public ActionDomainEvent<?> popActionDomainEvent() {
-        return !actionDomainEvents.isEmpty() ? actionDomainEvents.removeLast() : null;
-    }
-
-    @Override
-    @Programmatic
-    public List<ActionDomainEvent<?>> flushActionDomainEvents() {
-        final List<ActionDomainEvent<?>> events =
-                Collections.unmodifiableList(_Lists.newArrayList(actionDomainEvents));
-        actionDomainEvents.clear();
-        return events;
-    }
-
-
-
     // -- executor (property)
 
     private Executor executor;
@@ -235,16 +124,6 @@ public class CommandDefault implements Command {
         return executor;
     }
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Override
-    public void setExecutor(Executor nature) {
-        this.executor = nature;
-    }
-
-
-
     // -- executionType (property)
 
     private CommandExecuteIn executionType;
@@ -254,17 +133,6 @@ public class CommandDefault implements Command {
         return executionType;
     }
 
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Override
-    public void setExecuteIn(CommandExecuteIn executionType) {
-        this.executionType = executionType;
-    }
-
-
-
-
     // -- parent (property)
 
     private Command parent;
@@ -274,14 +142,6 @@ public class CommandDefault implements Command {
         return parent;
     }
 
-    @Override
-    public void setParent(Command parent) {
-        this.parent = parent;
-    }
-
-
-
-
     // -- result (property)
 
     private Bookmark result;
@@ -290,12 +150,6 @@ public class CommandDefault implements Command {
     public Bookmark getResult() {
         return result;
     }
-    @Override
-    public void setResult(final Bookmark result) {
-        this.result = result;
-    }
-
-
 
     // -- exceptionStackTrace (property)
 
@@ -305,28 +159,16 @@ public class CommandDefault implements Command {
     public String getException() {
         return exceptionStackTrace;
     }
-    @Override
-    public void setException(final String exceptionStackTrace) {
-        this.exceptionStackTrace = exceptionStackTrace;
-    }
-
-
 
     // -- transactionId (property)
 
-    private UUID transactionId;
+    private UUID interactionId;
 
     @Override
-    public UUID getTransactionId() {
-        return transactionId;
-    }
-    @Override
-    public void setTransactionId(UUID transactionId) {
-        this.transactionId = transactionId;
+    public UUID getUniqueId() {
+        return interactionId;
     }
-
-
-
+    
 
     // -- persistence
 
@@ -337,13 +179,6 @@ public class CommandDefault implements Command {
         return persistence;
     }
 
-    @Override
-    public void setPersistence(CommandPersistence persistence) {
-        this.persistence = persistence;
-    }
-
-
-
     // -- persistHint
 
     private boolean persistHint;
@@ -353,33 +188,6 @@ public class CommandDefault implements Command {
         return persistHint;
     }
 
-    @Override
-    public void setPersistHint(boolean persistHint) {
-        this.persistHint = persistHint;
-    }
-
-
-
-
-    // -- next
-
-    private final Map<String, AtomicInteger> sequenceByName = _Maps.newHashMap();
-
-    @Deprecated
-    @Override
-    public int next(String sequenceAbbr) {
-        AtomicInteger next = sequenceByName.get(sequenceAbbr);
-        if(next == null) {
-            next = new AtomicInteger(0);
-            sequenceByName.put(sequenceAbbr, next);
-        } else {
-            next.incrementAndGet();
-        }
-        return next.get();
-    }
-
-
-
     // -- toString
 
     private final static ToString<CommandDefault> toString = ObjectContracts
@@ -387,14 +195,91 @@ public class CommandDefault implements Command {
             .thenToString("user", CommandDefault::getUser)
             .thenToString("memberIdentifier", CommandDefault::getMemberIdentifier)
             .thenToString("target", CommandDefault::getTarget)
-            .thenToString("transactionId", CommandDefault::getTransactionId);
-
+            .thenToString("transactionId", CommandDefault::getUniqueId);
 
     @Override
     public String toString() {
         return toString.toString(this);
     }
 
+    
+    // -- FRAMEWORK INTERNATA
+    
+    private final Command.Internal INTERNAL = new Command.Internal() {
+        @Override
+        public void setMemberIdentifier(String actionIdentifier) {
+            CommandDefault.this.actionIdentifier = actionIdentifier;
+        }
+        @Override
+        public void setTargetClass(String targetClass) {
+            CommandDefault.this.targetClass = targetClass;
+        }
+        @Override
+        public void setTargetAction(String targetAction) {
+            CommandDefault.this.targetAction = targetAction;
+        }
+        @Override
+        public void setArguments(String arguments) {
+            CommandDefault.this.arguments = arguments;
+        }
+        @Override
+        public void setMemento(String memento) {
+            CommandDefault.this.memento = memento;
+        }
+        @Override
+        public void setTarget(Bookmark target) {
+            CommandDefault.this.target = target;
+        }
+        @Override
+        public void setTimestamp(Timestamp timestamp) {
+            CommandDefault.this.timestamp = timestamp;
+        }
+        @Override
+        public void setStartedAt(Timestamp startedAt) {
+            CommandDefault.this.startedAt = startedAt;
+        }
+        @Override
+        public void setCompletedAt(final Timestamp completed) {
+            CommandDefault.this.completedAt = completed;
+        }
+        @Override
+        public void setUser(String user) {
+            CommandDefault.this.user = user;
+        }
+        @Override
+        public void setParent(Command parent) {
+            CommandDefault.this.parent = parent;
+        }
+        @Override
+        public void setResult(final Bookmark result) {
+            CommandDefault.this.result = result;
+        }
+        @Override
+        public void setException(final String exceptionStackTrace) {
+            CommandDefault.this.exceptionStackTrace = exceptionStackTrace;
+        }
+        @Override
+        public void setPersistence(CommandPersistence persistence) {
+            CommandDefault.this.persistence = persistence;
+        }
+        @Override
+        public void setPersistHint(boolean persistHint) {
+            CommandDefault.this.persistHint = persistHint;
+        }
+        @Override
+        public void setExecutor(Executor executor) {
+            CommandDefault.this.executor = executor;
+        }
+        @Override
+        public void setInteractionId(UUID transactionId) {
+            CommandDefault.this.interactionId = interactionId;
+        }
+    };
+    
+    @Override
+    public Command.Internal internal() {
+        return INTERNAL;
+    }
 
 
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandService.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandService.java
index 545f0d7..fb910ff 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/spi/CommandService.java
@@ -26,7 +26,7 @@ public interface CommandService {
 
     /**
      * Simply instantiate the appropriate instance of the {@link Command}.  Its members will be populated automatically
-     * by the framework (the {@link Command}'s {@link Command#getTimestamp()}, {@link Command#getUser()} and {@link Command#getTransactionId()}).
+     * by the framework (the {@link Command}'s {@link Command#getTimestamp()}, {@link Command#getUser()} and {@link Command#getUniqueId()}).
      */
     @Programmatic
     Command create();
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index e971292..cc037cc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.eventbus.EventBusService;
@@ -78,25 +78,23 @@ import org.apache.isis.schema.utils.jaxbadapters.JavaSqlTimestampXmlGregorianCal
  *
  */
 @Value
-public class Interaction implements HasTransactionId {
+public class Interaction implements HasUniqueId {
 
     // -- transactionId (property)
 
-    private UUID transactionId;
+    private UUID interactionId;
 
     @Programmatic
     @Override
-    public UUID getTransactionId() {
-        return transactionId;
+    public UUID getUniqueId() {
+        return interactionId;
     }
 
     @Programmatic
-    @Override
-    public void setTransactionId(final UUID transactionId) {
-        this.transactionId = transactionId;
+    public void setUniqueId(final UUID transactionId) {
+        this.interactionId = transactionId;
     }
 
-
     // -- push/pop/current/get/clear Execution(s)
 
     private final List<Execution<?,?>> executionGraphs = _Lists.newArrayList();
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishedObjects.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishedObjects.java
index 3c91a23..6d09c75 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishedObjects.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishedObjects.java
@@ -21,11 +21,11 @@ package org.apache.isis.applib.services.publish;
 import java.sql.Timestamp;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.HasUsername;
 import org.apache.isis.schema.chg.v1.ChangesDto;
 
-public interface PublishedObjects extends HasTransactionId, HasUsername {
+public interface PublishedObjects extends HasUniqueId, HasUsername {
 
     @Programmatic
     Timestamp getCompletedAt();
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/xactn/Transaction.java b/core/applib/src/main/java/org/apache/isis/applib/services/xactn/Transaction.java
index cfc7c70..952526b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/xactn/Transaction.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/xactn/Transaction.java
@@ -20,16 +20,16 @@
 package org.apache.isis.applib.services.xactn;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 
 /**
  * Representation of the current transaction, which conceptually wraps the underlying objectstore transaction.
  */
-public interface Transaction extends HasTransactionId {
+public interface Transaction extends HasUniqueId {
 
 
     /**
-     * The {@link HasTransactionId#getTransactionId()} is (as of 1.13.0) actually an identifier for the request/
+     * The {@link HasUniqueId#getUniqueId()} is (as of 1.13.0) actually an identifier for the request/
      * interaction, and there can actually be multiple transactions within such a request/interaction.  The sequence
      * (0-based) is used to distinguish such.
      */
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java b/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java
index f99fd5a..24127d0 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java
@@ -191,7 +191,7 @@ public final class InteractionDtoUtils {
             final Interaction.Execution<?, ?> execution,
             final MemberExecutionDto executionDto) {
         final Interaction interaction = execution.getInteraction();
-        final String transactionId = interaction.getTransactionId().toString();
+        final String transactionId = interaction.getUniqueId().toString();
 
         return InteractionDtoUtils.newInteractionDto(transactionId, executionDto);
     }
diff --git a/core/applib/src/test/java/org/apache/isis/applib/services/command/CommandContractTestAbstract.java b/core/applib/src/test/java/org/apache/isis/applib/services/command/CommandContractTestAbstract.java
deleted file mode 100644
index 3fee447..0000000
--- a/core/applib/src/test/java/org/apache/isis/applib/services/command/CommandContractTestAbstract.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.services.command;
-
-import java.util.List;
-
-import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-public abstract class CommandContractTestAbstract {
-
-    Command command;
-
-    ActionDomainEvent<Object> ev1;
-    ActionDomainEvent<Object> ev2;
-
-    @Before
-    public void setUp() throws Exception {
-
-        final Object source = new Object();
-        ev1 = new ActionDomainEvent.Default();
-        ev1.setSource(source);
-        ev2 = new ActionDomainEvent.Default();
-        ev2.setSource(source);
-        command = newCommand();
-    }
-
-    protected abstract Command newCommand();
-
-    @Test
-    public void givenEmpty() throws Exception {
-        // then
-        assertNull(command.peekActionDomainEvent());
-        assertNull(command.popActionDomainEvent());
-    }
-
-    @Test
-    public void givenOne() throws Exception {
-        // given
-        command.pushActionDomainEvent(ev1);
-
-        // then
-        assertEquals(ev1, command.peekActionDomainEvent());
-
-        // and when
-        assertEquals(ev1, command.popActionDomainEvent());
-
-        // then
-        assertNull(command.peekActionDomainEvent());
-    }
-
-    @Test
-    public void givenTwo() throws Exception {
-        // given
-        command.pushActionDomainEvent(ev1);
-        command.pushActionDomainEvent(ev2);
-
-        // then
-        assertEquals(ev2, command.peekActionDomainEvent());
-
-        // and when
-        assertEquals(ev2, command.popActionDomainEvent());
-
-        // then
-        assertEquals(ev1, command.peekActionDomainEvent());
-
-        // and when
-        assertEquals(ev1, command.popActionDomainEvent());
-
-        // then
-        assertNull(command.peekActionDomainEvent());
-    }
-
-    @Test
-    public void pushSame() throws Exception {
-
-        // given
-        command.pushActionDomainEvent(ev1);
-        command.pushActionDomainEvent(ev1);
-
-        // then
-        assertEquals(ev1, command.peekActionDomainEvent());
-
-        // and when
-        assertEquals(ev1, command.popActionDomainEvent());
-
-        // then
-        assertNull(command.peekActionDomainEvent());
-    }
-
-
-    @Test
-    public void clear() throws Exception {
-
-        // given
-        command.pushActionDomainEvent(ev1);
-        command.pushActionDomainEvent(ev2);
-
-        // then
-        assertEquals(ev2, command.peekActionDomainEvent());
-
-        // and when
-        final List<ActionDomainEvent<?>> events = command.flushActionDomainEvents();
-
-        // then
-        assertEquals(ev1, events.get(0));
-        assertEquals(ev2, events.get(1));
-        assertNull(command.peekActionDomainEvent());
-
-    }
-
-
-
-}
\ No newline at end of file
diff --git a/core/applib/src/test/java/org/apache/isis/applib/services/command/CommandDefaultTest.java b/core/applib/src/test/java/org/apache/isis/applib/services/command/CommandDefaultTest.java
deleted file mode 100644
index 359e007..0000000
--- a/core/applib/src/test/java/org/apache/isis/applib/services/command/CommandDefaultTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.services.command;
-
-public class CommandDefaultTest extends CommandContractTestAbstract {
-
-    protected Command newCommand() {
-        return new CommandDefault();
-    }
-
-}
\ No newline at end of file
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java
index 6003e2f..a5762b9 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/HeadlessTransactionSupportDefault.java
@@ -68,7 +68,7 @@ public class HeadlessTransactionSupportDefault implements HeadlessTransactionSup
         // specify that this command (if any) is being executed by a 'USER'
         final CommandContext commandContext = getService(CommandContext.class);
         Command command = commandContext.getCommand();
-        command.setExecutor(Command.Executor.USER);
+        command.internal().setExecutor(Command.Executor.USER);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index 05c5611..667ac22 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -107,17 +107,6 @@ public class DomainEventHelper {
                 event.setReturnValue(ObjectAdapter.Util.unwrap(resultAdapter));
             }
 
-            // associate event with command...
-            if(command != null) {
-                event.setCommand(command);
-            }
-            // ... and associate command with event
-            if(command != null) {
-                if(phase.isExecuting()) {
-                    command.pushActionDomainEvent(event);
-                }
-            }
-
             getEventBusService().post(event);
             return event;
         } catch (Exception e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 7dc8929..67263ad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -24,7 +24,7 @@ import java.util.List;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -214,7 +214,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         //
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         //
-        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
             // do not install on any implementation of HasTransactionId
             // (ie commands, audit entries, published events).
             return;
@@ -236,7 +236,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         // and for commands, see above
         //
-        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
             // do not install on any implementation of HasTransactionId
             // (ie commands, audit entries, published events).
             return;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 3d90f48..cd030b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -236,7 +236,7 @@ implements ImperativeFacet {
                         final Timestamp startedAt = getClockService().nowAsJavaSqlTimestamp();
                         execution.setStartedAt(startedAt);
                         if(command.getStartedAt() == null) {
-                            command.setStartedAt(startedAt);
+                            command.internal().setStartedAt(startedAt);
                         }
 
 
@@ -453,7 +453,7 @@ implements ImperativeFacet {
             if(getRepositoryService().isPersistent(domainObject)) {
                 BookmarkService bookmarkService = getBookmarkService();
                 Bookmark bookmark = bookmarkService.bookmarkFor(domainObject);
-                command.setResult(bookmark);
+                command.internal().setResult(bookmark);
             }
             break;
         default:
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index fca560f..352935a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -35,7 +35,7 @@ import org.apache.isis.applib.events.lifecycle.ObjectPersistingEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectRemovingEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatedEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -118,7 +118,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache {
         // this rule originally implemented only in AuditableFacetFromConfigurationFactory
         // but think should apply in general
         //
-        if(HasTransactionId.class.isAssignableFrom(cls)) {
+        if(HasUniqueId.class.isAssignableFrom(cls)) {
             // do not install on any implementation of HasTransactionId
             // (ie commands, audit entries, published events).
             return;
@@ -142,7 +142,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache {
         //
         // this rule inspired by a similar rule for auditing, see above
         //
-        if(HasTransactionId.class.isAssignableFrom(cls)) {
+        if(HasUniqueId.class.isAssignableFrom(cls)) {
             // do not install on any implementation of HasTransactionId
             // (ie commands, audit entries, published events).
             return;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index bd23367..df84463 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -27,7 +27,7 @@ import javax.validation.constraints.Pattern;
 
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -198,7 +198,6 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
 
     void processCommand(final ProcessMethodContext processMethodContext) {
 
-        final Class<?> cls = processMethodContext.getCls();
         final Method method = processMethodContext.getMethod();
         final List<Property> properties = Annotations.getAnnotations(method, Property.class);
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
@@ -208,7 +207,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         //
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         //
-        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
             // do not install on any implementation of HasTransactionId
             // (ie commands, audit entries, published events).
             return;
@@ -230,7 +229,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
         // and for commands, see above
         //
-        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+        if(HasUniqueId.class.isAssignableFrom(processMethodContext.getCls())) {
             // do not install on any implementation of HasTransactionId
             // (ie commands, audit entries, published events).
             return;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index c6c3762..4ff4c54 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -57,7 +57,6 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
     private final PropertyOrCollectionAccessorFacet getterFacet;
     private final PropertySetterFacet setterFacet;
     private final PropertyClearFacet clearFacet;
-    private final PropertyDomainEventFacetAbstract propertyDomainEventFacet;
 
     private final ServicesInjector servicesInjector;
     private final PersistenceSessionServiceInternal persistenceSessionServiceInternal;
@@ -76,7 +75,7 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         this.getterFacet = getterFacet;
         this.setterFacet = setterFacet;
         this.clearFacet = clearFacet;
-        this.propertyDomainEventFacet = propertyDomainEventFacet;
+        //this.propertyDomainEventFacet = propertyDomainEventFacet;
         this.persistenceSessionServiceInternal = servicesInjector.getPersistenceSessionServiceInternal();
         this.servicesInjector = servicesInjector;
         this.domainEventHelper = new DomainEventHelper(servicesInjector);
@@ -229,7 +228,7 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
                         final Timestamp startedAt = getClockService().nowAsJavaSqlTimestamp();
                         execution.setStartedAt(startedAt);
                         if(command.getStartedAt() == null) {
-                            command.setStartedAt(startedAt);
+                            command.internal().setStartedAt(startedAt);
                         }
 
                         // ... post the executing event
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 0f82a47..9e8157a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -435,12 +435,12 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
             return;
         }
 
-        command.setTargetClass(CommandUtil.targetClassNameFor(targetAdapter));
-        command.setTargetAction(CommandUtil.targetMemberNameFor(this));
-        command.setArguments(arguments);
+        command.internal().setTargetClass(CommandUtil.targetClassNameFor(targetAdapter));
+        command.internal().setTargetAction(CommandUtil.targetMemberNameFor(this));
+        command.internal().setArguments(arguments);
 
         final Bookmark targetBookmark = CommandUtil.bookmarkFor(targetAdapter);
-        command.setTarget(targetBookmark);
+        command.internal().setTarget(targetBookmark);
     }
 
     protected void setupCommandMemberIdentifier() {
@@ -458,7 +458,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
             return;
         }
 
-        command.setMemberIdentifier(CommandUtil.memberIdentifierFor(this));
+        command.internal().setMemberIdentifier(CommandUtil.memberIdentifierFor(this));
     }
 
     protected void setupCommandDtoAndExecutionContext(final CommandDto dto) {
@@ -478,17 +478,17 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         // memento
 
         final String mementoXml = CommandDtoUtils.toXml(dto);
-        command.setMemento(mementoXml);
+        command.internal().setMemento(mementoXml);
 
         // copy over the command execution 'context' (if available)
         final CommandFacet commandFacet = getFacetHolder().getFacet(CommandFacet.class);
         if(commandFacet != null && !commandFacet.isDisabled()) {
-            command.setExecuteIn(commandFacet.executeIn());
-            command.setPersistence(commandFacet.persistence());
+            //command.internal().setExecuteIn(commandFacet.executeIn());
+            command.internal().setPersistence(commandFacet.persistence());
         } else {
             // if no facet, assume do want to execute right now, but only persist (eventually) if hinted.
-            command.setExecuteIn(org.apache.isis.applib.annotation.CommandExecuteIn.FOREGROUND);
-            command.setPersistence(org.apache.isis.applib.annotation.CommandPersistence.IF_HINTED);
+            //command.internal().setExecuteIn(org.apache.isis.applib.annotation.CommandExecuteIn.FOREGROUND);
+            command.internal().setPersistence(org.apache.isis.applib.annotation.CommandPersistence.IF_HINTED);
         }
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index 292c95a..ac6004f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -38,7 +38,7 @@ import org.apache.isis.applib.annotation.InvokeOn;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
@@ -139,18 +139,16 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         }
     }
 
-    class SomeTransactionalId implements HasTransactionId {
+    class SomeTransactionalId implements HasUniqueId {
         public void someAction() {
         }
 
         @Override
-        public UUID getTransactionId() {
+        public UUID getUniqueId() {
             return null;
         }
 
-        @Override
-        public void setTransactionId(final UUID transactionId) {
-        }
+        
     }
 
     public static class Invocation extends ActionAnnotationFacetFactoryTest {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 0a31bd3..9af5133 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -27,7 +27,7 @@ import java.util.UUID;
 
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
@@ -78,16 +78,13 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
     }
 
 
-    class SomeTransactionalId implements HasTransactionId {
+    class SomeTransactionalId implements HasUniqueId {
 
         @Override
-        public UUID getTransactionId() {
+        public UUID getUniqueId() {
             return null;
         }
-
-        @Override
-        public void setTransactionId(final UUID transactionId) {
-        }
+        
     }
 
     protected void allowingConfigurationToReturn(final String name, final String value) {
@@ -130,7 +127,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             allowingConfigurationToReturn("isis.services.audit.objects", "all");
 
-            facetFactory.processAuditing(new ProcessClassContext(HasTransactionId.class, mockMethodRemover, facetHolder));
+            facetFactory.processAuditing(new ProcessClassContext(HasUniqueId.class, mockMethodRemover, facetHolder));
 
             final Facet facet = facetHolder.getFacet(AuditableFacet.class);
             Assert.assertNull(facet);
@@ -281,7 +278,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             allowingConfigurationToReturn("isis.services.publish.objects", "all");
 
-            facetFactory.process(new ProcessClassContext(HasTransactionId.class, mockMethodRemover, facetHolder));
+            facetFactory.process(new ProcessClassContext(HasUniqueId.class, mockMethodRemover, facetHolder));
 
             final Facet facet = facetHolder.getFacet(PublishedObjectFacet.class);
             Assert.assertNull(facet);
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index 428e963..b486d45 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -171,11 +171,11 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
         final String userName = userService.getUser().getName();
 
-        command.setTimestamp(timestamp);
-        command.setUser(userName);
-        command.setTransactionId(transactionId);
+        command.internal().setTimestamp(timestamp);
+        command.internal().setUser(userName);
+        command.internal().setInteractionId(transactionId);
 
-        interaction.setTransactionId(transactionId);
+        interaction.setUniqueId(transactionId);
 
         commandContext.setCommand(command);
         interactionContext.setInteraction(interaction);
@@ -302,7 +302,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                 completedAt = clockService.nowAsJavaSqlTimestamp();
             }
 
-            command.setCompletedAt(completedAt);
+            command.internal().setCompletedAt(completedAt);
         }
 
         // ensureCommandsPersistedIfDirtyXactn
@@ -310,14 +310,12 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         // ensure that any changed objects means that the command should be persisted
         if(command.getMemberIdentifier() != null) {
             if(metricsService.numberObjectsDirtied() > 0) {
-                command.setPersistHint(true);
+                command.internal().setPersistHint(true);
             }
         }
 
         commandService.complete(command);
 
-        command.flushActionDomainEvents();
-
         interaction.clear();
     }
 
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index ff546ed..b095558 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -165,17 +165,17 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
 
         final Command command = createCommand();
-        final UUID transactionId = UUID.randomUUID();
+        final UUID interactionId = UUID.randomUUID();
         final Interaction interaction = factoryService.instantiate(Interaction.class);
 
         final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
         final String userName = userService.getUser().getName();
 
-        command.setTimestamp(timestamp);
-        command.setUser(userName);
-        command.setTransactionId(transactionId);
+        command.internal().setTimestamp(timestamp);
+        command.internal().setUser(userName);
+        command.internal().setInteractionId(interactionId);
 
-        interaction.setTransactionId(transactionId);
+        interaction.setUniqueId(interactionId);
 
         commandContext.setCommand(command);
         interactionContext.setInteraction(interaction);
@@ -302,7 +302,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
                 completedAt = clockService.nowAsJavaSqlTimestamp();
             }
 
-            command.setCompletedAt(completedAt);
+            command.internal().setCompletedAt(completedAt);
         }
 
         // ensureCommandsPersistedIfDirtyXactn
@@ -310,14 +310,12 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         // ensure that any changed objects means that the command should be persisted
         if(command.getMemberIdentifier() != null) {
             if(metricsService.numberObjectsDirtied() > 0) {
-                command.setPersistHint(true);
+                command.internal().setPersistHint(true);
             }
         }
 
         commandService.complete(command);
 
-        command.flushActionDomainEvents();
-
         interaction.clear();
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/auditing/AuditingServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/auditing/AuditingServiceInternal.java
index 5bde6ae..7e32a92 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/auditing/AuditingServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/auditing/AuditingServiceInternal.java
@@ -107,7 +107,7 @@ public class AuditingServiceInternal {
         final String targetClass = CommandUtil.targetClassNameFor(adapter);
 
         Transaction transaction = transactionService.currentTransaction();
-        final UUID transactionId = transaction.getTransactionId();
+        final UUID transactionId = transaction.getUniqueId();
         final int sequence = transaction.getSequence();
 
         for (AuditerService auditerService : auditerServices) {
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 7005383..f9a24bd 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
@@ -133,12 +133,12 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
 
         org.apache.isis.applib.annotation.CommandExecuteIn executeIn = commandWithDto.getExecuteIn();
 
-        LOG.info("Executing: {} {} {} {}", executeIn, commandWithDto.getMemberIdentifier(), commandWithDto.getTimestamp(), commandWithDto.getTransactionId());
+        LOG.info("Executing: {} {} {} {}", executeIn, commandWithDto.getMemberIdentifier(), commandWithDto.getTimestamp(), commandWithDto.getUniqueId());
 
         RuntimeException exceptionIfAny = null;
 
         try {
-            commandWithDto.setExecutor(Command.Executor.BACKGROUND);
+            commandWithDto.internal().setExecutor(Command.Executor.BACKGROUND);
 
             // responsibility for setting the Command#startedAt is in the ActionInvocationFacet or
             // PropertySetterFacet, but this is run if the domain object was found.  If the domain object is
@@ -151,7 +151,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
                     ? currentExecution.getStartedAt()
                             : clockService.nowAsJavaSqlTimestamp();
 
-                    commandWithDto.setStartedAt(startedAt);
+                    commandWithDto.internal().setStartedAt(startedAt);
 
                     final CommandDto dto = commandWithDto.asDto();
 
@@ -192,7 +192,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
                             // REVIEW: this doesn't really make sense if >1 action
                             if(resultAdapter != null) {
                                 Bookmark resultBookmark = CommandUtil.bookmarkFor(resultAdapter);
-                                commandWithDto.setResult(resultBookmark);
+                                commandWithDto.internal().setResult(resultBookmark);
                             }
                         }
                     } else {
@@ -244,7 +244,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
         if (commandWithDto.getStartedAt() == null) {
             // if attempting to commit the xactn threw an error, we will (I think?) have lost this info, so need to
             // capture
-            commandWithDto.setStartedAt(
+            commandWithDto.internal().setStartedAt(
                     priorExecution != null
                     ? priorExecution.getStartedAt()
                             : clockService.nowAsJavaSqlTimestamp());
@@ -254,10 +254,10 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
                 priorExecution != null
                 ? priorExecution.getCompletedAt()
                         : clockService.nowAsJavaSqlTimestamp();  // close enough...
-                commandWithDto.setCompletedAt(completedAt);
+                commandWithDto.internal().setCompletedAt(completedAt);
 
                 if(exceptionIfAny != null) {
-                    commandWithDto.setException(_Exceptions.
+                    commandWithDto.internal().setException(_Exceptions.
                             streamStacktraceLines(exceptionIfAny, 500)
                             .collect(Collectors.joining("\n")));
                 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
index e936a42..7b32bc0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.PublishingChangeKind;
-import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
@@ -242,7 +242,7 @@ public class ChangedObjectsServiceInternal implements WithTransactionScope {
     protected boolean shouldIgnore(final ObjectAdapter adapter) {
         final ObjectSpecification adapterSpec = adapter.getSpecification();
         final Class<?> adapterClass = adapterSpec.getCorrespondingClass();
-        return HasTransactionId.class.isAssignableFrom(adapterClass);
+        return HasUniqueId.class.isAssignableFrom(adapterClass);
     }
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java
index 8be50de..f9aa5f7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java
@@ -153,8 +153,8 @@ public class CommandDtoServiceInternalDefault implements CommandDtoServiceIntern
 
     protected UUID determineTransactionId() {
         Command command = commandContext.getCommand();
-        if (command != null && command.getTransactionId() != null) {
-            return command.getTransactionId();
+        if (command != null && command.getUniqueId() != null) {
+            return command.getUniqueId();
         } else {
             return UUID.randomUUID();
         }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ixn/InteractionDtoServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
index c51ab76..b7d3217 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.runtime.services.ixn;
 
 import java.util.List;
-import java.util.UUID;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
@@ -59,8 +58,6 @@ public class InteractionDtoServiceInternalDefault implements InteractionDtoServi
             final List<ObjectAdapter> argumentAdapters) {
 
         final Interaction interaction = interactionContext.getInteraction();
-        final UUID transactionId = interaction.getTransactionId();
-
         final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
 
         final Object targetPojo = targetAdapter.getObject();
@@ -77,8 +74,6 @@ public class InteractionDtoServiceInternalDefault implements InteractionDtoServi
                 objectAction, actionDto, argumentAdapters.toArray(new ObjectAdapter[]{}));
         final List<ParamDto> parameterDtos = CommandDtoUtils.parametersFor(actionDto).getParameter();
 
-        final String transactionIdStr = transactionId.toString();
-
         return InteractionDtoUtils.newActionInvocation(
                 nextEventSequence, targetBookmark, targetTitle,
                 actionDto.getMemberIdentifier(),
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishedObjectsDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishedObjectsDefault.java
index 29e2c2d..0087d65 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishedObjectsDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishedObjectsDefault.java
@@ -73,22 +73,18 @@ public class PublishedObjectsDefault implements PublishedObjects, RepresentsInte
         this.changesByAdapter = changesByAdapter;
     }
 
-
     // -- transactionId, sequence completedAt, user
     @Programmatic
-    @Override
     public UUID getTransactionId() {
-        return transactionUuid;
+        return getUniqueId();
     }
 
-    /**
-     * Unused; the {@link #getTransactionId()} is set in the constructor.
-     */
+    @Programmatic
     @Override
-    public void setTransactionId(final UUID transactionId) {
-        this.transactionUuid = transactionId;
+    public UUID getUniqueId() {
+        return transactionUuid;
     }
-
+    
     @Programmatic
     @Override
     public int getSequence() {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
index dffc2f8..c169db0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
@@ -97,7 +97,7 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
             final Map<ObjectAdapter, PublishingChangeKind> changeKindByPublishedAdapter) {
 
         final Command command = commandContext.getCommand();
-        final UUID transactionUuid = command.getTransactionId();
+        final UUID transactionUuid = command.getUniqueId();
 
         final String userName = userService.getUser().getName();
         final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
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 463b3c3..dd0eca8 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
@@ -27,7 +27,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.HasTransactionId;
 import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.applib.services.xactn.Transaction;
 import org.apache.isis.applib.services.xactn.TransactionState;
@@ -202,18 +201,10 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
 
     @Override
     @Programmatic
-    public final UUID getTransactionId() {
+    public final UUID getUniqueId() {
         return interactionId;
     }
 
-    /**
-     * Just throws an exception (the issue is that {@link HasTransactionId} really ought not to expose the setter).
-     */
-    @Override
-    public void setTransactionId(UUID transactionId) {
-        throw new IllegalStateException("Transaction Id cannot be set on Transaction object");
-    }
-
     @Override
     public int getSequence() {
         return sequence;
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 b2d16cd..5cbf5eb 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
@@ -235,10 +235,10 @@ public class IsisTransactionManager implements SessionScopedComponent {
             final Command command;
             if (existingCommandIfAny != null) {
                 commandContext.setCommand(existingCommandIfAny);
-                interaction.setTransactionId(existingCommandIfAny.getTransactionId());
+                interaction.setUniqueId(existingCommandIfAny.getUniqueId());
             }
             command = commandContext.getCommand();
-            final UUID transactionId = command.getTransactionId();
+            final UUID transactionId = command.getUniqueId();
 
             this.currentTransaction = new IsisTransaction(transactionId,
                     interaction.next(Interaction.Sequence.TRANSACTION.id()), /*authenticationSession,*/ servicesInjector);
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
index 34ce3cb..086ce4a 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
@@ -131,7 +131,7 @@ public abstract class ResourceAbstract {
 
 
     protected void setCommandExecutor(Command.Executor executor) {
-        getServicesInjector().lookupServiceElseFail(CommandContext.class).getCommand().setExecutor(executor);
+        getServicesInjector().lookupServiceElseFail(CommandContext.class).getCommand().internal().setExecutor(executor);
     }
 
     // //////////////////////////////////////////////////////////////
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index dcb8e7e..38fe8e9 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -117,7 +117,7 @@ public final class BulkActionsLinkFactory implements ActionLinkFactory {
                         final Command command;
                         if (commandContext != null) {
                             command = commandContext.getCommand();
-                            command.setExecutor(Executor.USER);
+                            command.internal().setExecutor(Executor.USER);
                         }
 
                         int numParameters = objectAction.getParameterCount();
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index bdda286..54333cf 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -126,7 +126,7 @@ implements FormExecutor {
             final CommandContext commandContext = getServicesInjector().lookupService(CommandContext.class);
             if (commandContext != null) {
                 command = commandContext.getCommand();
-                command.setExecutor(Command.Executor.USER);
+                command.internal().setExecutor(Command.Executor.USER);
             }
 
 
@@ -230,7 +230,7 @@ implements FormExecutor {
 
             // irrespective, capture error in the Command, and propagate
             if (command != null) {
-                command.setException(Throwables.getStackTraceAsString(ex));
+                command.internal().setException(Throwables.getStackTraceAsString(ex));
             }
 
             // throwing an exception will get caught by WebRequestCycleForIsis#onException(...)


[isis] 01/02: ISIS-1976: remove deprecated Command.next()

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 7f0d6ce8c0dcb4c2a8d64382ed1ec7a8416b13eb
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 26 18:45:53 2018 +0200

    ISIS-1976: remove deprecated Command.next()
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../isis/applib/services/iactn/Interaction.java    | 24 ++++++++++------------
 .../interaction/InteractionDefaultTest_next.java   |  5 +++--
 .../applib/util/ObjectContractsTest_compareTo.java |  1 -
 .../metamodel/interactions/InteractionContext.java |  2 +-
 4 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index f04080c..e971292 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -25,7 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.LongAdder;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Value;
@@ -305,8 +305,7 @@ public class Interaction implements HasTransactionId {
         }
     }
 
-
-    private final Map<String, AtomicInteger> maxBySequence = _Maps.newHashMap();
+    private final Map<String, LongAdder> maxBySequence = _Maps.newHashMap();
 
     /**
      * Generates numbers in a named sequence.  The name of the sequence can be arbitrary, though note that the
@@ -315,17 +314,16 @@ public class Interaction implements HasTransactionId {
      */
     @Programmatic
     public int next(final String sequenceId) {
-        AtomicInteger next = maxBySequence.get(sequenceId);
-        if(next == null) {
-            next = new AtomicInteger(0);
-            maxBySequence.put(sequenceId, next);
-        } else {
-            next.incrementAndGet();
-        }
-        return next.get();
+        final LongAdder adder = maxBySequence.computeIfAbsent(sequenceId, this::newAdder);
+        adder.increment();
+        return adder.intValue();
+    }
+    
+    private LongAdder newAdder(String ignore) {
+        final LongAdder adder = new LongAdder();
+        adder.decrement();
+        return adder;
     }
-
-
 
     /**
      * Represents an action invocation/property edit as a node in a call-stack execution graph, with sub-interactions
diff --git a/core/applib/src/test/java/org/apache/isis/applib/services/interaction/InteractionDefaultTest_next.java b/core/applib/src/test/java/org/apache/isis/applib/services/interaction/InteractionDefaultTest_next.java
index c977b07..31ec5db 100644
--- a/core/applib/src/test/java/org/apache/isis/applib/services/interaction/InteractionDefaultTest_next.java
+++ b/core/applib/src/test/java/org/apache/isis/applib/services/interaction/InteractionDefaultTest_next.java
@@ -24,13 +24,14 @@ import static org.junit.Assert.assertThat;
 
 import org.junit.Test;
 
-import org.apache.isis.applib.services.command.CommandDefault;
+import org.apache.isis.applib.services.iactn.Interaction;
 
 public class InteractionDefaultTest_next {
 
     @Test
     public void test() {
-        CommandDefault interaction = new CommandDefault();
+        final Interaction interaction = new Interaction();
+        
         assertThat(interaction.next("foo"), is(0));
         assertThat(interaction.next("foo"), is(1));
         assertThat(interaction.next("bar"), is(0));
diff --git a/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_compareTo.java b/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_compareTo.java
index 015a2ff..9c74ef5 100644
--- a/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_compareTo.java
+++ b/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_compareTo.java
@@ -40,7 +40,6 @@ public class ObjectContractsTest_compareTo extends ComparableContractTest_compar
     /**
      * as per {@link InvoiceItem#compareTo(InvoiceItem)}
      */
-    @SuppressWarnings("unchecked")
     @Override
     protected List<List<org.apache.isis.applib.util.InvoiceItem>> orderedTuples() {
         return listOf(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
index 81e1fc0..5445ecf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
@@ -53,7 +53,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  * public API.
  *
  * <p>
- * The class is genericized so that the {@link #createInteractionEvent() factory
+ * The class is generic so that the {@link #createInteractionEvent() factory
  * method} can return the correct subclass without having to downcast.
  */
 public abstract class InteractionContext<T extends InteractionEvent> {