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() {