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

ahuber pushed a commit to branch 3752-appfeat.filter.spi-a
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit 607d9119371b27012499d7d05073bfab25d82bc9
Author: andi-huber <[email protected]>
AuthorDate: Sun Dec 7 13:02:20 2025 +0100

    CAUSEWAY-3752: working on object visibility (1)
---
 .../core/metamodel/execution/ActionExecutor.java   | 21 +++++++-----
 .../metamodel/execution/MemberExecutorService.java |  8 +++--
 .../action/invocation/ActionInvocationFacet.java   |  4 ++-
 .../invocation/ActionInvocationFacetForAction.java |  6 ++--
 ...ocationFacetForMixedInPropertyOrCollection.java |  6 ++--
 .../facets/object/value/CompositeValueUpdater.java |  9 ++++--
 .../accessor/PropertyAccessorFacetViaAccessor.java |  3 +-
 .../interactions/VisibilityConstraint.java         |  8 -----
 .../interactions/managed/ManagedAction.java        |  2 +-
 .../core/metamodel/object/MmVisibilityUtils.java   |  8 +++--
 .../metamodel/spec/feature/HasObjectAction.java    |  5 +--
 .../core/metamodel/spec/feature/ObjectAction.java  |  3 +-
 .../metamodel/spec/impl/ObjectActionDefault.java   | 13 +++++---
 .../metamodel/spec/impl/ObjectActionMixedIn.java   |  7 ++--
 .../spec/impl/OneToManyAssociationMixedIn.java     |  8 ++---
 .../spec/impl/OneToOneAssociationMixedIn.java      |  8 ++---
 .../command/CommandExecutorServiceDefault.java     | 37 +++++++++-------------
 .../executor/MemberExecutorServiceDefault.java     |  8 +++--
 .../handlers/DomainObjectInvocationHandler.java    |  2 +-
 .../testdomain/value/ValueSemanticsTester.java     |  6 ++--
 .../viewer/commons/model/object/UiObject.java      |  5 +--
 .../rich/mutation/RichMutationForAction.java       |  2 +-
 .../domain/rich/query/RichActionInvokeResult.java  |  2 +-
 .../simple/mutation/SimpleMutationForAction.java   |  2 +-
 .../model/domain/simple/query/SimpleAction.java    |  2 +-
 .../wicket/ui/pages/obj/DomainObjectPage.java      | 20 ++++++------
 26 files changed, 109 insertions(+), 96 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java
index c8363fc6bbf..2aba4eea9d8 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/ActionExecutor.java
@@ -23,6 +23,8 @@
 import java.util.Objects;
 import java.util.Optional;
 
+import org.jspecify.annotations.NonNull;
+
 import org.apache.causeway.applib.events.domain.AbstractDomainEvent;
 import org.apache.causeway.applib.events.domain.ActionDomainEvent;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
@@ -42,6 +44,7 @@
 import 
org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetAbstract;
 import 
org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.ManagedObjects;
 import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
@@ -52,9 +55,9 @@
 import static org.apache.causeway.commons.internal.base._Casts.uncheckedCast;
 
 import lombok.Getter;
-import org.jspecify.annotations.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
+import lombok.experimental.Accessors;
 
 @RequiredArgsConstructor
 //@Slf4j
@@ -68,6 +71,7 @@ public final class ActionExecutor
     public static ActionExecutor forAction(
             final @NonNull FacetHolder facetHolder,
             final @NonNull InteractionInitiatedBy interactionInitiatedBy,
+            final @NonNull WhatViewer whatViewer,
             final @NonNull InteractionHead head,
             final @NonNull Can<ManagedObject> argumentAdapters,
             final @NonNull ObjectAction owningAction,
@@ -77,15 +81,14 @@ public static ActionExecutor forAction(
                 "action's parameter count and provided argument count must 
match");
 
         // guard against malformed argumentAdapters
-        argumentAdapters.forEach(arg->{if(!ManagedObjects.isSpecified(arg)) {
-            throw _Exceptions.illegalArgument("arguments must be specified for 
action %s", owningAction);
-        }});
+        argumentAdapters.forEach(arg->{if(!ManagedObjects.isSpecified(arg))
+                       throw _Exceptions.illegalArgument("arguments must be 
specified for action %s", owningAction);});
 
         var method = 
actionInvocationFacetAbstract.methods().getFirstElseFail();
 
         return new ActionExecutor(
                 owningAction.getMetaModelContext(), facetHolder,
-                interactionInitiatedBy, owningAction, method, head, 
argumentAdapters, actionInvocationFacetAbstract);
+                interactionInitiatedBy, whatViewer, owningAction, method, 
head, argumentAdapters, actionInvocationFacetAbstract);
     }
 
     // -- CONSTRUCTION
@@ -97,6 +100,9 @@ public static ActionExecutor forAction(
     private final @NonNull FacetHolder facetHolder;
     @Getter
     private final @NonNull InteractionInitiatedBy interactionInitiatedBy;
+    @Getter @Accessors(fluent = true)
+    private final @NonNull WhatViewer whatViewer;
+
     @Getter
     private final @NonNull ObjectAction owningAction;
     @Getter
@@ -225,9 +231,8 @@ private Object invokeMethodElseFromCache(
                     ()->CanonicalInvoker.invoke(method, targetPojo, 
executionParameters),
                     targetPojo.getClass(), method.getName(), 
targetPojoPlusExecutionParameters);
 
-        } else {
-            return CanonicalInvoker.invoke(method, targetPojo, 
executionParameters);
-        }
+        } else
+                       return CanonicalInvoker.invoke(method, targetPojo, 
executionParameters);
     }
 
     private static Can<ManagedObject> updateArguments(
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java
index 03a5534d839..1e98e91ad61 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/MemberExecutorService.java
@@ -20,6 +20,8 @@
 
 import java.util.Optional;
 
+import org.jspecify.annotations.NonNull;
+
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
@@ -30,12 +32,11 @@
 import 
org.apache.causeway.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import 
org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 
-import org.jspecify.annotations.NonNull;
-
 /**
  * Used by ActionInvocationFacets and PropertySetterOrClearFacets to submit 
their executions.
  * <p>
@@ -70,6 +71,7 @@ default InteractionInternal getInteractionElseFail() {
     default ManagedObject invokeAction(
             final @NonNull FacetHolder facetHolder,
             final @NonNull InteractionInitiatedBy interactionInitiatedBy,
+            final @NonNull WhatViewer whatViewer,
             final @NonNull InteractionHead head,
             // action specifics
             final @NonNull Can<ManagedObject> argumentAdapters,
@@ -78,7 +80,7 @@ default ManagedObject invokeAction(
         var actionExecutor = ActionExecutor.forAction(
                 facetHolder,
                 interactionInitiatedBy,
-                head,
+                whatViewer, head,
                 argumentAdapters,
                 owningAction,
                 actionInvocationFacetAbstract);
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
index 9b058f37926..c56ff501108 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
@@ -22,6 +22,7 @@
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -39,7 +40,8 @@ ManagedObject invoke(
             ObjectAction owningAction,
             InteractionHead head,
             Can<ManagedObject> argumentAdapters,
-            InteractionInitiatedBy interactionInitiatedBy);
+            InteractionInitiatedBy interactionInitiatedBy,
+            WhatViewer whatViewer);
 
     ObjectSpecification getReturnType();
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java
index 91abed72ce2..1b07c32348d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForAction.java
@@ -25,6 +25,7 @@
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facets.DomainEventHolder;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -51,10 +52,11 @@ public ManagedObject invoke(
             final ObjectAction owningAction,
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
 
         return memberExecutorService.invokeAction(facetHolder(), 
interactionInitiatedBy,
-                head, argumentAdapters, owningAction, this);
+                whatViewer, head, argumentAdapters, owningAction, this);
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java
index 95cdea4e04b..7799d89bfdb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForMixedInPropertyOrCollection.java
@@ -28,6 +28,7 @@
 import 
org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacet;
 import 
org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacet;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -61,9 +62,10 @@ public ManagedObject invoke(
             final ObjectAction owningAction,
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
         return memberExecutorService.invokeAction(facetHolder(), 
interactionInitiatedBy,
-                head, argumentAdapters, owningAction, this);
+                       whatViewer, head, argumentAdapters, owningAction, this);
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
index c9047ba29ac..3a3c69c1bb4 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
@@ -34,6 +34,7 @@
 import 
org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater.CompositeValueUpdaterForProperty;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
 import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedProperty;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -75,13 +76,15 @@ default CompositeValueUpdater overrideFacets() {
 
     @Override default ManagedObject execute(
             final InteractionHead head, final Can<ManagedObject> parameters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
         return map(simpleExecute(head, parameters));
     }
     @Override default ManagedObject executeWithRuleChecking(
         final InteractionHead head, final Can<ManagedObject> parameters,
-        final InteractionInitiatedBy interactionInitiatedBy, final 
VisibilityConstraint visibilityConstraint) throws AuthorizationException {
-        return execute(head, parameters, interactionInitiatedBy);
+        final InteractionInitiatedBy interactionInitiatedBy,
+        final VisibilityConstraint visibilityConstraint) throws 
AuthorizationException {
+        return execute(head, parameters, interactionInitiatedBy, 
visibilityConstraint.whatViewer());
     }
 
     // -- IMPLEMENTATIONS
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
index dbf5b053d8a..54a3469e800 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
@@ -29,6 +29,7 @@
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facets.ImperativeFacet;
 import 
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacetAbstract;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.MmInvokeUtils;
 import org.apache.causeway.core.metamodel.object.MmVisibilityUtils;
@@ -69,7 +70,7 @@ public Object getAssociationValueAsPojo(
         if(isConfiguredToFilterForVisibility()) {
             final ManagedObject referencedAdapter = 
getObjectManager().adapt(referencedObject);
             final boolean visible = MmVisibilityUtils
-                    .isVisible(referencedAdapter, interactionInitiatedBy);
+                    .isVisible(referencedAdapter, interactionInitiatedBy, 
WhatViewer.invalid());
             if (!visible) return null;
         }
         return referencedObject;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/VisibilityConstraint.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/VisibilityConstraint.java
index 6562665ef1d..ebda1a73edc 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/VisibilityConstraint.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/VisibilityConstraint.java
@@ -32,12 +32,4 @@ public VisibilityConstraint withWhere(final Where where) {
                return new VisibilityConstraint(whatViewer, where);
        }
 
-       /**
-        * temporary for refactoring
-        */
-       @Deprecated
-       public static VisibilityConstraint invalid(final Where where) {
-               return new VisibilityConstraint(WhatViewer.invalid(), where);
-       }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java
index 8470a18115b..1931fb43080 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java
@@ -140,7 +140,7 @@ public Railway<InteractionVeto, ManagedObject> invoke(
         final ManagedObject actionResult = getAction()
                 // under the hood intercepts cases, where the owner is a 
value-type;
                 // executions on value-types have no rule checking and trigger 
no domain events
-                .execute(interactionHead(), actionParameters, 
interactionInitiatedBy);
+                .execute(interactionHead(), actionParameters, 
interactionInitiatedBy, visibilityConstraint().whatViewer());
 
         return Railway.success(route(actionResult));
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java
index a92ac88d7a6..7d63f1135d8 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmVisibilityUtils.java
@@ -27,6 +27,7 @@
 import org.apache.causeway.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
 import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import 
org.apache.causeway.core.metamodel.interactions.vis.ObjectVisibilityContext;
 
 import lombok.experimental.UtilityClass;
@@ -35,7 +36,7 @@
 public final class MmVisibilityUtils {
 
     public static Predicate<? super ManagedObject> filterOn(final 
InteractionInitiatedBy interactionInitiatedBy) {
-        return $->MmVisibilityUtils.isVisible($, interactionInitiatedBy);
+        return $->MmVisibilityUtils.isVisible($, interactionInitiatedBy, 
WhatViewer.invalid());
     }
 
     /**
@@ -88,7 +89,8 @@ public static Object visiblePojosAutofit(
      */
     public static boolean isVisible(
             final ManagedObject mo,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
 
         if(ManagedObjects.isNullOrUnspecifiedOrEmpty(mo))
                        // a choices list could include a null (eg example in 
ToDoItems#choices1Categorized()); want to show as "visible"
@@ -104,7 +106,7 @@ public static boolean isVisible(
         var visibilityContext = ObjectVisibilityContext.createForRegular(
                 mo,
                 InteractionInitiatedBy.USER,
-                VisibilityConstraint.invalid(Where.OBJECT_FORMS));
+                new VisibilityConstraint(whatViewer, Where.OBJECT_FORMS));
 
         return InteractionUtils.isVisibleResult(spec, visibilityContext)
                 .isAllowing();
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java
index fe45a269212..d301ce18af7 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/HasObjectAction.java
@@ -34,6 +34,7 @@
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
 import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ActionScope;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -133,8 +134,8 @@ default FacetHolder getFacetHolder() {
         return getObjectAction().executeWithRuleChecking(head, parameters, 
interactionInitiatedBy, visibilityConstraint);
     }
     @Override default ManagedObject execute(final InteractionHead head, final 
Can<ManagedObject> parameters,
-        final InteractionInitiatedBy interactionInitiatedBy) {
-        return getObjectAction().execute(head, parameters, 
interactionInitiatedBy);
+        final InteractionInitiatedBy interactionInitiatedBy, final WhatViewer 
whatViewer) {
+        return getObjectAction().execute(head, parameters, 
interactionInitiatedBy, whatViewer);
     }
     @Override default Consent isArgumentSetValid(final InteractionHead head, 
final Can<ManagedObject> proposedArguments,
         final InteractionInitiatedBy interactionInitiatedBy) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java
index 985db5cb6e5..cb52e9d0b8c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java
@@ -119,7 +119,8 @@ ManagedObject executeWithRuleChecking(
     ManagedObject execute(
             InteractionHead head,
             Can<ManagedObject> parameters,
-            InteractionInitiatedBy interactionInitiatedBy);
+            InteractionInitiatedBy interactionInitiatedBy,
+            WhatViewer whatViewer);
 
     // -- isArgumentSetValid, isArgumentSetValidForParameters, 
isArgumentSetValidForAction
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java
index 3c6dc5b69b6..df4278d9a92 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionDefault.java
@@ -54,6 +54,7 @@
 import org.apache.causeway.core.metamodel.interactions.InteractionUtils;
 import org.apache.causeway.core.metamodel.interactions.RenderPolicy;
 import org.apache.causeway.core.metamodel.interactions.VisibilityConstraint;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import 
org.apache.causeway.core.metamodel.interactions.use.ActionUsabilityContext;
 import org.apache.causeway.core.metamodel.interactions.use.UsabilityContext;
 import 
org.apache.causeway.core.metamodel.interactions.val.ActionValidityContext;
@@ -413,7 +414,7 @@ public final ManagedObject executeWithRuleChecking(
         if(validity.isVetoed())
                        throw new 
RecoverableException(validity.getReasonAsString().orElse("no reason given"));
 
-        return execute(head, arguments, interactionInitiatedBy);
+        return execute(head, arguments, interactionInitiatedBy, 
visibilityConstraint.whatViewer());
     }
 
     /**
@@ -424,7 +425,8 @@ public final ManagedObject executeWithRuleChecking(
     public ManagedObject execute(
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
 
         _Assert.assertEquals(this.getParameterCount(), argumentAdapters.size(),
                 "action's parameter count and provided argument count must 
match");
@@ -446,7 +448,7 @@ public ManagedObject execute(
             }
         }
 
-        return this.executeInternal(head, argumentAdapters, 
interactionInitiatedBy);
+        return this.executeInternal(head, argumentAdapters, 
interactionInitiatedBy, whatViewer);
     }
 
     /**
@@ -455,10 +457,11 @@ public ManagedObject execute(
     protected ManagedObject executeInternal(
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
         var actionInvocationFacet = getFacet(ActionInvocationFacet.class);
         return actionInvocationFacet
-                .invoke(this, head, argumentAdapters, interactionInitiatedBy);
+                .invoke(this, head, argumentAdapters, interactionInitiatedBy, 
whatViewer);
     }
 
     protected Optional<ActionInvocationFacet> getActionInvocationFacet() {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java
index d878bd98e1c..ad20a0a7d4b 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectActionMixedIn.java
@@ -36,6 +36,7 @@
 import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet;
 import 
org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedInAction;
@@ -154,7 +155,8 @@ protected ManagedObject mixinAdapterFor(final ManagedObject 
mixeeAdapter) {
     public ManagedObject execute(
             final InteractionHead head,
             final Can<ManagedObject> argumentAdapters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
 
         final ManagedObject owner = head.owner();
         final ManagedObject target = mixinAdapterFor(mixinSpec, owner);
@@ -178,7 +180,8 @@ public ManagedObject execute(
 
         return mixinAction.executeInternal(
                 head, argumentAdapters,
-                interactionInitiatedBy);
+                interactionInitiatedBy,
+                whatViewer);
     }
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java
index 3d1a98f03be..54e0d890f71 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationMixedIn.java
@@ -34,6 +34,7 @@
 import 
org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
 import 
org.apache.causeway.core.metamodel.facets.properties.update.SnapshotExcludeFacetFromImmutableMember;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import 
org.apache.causeway.core.metamodel.services.publishing.ExecutionPublisher;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -131,9 +132,8 @@ protected InteractionHead headFor(final ManagedObject 
mixedInAdapter) {
     private DisabledFacet disabledFacet() {
         final DisabledFacet originalFacet = 
facetHolder.getFacet(DisabledFacet.class);
         if( originalFacet != null &&
-                originalFacet.where().isAlways()) {
-            return originalFacet;
-        }
+                originalFacet.where().isAlways())
+                       return originalFacet;
         // ensure that the contributed association is always disabled
         return new DisabledFacetForContributee(VetoReason.mixedinCollection(), 
this);
     }
@@ -145,7 +145,7 @@ public ManagedObject get(
 
         return executionPublisher().withPublishingSuppressed(
                 () -> mixinAction.executeInternal(
-                        headFor(ownerAdapter), Can.empty(), 
interactionInitiatedBy));
+                        headFor(ownerAdapter), Can.empty(), 
interactionInitiatedBy, WhatViewer.invalid()));
     }
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java
index bd6a030883c..06d7e82527c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationMixedIn.java
@@ -31,6 +31,7 @@
 import 
org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacet;
 import 
org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import 
org.apache.causeway.core.metamodel.services.publishing.ExecutionPublisher;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -112,9 +113,8 @@ protected InteractionHead headFor(final ManagedObject 
mixeeAdapter) {
     private DisabledFacet disabledFacet() {
         final DisabledFacet originalFacet = 
facetHolder.getFacet(DisabledFacet.class);
         if( originalFacet != null &&
-                originalFacet.where().isAlways()) {
-            return originalFacet;
-        }
+                originalFacet.where().isAlways())
+                       return originalFacet;
         // ensure that the contributed association is always disabled
         return new DisabledFacetForContributee(VetoReason.mixedinProperty(), 
this);
     }
@@ -127,7 +127,7 @@ public ManagedObject get(
         var head = headFor(mixedInAdapter);
 
         return executionPublisher().withPublishingSuppressed(
-                () -> mixinAction.executeInternal(head, Can.empty(), 
interactionInitiatedBy)
+                () -> mixinAction.executeInternal(head, Can.empty(), 
interactionInitiatedBy, WhatViewer.invalid())
         );
     }
 
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/command/CommandExecutorServiceDefault.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/command/CommandExecutorServiceDefault.java
index 7bb3af9c740..a21fa54a1b4 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -50,6 +50,7 @@
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.metamodel.commons.UtilStr;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.ManagedObjects;
 import org.apache.causeway.core.metamodel.services.publishing.CommandPublisher;
@@ -149,10 +150,9 @@ private Try<Bookmark> doExecute(
 
         Try<Bookmark> result = 
transactionService.callWithinCurrentTransactionElseCreateNew(
             () -> {
-                if (interactionContextPolicy == 
InteractionContextPolicy.NO_SWITCH) {
-                    // short-circuit
+                if (interactionContextPolicy == 
InteractionContextPolicy.NO_SWITCH)
+                                       // short-circuit
                     return doExecuteCommand(dto);
-                }
                 return sudoService.call(
                         context -> 
interactionContextPolicy.mapper.apply(context, dto),
                         () -> doExecuteCommand(dto));
@@ -199,7 +199,7 @@ private Bookmark doExecuteCommand(final CommandDto dto) {
 
             var interactionHead = objectAction.interactionHead(targetAdapter);
 
-            var resultAdapter = objectAction.execute(interactionHead, 
argAdapters, InteractionInitiatedBy.FRAMEWORK);
+            var resultAdapter = objectAction.execute(interactionHead, 
argAdapters, InteractionInitiatedBy.FRAMEWORK, WhatViewer.noViewer());
 
             // flush any PersistenceCommands pending
             // (else might get transient objects for the return value)
@@ -213,10 +213,9 @@ private Bookmark doExecuteCommand(final CommandDto dto) {
             // Object unused = priorExecution.getReturned();
             //
 
-            if(resultAdapter != null) {
-                return ManagedObjects.bookmark(resultAdapter)
+            if(resultAdapter != null)
+                               return ManagedObjects.bookmark(resultAdapter)
                         .orElse(null);
-            }
         } else {
 
             var propertyDto = (PropertyDto) memberDto;
@@ -226,10 +225,9 @@ private Bookmark doExecuteCommand(final CommandDto dto) {
 
             var targetAdapter = 
valueMarshaller.recoverReferenceFrom(targetOidDto);
 
-            if(ManagedObjects.isNullOrUnspecifiedOrEmpty(targetAdapter)) {
-                throw _Exceptions.unrecoverable("cannot recreate ManagedObject 
from bookmark %s",
+            if(ManagedObjects.isNullOrUnspecifiedOrEmpty(targetAdapter))
+                               throw _Exceptions.unrecoverable("cannot 
recreate ManagedObject from bookmark %s",
                         Bookmark.forOidDto(targetOidDto));
-            }
 
             var property = findOneToOneAssociation(targetAdapter, 
logicalMemberIdentifier);
             var newValueAdapter = 
valueMarshaller.recoverPropertyFrom(propertyDto);
@@ -249,12 +247,9 @@ private String targetBookmarkStrFor(final CommandDto dto) {
 
     private String argStrFor(final CommandDto dto) {
         var memberDto = dto.getMember();
-        if(memberDto instanceof ActionDto) {
-            var actionDto = (ActionDto) memberDto;
-            return paramNameArgValuesFor(actionDto);
-        }
-        if(memberDto instanceof PropertyDto) {
-            var propertyDto = (PropertyDto) memberDto;
+        if(memberDto instanceof ActionDto actionDto)
+                       return paramNameArgValuesFor(actionDto);
+        if(memberDto instanceof PropertyDto propertyDto) {
             var proposedValue = 
valueMarshaller.recoverPropertyFrom(propertyDto);
             return proposedValue.getTitle();
         }
@@ -274,9 +269,8 @@ private static ObjectAction findObjectAction(
         var localActionId = localPartOf(logicalMemberIdentifier);
 
         var objectAction = findActionElseNull(objectSpecification, 
localActionId);
-        if(objectAction == null) {
-            throw new RuntimeException(String.format("Unknown action '%s'", 
localActionId));
-        }
+        if(objectAction == null)
+                       throw new RuntimeException(String.format("Unknown 
action '%s'", localActionId));
         return objectAction;
     }
 
@@ -292,9 +286,8 @@ private static OneToOneAssociation findOneToOneAssociation(
         var objectSpecification = targetAdapter.objSpec();
 
         var property = findOneToOneAssociationElseNull(objectSpecification, 
localPropertyId);
-        if(property == null) {
-            throw new RuntimeException(String.format("Unknown property '%s'", 
localPropertyId));
-        }
+        if(property == null)
+                       throw new RuntimeException(String.format("Unknown 
property '%s'", localPropertyId));
         return property;
     }
 
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/executor/MemberExecutorServiceDefault.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/executor/MemberExecutorServiceDefault.java
index 427700ec4b4..4589ff3604a 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/executor/MemberExecutorServiceDefault.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/executor/MemberExecutorServiceDefault.java
@@ -57,6 +57,7 @@
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.causeway.core.metamodel.facets.members.publish.execution.ExecutionPublishingFacet;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.ManagedObjects;
 import org.apache.causeway.core.metamodel.object.MmEntityUtils;
@@ -216,7 +217,7 @@ private ManagedObject invokeActionInternally(
             executionPublisher().publishActionInvocation(priorExecution);
         }
 
-        var result = resultFilteredHonoringVisibility(returnedAdapter, 
interactionInitiatedBy);
+        var result = resultFilteredHonoringVisibility(returnedAdapter, 
interactionInitiatedBy, actionExecutor.whatViewer());
         _Xray.exitInvocation(xrayHandle);
         return result;
     }
@@ -334,7 +335,8 @@ private void setCommandResultIfEntity(
 
     private ManagedObject resultFilteredHonoringVisibility(
             final ManagedObject resultAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final WhatViewer whatViewer) {
 
         if(ManagedObjects.isNullOrUnspecifiedOrEmpty(resultAdapter))
                        return resultAdapter;
@@ -343,7 +345,7 @@ private ManagedObject resultFilteredHonoringVisibility(
                 || resultAdapter instanceof PackedManagedObject)
                        return resultAdapter;
 
-        return MmVisibilityUtils.isVisible(resultAdapter, 
interactionInitiatedBy)
+        return MmVisibilityUtils.isVisible(resultAdapter, 
interactionInitiatedBy, whatViewer)
                 ? resultAdapter
                 : null;
     }
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index fad1f3d6ee8..d410811c297 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -394,7 +394,7 @@ private Object handleActionMethod(
                 .forAction(head, objectAction, argAdapters));
 
         return runExecutionTask(wrapperInvocation, ()->{
-            var returnedAdapter = objectAction.execute(head, argAdapters, 
iConstraint.initiatedBy());
+            var returnedAdapter = objectAction.execute(head, argAdapters, 
iConstraint.initiatedBy(), iConstraint.whatViewer());
             return MmUnwrapUtils.single(returnedAdapter);
         }, ()->new ExceptionLogger("action " + objectAction.getId(), 
targetAdapter));
     }
diff --git 
a/regressiontests/value/src/test/java/org/apache/causeway/testdomain/value/ValueSemanticsTester.java
 
b/regressiontests/value/src/test/java/org/apache/causeway/testdomain/value/ValueSemanticsTester.java
index d51c5598bee..6599fa1725a 100644
--- 
a/regressiontests/value/src/test/java/org/apache/causeway/testdomain/value/ValueSemanticsTester.java
+++ 
b/regressiontests/value/src/test/java/org/apache/causeway/testdomain/value/ValueSemanticsTester.java
@@ -93,7 +93,7 @@ public void actionInteraction(
 
                 var command = 
interactionService.currentInteractionElseFail().getCommand();
                 var actInteraction = ActionInteraction
-                        
.wrap(ManagedAction.of(ManagedObject.adaptSingular(objSpec, domainObject), act, 
VisibilityConstraint.invalid(Where.OBJECT_FORMS)));
+                        
.wrap(ManagedAction.of(ManagedObject.adaptSingular(objSpec, domainObject), act, 
VisibilityConstraint.noViewer(Where.OBJECT_FORMS)));
 
                 var params = 
actInteraction.startParameterNegotiation().orElseThrow();
                 var singleArgPojoToUse = actionArgumentProvider.get();
@@ -113,7 +113,7 @@ public void actionInteraction(
 
                 var command = 
interactionService.currentInteractionElseFail().getCommand();
                 var actInteraction = ActionInteraction
-                        
.wrap(ManagedAction.of(ManagedObject.adaptSingular(objSpec, domainObject), act, 
VisibilityConstraint.invalid(Where.OBJECT_FORMS)));
+                        
.wrap(ManagedAction.of(ManagedObject.adaptSingular(objSpec, domainObject), act, 
VisibilityConstraint.noViewer(Where.OBJECT_FORMS)));
 
                 var params = 
actInteraction.startParameterNegotiation().orElseThrow();
 
@@ -201,7 +201,7 @@ public void propertyInteraction(
             var command = 
interactionService.currentInteractionElseFail().getCommand();
 
             var propInteraction = PropertyInteraction
-                    
.wrap(ManagedProperty.of(ManagedObject.adaptSingular(objSpec, domainObject), 
prop, VisibilityConstraint.invalid(Where.OBJECT_FORMS)));
+                    
.wrap(ManagedProperty.of(ManagedObject.adaptSingular(objSpec, domainObject), 
prop, VisibilityConstraint.noViewer(Where.OBJECT_FORMS)));
 
             propInteraction.modifyProperty(managedProp->
                 ManagedObject.adaptSingular(managedProp.getElementType(), 
newProperyValueProvider.apply(managedProp)));
diff --git 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/object/UiObject.java
 
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/object/UiObject.java
index 1533c42c609..fd091ac9f24 100644
--- 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/object/UiObject.java
+++ 
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/object/UiObject.java
@@ -19,6 +19,7 @@
 package org.apache.causeway.viewer.commons.model.object;
 
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.causeway.core.metamodel.interactions.WhatViewer;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.MmVisibilityUtils;
 import org.apache.causeway.viewer.commons.model.UiModel;
@@ -27,9 +28,9 @@ public interface UiObject extends UiModel {
 
     ManagedObject getManagedObject();
 
-    default boolean isVisible() {
+    default boolean isVisible(final WhatViewer whatViewer) {
         return MmVisibilityUtils
-                .isVisible(getManagedObject(), InteractionInitiatedBy.USER);
+                .isVisible(getManagedObject(), InteractionInitiatedBy.USER, 
whatViewer);
     }
 
 }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
index 02e6387fc5c..5b2c2909190 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
@@ -183,7 +183,7 @@ protected Object fetchData(final DataFetchingEnvironment 
dataFetchingEnvironment
         if (validityConsent.isVetoed())
                        throw new 
IllegalArgumentException(validityConsent.getReasonAsString().orElse("Invalid"));
 
-        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER, 
visibilityConstraint.whatViewer());
         return resultManagedObject.getPojo();
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeResult.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeResult.java
index 527d8ab8328..7dcd831e99c 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeResult.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeResult.java
@@ -127,7 +127,7 @@ protected Object fetchData(final DataFetchingEnvironment 
dataFetchingEnvironment
         if (validityConsent.isVetoed())
                        throw new 
IllegalArgumentException(validityConsent.getReasonAsString().orElse("Invalid"));
 
-        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER, 
visibilityConstraint.whatViewer());
         return resultManagedObject.getPojo();
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
index 0886c3ea46f..608c7997cfc 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
@@ -182,7 +182,7 @@ protected Object fetchData(final DataFetchingEnvironment 
dataFetchingEnvironment
         if (validityConsent.isVetoed())
                        throw new 
IllegalArgumentException(validityConsent.getReasonAsString().orElse("Invalid"));
 
-        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER, 
visibilityConstraint.whatViewer());
         return resultManagedObject.getPojo();
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
index 7b185341783..1b49b4f318b 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
@@ -315,7 +315,7 @@ protected Object fetchData(final DataFetchingEnvironment 
dataFetchingEnvironment
         if (validityConsent.isVetoed())
                        throw new 
IllegalArgumentException(validityConsent.getReasonAsString().orElse("Invalid"));
 
-        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        var resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER, 
visibilityConstraint.whatViewer());
         return resultManagedObject.getPojo();
     }
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
index c64c154addf..20193db03cd 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
@@ -45,6 +45,7 @@
 import org.apache.causeway.viewer.commons.model.components.UiComponentType;
 import org.apache.causeway.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
+import 
org.apache.causeway.viewer.wicket.model.models.interaction.WktVisibility;
 import org.apache.causeway.viewer.wicket.model.util.PageParameterUtils;
 import org.apache.causeway.viewer.wicket.model.util.PageUtils;
 import org.apache.causeway.viewer.wicket.model.whereAmI.WhereAmI;
@@ -85,9 +86,8 @@ public class DomainObjectPage extends PageAbstract {
      */
     public static DomainObjectPage forPageParameters(final PageParameters 
pageParameters) {
         var bookmark = PageParameterUtils.toBookmark(pageParameters);
-        if(!bookmark.isPresent()) {
-            throw new 
RestartResponseException(Application.get().getHomePage());
-        }
+        if(!bookmark.isPresent())
+                       throw new 
RestartResponseException(Application.get().getHomePage());
         return new DomainObjectPage(
                 pageParameters,
                 UiObjectWkt.ofPageParameters(pageParameters));
@@ -143,9 +143,8 @@ private void buildPage() {
         }
 
         // check that the entity overall can be viewed.
-        if(!model.isVisible()) {
-            throw new ObjectMember.AuthorizationException();
-        }
+        if(!model.isVisible(WktVisibility.WHAT_VIEWER))
+                       throw new ObjectMember.AuthorizationException();
 
         var objectSpec = model.getTypeOfSpecification();
 
@@ -209,7 +208,7 @@ protected void onDetach() {
        super.onDetach();
        model.detach();
     }
-    
+
     // -- REFRESH ENTITIES
 
     @Override
@@ -217,7 +216,7 @@ public void onNewRequestCycle() {
         var mo = model.getObject();
         if(!PageUtils.isAjax()) {
                //CAUSEWAY-3944: on normal page request, make sure entities are 
in sync with the db before rendering
-               ManagedObjects.refreshEntity(mo);       
+               ManagedObjects.refreshEntity(mo);
         }
         ManagedObjects.refreshViewmodel(mo,
                 ()->PageParameterUtils
@@ -245,9 +244,8 @@ private void onRenderingOrRendered(
             final Can<PageRenderSubscriber> pageRenderSubscribers,
             final BiFunction<PageRenderSubscriber, Bookmark, Void> handler) {
 
-        if(pageRenderSubscribers.isEmpty()) {
-            return;
-        }
+        if(pageRenderSubscribers.isEmpty())
+                       return;
 
         // guard against unspecified
         ManagedObjects.asSpecified(model.getObject())

Reply via email to