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 4a5a68111c CAUSEWAY-3676: fleshing out GqlvServiceStructure (4)
4a5a68111c is described below

commit 4a5a68111c79237fca0475138c9f7bbbc191f5f9
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 17:04:35 2024 +0000

    CAUSEWAY-3676: fleshing out GqlvServiceStructure (4)
---
 .../viewer/source/GqlvServiceStructure.java        | 85 ++++++++++++++++++++-
 .../graphql/viewer/source/QueryFieldFactory.java   | 86 +---------------------
 2 files changed, 88 insertions(+), 83 deletions(-)

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 64a65ae39e..5f1bce25c5 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
@@ -1,10 +1,28 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
+import graphql.schema.DataFetcher;
+import graphql.schema.FieldCoordinates;
+import graphql.schema.GraphQLArgument;
+import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 
+import graphql.schema.GraphQLOutputType;
+
 import lombok.Getter;
+import lombok.val;
+
+import java.util.Map;
+import java.util.stream.Collectors;
 
+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;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
@@ -13,6 +31,7 @@ public class GqlvServiceStructure {
 
     @Getter private final ObjectSpecification serviceSpec;
     @Getter private final GqlvTopLevelQueryStructure topLevelQueryStructure;
+    private final SpecificationLoader specificationLoader;
 
     private String getLogicalTypeName() {
         return serviceSpec.getLogicalTypeName();
@@ -33,9 +52,14 @@ public class GqlvServiceStructure {
         return gqlObjectTypeBuilder;
     }
 
-    public GqlvServiceStructure(ObjectSpecification serviceSpec, 
GqlvTopLevelQueryStructure topLevelQueryStructure) {
+    public GqlvServiceStructure(
+            final ObjectSpecification serviceSpec,
+            final GqlvTopLevelQueryStructure topLevelQueryStructure,
+            final SpecificationLoader specificationLoader
+    ) {
         this.serviceSpec = serviceSpec;
         this.topLevelQueryStructure = topLevelQueryStructure;
+        this.specificationLoader = specificationLoader;
 
         queryBuilder = topLevelQueryStructure.getQueryBuilder();
 
@@ -69,4 +93,63 @@ public class GqlvServiceStructure {
         }
         return gqlObjectType;
     }
+
+    void addAction(
+            final ObjectAction objectAction) {
+
+        val serviceAsGraphQlType = getGraphQlTypeBuilder();
+
+        String fieldName = objectAction.getId();
+
+        GraphQLFieldDefinition.Builder builder = newFieldDefinition()
+                .name(fieldName)
+                .type((GraphQLOutputType) 
TypeMapper.typeForObjectAction(objectAction));
+        if (objectAction.getParameters().isNotEmpty()) {
+            builder.arguments(objectAction.getParameters().stream()
+                    .map(objectActionParameter -> GraphQLArgument.newArgument()
+                            .name(objectActionParameter.getId())
+                            
.type(TypeMapper.inputTypeFor(objectActionParameter))
+                            .build())
+                    .collect(Collectors.toList()));
+        }
+        serviceAsGraphQlType
+                .field(builder
+                        .build());
+    }
+
+    void addBehaviour(
+            final ObjectAction objectAction,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder, 
QueryFieldFactory queryFieldFactory) {
+
+        final GraphQLObjectType graphQLObjectType = 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/QueryFieldFactory.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
index 283552786b..3dd52de77c 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
@@ -22,7 +22,6 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
@@ -30,25 +29,16 @@ import javax.inject.Inject;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import 
org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
-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.MixedIn;
 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 graphql.schema.DataFetcher;
-import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.FieldCoordinates;
-import graphql.schema.GraphQLArgument;
 import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLObjectType;
-import graphql.schema.GraphQLOutputType;
+
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
@@ -76,7 +66,7 @@ public class QueryFieldFactory {
             final GqlvTopLevelQueryStructure topLevelQueryStructure,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        val gqlvServiceStructure = new GqlvServiceStructure(serviceSpec, 
topLevelQueryStructure);
+        val gqlvServiceStructure = new GqlvServiceStructure(serviceSpec, 
topLevelQueryStructure, specificationLoader);
 
         List<ObjectAction> objectActionList = 
serviceSpec.streamRuntimeActions(MixedIn.INCLUDED)
                 .map(ObjectAction.class::cast)
@@ -90,13 +80,11 @@ public class QueryFieldFactory {
             val serviceAsGraphQlType = 
gqlvServiceStructure.getGraphQlTypeBuilder();
 
             objectActionList
-            .forEach(objectAction -> {
-                addAction(objectAction, gqlvServiceStructure);
-            });
+            .forEach(gqlvServiceStructure::addAction);
 
             objectActionList
             .forEach(objectAction -> {
-                addBehaviour(gqlvServiceStructure, objectAction, 
codeRegistryBuilder);
+                gqlvServiceStructure.addBehaviour(objectAction, 
codeRegistryBuilder, this);
             });
 
             gqlvServiceStructure.addTypeToTopLevelQuery();
@@ -111,70 +99,4 @@ public class QueryFieldFactory {
         }
     }
 
-    private void addBehaviour(
-            final GqlvServiceStructure gqlvServiceStructure,
-            final ObjectAction objectAction,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
-
-        final GraphQLObjectType graphQLObjectType = 
gqlvServiceStructure.getGqlObjectType();
-
-        String fieldName = objectAction.getId();
-        codeRegistryBuilder
-        .dataFetcher(
-            FieldCoordinates.coordinates(graphQLObjectType, fieldName),
-            new DataFetcher<Object>() {
-
-                @Override
-                public Object get(final DataFetchingEnvironment 
dataFetchingEnvironment) throws Exception {
-
-                    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();
-                }
-
-            });
-    }
-
-    private void addAction(
-            ObjectAction objectAction,
-            GqlvServiceStructure gqlvServiceStructure) {
-
-        val serviceAsGraphQlType = 
gqlvServiceStructure.getGraphQlTypeBuilder();
-
-        String fieldName = objectAction.getId();
-
-        GraphQLFieldDefinition.Builder builder = newFieldDefinition()
-                .name(fieldName)
-                .type((GraphQLOutputType) 
TypeMapper.typeForObjectAction(objectAction));
-        if (objectAction.getParameters().isNotEmpty()) {
-            builder.arguments(objectAction.getParameters().stream()
-                    .map(objectActionParameter -> GraphQLArgument.newArgument()
-                            .name(objectActionParameter.getId())
-                            
.type(TypeMapper.inputTypeFor(objectActionParameter))
-                            .build())
-                    .collect(Collectors.toList()));
-        }
-        serviceAsGraphQlType
-                .field(builder
-                        .build());
-    }
 }

Reply via email to