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 6493c2fb3affefa22909e2c5d233034efe748196
Author: danhaywood <[email protected]>
AuthorDate: Thu Jan 25 18:36:20 2024 +0000

    CAUSEWAY-3676: introduces Context as a convenience instead of
    
    passing 3 domain services around everywhere
---
 .../{GqlvCollectionGet.java => Context.java}       | 45 ++++++++++------------
 .../viewer/graphql/model/domain/GqlvAction.java    | 21 +++++-----
 .../graphql/model/domain/GqlvActionInvoke.java     | 13 +++----
 .../graphql/model/domain/GqlvActionParam.java      | 19 ++++-----
 .../model/domain/GqlvActionParamDisabled.java      | 14 +++----
 .../model/domain/GqlvActionParamHidden.java        | 14 +++----
 .../graphql/model/domain/GqlvActionParams.java     | 17 ++++----
 .../graphql/model/domain/GqlvActionValidate.java   |  8 ++--
 .../graphql/model/domain/GqlvAssociation.java      | 10 ++---
 .../graphql/model/domain/GqlvAssociationGet.java   | 13 +++----
 .../graphql/model/domain/GqlvCollection.java       | 18 ++++-----
 .../graphql/model/domain/GqlvCollectionGet.java    |  5 +--
 .../graphql/model/domain/GqlvDomainObject.java     | 17 ++++----
 .../graphql/model/domain/GqlvDomainService.java    | 13 ++-----
 .../viewer/graphql/model/domain/GqlvMember.java    | 14 +++----
 .../graphql/model/domain/GqlvMemberDisabled.java   |  9 ++---
 .../graphql/model/domain/GqlvMemberHidden.java     | 12 +++---
 .../viewer/graphql/model/domain/GqlvMeta.java      | 26 ++++++-------
 .../viewer/graphql/model/domain/GqlvProperty.java  | 22 +++++------
 .../graphql/model/domain/GqlvPropertyGet.java      |  5 +--
 .../graphql/model/domain/GqlvPropertySet.java      | 13 +++----
 .../graphql/model/domain/GqlvPropertyValidate.java | 15 +++-----
 .../integration/GraphQlSourceForCauseway.java      | 17 ++++----
 23 files changed, 152 insertions(+), 208 deletions(-)

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/Context.java
similarity index 56%
copy from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
copy to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Context.java
index 8e88cda94c..6e7d66147a 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/Context.java
@@ -18,34 +18,31 @@
  */
 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.types.TypeMapper;
-
-import lombok.val;
-
+import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLOutputType;
+import graphql.schema.GraphQLFieldDefinition;
+import graphql.schema.GraphQLObjectType;
 
-import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
 
-public class GqlvCollectionGet extends 
GqlvAssociationGet<OneToManyAssociation> {
+import java.util.LinkedHashMap;
+import java.util.Map;
 
-    public GqlvCollectionGet(
-            final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final SpecificationLoader specificationLoader) {
-        super(holder, codeRegistryBuilder, specificationLoader);
-    }
-
-    @Override
-    GraphQLOutputType 
outputTypeFor(GqlvAssociationGet.Holder<OneToManyAssociation> holder) {
-        val oneToManyAssociation = holder.getObjectAssociation();
-        return TypeMapper.listTypeForElementTypeOf(oneToManyAssociation);
-    }
+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;
 
-    public interface Holder extends 
GqlvAssociationGet.Holder<OneToManyAssociation> {
+import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
+import static graphql.schema.GraphQLObjectType.newObject;
 
-    }
+@RequiredArgsConstructor
+public class Context {
+    public final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    public final BookmarkService bookmarkService;
+    public final SpecificationLoader specificationLoader;
 }
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 f6c1c293c1..1f62e239aa 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
@@ -61,24 +61,21 @@ public class GqlvAction
      * Populated iif there are params for this action.
      */
     private final GqlvActionParams params;
-    private final BookmarkService bookmarkService;
 
     public GqlvAction(
             final Holder holder,
             final ObjectAction objectAction,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService
+            final Context context
             ) {
-        super(holder, objectAction, codeRegistryBuilder);
+        super(holder, objectAction, context);
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.actionTypeNameFor(holder.getObjectSpecification(), 
objectAction));
-        this.bookmarkService = bookmarkService;
 
-        this.hidden = new GqlvMemberHidden(this, codeRegistryBuilder);
-        this.disabled = new GqlvMemberDisabled(this, codeRegistryBuilder);
-        this.validate = new GqlvActionValidate(this, codeRegistryBuilder);
-        this.invoke = new GqlvActionInvoke(this, codeRegistryBuilder, 
bookmarkService);
-        val params = new GqlvActionParams(this, codeRegistryBuilder, 
bookmarkService);
+        this.hidden = new GqlvMemberHidden(this, context);
+        this.disabled = new GqlvMemberDisabled(this, context);
+        this.validate = new GqlvActionValidate(this, context);
+        this.invoke = new GqlvActionInvoke(this, context);
+        val params = new GqlvActionParams(this, context);
         this.params = params.hasParams() ? params : null;
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
@@ -176,9 +173,9 @@ public class GqlvAction
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(getField()),
-                new BookmarkedPojoFetcher(bookmarkService));
+                new BookmarkedPojoFetcher(context.bookmarkService));
 
         hidden.addDataFetcher();
         disabled.addDataFetcher();
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 aaf978202e..666843f2cd 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
@@ -45,18 +45,15 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvActionInvoke {
 
     private final Holder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final Context context;
     private final GraphQLFieldDefinition field;
-    private final BookmarkService bookmarkService;
 
     public GqlvActionInvoke(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService) {
+            final Context context) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.field = fieldDefinition(holder);
-        this.bookmarkService = bookmarkService;
     }
 
     private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
@@ -125,7 +122,7 @@ public class GqlvActionInvoke {
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
                 this::invoke
         );
@@ -148,7 +145,7 @@ public class GqlvActionInvoke {
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
         val actionInteractionHead = 
objectAction.interactionHead(managedObject);
 
-        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
bookmarkService);
+        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
 
         val consent = objectAction.isArgumentSetValid(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
         if (consent.isVetoed()) {
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 058fc19f4c..e31ff8276c 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
@@ -22,6 +22,7 @@ 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 lombok.Getter;
@@ -40,11 +41,10 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
 
     @Getter private final Holder holder;
     @Getter private final ObjectActionParameter objectActionParameter;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final Context context;
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     private final GraphQLObjectType gqlObjectType;
-    private final BookmarkService bookmarkService;
 
     private final GqlvActionParamHidden hidden;
     private final GqlvActionParamDisabled disabled;
@@ -54,17 +54,14 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
     public GqlvActionParam(
             final Holder holder,
             final ObjectActionParameter objectActionParameter,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService
-            ) {
+            final Context context) {
         this.holder = holder;
         this.objectActionParameter = objectActionParameter;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.actionParamTypeNameFor(holder.getObjectSpecification(),
 objectActionParameter));
-        this.bookmarkService = bookmarkService;
 
-        this.hidden = new GqlvActionParamHidden(this, codeRegistryBuilder, 
bookmarkService);
-        this.disabled = new GqlvActionParamDisabled(this, codeRegistryBuilder, 
bookmarkService);
+        this.hidden = new GqlvActionParamHidden(this, context);
+        this.disabled = new GqlvActionParamDisabled(this, context);
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
@@ -91,9 +88,9 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
-                new BookmarkedPojoFetcher(bookmarkService));
+                new BookmarkedPojoFetcher(context.bookmarkService));
 
         hidden.addDataFetcher();
         disabled.addDataFetcher();
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 5d490b4d99..beadbc1654 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
@@ -25,6 +25,7 @@ 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;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -43,29 +44,26 @@ import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlA
 public class GqlvActionParamDisabled {
 
     private final Holder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final BookmarkService bookmarkService;
+    private final Context context;
 
     private final GraphQLFieldDefinition field;
 
     public GqlvActionParamDisabled(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService) {
+            final Context context) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
 
         GraphQLFieldDefinition.Builder fieldBuilder = newFieldDefinition()
                 .name("disabled")
                 .type(TypeMapper.scalarTypeFor(String.class));
         addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE);
         this.field = holder.addField(fieldBuilder.build());
-        this.bookmarkService = bookmarkService;
     }
 
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
                 this::disabled
         );
@@ -91,7 +89,7 @@ public class GqlvActionParamDisabled {
 
         val objectActionParameter = 
objectAction.getParameterById(holder.getObjectActionParameter().getId());
 
-        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
bookmarkService);
+        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
 
         Consent usable = objectActionParameter.isUsable(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
         return usable.isVetoed() ? 
usable.getReasonAsString().orElse("Disabled") : null;
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 e47205a2c1..638c2594d9 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
@@ -24,6 +24,7 @@ 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.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
@@ -41,29 +42,26 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvActionParamHidden {
 
     private final Holder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final BookmarkService bookmarkService;
+    private final Context context;
 
     private final GraphQLFieldDefinition field;
 
     public GqlvActionParamHidden(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService) {
+            final Context context) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
 
         GraphQLFieldDefinition.Builder fieldBuilder = newFieldDefinition()
                 .name("hidden")
                 .type(TypeMapper.scalarTypeFor(boolean.class));
         addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE);
         this.field = holder.addField(fieldBuilder.build());
-        this.bookmarkService = bookmarkService;
     }
 
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
                 this::hidden
         );
@@ -88,7 +86,7 @@ public class GqlvActionParamHidden {
 
         val objectActionParameter = 
objectAction.getParameterById(holder.getObjectActionParameter().getId());
 
-        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
bookmarkService);
+        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
 
         Consent visible = 
objectActionParameter.isVisible(actionInteractionHead, argumentManagedObjects, 
InteractionInitiatedBy.USER);
         return visible.isVetoed();
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 f19069e292..ae77f7d35e 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
@@ -22,6 +22,7 @@ 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 lombok.Getter;
@@ -42,11 +43,10 @@ import static graphql.schema.GraphQLObjectType.newObject;
 public class GqlvActionParams implements GqlvActionParam.Holder {
 
     @Getter private final Holder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final Context context;
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     private final GraphQLObjectType gqlObjectType;
-    private final BookmarkService bookmarkService;
 
     /**
      * Populated iff {@link #hasParams()}
@@ -57,13 +57,10 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
 
     public GqlvActionParams(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService
-            ) {
+            final Context context) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.actionParamsTypeNameFor(holder.getObjectSpecification(),
 holder.getObjectAction()));
-        this.bookmarkService = bookmarkService;
 
         holder.getObjectAction().getParameters().forEach(this::addParam);
 
@@ -92,7 +89,7 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
     }
 
     void addParam(ObjectActionParameter objectActionParameter) {
-        params.put(objectActionParameter.getId(), new GqlvActionParam(this, 
objectActionParameter, codeRegistryBuilder, bookmarkService));
+        params.put(objectActionParameter.getId(), new GqlvActionParam(this, 
objectActionParameter, context));
     }
 
 
@@ -103,9 +100,9 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
     }
 
     void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
-                new BookmarkedPojoFetcher(bookmarkService));
+                new BookmarkedPojoFetcher(context.bookmarkService));
 
         params.forEach((id, param) -> param.addDataFetcher());
     }
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 d0052c3c23..548740b9f6 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
@@ -44,15 +44,15 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvActionValidate {
 
     private final Holder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final Context context;
     private final GraphQLFieldDefinition field;
 
     public GqlvActionValidate(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
+            final Context context
     ) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.field = fieldDefinition(holder);
     }
 
@@ -76,7 +76,7 @@ public class GqlvActionValidate {
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
                 this::validate
         );
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 c665462736..630e9dccf7 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
@@ -29,18 +29,16 @@ public abstract class GqlvAssociation<T extends 
ObjectAssociation, H extends Gql
     public GqlvAssociation(
             final H holder,
             final T objectAssociation,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
-            ) {
-        this(holder, objectAssociation, null, codeRegistryBuilder);
+            final Context context) {
+        this(holder, objectAssociation, null, context);
     }
 
     public GqlvAssociation(
             final H holder,
             final T objectAssociation,
             final GraphQLFieldDefinition fieldDefinition,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
-            ) {
-        super(holder, objectAssociation, fieldDefinition, codeRegistryBuilder);
+            final Context context) {
+        super(holder, objectAssociation, fieldDefinition, context);
     }
 
     public boolean hasFieldDefinition() {
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 148020fc59..f3674c301c 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
@@ -35,18 +35,15 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public abstract class GqlvAssociationGet<T extends ObjectAssociation> {
 
     final Holder<T> holder;
-    final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    final SpecificationLoader specificationLoader;
+    final Context context;
     final GraphQLFieldDefinition field;
 
     public GqlvAssociationGet(
             final Holder<T> holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final SpecificationLoader specificationLoader) {
+            final Context context) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.field = fieldDefinition(holder);
-        this.specificationLoader = specificationLoader;
     }
 
     GraphQLFieldDefinition fieldDefinition(final Holder<T> holder) {
@@ -78,7 +75,7 @@ public abstract class GqlvAssociationGet<T extends 
ObjectAssociation> {
             case VIEW_MODEL:
             case ENTITY:
 
-                codeRegistryBuilder.dataFetcher(
+                context.codeRegistryBuilder.dataFetcher(
                         holder.coordinatesFor(field),
                         this::get);
 
@@ -94,7 +91,7 @@ public abstract class GqlvAssociationGet<T extends 
ObjectAssociation> {
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
         val sourcePojoClass = sourcePojo.getClass();
-        val objectSpecification = 
specificationLoader.loadSpecification(sourcePojoClass);
+        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
         if (objectSpecification == null) {
             // not expected
             return null;
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 4317e03449..8c2fdb0059 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
@@ -38,22 +38,18 @@ public class GqlvCollection extends 
GqlvAssociation<OneToManyAssociation, GqlvCo
     private final GqlvMemberHidden hidden;
     private final GqlvMemberDisabled disabled;
     private final GqlvCollectionGet get;
-    private final BookmarkService bookmarkService;
 
     public GqlvCollection(
             final Holder domainObject,
             final OneToManyAssociation oneToManyAssociation,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService
-    ) {
-        super(domainObject, oneToManyAssociation, codeRegistryBuilder);
+            final Context context) {
+        super(domainObject, oneToManyAssociation, context);
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.collectionTypeNameFor(holder.getObjectSpecification(),
 oneToManyAssociation));
-        this.bookmarkService = bookmarkService;
 
-        this.hidden = new GqlvMemberHidden(this, codeRegistryBuilder);
-        this.disabled = new GqlvMemberDisabled(this, codeRegistryBuilder);
-        this.get = new GqlvCollectionGet(this, codeRegistryBuilder, 
specificationLoader);
+        this.hidden = new GqlvMemberHidden(this, context);
+        this.disabled = new GqlvMemberDisabled(this, context);
+        this.get = new GqlvCollectionGet(this, context);
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
@@ -83,9 +79,9 @@ public class GqlvCollection extends 
GqlvAssociation<OneToManyAssociation, GqlvCo
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(getField()),
-                new BookmarkedPojoFetcher(bookmarkService));
+                new BookmarkedPojoFetcher(context.bookmarkService));
 
         hidden.addDataFetcher();
         disabled.addDataFetcher();
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 8e88cda94c..3a220f3129 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
@@ -34,9 +34,8 @@ public class GqlvCollectionGet extends 
GqlvAssociationGet<OneToManyAssociation>
 
     public GqlvCollectionGet(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final SpecificationLoader specificationLoader) {
-        super(holder, codeRegistryBuilder, specificationLoader);
+            final Context context) {
+        super(holder, context);
     }
 
     @Override
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 84cc2ff9ff..99a295ccde 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
@@ -50,8 +50,7 @@ import static graphql.schema.GraphQLObjectType.newObject;
 public class GqlvDomainObject implements GqlvAction.Holder, 
GqlvProperty.Holder, GqlvCollection.Holder, GqlvMetaHolder {
 
     @Getter private final ObjectSpecification objectSpecification;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final BookmarkService bookmarkService;
+    private final Context context;
 
     private final GqlvMeta meta;
 
@@ -67,18 +66,16 @@ public class GqlvDomainObject implements GqlvAction.Holder, 
GqlvProperty.Holder,
 
     public GqlvDomainObject(
             final ObjectSpecification objectSpecification,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService,
+            final Context context,
             final ObjectManager objectManager,
             final GraphQLTypeRegistry graphQLTypeRegistry) {
 
         this.objectSpecification = objectSpecification;
-        this.codeRegistryBuilder = codeRegistryBuilder;
-        this.bookmarkService = bookmarkService;
+        this.context = context;
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.objectTypeNameFor(objectSpecification));
 
-        this.meta = new GqlvMeta(this, codeRegistryBuilder, bookmarkService, 
objectManager);
+        this.meta = new GqlvMeta(this, context, objectManager);
 
         GraphQLInputObjectType.Builder inputTypeBuilder = 
newInputObject().name(TypeNames.inputTypeNameFor(objectSpecification));
         inputTypeBuilder
@@ -110,16 +107,16 @@ public class GqlvDomainObject implements 
GqlvAction.Holder, GqlvProperty.Holder,
                 //  however, this is supportable in GraphQL, 
https://chat.openai.com/c/7ca721d5-865a-4765-9f90-5c28046516cd
                 .filter(objectAction -> 
objectAction.getParameters().stream().noneMatch(ObjectActionParameter::isPlural))
                 .forEach(objectAction -> {
-                    actions.put(objectAction.getId(), new GqlvAction(this, 
objectAction, codeRegistryBuilder, bookmarkService));
+                    actions.put(objectAction.getId(), new GqlvAction(this, 
objectAction, context));
                 });
     }
 
     private void addProperty(final OneToOneAssociation otoa) {
-        properties.put(otoa.getId(), new GqlvProperty(this, otoa, 
codeRegistryBuilder, bookmarkService));
+        properties.put(otoa.getId(), new GqlvProperty(this, otoa, context));
     }
 
     private void addCollection(OneToManyAssociation otom) {
-        GqlvCollection collection = new GqlvCollection(this, otom, 
codeRegistryBuilder, bookmarkService);
+        GqlvCollection collection = new GqlvCollection(this, otom, context);
         if (collection.hasFieldDefinition()) {
             collections.put(otom.getId(), collection);
         }
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 a860e8884e..bdd8d96d87 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
@@ -21,7 +21,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.core.metamodel.spec.ActionScope;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
@@ -32,7 +31,6 @@ import 
org.apache.causeway.viewer.graphql.model.util.TypeNames;
 import lombok.Getter;
 
 import graphql.schema.FieldCoordinates;
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 
@@ -47,8 +45,7 @@ public class GqlvDomainService implements GqlvAction.Holder {
 
     @Getter private final ObjectSpecification objectSpecification;
     @Getter private final Object servicePojo;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final BookmarkService bookmarkService;
+    private final Context context;
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
 
@@ -66,12 +63,10 @@ public class GqlvDomainService implements GqlvAction.Holder 
{
     public GqlvDomainService(
             final ObjectSpecification objectSpecification,
             final Object servicePojo,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService) {
+            final Context context) {
         this.objectSpecification = objectSpecification;
         this.servicePojo = servicePojo;
-        this.codeRegistryBuilder = codeRegistryBuilder;
-        this.bookmarkService = bookmarkService;
+        this.context = context;
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.objectTypeNameFor(objectSpecification));
 
@@ -95,7 +90,7 @@ public class GqlvDomainService implements GqlvAction.Holder {
     }
 
     private void addAction(final ObjectAction objectAction) {
-        actions.put(objectAction.getId(), new GqlvAction(this, objectAction, 
codeRegistryBuilder, bookmarkService));
+        actions.put(objectAction.getId(), new GqlvAction(this, objectAction, 
context));
     }
 
 
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 f8961f9dff..987cb52f28 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
@@ -34,31 +34,29 @@ public abstract class GqlvMember<T extends ObjectMember, H 
extends GqlvMember.Ho
 
     @Getter final H holder;
     @Getter private final T objectMember;
+
+    final Context context;
     @Getter @Setter(AccessLevel.PACKAGE)
     GraphQLFieldDefinition field;
 
-    final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    final SpecificationLoader specificationLoader;
-
     public GqlvMember(
             final H holder,
             final T objectMember,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
+            final Context context
     ) {
-        this(holder, objectMember, null, codeRegistryBuilder);
+        this(holder, objectMember, null, context);
     }
 
     public GqlvMember(
             final H holder,
             final T objectMember,
             final GraphQLFieldDefinition field,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
+            final Context context
     ) {
         this.holder = holder;
         this.objectMember = objectMember;
         this.field = field;
-        this.codeRegistryBuilder = codeRegistryBuilder;
-        this.specificationLoader = objectMember.getSpecificationLoader();
+        this.context = context;
     }
 
     public String getId() {
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 c6be053246..b765992697 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
@@ -29,7 +29,6 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 import graphql.schema.DataFetchingEnvironment;
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
@@ -38,15 +37,15 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvMemberDisabled {
 
     private final Holder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final Context context;
     private final GraphQLFieldDefinition field;
 
     public GqlvMemberDisabled(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
+            final Context context
     ) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.field = fieldDefinition(holder);
     }
 
@@ -63,7 +62,7 @@ public class GqlvMemberDisabled {
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
                 this::disabled
         );
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 ce5f081408..f47b224336 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
@@ -25,29 +25,27 @@ import 
org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
+import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 import graphql.schema.DataFetchingEnvironment;
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 
-import lombok.val;
-
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
 @Log4j2
 public class GqlvMemberHidden {
 
     private final Holder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final Context context;
     private final GraphQLFieldDefinition field;
 
     public GqlvMemberHidden(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
+            final Context context
     ) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.field = fieldDefinition(holder);
     }
 
@@ -64,7 +62,7 @@ public class GqlvMemberHidden {
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(field),
                 this::hidden
         );
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 4b2de8e15a..537ee5f91b 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
@@ -51,22 +51,19 @@ public class GqlvMeta {
 
     private final GqlvMetaHolder holder;
 
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final BookmarkService bookmarkService;
+    private final Context context;
     private final ObjectManager objectManager;
 
     @Getter private final GraphQLFieldDefinition metaField;
 
     public GqlvMeta(
             final GqlvMetaHolder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService,
+            final Context context,
             final ObjectManager objectManager
     ) {
         this.holder = holder;
 
-        this.codeRegistryBuilder = codeRegistryBuilder;
-        this.bookmarkService = bookmarkService;
+        this.context = context;
         this.objectManager = objectManager;
 
         // we can build the metafield and meta type eagerly because we know 
exactly which fields it has.
@@ -91,24 +88,23 @@ public class GqlvMeta {
 
     public void addDataFetchers() {
 
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(getMetaField()),
-                (DataFetcher<Object>) environment -> {
-                    return bookmarkService.bookmarkFor(environment.getSource())
-                            .map(bookmark -> new Fetcher(bookmark, 
bookmarkService, objectManager))
-                            .orElseThrow();
-                });
+                (DataFetcher<Object>) environment ->
+                    
context.bookmarkService.bookmarkFor(environment.getSource())
+                        .map(bookmark -> new Fetcher(bookmark, 
context.bookmarkService, objectManager))
+                        .orElseThrow());
 
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 coordinates(getMetaType(), logicalTypeName),
                 (DataFetcher<Object>) environment -> 
environment.<Fetcher>getSource().logicalTypeName());
 
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 coordinates(getMetaType(), id),
                 (DataFetcher<Object>) environment -> 
environment.<Fetcher>getSource().id());
 
         if (holder.getObjectSpecification().getBeanSort() == BeanSort.ENTITY) {
-            codeRegistryBuilder.dataFetcher(
+            context.codeRegistryBuilder.dataFetcher(
                     coordinates(getMetaType(), version),
                     (DataFetcher<Object>) environment -> 
environment.<Fetcher>getSource().version());
         }
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 f7a9ee1ef7..9ac47e791a 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
@@ -45,24 +45,20 @@ public class GqlvProperty
     private final GqlvPropertyGet get;
     private final GqlvPropertySet set;
     private final GqlvPropertyValidate validate;
-    private final BookmarkService bookmarkService;
 
     public GqlvProperty(
             final Holder holder,
             final OneToOneAssociation oneToOneAssociation,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService
-    ) {
-        super(holder, oneToOneAssociation, codeRegistryBuilder);
+            final Context context) {
+        super(holder, oneToOneAssociation, context);
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.propertyTypeNameFor(this.holder.getObjectSpecification(),
 oneToOneAssociation));
-        this.bookmarkService = bookmarkService;
 
-        this.hidden = new GqlvMemberHidden(this, codeRegistryBuilder);
-        this.disabled = new GqlvMemberDisabled(this, codeRegistryBuilder);
-        this.get = new GqlvPropertyGet(this, codeRegistryBuilder, 
specificationLoader);
-        this.set = new GqlvPropertySet(this, codeRegistryBuilder, 
specificationLoader);
-        this.validate = new GqlvPropertyValidate(this, codeRegistryBuilder, 
specificationLoader);
+        this.hidden = new GqlvMemberHidden(this, context);
+        this.disabled = new GqlvMemberDisabled(this, context);
+        this.get = new GqlvPropertyGet(this, context);
+        this.set = new GqlvPropertySet(this, context);
+        this.validate = new GqlvPropertyValidate(this, context);
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
@@ -109,9 +105,9 @@ public class GqlvProperty
     }
 
     public void addDataFetcher() {
-        codeRegistryBuilder.dataFetcher(
+        context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(getField()),
-                new BookmarkedPojoFetcher(bookmarkService));
+                new BookmarkedPojoFetcher(context.bookmarkService));
 
         hidden.addDataFetcher();
         disabled.addDataFetcher();
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 063646bfb7..8f285b45d8 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
@@ -34,9 +34,8 @@ public class GqlvPropertyGet  extends 
GqlvAssociationGet<OneToOneAssociation> {
 
     public GqlvPropertyGet(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final SpecificationLoader specificationLoader) {
-        super(holder, codeRegistryBuilder, specificationLoader);
+            final Context context) {
+        super(holder, context);
     }
 
     @Override
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 15468a2806..1c50c02da3 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
@@ -40,18 +40,15 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvPropertySet {
 
     final Holder holder;
-    final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    final SpecificationLoader specificationLoader;
+    final Context context;
     final GraphQLFieldDefinition field;
 
     public GqlvPropertySet(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final SpecificationLoader specificationLoader) {
+            final Context context) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.field = fieldDefinition(holder);
-        this.specificationLoader = specificationLoader;
     }
 
     GraphQLFieldDefinition fieldDefinition(final Holder holder) {
@@ -85,7 +82,7 @@ public class GqlvPropertySet {
             case VALUE:
             case VIEW_MODEL:
             case ENTITY:
-                codeRegistryBuilder.dataFetcher(
+                context.codeRegistryBuilder.dataFetcher(
                         holder.coordinatesFor(field),
                         this::set);
 
@@ -100,7 +97,7 @@ public class GqlvPropertySet {
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
         val sourcePojoClass = sourcePojo.getClass();
-        val objectSpecification = 
specificationLoader.loadSpecification(sourcePojoClass);
+        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
         if (objectSpecification == null) {
             // not expected
             return null;
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 e4431ff18d..c4f8b3273a 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
@@ -25,13 +25,11 @@ 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.types.TypeMapper;
 
 import lombok.val;
 
 import graphql.schema.DataFetchingEnvironment;
-import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLOutputType;
 
@@ -40,18 +38,15 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvPropertyValidate {
 
     final Holder holder;
-    final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    final SpecificationLoader specificationLoader;
+    private final Context context;
     final GraphQLFieldDefinition field;
 
     public GqlvPropertyValidate(
             final Holder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final SpecificationLoader specificationLoader) {
+            final Context context) {
         this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.context = context;
         this.field = fieldDefinition(holder);
-        this.specificationLoader = specificationLoader;
     }
 
     GraphQLFieldDefinition fieldDefinition(final Holder holder) {
@@ -86,7 +81,7 @@ public class GqlvPropertyValidate {
             case VALUE:
             case VIEW_MODEL:
             case ENTITY:
-                codeRegistryBuilder.dataFetcher(
+                context.codeRegistryBuilder.dataFetcher(
                         holder.coordinatesFor(field),
                         this::validate);
 
@@ -101,7 +96,7 @@ public class GqlvPropertyValidate {
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
         val sourcePojoClass = sourcePojo.getClass();
-        val objectSpecification = 
specificationLoader.loadSpecification(sourcePojoClass);
+        val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojoClass);
         if (objectSpecification == null) {
             // not expected
             return null;
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 3e9f2be380..ec44a86111 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,6 +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.domain.GqlvDomainObject;
 import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainService;
 import org.apache.causeway.viewer.graphql.viewer.toplevel.GqlvTopLevelQuery;
@@ -145,11 +146,13 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             final GqlvTopLevelQuery gqlvTopLevelQuery,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
+        Context context = new Context(codeRegistryBuilder, bookmarkService, 
specificationLoader);
+
         switch (objectSpec.getBeanSort()) {
 
             case MANAGED_BEAN_CONTRIBUTING: // @DomainService
 
-                addDomainServiceToTopLevelQuery(objectSpec, gqlvTopLevelQuery, 
codeRegistryBuilder);
+                addDomainServiceToTopLevelQuery(objectSpec, gqlvTopLevelQuery, 
context);
                 break;
 
             case ABSTRACT:
@@ -157,7 +160,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             case VIEW_MODEL: // @DomainObject(nature=VIEW_MODEL)
             case ENTITY:     // @DomainObject(nature=ENTITY)
 
-                new GqlvDomainObject(objectSpec, codeRegistryBuilder, 
bookmarkService, objectManager, graphQLTypeRegistry);
+                new GqlvDomainObject(objectSpec, context, objectManager, 
graphQLTypeRegistry);
 
                 break;
 
@@ -174,24 +177,24 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
     public void addDomainServiceToTopLevelQuery(
             final ObjectSpecification objectSpec,
             final GqlvTopLevelQuery topLevelQueryStructure,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
+            final Context context) {
 
         serviceRegistry.lookupBeanById(objectSpec.getLogicalTypeName())
             .ifPresent(servicePojo ->
-                addDomainServiceToTopLevelQuery(servicePojo, objectSpec, 
topLevelQueryStructure, codeRegistryBuilder));
+                addDomainServiceToTopLevelQuery(servicePojo, objectSpec, 
topLevelQueryStructure, context));
     }
 
     private void addDomainServiceToTopLevelQuery(
             final Object servicePojo,
             final ObjectSpecification objectSpec,
             final GqlvTopLevelQuery topLevelQuery,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
+            final Context context) {
 
-        val domainService = new GqlvDomainService(objectSpec, servicePojo, 
codeRegistryBuilder, bookmarkService);
+        val domainService = new GqlvDomainService(objectSpec, servicePojo, 
context);
 
         boolean actionsAdded = domainService.hasActions();
         if (actionsAdded) {
-            topLevelQuery.addFieldFor(domainService, codeRegistryBuilder);
+            topLevelQuery.addFieldFor(domainService, 
context.codeRegistryBuilder);
         }
 
 

Reply via email to