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/06/19 06:47:41 UTC

(causeway) 10/11: CAUSEWAY-4039: moves KnownParticipants validator to CommandManagerAbstract

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

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

commit a71c050e60c5c179f64d35ee8b468ee28256f931
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Jun 19 07:28:08 2026 +0100

    CAUSEWAY-4039: moves KnownParticipants validator to CommandManagerAbstract
---
 ...java => CommandKnownParticipantsValidator.java} | 19 +++++------
 .../applib/dom/replay/CommandManagerAbstract.java  | 28 +++++++++++++++-
 .../applib/dom/replay/CommandManagerExport.java    | 36 ++++----------------
 .../CommandManagerExport_exportSelected.java       |  4 +--
 .../applib/dom/replay/ReplayableCommand.java       | 22 ++-----------
 .../ReplayableCommandParticipantTracker.java       |  6 ++--
 ... => CommandKnownParticipantsValidatorTest.java} | 38 +++++++++++-----------
 7 files changed, 68 insertions(+), 85 deletions(-)

diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandExportKnownTargetValidator.java b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandKnownParticipantsValidator.java
similarity index 91%
rename from extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandExportKnownTargetValidator.java
rename to extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandKnownParticipantsValidator.java
index e4343ec167f..4ffe10f0bc0 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandExportKnownTargetValidator.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandKnownParticipantsValidator.java
@@ -22,7 +22,6 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -35,22 +34,22 @@
 import org.apache.causeway.schema.common.v2.ValueType;
 
 /**
- * Validates that an exported command sequence can reach every selected action target and reference parameter
- * from a root service or from a previously recorded result in the same baseline-bounded export sequence.
+ * Validates that in a sequence of commands, every action target or reference parameter argument is either
+ * a root service, is refdata, or is a previously recorded result in the same baseline-bounded export sequence.
  */
-final class CommandExportKnownTargetValidator {
+final class CommandKnownParticipantsValidator {
 
     private final Predicate<Bookmark> exportRootPredicate;
 
-    CommandExportKnownTargetValidator(final Predicate<Bookmark> exportRootPredicate) {
+    CommandKnownParticipantsValidator(final Predicate<Bookmark> exportRootPredicate) {
         this.exportRootPredicate = exportRootPredicate;
     }
 
     Optional<Failure> validate(
             final Timestamp baseline,
-            final List<CommandLogEntry> selectedCommandLogEntries) {
+            final List<CommandLogEntry> commandLogEntries) {
         final Set<Bookmark> knownTargets = new HashSet<>();
-        for (final CommandLogEntry entry : selectedCommandLogEntries) {
+        for (final CommandLogEntry entry : commandLogEntries) {
             if (isBeforeBaseline(baseline, entry)) {
                 continue;
             }
@@ -100,14 +99,12 @@ private static List<Participant> participantsFor(final CommandLogEntry entry) {
                 .stream()
                 .flatMap(oidsDto -> oidsDto.getOid().stream())
                 .map(Bookmark::forOidDto)
-                .filter(Objects::nonNull)
                 .map(Participant::target)
                 .forEach(participants::add);
         if (participants.isEmpty() && entry.getTarget() != null) {
             participants.add(Participant.target(entry.getTarget()));
         }
-        referenceParametersFor(entry)
-                .forEach(participants::add);
+        participants.addAll(referenceParametersFor(entry));
         return participants;
     }
 
@@ -124,7 +121,7 @@ private static List<Participant> referenceParametersFor(final CommandLogEntry en
                 .map(ActionDto::getParameters)
                 .stream()
                 .flatMap(paramsDto -> paramsDto.getParameter().stream())
-                .filter(CommandExportKnownTargetValidator::isReferenceParameter)
+                .filter(CommandKnownParticipantsValidator::isReferenceParameter)
                 .forEach(parameter -> participants.add(Participant.parameter(
                         parameterName(parameter, participants.size()),
                         Bookmark.forOidDto(parameter.getReference()))));
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerAbstract.java b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerAbstract.java
index bbc7bcd2212..a7fc9162040 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerAbstract.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerAbstract.java
@@ -27,10 +27,12 @@
 
 import org.apache.causeway.applib.ViewModel;
 import org.apache.causeway.applib.annotation.ObjectSupport;
-import org.apache.causeway.applib.annotation.Programmatic;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
+import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.services.command.CommandRecordingSuppressed;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+import org.apache.causeway.extensions.commandlog.applib.spi.CommandReplayReferenceDataService;
 
 import static org.apache.causeway.extensions.commandlog.applib.dom.replay.TimestampMarshallUtil.fromString;
 
@@ -77,6 +79,29 @@ public String viewModelMemento() {
     }
 
 
+    CommandKnownParticipantsValidator validator() {
+        return new CommandKnownParticipantsValidator(this::isDomainServiceOrReferenceData);
+    }
+
+    private boolean isDomainServiceOrReferenceData(final Bookmark bookmark) {
+        return isDomainService(bookmark)
+                || CommandReplayReferenceDataService.isReferenceData(replayContext.commandReplayReferenceDataServices(), bookmark);
+    }
+
+    private boolean isDomainService(final Bookmark bookmark) {
+        final var metaModelService = replayContext.metaModelService();
+        final var specificationLoader = replayContext.specificationLoader();
+        if (metaModelService == null || specificationLoader == null) {
+            // shouldn't happen, except perhaps in unit testing?
+            return false;
+        }
+        return metaModelService.lookupLogicalTypeByName(bookmark.getLogicalTypeName())
+                .flatMap(specificationLoader::specForLogicalType)
+                .map(ObjectSpecification::isDomainService)
+                .orElse(false);
+    }
+
+
     @Data
     public static class State {
         private static final String DELIMITER = "--";
@@ -117,4 +142,5 @@ public String toMemento() {
             return TimestampMarshallUtil.toString(timestamp) + DELIMITER + limit;
         }
     }
+
 }
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport.java b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport.java
index e495401650f..b4f11044683 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport.java
@@ -40,7 +40,6 @@
 import org.apache.causeway.extensions.commandlog.applib.dom.CommandLogEntry;
 import org.apache.causeway.extensions.commandlog.applib.dom.CommandLogEntryRepository;
 import org.apache.causeway.extensions.commandlog.applib.dom.ReplayState;
-import org.apache.causeway.extensions.commandlog.applib.spi.CommandReplayReferenceDataService;
 
 @DomainObject(introspection = Introspection.ANNOTATION_REQUIRED)
 @DomainObjectLayout(cssClassFa = "solid share-from-square")
@@ -50,7 +49,6 @@ public final class CommandManagerExport
         implements ReplayableCommandParticipantTracker {
 
     public static final String LOGICAL_TYPE_NAME = CausewayModuleExtCommandLogApplib.NAMESPACE + ".CommandExportManager";
-    static final String SCRATCHPAD_KEY = LOGICAL_TYPE_NAME + "#current";
 
     public static abstract class ActionDomainEvent<T>
             extends CausewayModuleExtCommandLogApplib.ActionDomainEvent<T> { }
@@ -91,7 +89,7 @@ public List<ReplayableCommand> getCommands() {
         ReplayableCommandParticipantTracker.putTrackerOnScratchpad(this, replayContext.scratchpad());
         return activeCommandLogEntries().stream()
                 .filter(this::isDoOp)
-                .map(this::replayableCommandInExportManagerContext)
+                .map(this::replayableCommandFor)
                 .collect(Collectors.toList());
     }
 
@@ -136,7 +134,7 @@ public List<ReplayableCommand> commands(final Direction direction) {
     }
 
     @Programmatic
-    Optional<CommandExportKnownTargetValidator.Failure> validateKnownTargets(
+    Optional<CommandKnownParticipantsValidator.Failure> validateKnownTargets(
             final List<CommandLogEntry> selectedCommandLogEntries) {
         return isRecordingSupportEnabled()
                 ? validator().validate(baseline, selectedCommandLogEntries)
@@ -180,22 +178,6 @@ private boolean isRecordingSupportEnabled() {
                 && replayContext.causewayConfiguration().getExtensions().getCommandLog().getRecordingSupport().isEnabled();
     }
 
-    private CommandExportKnownTargetValidator validator() {
-        return new CommandExportKnownTargetValidator(this::isExportRootOrReferenceData);
-    }
-
-    private boolean isExportRootOrReferenceData(final Bookmark bookmark) {
-        return isExportRoot(bookmark)
-                || CommandReplayReferenceDataService.isReferenceData(replayContext.commandReplayReferenceDataServices(), bookmark);
-    }
-
-    private boolean isExportRoot(final Bookmark bookmark) {
-        return replayContext.metaModelService() != null
-                && replayContext.metaModelService().lookupLogicalTypeByName(bookmark.getLogicalTypeName())
-                .map(logicalType -> logicalType.correspondingClass().isAnnotationPresent(org.apache.causeway.applib.annotation.DomainService.class))
-                .orElse(false);
-    }
-
     @Programmatic
     List<CommandLogEntry> activeCommandLogEntries() {
         return commandLogEntryRepository().findForegroundSinceTimestamp(baseline, limit).stream()
@@ -208,16 +190,10 @@ private boolean isDoOp(final CommandLogEntry entry) {
         return ReplayableCommand.Util.isDoOp(entry, replayContext.specificationLoader());
     }
 
-    private ReplayableCommand replayableCommandInExportManagerContext(final CommandLogEntry entry) {
-        return replayContext.scratchpad() != null
-                ? new ReplayableCommand(
-                        entry.getInteractionId(),
-                        replayContext)
-                : new ReplayableCommand(
-                        entry.getInteractionId(),
-                        replayContext,
-                        new org.apache.causeway.commons.internal.base._Refs.ObjectReference<>(null),
-                        this);
+    private ReplayableCommand replayableCommandFor(final CommandLogEntry entry) {
+        return new ReplayableCommand(
+                entry.getInteractionId(),
+                replayContext);
     }
 
     private static boolean isActiveCommand(final CommandLogEntry entry) {
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport_exportSelected.java b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport_exportSelected.java
index 9fd6b306390..ef68ed7cc56 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport_exportSelected.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandManagerExport_exportSelected.java
@@ -117,7 +117,7 @@ public String validateSelected(final List<ReplayableCommand> selected) {
             return "Select at least one command to export";
         }
         return validateKnownTargets(selectedCommandLogEntries(selected))
-                .map(CommandExportKnownTargetValidator.Failure::message)
+                .map(CommandKnownParticipantsValidator.Failure::message)
                 .orElse(null);
     }
 
@@ -133,7 +133,7 @@ private List<CommandLogEntry> selectedCommandLogEntries(final List<ReplayableCom
                 .collect(Collectors.toList());
     }
 
-    private Optional<CommandExportKnownTargetValidator.Failure> validateKnownTargets(
+    private Optional<CommandKnownParticipantsValidator.Failure> validateKnownTargets(
             final List<CommandLogEntry> selectedCommandLogEntries) {
         return commandExportManager.validateKnownTargets(selectedCommandLogEntries);
     }
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 95d065b505c..ac554d2ff02 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
@@ -50,7 +50,6 @@
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.applib.services.command.CommandExecutorService.InteractionContextPolicy;
 import org.apache.causeway.applib.services.command.CommandRecordingSuppressed;
-import org.apache.causeway.applib.services.scratchpad.Scratchpad;
 import org.apache.causeway.applib.util.schema.CommandDtoUtils;
 import org.apache.causeway.commons.functional.Try;
 import org.apache.causeway.commons.internal.base._NullSafe;
@@ -112,7 +111,7 @@ public ReplayContext replayContext() {
     }
 
 
-    private final ObjectReference<CommandRecord> recordRef;
+    private final ObjectReference<CommandRecord> recordRef = new ObjectReference<>(null);
 
 
     private final ReplayableCommandParticipantTracker replayableCommandParticipantTracker;
@@ -184,26 +183,9 @@ public ReplayableCommand(
     ReplayableCommand(
             final UUID interactionId,
             final ReplayContext replayContext) {
-        this(interactionId, replayContext, new ObjectReference<>(null),
-                ReplayableCommandParticipantTracker.current(replayContext.scratchpad()).orElse(null));
-    }
-
-    ReplayableCommand(
-            final UUID interactionId,
-            final ReplayContext replayContext,
-            final ObjectReference<CommandRecord> recordRef) {
-        this(interactionId, replayContext, recordRef, null);
-    }
-
-    ReplayableCommand(
-            final UUID interactionId,
-            final ReplayContext replayContext,
-            final ObjectReference<CommandRecord> recordRef,
-            final ReplayableCommandParticipantTracker replayableCommandParticipantTracker) {
         this.interactionId = interactionId;
         this.replayContext = replayContext;
-        this.recordRef = recordRef;
-        this.replayableCommandParticipantTracker = replayableCommandParticipantTracker;
+        this.replayableCommandParticipantTracker = ReplayableCommandParticipantTracker.current(replayContext.scratchpad()).orElse(null);
     }
 
     @ObjectSupport
diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommandParticipantTracker.java b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommandParticipantTracker.java
index 0f2e82870d5..a47dbdccc1b 100644
--- a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommandParticipantTracker.java
+++ b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/ReplayableCommandParticipantTracker.java
@@ -15,15 +15,17 @@
  */
 public interface ReplayableCommandParticipantTracker {
 
+    String SCRATCHPAD_KEY = CommandManagerExport.LOGICAL_TYPE_NAME + "#current";
+
     static void putTrackerOnScratchpad(ReplayableCommandParticipantTracker value, Scratchpad scratchpad) {
         if (scratchpad != null) {
-            scratchpad.put(CommandManagerExport.SCRATCHPAD_KEY, value);
+            scratchpad.put(SCRATCHPAD_KEY, value);
         }
     }
 
     static Optional<ReplayableCommandParticipantTracker> current(final Scratchpad scratchpad) {
         return Optional.ofNullable(scratchpad)
-                .map(sp -> sp.get(CommandManagerExport.SCRATCHPAD_KEY))
+                .map(sp -> sp.get(SCRATCHPAD_KEY))
                 .filter(ReplayableCommandParticipantTracker.class::isInstance)
                 .map(ReplayableCommandParticipantTracker.class::cast);
     }
diff --git a/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandExportKnownTargetValidatorTest.java b/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandKnownParticipantsValidatorTest.java
similarity index 91%
rename from extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandExportKnownTargetValidatorTest.java
rename to extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandKnownParticipantsValidatorTest.java
index 4040a2551f2..05f6f42cfc2 100644
--- a/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandExportKnownTargetValidatorTest.java
+++ b/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/dom/replay/CommandKnownParticipantsValidatorTest.java
@@ -40,7 +40,7 @@
 import org.apache.causeway.schema.common.v2.OidsDto;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-class CommandExportKnownTargetValidatorTest {
+class CommandKnownParticipantsValidatorTest {
 
     private static final Timestamp BASELINE = Timestamp.from(Instant.parse("2026-06-07T10:00:00Z"));
     private static final Timestamp BEFORE_BASELINE = Timestamp.from(Instant.parse("2026-06-07T09:59:59Z"));
@@ -54,7 +54,7 @@ class CommandExportKnownTargetValidatorTest {
 
     @Test
     void accepts_root_menu_service_target() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(action(T1, MENU_SERVICE, null)));
 
@@ -63,7 +63,7 @@ void accepts_root_menu_service_target() {
 
     @Test
     void accepts_target_returned_by_earlier_selected_command() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 action(T1, MENU_SERVICE, CUSTOMER),
@@ -74,7 +74,7 @@ void accepts_target_returned_by_earlier_selected_command() {
 
     @Test
     void accepts_target_returned_by_earlier_singleton_container_command() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var singletonContainerResult = CUSTOMER;
         final var failure = validator.validate(BASELINE, List.of(
@@ -86,7 +86,7 @@ void accepts_target_returned_by_earlier_singleton_container_command() {
 
     @Test
     void accepts_reference_data_target_without_prior_result() {
-        final var validator = new CommandExportKnownTargetValidator(bookmark -> MENU_SERVICE.equals(bookmark) || CATEGORY.equals(bookmark));
+        final var validator = new CommandKnownParticipantsValidator(bookmark -> MENU_SERVICE.equals(bookmark) || CATEGORY.equals(bookmark));
 
         final var failure = validator.validate(BASELINE, List.of(action(T1, CATEGORY, null)));
 
@@ -95,7 +95,7 @@ void accepts_reference_data_target_without_prior_result() {
 
     @Test
     void rejects_unknown_non_root_target_and_reports_command_and_bookmark() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
         final var selected = action(T1, CUSTOMER, null);
 
         final var failure = validator.validate(BASELINE, List.of(selected));
@@ -110,7 +110,7 @@ void rejects_unknown_non_root_target_and_reports_command_and_bookmark() {
 
     @Test
     void ignores_result_before_baseline_when_validating_later_target() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 action(BEFORE_BASELINE, MENU_SERVICE, CUSTOMER),
@@ -122,7 +122,7 @@ void ignores_result_before_baseline_when_validating_later_target() {
 
     @Test
     void does_not_treat_locally_resolvable_object_as_root() {
-        final var validator = new CommandExportKnownTargetValidator(__ -> false);
+        final var validator = new CommandKnownParticipantsValidator(__ -> false);
 
         final var failure = validator.validate(BASELINE, List.of(action(T1, CUSTOMER, null)));
 
@@ -131,7 +131,7 @@ void does_not_treat_locally_resolvable_object_as_root() {
 
     @Test
     void later_result_does_not_validate_earlier_target() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 action(T1, CUSTOMER, null),
@@ -143,7 +143,7 @@ void later_result_does_not_validate_earlier_target() {
 
     @Test
     void safe_action_without_result_does_not_establish_unrelated_target() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 action(T1, MENU_SERVICE, null),
@@ -155,7 +155,7 @@ void safe_action_without_result_does_not_establish_unrelated_target() {
 
     @Test
     void property_commands_with_known_targets_establish_result_as_later_known_target() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 property(T1, MENU_SERVICE, CUSTOMER),
@@ -166,7 +166,7 @@ void property_commands_with_known_targets_establish_result_as_later_known_target
 
     @Test
     void accepts_reference_parameter_returned_by_earlier_selected_command() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 action(T1, MENU_SERVICE, CUSTOMER),
@@ -177,7 +177,7 @@ void accepts_reference_parameter_returned_by_earlier_selected_command() {
 
     @Test
     void accepts_reference_parameter_that_is_root_menu_service() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 actionWithReferenceParameter(T1, MENU_SERVICE, null, "menu", MENU_SERVICE)));
@@ -187,7 +187,7 @@ void accepts_reference_parameter_that_is_root_menu_service() {
 
     @Test
     void accepts_reference_data_reference_parameter_without_prior_result() {
-        final var validator = new CommandExportKnownTargetValidator(bookmark -> MENU_SERVICE.equals(bookmark) || CATEGORY.equals(bookmark));
+        final var validator = new CommandKnownParticipantsValidator(bookmark -> MENU_SERVICE.equals(bookmark) || CATEGORY.equals(bookmark));
 
         final var failure = validator.validate(BASELINE, List.of(
                 actionWithReferenceParameter(T1, MENU_SERVICE, null, "category", CATEGORY)));
@@ -197,7 +197,7 @@ void accepts_reference_data_reference_parameter_without_prior_result() {
 
     @Test
     void rejects_unknown_reference_parameter_and_reports_command_parameter_and_bookmark() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
         final var selected = actionWithReferenceParameter(T1, MENU_SERVICE, null, "customer", CUSTOMER);
 
         final var failure = validator.validate(BASELINE, List.of(selected));
@@ -213,7 +213,7 @@ void rejects_unknown_reference_parameter_and_reports_command_parameter_and_bookm
 
     @Test
     void later_result_does_not_validate_earlier_reference_parameter() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 actionWithReferenceParameter(T1, MENU_SERVICE, null, "customer", CUSTOMER),
@@ -227,7 +227,7 @@ void later_result_does_not_validate_earlier_reference_parameter() {
 
     @Test
     void result_before_baseline_does_not_validate_reference_parameter() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 action(BEFORE_BASELINE, MENU_SERVICE, CUSTOMER),
@@ -241,7 +241,7 @@ void result_before_baseline_does_not_validate_reference_parameter() {
 
     @Test
     void ignores_scalar_parameters_for_export_path_validation() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 actionWithScalarParameter(T1, MENU_SERVICE, null, "name")));
@@ -251,7 +251,7 @@ void ignores_scalar_parameters_for_export_path_validation() {
 
     @Test
     void ignores_reference_parameters_without_reference_bookmark() {
-        final var validator = new CommandExportKnownTargetValidator(MENU_SERVICE::equals);
+        final var validator = new CommandKnownParticipantsValidator(MENU_SERVICE::equals);
 
         final var failure = validator.validate(BASELINE, List.of(
                 actionWithReferenceParameter(T1, MENU_SERVICE, null, "customer", null)));