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

danhaywood pushed a commit to branch CAUSEWAY-4042
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/CAUSEWAY-4042 by this push:
     new 8efd1dd6772 CAUSEWAY-4042: refining openTarget, adds actualTarget
8efd1dd6772 is described below

commit 8efd1dd677243e9ffe4829d2074fd7de1506b3c0
Author: Dan Haywood <[email protected]>
AuthorDate: Fri Jul 3 10:36:18 2026 +0100

    CAUSEWAY-4042: refining openTarget, adds actualTarget
---
 .../applib/dom/replay/ReplayableCommand.java       | 22 +++++++-
 .../replay/ReplayableCommand.layout.fallback.xml   |  1 +
 .../dom/replay/ReplayableCommand_openTarget.java   | 58 ++++++++++++++++++----
 .../dom/replay/ReplayableCommand_openTargetTR.java | 21 +++++---
 4 files changed, 84 insertions(+), 18 deletions(-)

diff --git 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.java
 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.java
index 41ecdb30a08..a5a10479ef5 100644
--- 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.java
+++ 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.java
@@ -30,6 +30,7 @@
 
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.causeway.applib.Identifier;
 import org.apache.causeway.applib.ViewModel;
@@ -68,6 +69,8 @@
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import 
org.apache.causeway.extensions.commandlog.applib.CausewayModuleExtCommandLogApplib;
 import org.apache.causeway.extensions.commandlog.applib.dom.CommandLogEntry;
+import 
org.apache.causeway.extensions.commandlog.applib.dom.CommandReplayResultMapping;
+import 
org.apache.causeway.extensions.commandlog.applib.dom.CommandReplayResultMappingRepository;
 import org.apache.causeway.extensions.commandlog.applib.dom.ReplayState;
 import org.apache.causeway.schema.cmd.v2.ActionDto;
 import org.apache.causeway.schema.cmd.v2.CommandDto;
@@ -249,12 +252,29 @@ public Optional<ZonedDateTime> getTimestampIfAny() {
             sequence = "2.1",
             fieldSetId = "target",
             hidden = Where.PARENTED_TABLES,
-            describedAs = "Target of the command")
+            describedAs = "Recorded target of the command")
     public String getTarget() {
         return targetBookmarkIfAny()
                 .orElse(null);
     }
 
+    @Property
+    @PropertyLayout(
+            sequence = "2.1.5",
+            fieldSetId = "target",
+            hidden = Where.PARENTED_TABLES,
+            describedAs = "Actual target of the command")
+    public String getActualTarget() {
+        return targetBookmarkIfAny()
+                .flatMap(Bookmark::parse)
+                .flatMap((Bookmark x) -> 
commandReplayResultMappingRepository.findByRecordedBookmark(x))
+                .map(CommandReplayResultMapping::getActualBookmark)
+                .map(Bookmark::stringify)
+                .orElse(null);
+    }
+
+    @Inject CommandReplayResultMappingRepository 
commandReplayResultMappingRepository;
+
     @Property
     @PropertyLayout(
             named = "Target",
diff --git 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.layout.fallback.xml
 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.layout.fallback.xml
index 765de8e258d..b98fdacc3ff 100644
--- 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.layout.fallback.xml
+++ 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand.layout.fallback.xml
@@ -47,6 +47,7 @@
                     <cpt:fieldSet name="Target">
                         <cpt:action id="openTarget"/>
                         <cpt:property id="target"/>
+                        <cpt:property id="actualTarget"/>
                         <cpt:property id="member"/>
                     </cpt:fieldSet>
                 </bs:col>
diff --git 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTarget.java
 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTarget.java
index 28ae1b08b87..5aeb0e7d729 100644
--- 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTarget.java
+++ 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTarget.java
@@ -2,6 +2,12 @@
 
 import lombok.RequiredArgsConstructor;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
 import javax.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -12,9 +18,12 @@
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.applib.services.message.MessageService;
 
+import org.jspecify.annotations.Nullable;
+
 @Action(semantics = SemanticsOf.SAFE)
 @ActionLayout(
         associateWith = "target",
+        describedAs = "Open recorded or actual target",
         position = ActionLayout.Position.PANEL
 )
 @RequiredArgsConstructor
@@ -22,22 +31,49 @@ public class ReplayableCommand_openTarget {
 
     private final ReplayableCommand replayableCommand;
 
+    public enum TargetType {
+        RECORDED,
+        ACTUAL
+    }
+
     @MemberSupport
-    public Object act() {
-        final var bookmarkIfAny = 
replayableCommand.targetBookmarkIfAny().flatMap(Bookmark::parse);
-        if (bookmarkIfAny.isPresent()) {
-            final var targetIfAny = 
bookmarkService.lookup(bookmarkIfAny.get());
-            if (targetIfAny.isPresent()) {
-                return targetIfAny.get();
-            }
-        }
-        messageService.informUser(String.format("Unable to open target '%s'", 
replayableCommand.targetBookmarkIfAny().orElse(null)));
-        return null;
+    public Object act(TargetType targetType) {
+        final var bookmarkStr =
+                targetType == TargetType.RECORDED
+                    ? replayableCommand.getTarget()
+                    : replayableCommand.getActualTarget();
+        return domainObject(targetType, bookmarkStr);
     }
 
     @MemberSupport
     public String disableAct() {
-        return replayableCommand.targetBookmarkIfAny().isPresent() ? null : 
"No target bookmark";
+        return choicesTargetType().isEmpty() ? "No targets found." : null;
+    }
+
+    @MemberSupport
+    public List<TargetType> choicesTargetType() {
+        var list = new ArrayList<TargetType>();
+        if (replayableCommand.getTarget() != null) {
+            list.add(TargetType.RECORDED);
+        }
+        if (replayableCommand.getActualTarget() != null) {
+            list.add(TargetType.ACTUAL);
+        }
+        return list;
+    }
+
+    @MemberSupport
+    public TargetType defaultTargetType() {
+        return 
choicesTargetType().stream().findFirst().orElse(TargetType.RECORDED);
+    }
+
+    private @Nullable Object domainObject(TargetType targetType, String 
bookmarkStr) {
+        final Optional<Object> domainObjectIfAny = 
Optional.ofNullable(bookmarkStr).flatMap(Bookmark::parse).flatMap((Bookmark x) 
-> bookmarkService.lookup(x));
+        if(domainObjectIfAny.isPresent()) {
+            return domainObjectIfAny.get();
+        }
+        messageService.informUser(String.format("Unable to open %s target 
'%s'", targetType.name().toLowerCase(), bookmarkStr));
+        return null;
     }
 
     @Inject BookmarkService bookmarkService;
diff --git 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTargetTR.java
 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTargetTR.java
index 0682cd63486..dbc4a49909c 100644
--- 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTargetTR.java
+++ 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTargetTR.java
@@ -12,6 +12,9 @@
 
 import lombok.RequiredArgsConstructor;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
         commandPublishing = Publishing.DISABLED,
@@ -20,6 +23,7 @@
 )
 @ActionLayout(
         named = "Open Target",
+        describedAs = "Open recorded or actual target",
         hidden = Where.OBJECT_FORMS
 )
 @RequiredArgsConstructor
@@ -31,18 +35,23 @@ public static class DomainEvent extends 
ReplayableCommand.ActionDomainEvent<Repl
     private final ReplayableCommand replayableCommand;
 
     @MemberSupport
-    public Object act(boolean areYouSure) {
-        return mixin().act();
+    public Object act(ReplayableCommand_openTarget.TargetType targetType) {
+        return mixin().act(targetType);
     }
 
     @MemberSupport
-    public boolean defaultAreYouSure() {
-        return true;
+    public String disableAct() {
+        return mixin().disableAct();
     }
 
     @MemberSupport
-    public String disableAct() {
-        return mixin().disableAct();
+    public List<ReplayableCommand_openTarget.TargetType> choicesTargetType() {
+        return mixin().choicesTargetType();
+    }
+
+    @MemberSupport
+    public ReplayableCommand_openTarget.TargetType defaultTargetType() {
+        return mixin().defaultTargetType();
     }
 
     private ReplayableCommand_openTarget mixin() {

Reply via email to