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

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

commit 2cbfe69405635dfe9e72a54d29293aa04c9776cd
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 26 05:58:16 2024 +0000

    CAUSEWAY-3676: exceptions
---
 .../graphql/model/src/main/java/module-info.java   |  5 +-
 .../graphql/model/{domain => context}/Context.java | 14 +-----
 .../viewer/graphql/model/domain/Evaluator.java     | 25 ----------
 .../viewer/graphql/model/domain/GqlvAction.java    | 50 +-------------------
 .../graphql/model/domain/GqlvActionInvoke.java     | 50 +++++++++++++-------
 .../graphql/model/domain/GqlvActionParam.java      |  9 ++--
 .../model/domain/GqlvActionParamDisabled.java      | 40 ++++++++++------
 .../model/domain/GqlvActionParamHidden.java        | 39 +++++++++------
 .../graphql/model/domain/GqlvActionParams.java     |  3 +-
 .../graphql/model/domain/GqlvActionValidate.java   |  8 +++-
 .../graphql/model/domain/GqlvAssociation.java      |  3 +-
 .../graphql/model/domain/GqlvAssociationGet.java   | 11 +++--
 .../graphql/model/domain/GqlvCollection.java       |  7 ++-
 .../graphql/model/domain/GqlvCollectionGet.java    |  4 +-
 .../graphql/model/domain/GqlvDomainObject.java     |  2 +-
 .../graphql/model/domain/GqlvDomainService.java    |  2 +-
 .../viewer/graphql/model/domain/GqlvMember.java    |  7 ++-
 .../graphql/model/domain/GqlvMemberDisabled.java   | 12 +++--
 .../graphql/model/domain/GqlvMemberHidden.java     | 15 +++---
 .../viewer/graphql/model/domain/GqlvMeta.java      |  5 +-
 .../viewer/graphql/model/domain/GqlvProperty.java  |  7 ++-
 .../graphql/model/domain/GqlvPropertyGet.java      |  4 +-
 .../graphql/model/domain/GqlvPropertySet.java      | 35 +++++++++-----
 .../graphql/model/domain/GqlvPropertyValidate.java | 11 +++--
 .../graphql/model/{util => domain}/TypeNames.java  |  2 +-
 .../DisabledException.java}                        | 23 +++++----
 .../HiddenException.java}                          | 24 ++++++----
 .../model/exceptions/InteractionException.java     | 55 ++++++++++++++++++++++
 .../InvalidException.java}                         | 19 ++++++--
 .../model/{domain => fetcher}/BookmarkedPojo.java  |  6 +--
 .../{domain => fetcher}/BookmarkedPojoFetcher.java |  6 +--
 .../ObjectActionParameterProvider.java             |  2 +-
 .../ObjectActionProvider.java                      |  2 +-
 .../ObjectAssociationProvider.java                 |  2 +-
 .../ObjectMemberProvider.java                      |  2 +-
 .../ObjectSpecificationProvider.java               |  2 +-
 .../OneToManyAssociationProvider.java              |  2 +-
 .../OneToOneAssociationProvider.java               |  2 +-
 .../viewer/graphql/model/types/TypeMapper.java     |  2 +-
 .../integration/GraphQlSourceForCauseway.java      |  2 +-
 40 files changed, 287 insertions(+), 234 deletions(-)

diff --git a/incubator/viewers/graphql/model/src/main/java/module-info.java 
b/incubator/viewers/graphql/model/src/main/java/module-info.java
index 64db20375f..8654827e5f 100644
--- a/incubator/viewers/graphql/model/src/main/java/module-info.java
+++ b/incubator/viewers/graphql/model/src/main/java/module-info.java
@@ -1,9 +1,12 @@
 module org.apache.causeway.incubator.viewer.graphql.model {
     exports org.apache.causeway.viewer.graphql.model;
-    exports org.apache.causeway.viewer.graphql.model.util;
     exports org.apache.causeway.viewer.graphql.model.types;
     exports org.apache.causeway.viewer.graphql.model.registry;
     exports org.apache.causeway.viewer.graphql.model.domain;
+    exports org.apache.causeway.viewer.graphql.model.exceptions;
+    exports org.apache.causeway.viewer.graphql.model.context;
+    exports org.apache.causeway.viewer.graphql.model.mmproviders;
+    exports org.apache.causeway.viewer.graphql.model.fetcher;
 
     requires org.apache.causeway.core.config;
     requires org.apache.causeway.incubator.viewer.graphql.applib;
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Context.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
similarity index 71%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Context.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
index 6e7d66147a..cb37c5cb01 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Context.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
@@ -16,26 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.context;
 
-import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLObjectType;
 
-import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Evaluator.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Evaluator.java
deleted file mode 100644
index b6d2fa2e1a..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Evaluator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.apache.causeway.viewer.graphql.model.domain;
-
-import lombok.RequiredArgsConstructor;
-
-import org.apache.causeway.commons.collections.Can;
-import 
org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
-
-/**
- *
- * @param <T>
- * @param <U> - either an {@link 
org.apache.causeway.core.metamodel.spec.feature.ObjectAction} or an {@link 
ObjectActionParameter}.
- */
-@RequiredArgsConstructor
-abstract class Evaluator<T, U extends ObjectFeature> {
-    private final T unexpected;
-
-    abstract T evaluate(ActionInteractionHead head, U objectFeature, 
Can<ManagedObject> argumentManagedObjects);
-
-    public T unexpected() {
-        return unexpected;
-    }
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
index 283c6c62df..49ea67bad9 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
@@ -26,8 +26,9 @@ import 
org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
 import graphql.schema.*;
 
@@ -157,53 +158,6 @@ public class GqlvAction
                 .build();
     }
 
-    static <T> T evaluate(
-            final ObjectActionProvider holder,
-            final Context context,
-            final DataFetchingEnvironment dataFetchingEnvironment,
-            final Evaluator<T, ObjectAction> evaluator) {
-
-        val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
-
-        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojo.getClass());
-        if (objectSpecification == null) {
-            return evaluator.unexpected();
-        }
-
-        val objectAction = holder.getObjectAction();
-        val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
-        val actionInteractionHead = 
objectAction.interactionHead(managedObject);
-
-        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
-
-        return evaluator.evaluate(actionInteractionHead, objectAction, 
argumentManagedObjects);
-    }
-
-    static <T> T evaluate(
-            final ObjectActionParameterProvider holder,
-            final Context context,
-            final DataFetchingEnvironment dataFetchingEnvironment,
-            final Evaluator<T, ObjectActionParameter> evaluator) {
-
-        val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
-
-        val sourcePojoClass = sourcePojo.getClass();
-        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
-        if (objectSpecification == null) {
-            return evaluator.unexpected();
-        }
-
-        val objectAction = holder.getObjectAction();
-        val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
-        val actionInteractionHead = 
objectAction.interactionHead(managedObject);
-
-        val objectActionParameter = 
objectAction.getParameterById(holder.getObjectActionParameter().getId());
-
-        val argumentManagedObjects = 
argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
-
-        return evaluator.evaluate(actionInteractionHead, 
objectActionParameter, argumentManagedObjects);
-    }
-
     @Override
     public ObjectSpecification getObjectSpecification() {
         return holder.getObjectSpecification();
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
index f988551123..59e1ee51c2 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
@@ -18,8 +18,14 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.commons.collections.Can;
-import 
org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead;
+import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+
+import org.apache.causeway.viewer.graphql.model.exceptions.DisabledException;
+import org.apache.causeway.viewer.graphql.model.exceptions.HiddenException;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
 import org.springframework.lang.Nullable;
 
@@ -130,33 +136,43 @@ public class GqlvActionInvoke {
 
     private Object invoke(final DataFetchingEnvironment 
dataFetchingEnvironment) {
 
-        val evaluator = new Evaluator<Object, ObjectAction>(null) {
-            @Override
-            public Object evaluate(ActionInteractionHead head, ObjectAction 
objectAction, final Can<ManagedObject> argumentManagedObjects) {
+        val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
-                // TODO: should also check visibility and usability
+        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojo.getClass());
+        if (objectSpecification == null) {
+            return null;
+        }
 
-                val consent = objectAction.isArgumentSetValid(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
-                if (consent.isVetoed()) {
-                    throw new 
IllegalArgumentException(consent.getReasonAsString().orElse("Invalid"));
-                }
+        val objectAction = holder.getObjectAction();
+        val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
+        val actionInteractionHead = 
objectAction.interactionHead(managedObject);
 
-                val resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
 
-                return resultManagedObject.getPojo();
 
-            }
-        };
+        val visibleConsent = objectAction.isVisible(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
+        if (visibleConsent.isVetoed()) {
+            throw new HiddenException(objectAction.getFeatureIdentifier());
+        }
 
-        return GqlvAction.evaluate(holder, context, dataFetchingEnvironment, 
evaluator);
+        val usableConsent = objectAction.isUsable(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
+        if (usableConsent.isVetoed()) {
+            throw new DisabledException(objectAction.getFeatureIdentifier());
+        }
 
+        val validityConsent = 
objectAction.isArgumentSetValid(actionInteractionHead, argumentManagedObjects, 
InteractionInitiatedBy.USER);
+        if (validityConsent.isVetoed()) {
+            throw new 
IllegalArgumentException(validityConsent.getReasonAsString().orElse("Invalid"));
+        }
 
+        val resultManagedObject = objectAction.execute(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        return resultManagedObject.getPojo();
     }
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectActionProvider {
+            ObjectSpecificationProvider,
+            ObjectActionProvider {
 
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
index 2c0782a792..5fb90cd79a 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
@@ -21,7 +21,10 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
@@ -110,8 +113,8 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
 
     public static interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectActionProvider {
+            ObjectSpecificationProvider,
+            ObjectActionProvider {
 
         GqlvActionParams.Holder getHolder();
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
index 560f0b2570..098acd175e 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
@@ -18,12 +18,13 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
-import 
org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
@@ -67,22 +68,31 @@ public class GqlvActionParamDisabled {
 
     private String disabled(final DataFetchingEnvironment 
dataFetchingEnvironment) {
 
-        val evaluator = new Evaluator<String, 
ObjectActionParameter>("Disabled") {
-            @Override
-            public String evaluate(ActionInteractionHead head, 
ObjectActionParameter objectActionParameter, final Can<ManagedObject> 
argumentManagedObjects) {
-                Consent usable = objectActionParameter.isUsable(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
-                return usable.isVetoed() ? 
usable.getReasonAsString().orElse("Disabled") : null;
-            }
-        };
+        val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
-        return GqlvAction.evaluate(holder, context, dataFetchingEnvironment, 
evaluator);
+        val sourcePojoClass = sourcePojo.getClass();
+        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
+        if (objectSpecification == null) {
+            return "Disabled";
+        }
+
+        val objectAction = holder.getObjectAction();
+        val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
+        val actionInteractionHead = 
objectAction.interactionHead(managedObject);
+
+        val objectActionParameter = 
objectAction.getParameterById(holder.getObjectActionParameter().getId());
+
+        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
+
+        val usable = objectActionParameter.isUsable(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        return usable.isVetoed() ? 
usable.getReasonAsString().orElse("Disabled") : null;
     }
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectActionProvider,
-                    ObjectActionParameterProvider {
+            ObjectSpecificationProvider,
+            ObjectActionProvider,
+            ObjectActionParameterProvider {
         GqlvActionParam.Holder getHolder();
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
index 6f8f35d566..8ba5817b2c 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
@@ -18,12 +18,13 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
-import 
org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
@@ -67,23 +68,31 @@ public class GqlvActionParamHidden {
 
     private boolean hidden(final DataFetchingEnvironment 
dataFetchingEnvironment) {
 
-        val evaluator = new Evaluator<Boolean, ObjectActionParameter>(true) {
+        val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
-            @Override
-            public Boolean evaluate(ActionInteractionHead head, 
ObjectActionParameter objectActionParameter, final Can<ManagedObject> 
argumentManagedObjects) {
-                Consent visible = objectActionParameter.isVisible(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
-                return visible.isVetoed();
-            }
-        };
+        val sourcePojoClass = sourcePojo.getClass();
+        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
+        if (objectSpecification == null) {
+            return true;
+        }
 
-        return GqlvAction.evaluate(holder, context, dataFetchingEnvironment, 
evaluator);
+        val objectAction = holder.getObjectAction();
+        val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
+        val actionInteractionHead = 
objectAction.interactionHead(managedObject);
+
+        val objectActionParameter = 
objectAction.getParameterById(holder.getObjectActionParameter().getId());
+
+        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
+
+        val visible = objectActionParameter.isVisible(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        return visible.isVetoed();
     }
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectActionProvider,
-                    ObjectActionParameterProvider {
+            ObjectSpecificationProvider,
+            ObjectActionProvider,
+            ObjectActionParameterProvider {
         GqlvActionParam.Holder getHolder();
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
index e1ae2cd5a6..a340200aea 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
@@ -21,7 +21,8 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
index ab940964ad..2abf2c02a7 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
@@ -27,6 +27,10 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 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.ObjectActionParameter;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -112,8 +116,8 @@ public class GqlvActionValidate {
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectActionProvider {
+            ObjectSpecificationProvider,
+            ObjectActionProvider {
 
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
index aff32ff15a..00d0ff7d2a 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
@@ -18,10 +18,9 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.causeway.viewer.graphql.model.context.Context;
 
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 
 public abstract class GqlvAssociation<T extends ObjectAssociation, H extends 
GqlvAssociation.Holder> extends GqlvMember<T, H> {
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
index 496c39edc7..c8ab87860a 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
@@ -19,14 +19,15 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectAssociationProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
 import lombok.val;
 
 import graphql.schema.DataFetchingEnvironment;
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLOutputType;
 
@@ -107,8 +108,8 @@ public abstract class GqlvAssociationGet<T extends 
ObjectAssociation> {
 
     public interface Holder<T extends ObjectAssociation>
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectAssociationProvider<T> {
+            ObjectSpecificationProvider,
+            ObjectAssociationProvider<T> {
 
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
index 42fe77b0a0..1d68513da1 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
@@ -18,13 +18,12 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 
 import graphql.schema.FieldCoordinates;
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 
@@ -51,7 +50,7 @@ public class GqlvCollection
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.collectionTypeNameFor(holder.getObjectSpecification(),
 oneToManyAssociation));
 
-        this.hidden = new GqlvMemberHidden(this, context);
+        this.hidden = new GqlvMemberHidden<>(this, context);
         this.disabled = new GqlvMemberDisabled<>(this, context);
         this.get = new GqlvCollectionGet(this, context);
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
index 82b4b1452f..53d82b2e3c 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
@@ -18,14 +18,12 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLOutputType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
index a7e0812ba3..49f0abae38 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
@@ -26,8 +26,8 @@ import 
org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
 import org.apache.causeway.core.metamodel.spec.ActionScope;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.*;
+import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
 import lombok.Getter;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
index bdd8d96d87..dba47672be 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
@@ -26,7 +26,7 @@ import 
org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
+import org.apache.causeway.viewer.graphql.model.context.Context;
 
 import lombok.Getter;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
index d979a67276..f0aa6af264 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
@@ -18,14 +18,13 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
 import lombok.AccessLevel;
 import lombok.Getter;
 
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 
 import lombok.Setter;
@@ -65,7 +64,7 @@ public abstract class GqlvMember<T extends ObjectMember, H 
extends GqlvMember.Ho
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider{
+            ObjectSpecificationProvider {
 
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
index fdba6fa846..549a7be4eb 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
@@ -21,8 +21,11 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectMemberProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -74,8 +77,7 @@ public class GqlvMemberDisabled<T extends ObjectMember> {
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
         val sourcePojoClass = sourcePojo.getClass();
-        val specificationLoader = 
holder.getObjectMember().getSpecificationLoader();
-        val objectSpecification = 
specificationLoader.loadSpecification(sourcePojoClass);
+        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
         if (objectSpecification == null) {
             return String.format("Disabled; could not determine target 
object's type ('%s')", sourcePojoClass.getName());
         }
@@ -89,7 +91,7 @@ public class GqlvMemberDisabled<T extends ObjectMember> {
 
     public interface Holder<T extends ObjectMember>
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectMemberProvider<T> {
+            ObjectSpecificationProvider,
+            ObjectMemberProvider<T> {
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
index facdd8e7f0..6fb6a7897f 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
@@ -21,12 +21,13 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectMemberProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
-import org.springframework.beans.factory.ObjectProvider;
-
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -73,9 +74,6 @@ public class GqlvMemberHidden<T extends ObjectMember> {
     private boolean hidden(
             final DataFetchingEnvironment dataFetchingEnvironment) {
 
-        // TODO: introduce Evaluator
-
-
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
         val sourcePojoClass = sourcePojo.getClass();
@@ -94,8 +92,7 @@ public class GqlvMemberHidden<T extends ObjectMember> {
 
     public interface Holder<T extends ObjectMember>
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    ObjectMemberProvider<T> {
-
+            ObjectSpecificationProvider,
+            ObjectMemberProvider<T> {
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
index f41e16ca7f..f08717fd0b 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
@@ -26,8 +26,9 @@ import 
org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.applib.services.metamodel.BeanSort;
 import org.apache.causeway.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
 import lombok.Getter;
 import lombok.val;
@@ -153,7 +154,7 @@ public class GqlvMeta {
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider {
+            ObjectSpecificationProvider {
 
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
index 499b19d190..bba16febc6 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
@@ -18,12 +18,11 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.applib.services.bookmark.BookmarkService;
-
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
 import graphql.schema.*;
 
@@ -54,7 +53,7 @@ public class GqlvProperty
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.propertyTypeNameFor(this.holder.getObjectSpecification(),
 oneToOneAssociation));
 
-        this.hidden = new GqlvMemberHidden(this, context);
+        this.hidden = new GqlvMemberHidden<>(this, context);
         this.disabled = new GqlvMemberDisabled<>(this, context);
         this.get = new GqlvPropertyGet(this, context);
         this.set = new GqlvPropertySet(this, context);
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
index 8f285b45d8..25d207b60e 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
@@ -18,14 +18,12 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLOutputType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
index f39711ab88..e09360fef3 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
@@ -18,18 +18,22 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
+import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.exceptions.DisabledException;
+import org.apache.causeway.viewer.graphql.model.exceptions.HiddenException;
+import org.apache.causeway.viewer.graphql.model.exceptions.InvalidException;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
 import graphql.schema.DataFetchingEnvironment;
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLOutputType;
 
@@ -92,26 +96,35 @@ public class GqlvPropertySet {
 
     Object set(final DataFetchingEnvironment dataFetchingEnvironment) {
 
-        val association = holder.getOneToOneAssociation();
 
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
         val sourcePojoClass = sourcePojo.getClass();
         val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
         if (objectSpecification == null) {
-            // not expected
             return null;
         }
 
+        val association = holder.getOneToOneAssociation();
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
 
         Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
         Object argumentValue = arguments.get(association.getId());
         ManagedObject argumentManagedObject = 
ManagedObject.adaptProperty(association, argumentValue);
 
-        Consent consent = association.isAssociationValid(managedObject, 
argumentManagedObject, InteractionInitiatedBy.USER);
-        if (consent.isVetoed()) {
-            throw new 
IllegalArgumentException(consent.getReasonAsString().orElse("Invalid"));
+        val visibleConsent = association.isVisible(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
+        if (visibleConsent.isVetoed()) {
+            throw new HiddenException(association.getFeatureIdentifier());
+        }
+
+        val usableConsent = association.isUsable(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
+        if (usableConsent.isVetoed()) {
+            throw new DisabledException(association.getFeatureIdentifier());
+        }
+
+        val validityConsent = association.isAssociationValid(managedObject, 
argumentManagedObject, InteractionInitiatedBy.USER);
+        if (validityConsent.isVetoed()) {
+            throw new InvalidException(validityConsent);
         }
 
         association.set(managedObject, argumentManagedObject, 
InteractionInitiatedBy.USER);
@@ -121,8 +134,8 @@ public class GqlvPropertySet {
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    OneToOneAssociationProvider {
+            ObjectSpecificationProvider,
+            OneToOneAssociationProvider {
 
         GqlvProperty.Holder getHolder();
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
index d607c8ebed..1fd4699a64 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
@@ -23,8 +23,11 @@ import java.util.Map;
 import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -91,7 +94,6 @@ public class GqlvPropertyValidate {
 
     Object validate(final DataFetchingEnvironment dataFetchingEnvironment) {
 
-        val association = holder.getOneToOneAssociation();
 
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
@@ -102,6 +104,7 @@ public class GqlvPropertyValidate {
             return null;
         }
 
+        val association = holder.getOneToOneAssociation();
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
 
         Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
@@ -113,8 +116,8 @@ public class GqlvPropertyValidate {
 
     public interface Holder
             extends GqlvHolder,
-                    ObjectSpecificationProvider,
-                    OneToOneAssociationProvider {
+            ObjectSpecificationProvider,
+            OneToOneAssociationProvider {
 
         GqlvProperty.Holder getHolder();
     }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/TypeNames.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
similarity index 98%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/TypeNames.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
index 3d7e198890..6de2a022be 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/TypeNames.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.util;
+package org.apache.causeway.viewer.graphql.model.domain;
 
 import lombok.experimental.UtilityClass;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/DisabledException.java
similarity index 55%
copy from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
copy to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/DisabledException.java
index 760e621cc6..dd5919ee09 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/DisabledException.java
@@ -16,15 +16,22 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.exceptions;
 
-import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.causeway.applib.Identifier;
+import org.apache.causeway.applib.exceptions.RecoverableException;
+import org.apache.causeway.applib.services.i18n.TranslatableString;
+import org.apache.causeway.core.metamodel.consent.Consent;
 
-public interface ObjectActionParameterProvider extends ObjectActionProvider {
-    ObjectActionParameter getObjectActionParameter();
+public class DisabledException extends InteractionException {
 
-    /**
-     * 0-based
-     */
-    int getParamNum();
+    public DisabledException(Consent consent) {
+        super(consent.getReasonAsString().orElse("Disabled"));
+    }
+    public DisabledException(Identifier identifier) {
+        super(identifier);
+    }
+    public DisabledException(Identifier identifier, Throwable cause) {
+        super(identifier, cause);
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/HiddenException.java
similarity index 57%
copy from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
copy to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/HiddenException.java
index 760e621cc6..36dbf1ca31 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/HiddenException.java
@@ -16,15 +16,23 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.exceptions;
 
-import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.causeway.applib.Identifier;
+import org.apache.causeway.core.metamodel.consent.Consent;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneFeature;
 
-public interface ObjectActionParameterProvider extends ObjectActionProvider {
-    ObjectActionParameter getObjectActionParameter();
+public class HiddenException extends InteractionException {
 
-    /**
-     * 0-based
-     */
-    int getParamNum();
+    public HiddenException(Consent consent) {
+        super(consent.getReasonAsString().orElse("Hidden"));
+    }
+
+    public HiddenException(Identifier identifier) {
+        super(identifier);
+    }
+
+    public HiddenException(Identifier identifier, Throwable cause) {
+        super(identifier, cause);
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/InteractionException.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/InteractionException.java
new file mode 100644
index 0000000000..fcbb93fb0e
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/InteractionException.java
@@ -0,0 +1,55 @@
+/*
+ *  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.viewer.graphql.model.exceptions;
+
+import org.apache.causeway.applib.Identifier;
+import org.apache.causeway.applib.exceptions.RecoverableException;
+import org.apache.causeway.applib.services.i18n.TranslatableString;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+
+public abstract class InteractionException extends RecoverableException {
+
+    public InteractionException(String msg) {
+        super(msg);
+    }
+
+    public InteractionException(TranslatableString translatableMessage, 
Class<?> translationContextClass, String translationContextMethod) {
+        super(translatableMessage, translationContextClass, 
translationContextMethod);
+    }
+
+    public InteractionException(Throwable cause) {
+        super(cause);
+    }
+
+    public InteractionException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
+
+    public InteractionException(TranslatableString translatableMessage, 
Class<?> translationContextClass, String translationContextMethod, Throwable 
cause) {
+        super(translatableMessage, translationContextClass, 
translationContextMethod, cause);
+    }
+
+    public InteractionException(final Identifier identifier) {
+        this(identifier.toString());
+    }
+
+    public InteractionException(Identifier identifier, Throwable cause) {
+        this(identifier.toString(), cause);
+    }
+}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/InvalidException.java
similarity index 55%
copy from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionProvider.java
copy to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/InvalidException.java
index 45dfe01e58..5878dedfa7 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/exceptions/InvalidException.java
@@ -16,10 +16,21 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.exceptions;
 
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+import org.apache.causeway.applib.Identifier;
+import org.apache.causeway.applib.exceptions.RecoverableException;
+import org.apache.causeway.applib.services.i18n.TranslatableString;
+import org.apache.causeway.core.metamodel.consent.Consent;
 
-public interface ObjectActionProvider extends 
ObjectMemberProvider<ObjectAction> {
-    ObjectAction getObjectAction();
+public class InvalidException extends InteractionException {
+    public InvalidException(Consent consent) {
+        super(consent.getReasonAsString().orElse("Invalid"));
+    }
+    public InvalidException(Identifier identifier) {
+        super(identifier);
+    }
+    public InvalidException(Identifier identifier, Throwable cause) {
+        super(identifier, cause);
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/BookmarkedPojo.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/fetcher/BookmarkedPojo.java
similarity index 90%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/BookmarkedPojo.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/fetcher/BookmarkedPojo.java
index ed0e4d1be7..09aa8a62ce 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/BookmarkedPojo.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/fetcher/BookmarkedPojo.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.fetcher;
 
 import graphql.schema.DataFetchingEnvironment;
 
@@ -25,7 +25,7 @@ import lombok.val;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 
-class BookmarkedPojo {
+public class BookmarkedPojo {
 
     private final Bookmark bookmark;
     private final BookmarkService bookmarkService;
@@ -38,7 +38,7 @@ class BookmarkedPojo {
         this.bookmarkService = bookmarkService;
     }
 
-    static Object sourceFrom(DataFetchingEnvironment dataFetchingEnvironment) {
+    public static Object sourceFrom(DataFetchingEnvironment 
dataFetchingEnvironment) {
 
         val source = dataFetchingEnvironment.getSource();
         return source instanceof BookmarkedPojo
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/BookmarkedPojoFetcher.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/fetcher/BookmarkedPojoFetcher.java
similarity index 88%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/BookmarkedPojoFetcher.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/fetcher/BookmarkedPojoFetcher.java
index ac0c3ed2e1..7a70a9109d 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/BookmarkedPojoFetcher.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/fetcher/BookmarkedPojoFetcher.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.fetcher;
 
 import graphql.schema.DataFetcher;
 import graphql.schema.DataFetchingEnvironment;
@@ -25,10 +25,10 @@ import lombok.val;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 
-class BookmarkedPojoFetcher implements DataFetcher<Object> {
+public class BookmarkedPojoFetcher implements DataFetcher<Object> {
     private final BookmarkService bookmarkService;
 
-    BookmarkedPojoFetcher(BookmarkService bookmarkService) {
+    public BookmarkedPojoFetcher(BookmarkService bookmarkService) {
         this.bookmarkService = bookmarkService;
     }
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectActionParameterProvider.java
similarity index 94%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectActionParameterProvider.java
index 760e621cc6..9cd59f89ab 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionParameterProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectActionParameterProvider.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.mmproviders;
 
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectActionProvider.java
similarity index 94%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionProvider.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectActionProvider.java
index 45dfe01e58..92e40a11bc 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectActionProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectActionProvider.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.mmproviders;
 
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectAssociationProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectAssociationProvider.java
similarity index 94%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectAssociationProvider.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectAssociationProvider.java
index f9ca318fd9..9c7c88fcc0 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectAssociationProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectAssociationProvider.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.mmproviders;
 
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectMemberProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectMemberProvider.java
similarity index 94%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectMemberProvider.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectMemberProvider.java
index e1ffb7afaf..073c63e45d 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectMemberProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectMemberProvider.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.mmproviders;
 
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectSpecificationProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectSpecificationProvider.java
similarity index 94%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectSpecificationProvider.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectSpecificationProvider.java
index 5ef002274f..0a6c0c5af0 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/ObjectSpecificationProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/ObjectSpecificationProvider.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.mmproviders;
 
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/OneToManyAssociationProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/OneToManyAssociationProvider.java
similarity index 94%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/OneToManyAssociationProvider.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/OneToManyAssociationProvider.java
index 5bd93507e9..08c3b62939 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/OneToManyAssociationProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/OneToManyAssociationProvider.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.mmproviders;
 
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/OneToOneAssociationProvider.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/OneToOneAssociationProvider.java
similarity index 94%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/OneToOneAssociationProvider.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/OneToOneAssociationProvider.java
index 93ed7a5746..ff97cad20f 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/OneToOneAssociationProvider.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/mmproviders/OneToOneAssociationProvider.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.viewer.graphql.model.domain;
+package org.apache.causeway.viewer.graphql.model.mmproviders;
 
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
index 1e01ba66f7..3dd16d5220 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
@@ -33,7 +33,7 @@ import org.apache.causeway.commons.internal.collections._Maps;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneFeature;
-import org.apache.causeway.viewer.graphql.model.util.TypeNames;
+import org.apache.causeway.viewer.graphql.model.domain.TypeNames;
 
 import org.springframework.lang.Nullable;
 
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
index ec44a86111..f1596fd919 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
@@ -35,7 +35,7 @@ import 
org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
-import org.apache.causeway.viewer.graphql.model.domain.Context;
+import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainObject;
 import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainService;
 import org.apache.causeway.viewer.graphql.viewer.toplevel.GqlvTopLevelQuery;

Reply via email to