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 661bd8f1b4337273e5bc483e8f8e0716e320b84c
Author: danhaywood <[email protected]>
AuthorDate: Tue Jan 23 09:54:02 2024 +0000

    CAUSEWAY-3676: sketched out ActionInvoke
---
 .../viewer/graphql/model/domain/GqlvAction.java    |  65 ++++++++++++
 ...GqlvActionSimple.java => GqlvActionInvoke.java} | 109 +++++++++++----------
 .../model/domain/GqlvActionInvokeHolder.java       |   9 ++
 .../graphql/model/domain/GqlvActionSimple.java     |   6 +-
 .../graphql/model/domain/GqlvDomainObject.java     |   4 +-
 .../graphql/model/domain/GqlvDomainService.java    |   6 +-
 .../viewer/graphql/model/domain/GqlvMember.java    |  15 ++-
 .../viewer/graphql/model/domain/GqlvMutations.java |  21 ++--
 .../viewer/graphql/model/util/TypeNames.java       |   6 ++
 .../integration/GraphQlSourceForCauseway.java      |   2 +-
 10 files changed, 171 insertions(+), 72 deletions(-)

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
new file mode 100644
index 0000000000..27340e0264
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
@@ -0,0 +1,65 @@
+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.viewer.graphql.model.util.TypeNames;
+
+import graphql.schema.FieldCoordinates;
+import graphql.schema.GraphQLObjectType;
+
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLFieldDefinition;
+import graphql.schema.GraphQLOutputType;
+
+import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
+import static graphql.schema.GraphQLObjectType.newObject;
+
+@Log4j2
+public class GqlvAction extends GqlvMember<ObjectAction, GqlvActionHolder> 
implements GqlvActionInvokeHolder {
+
+    private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
+    private final GraphQLObjectType gqlObjectType;
+    private final GqlvActionInvoke invoke;
+
+    public GqlvAction(
+            final GqlvActionHolder holder,
+            final ObjectAction objectAction,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder
+            ) {
+        super(holder, objectAction, codeRegistryBuilder);
+
+        gqlObjectTypeBuilder = 
newObject().name(TypeNames.invokeTypeNameFor(objectAction));
+
+        this.invoke = new GqlvActionInvoke(this, codeRegistryBuilder);
+
+        gqlObjectType = gqlObjectTypeBuilder.build();
+
+        final GraphQLFieldDefinition field = newFieldDefinition()
+                .name(objectAction.getId())
+                .type(gqlObjectTypeBuilder)
+                .build();
+
+        holder.addField(field);
+
+        setFieldDefinition(field);
+    }
+
+
+    public ObjectAction getObjectAction() {
+        return getObjectMember();
+    }
+
+    @Override
+    public void addField(GraphQLFieldDefinition fieldDefinition) {
+        gqlObjectTypeBuilder.field(fieldDefinition);
+    }
+
+    @Override
+    public FieldCoordinates coordinatesFor(GraphQLFieldDefinition 
fieldDefinition) {
+        return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
+    }
+
+}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionSimple.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
similarity index 87%
copy from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionSimple.java
copy to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
index bd05b13a35..fcb707cac7 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionSimple.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
@@ -1,10 +1,22 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
+import graphql.Scalars;
+import graphql.schema.DataFetchingEnvironment;
+import graphql.schema.GraphQLArgument;
+import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLFieldDefinition;
+import graphql.schema.GraphQLList;
+import graphql.schema.GraphQLOutputType;
+
+import graphql.schema.GraphQLType;
+import graphql.schema.GraphQLTypeReference;
+
+import lombok.extern.log4j.Log4j2;
+import lombok.val;
+
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
@@ -16,40 +28,33 @@ import 
org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.viewer.graphql.model.types.ScalarMapper;
 import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
-
-import graphql.Scalars;
-import graphql.schema.DataFetchingEnvironment;
-import graphql.schema.GraphQLArgument;
-import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLList;
-import graphql.schema.GraphQLOutputType;
-import graphql.schema.GraphQLType;
-import graphql.schema.GraphQLTypeReference;
+import org.springframework.lang.Nullable;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLNonNull.nonNull;
 
 @Log4j2
-public class GqlvActionSimple extends GqlvMember<ObjectAction, 
GqlvActionHolder> {
+public class GqlvActionInvoke {
 
-    public GqlvActionSimple(
-            final GqlvActionHolder holder,
-            final ObjectAction objectAction,
+    private final GqlvActionInvokeHolder holder;
+    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final GraphQLFieldDefinition field;
+
+    public GqlvActionInvoke(
+            final GqlvActionInvokeHolder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder
-            ) {
-        super(holder, objectAction, fieldDefinition(objectAction, holder), 
codeRegistryBuilder);
+    ) {
+        this.holder = holder;
+        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.field = fieldDefinition(holder);
     }
 
-    private static GraphQLFieldDefinition fieldDefinition(
-            final ObjectAction objectAction,
-            final GqlvActionHolder holder) {
+    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvActionInvokeHolder holder) {
+
+        val objectAction = holder.getObjectAction();
 
         GraphQLFieldDefinition fieldDefinition = null;
         GraphQLOutputType type = typeFor(objectAction);
-
         if (type != null) {
             val fieldBuilder = newFieldDefinition()
                     .name(objectAction.getId())
@@ -116,23 +121,39 @@ public class GqlvActionSimple extends 
GqlvMember<ObjectAction, GqlvActionHolder>
         }
     }
 
-    public ObjectAction getObjectAction() {
-        return getObjectMember();
+    static void addGqlArguments(
+            final ObjectAction objectAction,
+            final GraphQLFieldDefinition.Builder builder) {
+
+        Can<ObjectActionParameter> parameters = objectAction.getParameters();
+
+        if (parameters.isNotEmpty()) {
+            builder.arguments(parameters.stream()
+                    .map(GqlvActionInvoke::gqlArgumentFor)
+                    .collect(Collectors.toList()));
+        }
+    }
+
+    private static GraphQLArgument gqlArgumentFor(final ObjectActionParameter 
objectActionParameter) {
+        return GraphQLArgument.newArgument()
+                .name(objectActionParameter.getId())
+                .type(objectActionParameter.isOptional()
+                        ? 
GqlvActionParameter.inputTypeFor(objectActionParameter)
+                        : 
nonNull(GqlvActionParameter.inputTypeFor(objectActionParameter)))
+                .build();
     }
 
     public void addDataFetcher() {
-        GraphQLFieldDefinition fieldDefinition = getFieldDefinition();
         codeRegistryBuilder.dataFetcher(
-                getHolder().coordinatesFor(fieldDefinition),
+                holder.coordinatesFor(field),
                 this::invoke
         );
     }
 
     private Object invoke(
             final DataFetchingEnvironment dataFetchingEnvironment) {
-        final ObjectAction objectAction = getObjectAction();
+        final ObjectAction objectAction = holder.getObjectAction();
 
-        // TODO: not tested
         Object source = dataFetchingEnvironment.getSource();
         Object domainObjectInstance;
         if (source instanceof GqlvMutations.Fetcher) {
@@ -143,11 +164,14 @@ public class GqlvActionSimple extends 
GqlvMember<ObjectAction, GqlvActionHolder>
         }
 
         Class<?> domainObjectInstanceClass = domainObjectInstance.getClass();
-        ObjectSpecification specification = specificationLoader
+        ObjectSpecification specification = 
holder.getObjectAction().getSpecificationLoader()
                 .loadSpecification(domainObjectInstanceClass);
+        if (specification == null) {
+            // not expected
+            return null;
+        }
 
         ManagedObject owner = ManagedObject.adaptSingular(specification, 
domainObjectInstance);
-
         ActionInteractionHead actionInteractionHead = 
objectAction.interactionHead(owner);
 
         Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
@@ -164,25 +188,4 @@ public class GqlvActionSimple extends 
GqlvMember<ObjectAction, GqlvActionHolder>
         return managedObject.getPojo();
     }
 
-    static void addGqlArguments(
-            final ObjectAction objectAction,
-            final GraphQLFieldDefinition.Builder builder) {
-
-        Can<ObjectActionParameter> parameters = objectAction.getParameters();
-
-        if (parameters.isNotEmpty()) {
-            builder.arguments(parameters.stream()
-                    .map(GqlvActionSimple::gqlArgumentFor)
-                    .collect(Collectors.toList()));
-        }
-    }
-
-    private static GraphQLArgument gqlArgumentFor(final ObjectActionParameter 
objectActionParameter) {
-        return GraphQLArgument.newArgument()
-                .name(objectActionParameter.getId())
-                .type(objectActionParameter.isOptional()
-                        ? 
GqlvActionParameter.inputTypeFor(objectActionParameter)
-                        : 
nonNull(GqlvActionParameter.inputTypeFor(objectActionParameter)))
-                .build();
-    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvokeHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvokeHolder.java
new file mode 100644
index 0000000000..d32aafe916
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvokeHolder.java
@@ -0,0 +1,9 @@
+package org.apache.causeway.viewer.graphql.model.domain;
+
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+
+public interface GqlvActionInvokeHolder extends GqlvHolder {
+
+
+    ObjectAction getObjectAction();
+}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionSimple.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionSimple.java
index bd05b13a35..ee9f846f78 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionSimple.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionSimple.java
@@ -132,7 +132,6 @@ public class GqlvActionSimple extends 
GqlvMember<ObjectAction, GqlvActionHolder>
             final DataFetchingEnvironment dataFetchingEnvironment) {
         final ObjectAction objectAction = getObjectAction();
 
-        // TODO: not tested
         Object source = dataFetchingEnvironment.getSource();
         Object domainObjectInstance;
         if (source instanceof GqlvMutations.Fetcher) {
@@ -145,9 +144,14 @@ public class GqlvActionSimple extends 
GqlvMember<ObjectAction, GqlvActionHolder>
         Class<?> domainObjectInstanceClass = domainObjectInstance.getClass();
         ObjectSpecification specification = specificationLoader
                 .loadSpecification(domainObjectInstanceClass);
+        if (specification == null) {
+            // not expected
+            return null;
+        }
 
         ManagedObject owner = ManagedObject.adaptSingular(specification, 
domainObjectInstance);
 
+
         ActionInteractionHead actionInteractionHead = 
objectAction.interactionHead(owner);
 
         Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
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 4731fcd07c..0168fa7744 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
@@ -46,6 +46,7 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
     private final List<GqlvProperty> properties = new ArrayList<>();
     private final List<GqlvCollection> collections = new ArrayList<>();
     private final List<GqlvActionSimple> safeActionSimples = new ArrayList<>();
+    private final List<GqlvAction> safeActions = new ArrayList<>();
 
     private GraphQLObjectType gqlObjectType;
 
@@ -62,7 +63,7 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.objectTypeNameFor(objectSpecification));
 
         this.meta = new GqlvMeta(this, codeRegistryBuilder, bookmarkService, 
objectManager);
-        this.mutations = new GqlvMutations(this, codeRegistryBuilder, 
bookmarkService, objectManager);
+        this.mutations = new GqlvMutations(this, codeRegistryBuilder, 
bookmarkService);
 
 
         // input object type
@@ -109,6 +110,7 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
     private void addAction(final ObjectAction objectAction) {
         if (objectAction.getSemantics().isSafeInNature()) {
             safeActionSimples.add(new GqlvActionSimple(this, objectAction, 
codeRegistryBuilder));
+            //safeActions.add(new GqlvAction(this, objectAction, 
codeRegistryBuilder));
         } else {
             mutations.addAction(objectAction);
         }
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 b9caba2a3a..1583919865 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
@@ -6,7 +6,6 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
-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.MixedIn;
@@ -55,8 +54,7 @@ public class GqlvDomainService implements GqlvActionHolder, 
GqlvMutationsHolder
             final ObjectSpecification objectSpecification,
             final Object servicePojo,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService,
-            final ObjectManager objectManager
+            final BookmarkService bookmarkService
     ) {
         this.objectSpecification = objectSpecification;
         this.servicePojo = servicePojo;
@@ -64,7 +62,7 @@ public class GqlvDomainService implements GqlvActionHolder, 
GqlvMutationsHolder
 
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.objectTypeNameFor(objectSpecification));
 
-        this.mutations = new GqlvMutations(this, codeRegistryBuilder, 
bookmarkService, objectManager);
+        this.mutations = new GqlvMutations(this, codeRegistryBuilder, 
bookmarkService);
     }
 
     /**
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 08b4383752..09288d25e9 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
@@ -3,19 +3,32 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 
+import lombok.AccessLevel;
 import lombok.Getter;
 
 import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 
+import lombok.Setter;
+
 public abstract class GqlvMember<T extends ObjectMember, H extends 
GqlvMemberHolder> {
 
     @Getter private final H holder;
     @Getter private final T objectMember;
-    @Getter private final GraphQLFieldDefinition fieldDefinition;
+    @Getter @Setter(AccessLevel.PACKAGE)
+    private GraphQLFieldDefinition fieldDefinition;
+
     final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     final SpecificationLoader specificationLoader;
 
+    public GqlvMember(
+            final H holder,
+            final T objectMember,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder
+    ) {
+        this(holder, objectMember, null, codeRegistryBuilder);
+    }
+
     public GqlvMember(
             final H holder,
             final T objectMember,
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java
index 917317e812..5f985a8e82 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java
@@ -6,7 +6,6 @@ import java.util.Optional;
 
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 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.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry;
@@ -26,7 +25,6 @@ public class GqlvMutations implements GqlvActionHolder {
     private final GqlvMutationsHolder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     private final BookmarkService bookmarkService;
-    private final ObjectManager objectManager;
 
     /**
      * Used to build {@link #objectTypeIfAny}.
@@ -43,18 +41,19 @@ public class GqlvMutations implements GqlvActionHolder {
      * Built lazily using {@link #buildObjectTypeAndFieldIfRequired()}
      */
     @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
-    private Optional<GraphQLFieldDefinition> mutationsFieldIfAny;
+    private Optional<GraphQLFieldDefinition> fieldIfAny;
+
+    private final List<GqlvActionSimple> actionSimples = new ArrayList<>();
+    private final List<GqlvAction> actions = new ArrayList<>();
 
     public GqlvMutations(
             final GqlvMutationsHolder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final BookmarkService bookmarkService,
-            final ObjectManager objectManager
+            final BookmarkService bookmarkService
     ) {
         this.holder = holder;
         this.codeRegistryBuilder = codeRegistryBuilder;
         this.bookmarkService = bookmarkService;
-        this.objectManager = objectManager;
 
         gqlObjectTypeBuilder = 
newObject().name(TypeNames.mutationsTypeNameFor(this.holder.getObjectSpecification()));
     }
@@ -66,9 +65,9 @@ public class GqlvMutations implements GqlvActionHolder {
 
     public void addAction(final ObjectAction objectAction) {
         actionSimples.add(new GqlvActionSimple(this, objectAction, 
codeRegistryBuilder));
+        //actions.add(new GqlvAction(this, objectAction, codeRegistryBuilder));
     }
 
-    private final List<GqlvActionSimple> actionSimples = new ArrayList<>();
 
     boolean hasActions() {
         return !actionSimples.isEmpty();
@@ -92,22 +91,22 @@ public class GqlvMutations implements GqlvActionHolder {
                     .name("_gql_mutations")
                     .type(mutationsType)
                     .build();
-            mutationsFieldIfAny = Optional.of(mutationsField);
+            fieldIfAny = Optional.of(mutationsField);
 
             // register the field into the owning type
             holder.addField(mutationsField);
 
         } else {
-            mutationsFieldIfAny = Optional.empty();
+            fieldIfAny = Optional.empty();
             objectTypeIfAny = Optional.empty();
         }
         return objectTypeIfAny;
     }
 
     public void addDataFetchers() {
-        if (mutationsFieldIfAny.isPresent()) {
+        if (fieldIfAny.isPresent()) {
             codeRegistryBuilder.dataFetcher(
-                    holder.coordinatesFor(mutationsFieldIfAny.get()),
+                    holder.coordinatesFor(fieldIfAny.get()),
                     (DataFetcher<Object>) environment ->
                         bookmarkService.bookmarkFor(environment.getSource())
                             .map(bookmark -> new Fetcher(bookmark, 
bookmarkService))
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/util/TypeNames.java
index b34420cb24..c3989db1d1 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/util/TypeNames.java
@@ -21,6 +21,8 @@ package org.apache.causeway.viewer.graphql.model.util;
 import lombok.experimental.UtilityClass;
 
 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.ObjectMember;
 
 @UtilityClass
 public final class TypeNames {
@@ -41,6 +43,10 @@ public final class TypeNames {
         return objectTypeNameFor(objectSpecification) + "__input";
     }
 
+    public static String invokeTypeNameFor(ObjectMember objectMember) {
+        return 
sanitized(objectMember.getFeatureIdentifier().getFullIdentityString()) + 
"__invoke";
+    }
+
     private static String sanitized(final String name) {
         return name.replace('.', '_');
     }
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 4345553bf2..d864b4791b 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
@@ -184,7 +184,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             final GqlvTopLevelQuery topLevelQueryStructure,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        val domainService = new GqlvDomainService(objectSpec, servicePojo, 
codeRegistryBuilder, bookmarkService, objectManager);
+        val domainService = new GqlvDomainService(objectSpec, servicePojo, 
codeRegistryBuilder, bookmarkService);
 
         boolean actionsAdded = domainService.addActions();
         if (!actionsAdded) {

Reply via email to