You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2026/05/22 06:20:51 UTC

(causeway) 01/01: CAUSEWAY-3998 : minor polishing for replay manager

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

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

commit 830d2a293a99e7808aa35268ef4f200d757b0456
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Thu May 21 19:28:48 2026 +0100

    CAUSEWAY-3998 : minor polishing for replay manager
---
 .../commandlog/applib/app/CommandLogMenu.java      | 18 ++++---
 .../dom/replay/ReplayableCommand_openTarget.java   | 60 ++++++++++++++++++++++
 2 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java
index 1d973590406..507775f194b 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java
@@ -32,12 +32,15 @@
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
+import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.ParameterLayout;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.RestrictTo;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.services.clock.ClockService;
+import org.apache.causeway.applib.services.factory.FactoryService;
+import org.apache.causeway.applib.value.Blob;
 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.CommandLogEntryRepository;
@@ -189,15 +192,16 @@ public class replayManager {
         public class DomainEvent extends ActionDomainEvent<replayManager> { }
 
         @MemberSupport public CommandReplayManager act(
-                @ParameterLayout(describedAs = "Limits the commands shown; only commands since this timestamp are available for replay.  Set to a time immediately before the commands to be replayed.")
-                final java.sql.Timestamp since
+                @Parameter(fileAccept = ".yml,.yaml")
+                final Blob commandsYaml
         ) {
-            return new CommandReplayManager(since, replayContext);
+            final var now = clockService.getClock().nowAsJavaSqlTimestamp();
+            final var commandReplayManager = new CommandReplayManager(now, replayContext);
+            return importCommands(commandReplayManager).act(commandsYaml, true);
         }
 
-        @MemberSupport public java.sql.Timestamp defaultSince() {
-            final var now = clockService.getClock().nowAsJavaSqlTimestamp();
-            return truncatedTo(now, ChronoUnit.HOURS);
+        private CommandReplayManager.importCommands importCommands(CommandReplayManager commandReplayManager) {
+            return factoryService.mixin(CommandReplayManager.importCommands.class, commandReplayManager);
         }
     }
 
@@ -208,4 +212,6 @@ public class DomainEvent extends ActionDomainEvent<replayManager> { }
     private LocalDate now() {
         return clockService.getClock().nowAsLocalDate(ZoneId.systemDefault());
     }
+
+    @Inject private FactoryService factoryService;
 }
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
new file mode 100644
index 00000000000..c538a8cbaf4
--- /dev/null
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommand_openTarget.java
@@ -0,0 +1,60 @@
+/*
+ *  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.causeway.extensions.commandlog.applib.dom.replay;
+
+import lombok.RequiredArgsConstructor;
+
+import org.apache.causeway.applib.annotation.*;
+import org.apache.causeway.applib.services.bookmark.Bookmark;
+import org.apache.causeway.applib.services.bookmark.BookmarkService;
+import org.apache.causeway.extensions.commandlog.applib.dom.CommandLogEntry;
+
+@Action(
+        semantics = SemanticsOf.SAFE,
+        commandPublishing = Publishing.DISABLED,
+        domainEvent = ReplayableCommand_openTarget.DomainEvent.class,
+        executionPublishing = Publishing.DISABLED
+)
+@ActionLayout(
+        sequence = "0.3", associateWith = "target",
+        describedAs = "Opens the underlying Target"
+)
+@RequiredArgsConstructor
+public class ReplayableCommand_openTarget {
+
+    public static class DomainEvent extends ReplayableCommand.ActionDomainEvent<ReplayableCommand_openTarget> {
+    }
+
+    private final ReplayableCommand replayableCommand;
+
+    @MemberSupport
+    public Object act() {
+        return replayableCommand.commandLogEntry()
+                .map(CommandLogEntry::getTarget)
+                .flatMap(bookmark -> bookmarkService.lookup(bookmark))
+                .orElse(null);
+    }
+
+    @MemberSupport
+    public String disableAct() {
+        return replayableCommand.commandLogEntry().isEmpty() ? "No corresponding CommandLogEntry" : null;
+    }
+
+    private BookmarkService bookmarkService;
+}