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


The following commit(s) were added to refs/heads/CAUSEWAY-3676 by this push:
     new c53725963e CAUSEWAY-3676: moves functionality to ServiceBehaviour
c53725963e is described below

commit c53725963ec2771f082ae588b8ba7b2e6d4b0f96
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 17:54:15 2024 +0000

    CAUSEWAY-3676: moves functionality to ServiceBehaviour
---
 .../viewer/source/GqlvServiceBehaviour.java        | 51 ++++++++++++++++++++++
 .../viewer/source/GqlvServiceStructure.java        | 41 +++--------------
 .../graphql/viewer/source/QueryFieldFactory.java   | 13 +++---
 3 files changed, 64 insertions(+), 41 deletions(-)

diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
index ce1ac9f176..942d7270ec 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
@@ -1,15 +1,66 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
+import graphql.schema.DataFetcher;
+import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLCodeRegistry;
 
+import graphql.schema.GraphQLObjectType;
+
 import lombok.RequiredArgsConstructor;
 
+import java.util.Map;
+
+import org.apache.causeway.commons.collections.Can;
+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.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;
+
 @RequiredArgsConstructor
 public class GqlvServiceBehaviour {
 
     private final GqlvServiceStructure structure;
     private final Object service;
+    private final SpecificationLoader specificationLoader;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
 
 
+    public void addAction(
+            final ObjectAction objectAction,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
+
+        final GraphQLObjectType graphQLObjectType = 
structure.getGqlObjectType();
+
+        String fieldName = objectAction.getId();
+        codeRegistryBuilder.dataFetcher(
+                FieldCoordinates.coordinates(graphQLObjectType, fieldName),
+                (DataFetcher<Object>) dataFetchingEnvironment -> {
+
+                    Object domainObjectInstance = 
dataFetchingEnvironment.getSource();
+
+                    Class<?> domainObjectInstanceClass = 
domainObjectInstance.getClass();
+                    ObjectSpecification specification = specificationLoader
+                            .loadSpecification(domainObjectInstanceClass);
+
+                    ManagedObject owner = 
ManagedObject.adaptSingular(specification, domainObjectInstance);
+
+                    ActionInteractionHead actionInteractionHead = 
objectAction.interactionHead(owner);
+
+                    Map<String, Object> arguments = 
dataFetchingEnvironment.getArguments();
+                    Can<ObjectActionParameter> parameters = 
objectAction.getParameters();
+                    Can<ManagedObject> canOfParams = parameters
+                            .map(oap -> {
+                                Object argumentValue = 
arguments.get(oap.getId());
+                                return ManagedObject.adaptParameter(oap, 
argumentValue);
+                            });
+
+                    ManagedObject managedObject = objectAction
+                            .execute(actionInteractionHead, canOfParams, 
InteractionInitiatedBy.USER);
+
+                    return managedObject.getPojo();
+                });
+    }
 }
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
index a24a714d39..4e5889c6b3 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
@@ -143,43 +143,12 @@ public class GqlvServiceStructure {
                             .build())
                     .collect(Collectors.toList()));
         }
-        gqlObjectTypeBuilder.field(fieldBuilder.build());
-    }
-
-
-    void addBehaviour(
-            final ObjectAction objectAction,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
-
-        final GraphQLObjectType graphQLObjectType = getGqlObjectType();
-
-        String fieldName = objectAction.getId();
-        codeRegistryBuilder.dataFetcher(
-            FieldCoordinates.coordinates(graphQLObjectType, fieldName),
-            (DataFetcher<Object>) dataFetchingEnvironment -> {
+        GraphQLFieldDefinition fieldDefinition = fieldBuilder.build();
+        gqlObjectTypeBuilder.field(fieldDefinition);
 
-                Object domainObjectInstance = 
dataFetchingEnvironment.getSource();
-
-                Class<?> domainObjectInstanceClass = 
domainObjectInstance.getClass();
-                ObjectSpecification specification = specificationLoader
-                        .loadSpecification(domainObjectInstanceClass);
-
-                ManagedObject owner = 
ManagedObject.adaptSingular(specification, domainObjectInstance);
-
-                ActionInteractionHead actionInteractionHead = 
objectAction.interactionHead(owner);
-
-                Map<String, Object> arguments = 
dataFetchingEnvironment.getArguments();
-                Can<ObjectActionParameter> parameters = 
objectAction.getParameters();
-                Can<ManagedObject> canOfParams = parameters
-                        .map(oap -> {
-                            Object argumentValue = arguments.get(oap.getId());
-                            return ManagedObject.adaptParameter(oap, 
argumentValue);
-                        });
+        // TODO: either safe or mutator
+        safeActionToField.put(objectAction, fieldDefinition);
+    }
 
-                ManagedObject managedObject = objectAction
-                        .execute(actionInteractionHead, canOfParams, 
InteractionInitiatedBy.USER);
 
-                return managedObject.getPojo();
-            });
-    }
 }
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
index 2ac81d0693..630cbd0e52 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
@@ -67,7 +67,7 @@ public class QueryFieldFactory {
             final GqlvTopLevelQueryStructure topLevelQueryStructure,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        val gqlvServiceStructure = new GqlvServiceStructure(serviceSpec, 
topLevelQueryStructure, specificationLoader);
+        val serviceStructure = new GqlvServiceStructure(serviceSpec, 
topLevelQueryStructure, specificationLoader);
 
         List<ObjectAction> objectActionList = 
serviceSpec.streamRuntimeActions(MixedIn.INCLUDED)
                 .map(ObjectAction.class::cast)
@@ -77,15 +77,18 @@ public class QueryFieldFactory {
             return;
         }
 
-        objectActionList.forEach(gqlvServiceStructure::addAction);
+        objectActionList.forEach(serviceStructure::addAction);
 
-        gqlvServiceStructure.buildObjectGqlType();
+        serviceStructure.buildObjectGqlType();
 
-        objectActionList.forEach(objectAction -> 
gqlvServiceStructure.addBehaviour(objectAction, codeRegistryBuilder));
+        GqlvServiceBehaviour serviceBehaviour = new 
GqlvServiceBehaviour(serviceStructure, service, specificationLoader, 
codeRegistryBuilder);
 
-        GraphQLFieldDefinition topLevelQueryField = 
gqlvServiceStructure.addTopLevelQueryField();
+        objectActionList.forEach(objectAction -> 
serviceBehaviour.addAction(objectAction, codeRegistryBuilder));
+
+        GraphQLFieldDefinition topLevelQueryField = 
serviceStructure.addTopLevelQueryField();
 
         codeRegistryBuilder.dataFetcher(
+                // TODO: it would be nice to make these typesafe...
                 FieldCoordinates.coordinates("Query", 
topLevelQueryField.getName()),
                 (DataFetcher<Object>) environment -> service);
     }

Reply via email to