You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/09/30 07:27:32 UTC

[isis] branch ISIS-2222 updated (102309b -> 914671f)

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

danhaywood pushed a change to branch ISIS-2222
in repository https://gitbox.apache.org/repos/asf/isis.git.


 discard 102309b  ISIS-2222 : adds actuator
     add 57f0daa  ISIS-2439: fix Create Schema syntax for MariaDB/MySql
     add 087b2c1  Bump ognl from 3.0.9 to 3.2.15
     add 1d04d2b  Merge pull request #221 from apache/dependabot/maven/ognl-ognl-3.2.15
     add e2de534  Bump cucumber.version from 6.7.0 to 6.8.0
     add e2f9ae3  Merge pull request #222 from apache/dependabot/maven/cucumber.version-6.8.0
     add af162e7  ISIS-2440: fixes AsciiDoc value facets not registered properly
     add 30a94b4  ISIS-2440: fixes Markdown value facets not registered properly
     add d11d21a  ISIS-2439: adds adoc on how to override SecMan default schema
     new 8c6e2b7  ISIS-2222 : adds actuator
     new ccad7ba  ISIS-2222: adds openOnPrimary and openOnSecondary for command replay.  Also fixes replay of commands - no userData is required for these.
     new 914671f  ISIS-2222 : converts applib Object mixins to modern annotation style

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (102309b)
            \
             N -- N -- N   refs/heads/ISIS-2222 (914671f)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 3 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:
 .../mixins/layout/Object_downloadLayoutXml.java    | 34 ++++-------
 .../applib/mixins/layout/Object_openRestApi.java   | 31 +++++-----
 .../mixins/layout/Object_rebuildMetamodel.java     |  4 +-
 .../isis/applib/util/schema/CommonDtoUtils.java    |  6 +-
 .../apache/isis/core/config/IsisConfiguration.java |  7 +++
 .../core/metamodel/facetapi/FacetHolderImpl.java   |  3 +-
 .../facets/object/value/ValueFacetAbstract.java    |  8 ++-
 .../value/annotcfg/ValueFacetAnnotation.java       | 19 ++----
 .../vsp/ValueFacetUsingSemanticsProvider.java      | 12 +---
 .../ValueFacetUsingSemanticsProviderFactory.java   |  9 +--
 .../ValueSemanticsProviderAndFacetAbstract.java    |  1 -
 .../value/vsp/ValueSemanticsProviderUtil.java      | 29 +++++++--
 core/pom.xml                                       |  4 +-
 .../Action/command/ActionCommandJdo.java           |  8 ++-
 .../ActionCommandJdo_mixinUpdateProperty.java      |  4 +-
 .../config/application-primary.properties          |  3 +-
 .../commandlog/impl/jdo/CommandJdoRepository.java  | 15 +++--
 .../impl/mixins/Object_recentCommands.java         |  5 +-
 .../primary/IsisModuleExtCommandReplayPrimary.java |  6 ++
 .../primary/config/PrimaryConfig.java              | 36 ++++++++++++
 .../primary/mixins/CommandJdo_download.java        | 48 ---------------
 .../primary/mixins/Object_openOnSecondary.java}    | 26 ++++-----
 .../IsisModuleExtCommandReplaySecondary.java       |  5 ++
 .../analyser/CommandReplayAnalyserException.java   |  4 ++
 .../analyser/CommandReplayAnalyserResult.java      |  6 +-
 ...penOnPrimary.java => Object_openOnPrimary.java} | 13 +++--
 .../adoc/modules/secman/pages/jdo-persistence.adoc | 60 ++++++++++++++++++-
 .../CreateSchemaObjectFromClassMetadata.java       | 68 +++++++++++++---------
 .../valuetypes/asciidoc/applib/value/AsciiDoc.java |  2 +-
 .../metamodel/IsisModuleValAsciidocMetaModel.java  |  9 ++-
 ...DocValueFacetUsingSemanticsProviderFactory.java | 41 -------------
 .../facets/AsciiDocValueSemanticsProvider.java     | 36 ++++++------
 .../valuetypes/markdown/applib/value/Markdown.java |  3 +-
 .../metamodel/IsisModuleValMarkdownMetaModel.java  |  9 ++-
 ...ownValueFacetUsingSemanticsProviderFactory.java | 42 -------------
 .../facets/MarkdownValueSemanticsProvider.java     | 34 +++++------
 36 files changed, 323 insertions(+), 327 deletions(-)
 create mode 100644 extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java
 delete mode 100644 extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/CommandJdo_download.java
 copy extensions/core/command-replay/{secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_openOnPrimary.java => primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java} (52%)
 rename extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/{CommandJdo_openOnPrimary.java => Object_openOnPrimary.java} (81%)
 delete mode 100644 valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/facets/AsciiDocValueFacetUsingSemanticsProviderFactory.java
 delete mode 100644 valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/facets/MarkdownValueFacetUsingSemanticsProviderFactory.java


[isis] 01/03: ISIS-2222 : adds actuator

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

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

commit 8c6e2b7cbb87d0b485027c321617b536a929fda7
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Sep 29 07:35:14 2020 +0100

    ISIS-2222 : adds actuator
---
 examples/demo/web/pom.xml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/examples/demo/web/pom.xml b/examples/demo/web/pom.xml
index 83243b3..7621e20 100644
--- a/examples/demo/web/pom.xml
+++ b/examples/demo/web/pom.xml
@@ -67,6 +67,12 @@
 			<artifactId>isis-extensions-command-replay-secondary</artifactId>
 		</dependency>
 
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-actuator</artifactId>
+			<version>${spring-boot.version}</version>
+		</dependency>
+
 	</dependencies>
 
 </project>
\ No newline at end of file


[isis] 03/03: ISIS-2222 : converts applib Object mixins to modern annotation style

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

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

commit 914671f84281204c12f155f29459a59cabd4b2ca
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Sep 30 08:26:57 2020 +0100

    ISIS-2222 : converts applib Object mixins to modern annotation style
---
 .../mixins/layout/Object_downloadLayoutXml.java    | 34 +++++++---------------
 .../applib/mixins/layout/Object_openRestApi.java   | 31 +++++++++-----------
 .../mixins/layout/Object_rebuildMetamodel.java     |  4 +--
 3 files changed, 27 insertions(+), 42 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java
index 7a44227..d802a64 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_downloadLayoutXml.java
@@ -36,55 +36,43 @@ import org.apache.isis.applib.value.NamedWithMimeType.CommonMimeType;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
-@Mixin(method="act") 
+@Action(
+        domainEvent = Object_downloadLayoutXml.ActionDomainEvent.class,
+        semantics = SemanticsOf.SAFE,
+        restrictTo = RestrictTo.PROTOTYPING
+)
+@ActionLayout(
+        cssClassFa = "fa-download",
+        position = ActionLayout.Position.PANEL_DROPDOWN
+)
 @RequiredArgsConstructor
 public class Object_downloadLayoutXml {
 
-    private final Object holder;
-
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_downloadLayoutXml> {}
 
-    @Action(
-            domainEvent = ActionDomainEvent.class,
-            semantics = SemanticsOf.SAFE,
-            restrictTo = RestrictTo.PROTOTYPING
-            )
-    @ActionLayout(
-            contributed = Contributed.AS_ACTION,
-            cssClassFa = "fa-download",
-            position = ActionLayout.Position.PANEL_DROPDOWN
-            )
+    private final Object holder;
+
     @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.1")
     public Object act(
-
-            // PARAM 0
             @ParameterLayout(
                     named = MixinConstants.FILENAME_PROPERTY_NAME,
                     describedAs = MixinConstants.FILENAME_PROPERTY_DESCRIPTION)
             final String fileName,
-
-            // PARAM 1
             final LayoutService.Style style) {
 
         val xmlString = layoutService.toXml(holder.getClass(), style);
         return  Clob.of(fileName, CommonMimeType.XML, xmlString);
     }
 
-    // -- PARAM 0 (fileName)
-
     public String default0Act() {
         return holder.getClass().getSimpleName() + ".layout";
     }
 
-    // -- PARAM 1 (style)
-
     public LayoutService.Style default1Act() {
         return LayoutService.Style.NORMALIZED;
     }
 
-    // -- DEPENDENCIES
-
     @Inject LayoutService layoutService;
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
index 8ee8008..b65676a 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
@@ -36,29 +36,23 @@ import org.apache.isis.applib.value.LocalResourcePath;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
-@Mixin(method="act")
+@Action(
+        domainEvent = Object_openRestApi.ActionDomainEvent.class,
+        semantics = SemanticsOf.SAFE,
+        restrictTo = RestrictTo.PROTOTYPING
+)
+@ActionLayout(
+        cssClassFa = "fa-external-link-alt",
+        position = ActionLayout.Position.PANEL_DROPDOWN
+)
 @RequiredArgsConstructor
 public class Object_openRestApi {
 
-    @Inject private BookmarkService bookmarkService;
-    //@Inject private ConfigurationViewService configurationViewService;
-    @Inject private RestfulPathProvider restfulPathProvider;
-
-    private final Object holder;
-
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_openRestApi> {}
 
-    @Action(
-            domainEvent = ActionDomainEvent.class,
-            semantics = SemanticsOf.SAFE,
-            restrictTo = RestrictTo.PROTOTYPING
-            )
-    @ActionLayout(
-            contributed = Contributed.AS_ACTION,
-            cssClassFa = "fa-external-link-alt",
-            position = ActionLayout.Position.PANEL_DROPDOWN
-            )
+    private final Object holder;
+
     @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "750.1")
     public LocalResourcePath act() {
         val bookmark = bookmarkService.bookmarkForElseThrow(holder);
@@ -77,4 +71,7 @@ public class Object_openRestApi {
         Optional<String> getRestfulPath();
     }
 
+    @Inject BookmarkService bookmarkService;
+    @Inject RestfulPathProvider restfulPathProvider;
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
index c68f875..4574e16 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
@@ -44,11 +44,11 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class Object_rebuildMetamodel {
 
-    private final Object holder;
-
     public static class ActionDomainEvent
     extends org.apache.isis.applib.IsisModuleApplib.ActionDomainEvent<Object_rebuildMetamodel> {}
 
+    private final Object holder;
+
     @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.1")
     public Object act() {
         metaModelService.rebuild(holder.getClass());


[isis] 02/03: ISIS-2222: adds openOnPrimary and openOnSecondary for command replay. Also fixes replay of commands - no userData is required for these.

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

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

commit ccad7ba144722364c72bfb53f9fbdaa73e0065e1
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Sep 30 08:26:31 2020 +0100

    ISIS-2222: adds openOnPrimary and openOnSecondary for command replay.  Also fixes replay of commands - no userData is required for these.
---
 .../isis/applib/util/schema/CommonDtoUtils.java    |  6 ++-
 .../apache/isis/core/config/IsisConfiguration.java |  7 ++++
 .../Action/command/ActionCommandJdo.java           |  8 ++--
 .../ActionCommandJdo_mixinUpdateProperty.java      |  4 +-
 .../config/application-primary.properties          |  3 +-
 .../commandlog/impl/jdo/CommandJdoRepository.java  | 15 ++++---
 .../impl/mixins/Object_recentCommands.java         |  5 ++-
 .../primary/IsisModuleExtCommandReplayPrimary.java |  6 +++
 .../primary/config/PrimaryConfig.java              | 36 ++++++++++++++++
 .../primary/mixins/CommandJdo_download.java        | 48 ----------------------
 .../primary/mixins/Object_openOnSecondary.java}    | 26 ++++++------
 .../IsisModuleExtCommandReplaySecondary.java       |  5 +++
 .../analyser/CommandReplayAnalyserException.java   |  4 ++
 .../analyser/CommandReplayAnalyserResult.java      |  6 ++-
 ...penOnPrimary.java => Object_openOnPrimary.java} | 13 +++---
 15 files changed, 109 insertions(+), 83 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
index 3fb7f14..eab3811 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
@@ -58,6 +58,8 @@ import org.apache.isis.schema.common.v2.ValueWithTypeDto;
 
 import static org.apache.isis.commons.internal.collections._Maps.entry;
 
+import lombok.val;
+
 public final class CommonDtoUtils {
 
     // -- PARAM_DTO_TO_NAME, PARAM_DTO_TO_TYPE
@@ -519,7 +521,7 @@ public final class CommonDtoUtils {
             return null;
         }
         final Optional<MapDto.Entry> entryIfAny = entryIfAnyFor(mapDto, key);
-        return entryIfAny.isPresent() ? entryIfAny.get().getValue() : null;
+        return entryIfAny.map(MapDto.Entry::getValue).orElse(null);
     }
 
     public static void putMapKeyValue(final MapDto mapDto, final String key, final String value) {
@@ -530,7 +532,7 @@ public final class CommonDtoUtils {
         if(entryIfAny.isPresent()) {
             entryIfAny.get().setValue(value);
         } else {
-            final MapDto.Entry entry = new MapDto.Entry();
+            val entry = new MapDto.Entry();
             entry.setKey(key);
             entry.setValue(value);
             mapDto.getEntry().add(entry);
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index f33acf3..3189179 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -3068,6 +3068,13 @@ public class IsisConfiguration {
                 private Optional<String> baseUrlWicket;
             }
 
+            private final SecondaryAccess secondaryAccess = new SecondaryAccess();
+            @Data
+            public static class SecondaryAccess {
+                @javax.validation.constraints.Pattern(regexp="^http[s]?://[^:]+?(:\\d+)?.*([^/]+/)$")
+                private Optional<String> baseUrlWicket;
+            }
+
             private Integer batchSize = 10;
 
             private final QuartzSession quartzSession = new QuartzSession();
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.java
index a7beb97..d882f2f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.java
@@ -90,7 +90,7 @@ public class ActionCommandJdo
 
 //tag::annotation[]
     @Action(
-        command = CommandReification.ENABLED
+        command = CommandReification.ENABLED        // <.>
         , semantics = SemanticsOf.IDEMPOTENT
         , associateWith = "property"
         , associateWithSequence = "1"
@@ -100,11 +100,14 @@ public class ActionCommandJdo
         , describedAs = "@Action(command = ENABLED)"
     )
     public ActionCommandJdo updatePropertyUsingAnnotation(final String value) {
+        // ...
+//end::annotation[]
         setProperty(value);
         return this;
     }
     public String default0UpdatePropertyUsingAnnotation() {
         return getProperty();
+//tag::annotation[]
     }
 //end::annotation[]
 
@@ -119,7 +122,6 @@ public class ActionCommandJdo
         named = "Update Property"
         , describedAs = "@Action(command = ENABLED)"
     )
-//tag::annotation-2[]
     public ActionCommandJdo updatePropertyCommandDisabledUsingAnnotation(final String value) {
         // ...
 //end::annotation-2[]
@@ -159,7 +161,7 @@ public class ActionCommandJdo
     @ActionCommandDisabledMetaAnnotation        // <.>
     @Action(
         semantics = SemanticsOf.IDEMPOTENT
-        , command = CommandReification.ENABLED
+        , command = CommandReification.ENABLED  // <.>
         , associateWith = "propertyMetaAnnotatedOverridden"
         , associateWithSequence = "1"
     )
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdateProperty.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdateProperty.java
index 806add4..ee0e2fc 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdateProperty.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdateProperty.java
@@ -8,7 +8,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 
 //tag::class[]
 @Action(
-    command = CommandReification.ENABLED
+    command = CommandReification.ENABLED        // <.>
     , semantics = SemanticsOf.IDEMPOTENT
     , associateWith = "property"
     , associateWithSequence = "2"
@@ -27,7 +27,6 @@ public class ActionCommandJdo_mixinUpdateProperty {
         this.actionCommandJdo = actionCommandJdo;
     }
 
-//tag::class[]
     public ActionCommandJdo act(final String value) {
         actionCommandJdo.setProperty(value);
         return actionCommandJdo;
@@ -35,5 +34,6 @@ public class ActionCommandJdo_mixinUpdateProperty {
     public String default0Act() {
         return actionCommandJdo.getProperty();
     }
+//tag::class[]
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/resources/config/application-primary.properties b/examples/demo/domain/src/main/resources/config/application-primary.properties
index a3ac65c..82f5e64 100644
--- a/examples/demo/domain/src/main/resources/config/application-primary.properties
+++ b/examples/demo/domain/src/main/resources/config/application-primary.properties
@@ -1 +1,2 @@
-server.port=8080
\ No newline at end of file
+server.port=8080
+isis.extensions.command-replay.secondary-access.base-url-wicket=http://localhost:9090/wicket/
\ No newline at end of file
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
index 2b3450f..aec9182 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.extensions.commandlog.impl.jdo;
 
+import java.rmi.activation.ActivationID;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -49,7 +50,9 @@ import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.cmd.v2.CommandsDto;
 import org.apache.isis.schema.cmd.v2.MapDto;
+import org.apache.isis.schema.common.v2.InteractionType;
 import org.apache.isis.schema.common.v2.OidDto;
+import org.apache.isis.schema.ixn.v2.ActionInvocationDto;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -333,11 +336,13 @@ public class CommandJdoRepository {
     @Programmatic
     public CommandJdo saveForReplay(final CommandDto dto) {
 
-        final MapDto userData = dto.getUserData();
-        if (userData == null ) {
-            throw new IllegalStateException(String.format(
-                    "Can only persist DTOs with additional userData; got: \n%s",
-                    CommandDtoUtils.toXml(dto)));
+        if(dto.getMember().getInteractionType() == InteractionType.ACTION_INVOCATION) {
+            final MapDto userData = dto.getUserData();
+            if (userData == null ) {
+                throw new IllegalStateException(String.format(
+                        "Can only persist action DTOs with additional userData; got: \n%s",
+                        CommandDtoUtils.toXml(dto)));
+            }
         }
 
         final CommandJdo commandJdo = new CommandJdo();
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
index bd8af7d..5756b8e 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
@@ -8,6 +8,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -20,10 +21,10 @@ import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
  * This mixin contributes a <tt>recentCommands</tt> action to any domain object
  * (unless also {@link HasUniqueId} - cmmands don't themselves have commands).
  */
-@Mixin(method = "act")
 @Action(
     semantics = SemanticsOf.SAFE,
-    domainEvent = Object_recentCommands.ActionDomainEvent.class
+    domainEvent = Object_recentCommands.ActionDomainEvent.class,
+    restrictTo = RestrictTo.PROTOTYPING
 )
 @ActionLayout(
     cssClassFa = "fa-bolt",
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java
index aaeff75..d72f39c 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java
@@ -5,6 +5,8 @@ import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Profile;
 
 import org.apache.isis.extensions.commandlog.impl.IsisModuleExtCommandLogImpl;
+import org.apache.isis.extensions.commandreplay.primary.config.PrimaryConfig;
+import org.apache.isis.extensions.commandreplay.primary.mixins.Object_openOnSecondary;
 import org.apache.isis.extensions.commandreplay.primary.restapi.CommandRetrievalService;
 import org.apache.isis.extensions.commandreplay.primary.spiimpl.CaptureResultOfCommand;
 import org.apache.isis.extensions.commandreplay.primary.ui.CommandReplayOnPrimaryService;
@@ -18,6 +20,10 @@ import org.apache.isis.extensions.commandreplay.primary.ui.CommandReplayOnPrimar
         CommandRetrievalService.class,
         CommandReplayOnPrimaryService.class,
         CaptureResultOfCommand.class,
+        PrimaryConfig.class,
+
+        // mixins
+        Object_openOnSecondary.class,
 
 })
 @Profile("primary")
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java
new file mode 100644
index 0000000..da95583
--- /dev/null
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java
@@ -0,0 +1,36 @@
+package org.apache.isis.extensions.commandreplay.primary.config;
+
+import java.util.List;
+
+import javax.inject.Named;
+import javax.validation.constraints.NotNull;
+
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.core.config.IsisConfiguration;
+
+import lombok.Getter;
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+@Service
+@Named("isisExtensionsCommandReplayPrimary.PrimaryConfig")
+@Order(OrderPrecedence.MIDPOINT)
+@Log4j2
+public class PrimaryConfig {
+
+    @Getter final String secondaryBaseUrlWicket;
+
+    public PrimaryConfig(@NotNull final IsisConfiguration isisConfiguration) {
+        val config = isisConfiguration.getExtensions().getCommandReplay();
+
+        val secondaryAccess = config.getSecondaryAccess();
+        secondaryBaseUrlWicket = secondaryAccess.getBaseUrlWicket().orElse(null);
+    }
+
+    public boolean isConfigured() {
+        return secondaryBaseUrlWicket != null;
+    }
+}
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/CommandJdo_download.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/CommandJdo_download.java
deleted file mode 100644
index 82848f5..0000000
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/CommandJdo_download.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.apache.isis.extensions.commandreplay.primary.mixins;
-
-import javax.inject.Inject;
-
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ParameterLayout;
-import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.value.Clob;
-import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
-import org.apache.isis.extensions.commandreplay.primary.IsisModuleExtCommandReplayPrimary;
-import org.apache.isis.extensions.commandreplay.primary.ui.CommandReplayOnPrimaryService;
-
-
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.NON_IDEMPOTENT,
-    domainEvent = CommandJdo_download.ActionDomainEvent.class
-)
-@ActionLayout(
-    cssClassFa = "fa-download",
-    position = ActionLayout.Position.PANEL
-)
-@RequiredArgsConstructor
-public class CommandJdo_download {
-
-    public static class ActionDomainEvent
-            extends IsisModuleExtCommandReplayPrimary.ActionDomainEvent<CommandJdo_download> { }
-
-    private final CommandJdo commandJdo;
-
-    @MemberOrder(name = "arguments", sequence = "1")
-    public Clob act(
-            @ParameterLayout(named="Filename prefix")
-            final String fileNamePrefix) {
-        return commandReplayOnPrimaryService.downloadCommandById(commandJdo.getUniqueId(), fileNamePrefix);
-    }
-    public String default0Act() {
-        return "command";
-    }
-
-    @Inject
-    CommandReplayOnPrimaryService commandReplayOnPrimaryService;
-
-
-}
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_openOnPrimary.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java
similarity index 52%
copy from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_openOnPrimary.java
copy to extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java
index d7f0b61..7fedb2b 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_openOnPrimary.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java
@@ -1,4 +1,4 @@
-package org.apache.isis.extensions.commandreplay.secondary.mixins;
+package org.apache.isis.extensions.commandreplay.primary.mixins;
 
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -8,31 +8,31 @@ import javax.inject.Inject;
 import org.apache.isis.applib.ApplicationException;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
-import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
-import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary;
-import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig;
+import org.apache.isis.extensions.commandreplay.primary.IsisModuleExtCommandReplayPrimary;
+import org.apache.isis.extensions.commandreplay.primary.config.PrimaryConfig;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @Action(
     semantics = SemanticsOf.SAFE,
-    domainEvent = CommandJdo_openOnPrimary.ActionDomainEvent.class
+    domainEvent = Object_openOnSecondary.ActionDomainEvent.class,
+    restrictTo = RestrictTo.PROTOTYPING
 )
 @RequiredArgsConstructor
-public class CommandJdo_openOnPrimary<T> {
+public class Object_openOnSecondary {
 
     public static class ActionDomainEvent
-            extends IsisModuleExtCommandReplaySecondary.ActionDomainEvent<CommandJdo_openOnPrimary> { }
+            extends IsisModuleExtCommandReplayPrimary.ActionDomainEvent<Object_openOnSecondary> { }
 
-    final CommandJdo commandJdo;
+    final Object object;
 
-    @MemberOrder(name = "transactionId", sequence = "1")
     public URL act() {
         val baseUrlPrefix = lookupBaseUrlPrefix();
-        val urlSuffix = bookmarkService.bookmarkFor(commandJdo).toString();
+        val urlSuffix = bookmarkService.bookmarkFor(object).toString();
 
         try {
             return new URL(baseUrlPrefix + urlSuffix);
@@ -41,14 +41,14 @@ public class CommandJdo_openOnPrimary<T> {
         }
     }
     public boolean hideAct() {
-        return !secondaryConfig.isConfigured();
+        return !primaryConfig.isConfigured();
     }
 
     private String lookupBaseUrlPrefix() {
-        return secondaryConfig.getPrimaryBaseUrlWicket() + "entity/";
+        return primaryConfig.getSecondaryBaseUrlWicket() + "entity/";
     }
 
-    @Inject SecondaryConfig secondaryConfig;
+    @Inject PrimaryConfig primaryConfig;
     @Inject BookmarkService bookmarkService;
 
 }
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java
index c7e115c..6202b21 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java
@@ -29,6 +29,7 @@ import org.apache.isis.extensions.commandreplay.secondary.executor.CommandExecut
 import org.apache.isis.extensions.commandreplay.secondary.fetch.CommandFetcher;
 import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig;
 import org.apache.isis.extensions.commandreplay.secondary.job.ReplicateAndReplayJob;
+import org.apache.isis.extensions.commandreplay.secondary.mixins.Object_openOnPrimary;
 import org.apache.isis.extensions.commandreplay.secondary.ui.CommandReplayOnSecondaryService;
 import org.apache.isis.extensions.quartz.IsisModuleExtQuartzImpl;
 import org.apache.isis.extensions.quartz.spring.AutowiringSpringBeanJobFactory;
@@ -52,6 +53,10 @@ import lombok.val;
 
         // @Service's
         SecondaryConfig.class,
+
+        // mixins
+        Object_openOnPrimary.class,
+
 })
 @Profile("secondary")
 public class IsisModuleExtCommandReplaySecondary {
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java
index d6226ac..839adaa 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java
@@ -14,6 +14,7 @@ import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
+import org.apache.isis.schema.common.v2.InteractionType;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -39,6 +40,9 @@ public class CommandReplayAnalyserException implements CommandReplayAnalyser {
         }
 
         val dto = commandJdo.getCommandDto();
+        if(dto.getMember().getInteractionType() == InteractionType.PROPERTY_EDIT) {
+            return null;
+        }
 
         val primaryException = CommandDtoUtils.getUserData(dto, UserDataKeys.EXCEPTION);
         if (_Strings.isNullOrEmpty(primaryException)) {
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java
index dc1012d..5cfa926 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java
@@ -15,6 +15,7 @@ import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
 import org.apache.isis.schema.cmd.v2.CommandDto;
+import org.apache.isis.schema.common.v2.InteractionType;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -39,7 +40,10 @@ public class CommandReplayAnalyserResult implements CommandReplayAnalyser {
             return null;
         }
 
-        final CommandDto dto = commandJdo.getCommandDto();
+        val dto = commandJdo.getCommandDto();
+        if(dto.getMember().getInteractionType() == InteractionType.PROPERTY_EDIT) {
+            return null;
+        }
 
         // see if the outcome was the same...
         // ... either the same result when replayed
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_openOnPrimary.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java
similarity index 81%
rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_openOnPrimary.java
rename to extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java
index d7f0b61..5571aa9 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandJdo_openOnPrimary.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java
@@ -8,6 +8,7 @@ import javax.inject.Inject;
 import org.apache.isis.applib.ApplicationException;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
@@ -19,20 +20,20 @@ import lombok.val;
 
 @Action(
     semantics = SemanticsOf.SAFE,
-    domainEvent = CommandJdo_openOnPrimary.ActionDomainEvent.class
+    domainEvent = Object_openOnPrimary.ActionDomainEvent.class,
+    restrictTo = RestrictTo.PROTOTYPING
 )
 @RequiredArgsConstructor
-public class CommandJdo_openOnPrimary<T> {
+public class Object_openOnPrimary {
 
     public static class ActionDomainEvent
-            extends IsisModuleExtCommandReplaySecondary.ActionDomainEvent<CommandJdo_openOnPrimary> { }
+            extends IsisModuleExtCommandReplaySecondary.ActionDomainEvent<Object_openOnPrimary> { }
 
-    final CommandJdo commandJdo;
+    final Object object;
 
-    @MemberOrder(name = "transactionId", sequence = "1")
     public URL act() {
         val baseUrlPrefix = lookupBaseUrlPrefix();
-        val urlSuffix = bookmarkService.bookmarkFor(commandJdo).toString();
+        val urlSuffix = bookmarkService.bookmarkFor(object).toString();
 
         try {
             return new URL(baseUrlPrefix + urlSuffix);