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 f5269332f7 CAUSEWAY-3676: fleshing out GqlvServiceStructure
f5269332f7 is described below

commit f5269332f720ac4a5764acf77fbdcb6b43850369
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 16:55:27 2024 +0000

    CAUSEWAY-3676: fleshing out GqlvServiceStructure
---
 .../graphql/viewer/source/GqlvObjectBehaviour.java |  6 +---
 .../viewer/source/GqlvServiceBehaviour.java        |  5 ++++
 .../viewer/source/GqlvServiceStructure.java        | 33 ++++++++++++++++++++--
 .../graphql/viewer/source/QueryFieldFactory.java   | 18 ++++++------
 4 files changed, 46 insertions(+), 16 deletions(-)

diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
index 3e1202386b..1ab0c21ab5 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
@@ -9,17 +9,14 @@ import org.apache.causeway.applib.services.metamodel.BeanSort;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
 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.ObjectAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 
-import graphql.schema.GraphQLFieldDefinition;
-
 import lombok.RequiredArgsConstructor;
 
 import graphql.schema.DataFetcher;
-import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 import graphql.schema.GraphQLType;
 
@@ -36,7 +33,6 @@ public class GqlvObjectBehaviour {
     private final SpecificationLoader specificationLoader;
 
 
-
     public void createAndRegisterDataFetchersForMetaData() {
 
         codeRegistryBuilder.dataFetcher(
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 2cf79f14a7..ce1ac9f176 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,10 +1,15 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
+import graphql.schema.GraphQLCodeRegistry;
+
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
 public class GqlvServiceBehaviour {
 
     private final GqlvServiceStructure structure;
+    private final Object service;
+    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+
 
 }
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 685e11f662..1e14b0a0e8 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,13 +1,42 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
+import graphql.schema.GraphQLObjectType;
+
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
-@RequiredArgsConstructor
+import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
+import static graphql.schema.GraphQLObjectType.newObject;
+
 public class GqlvServiceStructure {
 
     @Getter private final ObjectSpecification serviceSpec;
+    @Getter private final GqlvTopLevelQueryStructure topLevelQueryStructure;
+
+    private final GraphQLObjectType.Builder queryBuilder;
+
+    private GraphQLObjectType.Builder gqlObjectTypeBuilder;
+
+    // TODO - don't expose
+    public GraphQLObjectType.Builder getGraphQlTypeBuilder() {
+        return gqlObjectTypeBuilder;
+    }
+
+    public GqlvServiceStructure(ObjectSpecification serviceSpec, 
GqlvTopLevelQueryStructure topLevelQueryStructure) {
+        this.serviceSpec = serviceSpec;
+        this.topLevelQueryStructure = topLevelQueryStructure;
+
+        queryBuilder = topLevelQueryStructure.getQueryBuilder();
+
+        gqlObjectTypeBuilder = newObject().name(_LTN.sanitized(serviceSpec));
+    }
+
+    public void addTypeToTopLevelQuery() {
+        queryBuilder.field(newFieldDefinition()
+                .name(_LTN.sanitized(serviceSpec))
+                .type(getGraphQlTypeBuilder())
+                .build());
+    }
 
 }
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 2bb999703b..7a8d37db8e 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
@@ -71,14 +71,16 @@ public class QueryFieldFactory {
     }
 
     private void addService(
-            final ObjectSpecification objectSpec,
+            final ObjectSpecification serviceSpec,
             final Object service,
             final GqlvTopLevelQueryStructure topLevelQueryStructure,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        final GraphQLObjectType.Builder queryBuilder = 
topLevelQueryStructure.getQueryBuilder();
+        val gqlvServiceStructure = new GqlvServiceStructure(serviceSpec, 
topLevelQueryStructure);
+
+        //final GraphQLObjectType.Builder queryBuilder = 
topLevelQueryStructure.getQueryBuilder();
 
-        List<ObjectAction> objectActionList = 
objectSpec.streamRuntimeActions(MixedIn.INCLUDED)
+        List<ObjectAction> objectActionList = 
serviceSpec.streamRuntimeActions(MixedIn.INCLUDED)
                 .map(ObjectAction.class::cast)
                 .filter((final ObjectAction x) -> 
x.containsFacet(ActionSemanticsFacet.class))
 //              .filter(x -> x.getFacet(ActionSemanticsFacet.class).value() == 
SemanticsOf.SAFE)
@@ -87,7 +89,8 @@ public class QueryFieldFactory {
         // for now filters when no safe actions
         if (!objectActionList.isEmpty()) {
 
-            val serviceAsGraphQlType = 
newObject().name(_LTN.sanitized(objectSpec));
+            val serviceAsGraphQlType = 
gqlvServiceStructure.getGraphQlTypeBuilder();
+
 
             objectActionList
             .forEach(objectAction -> {
@@ -103,15 +106,12 @@ public class QueryFieldFactory {
 
             });
 
-            queryBuilder.field(newFieldDefinition()
-                    .name(_LTN.sanitized(objectSpec))
-                    .type(serviceAsGraphQlType)
-                    .build());
+            gqlvServiceStructure.addTypeToTopLevelQuery();
 
             codeRegistryBuilder
             .dataFetcher(
                     FieldCoordinates.coordinates("Query", newFieldDefinition()
-                        .name(_LTN.sanitized(objectSpec))
+                        .name(_LTN.sanitized(serviceSpec))
                         .type(serviceAsGraphQlType)
                         .build().getName()),
                     (DataFetcher<Object>) environment -> service);

Reply via email to