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 584912817e006fe2f34f0ef1ba8bcc6469696521
Author: danhaywood <[email protected]>
AuthorDate: Sun Feb 11 15:27:55 2024 +0000

    CAUSEWAY-3676: further refactors
---
 .../graphql/model/domain/GqlvDomainObject.java     | 19 ++++++++
 .../integration/GraphQlSourceForCauseway.java      | 12 ++---
 .../graphql/viewer/toplevel/GqlvTopLevelQuery.java | 54 ++++++++--------------
 3 files changed, 43 insertions(+), 42 deletions(-)

diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
index 10c1ab2491..997f780cd8 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
@@ -24,10 +24,12 @@ import java.util.TreeMap;
 
 import graphql.Scalars;
 import graphql.schema.FieldCoordinates;
+import graphql.schema.GraphQLArgument;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLInputObjectType;
 import graphql.schema.GraphQLObjectType;
 
+import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLInputObjectField.newInputObjectField;
 import static graphql.schema.GraphQLInputObjectType.newInputObject;
 import static graphql.schema.GraphQLNonNull.nonNull;
@@ -91,6 +93,23 @@ public class GqlvDomainObject implements GqlvAction.Holder, 
GqlvProperty.Holder,
         addMembers();
     }
 
+    public GraphQLFieldDefinition getField() {
+        val lookupConfig = 
this.context.causewayConfiguration.getViewer().getGraphql().getLookup();
+        ObjectSpecification objectSpec = getObjectSpecification();
+        return newFieldDefinition()
+                .name(String.format("%s%s%s",
+                        lookupConfig.getFieldNamePrefix(),          // eg 
"_gqlv_lookup__"
+                        TypeNames.objectTypeNameFor(objectSpec),
+                        lookupConfig.getFieldNameSuffix())          // eg ""
+                )
+                .type(this.context.typeMapper.outputTypeFor(objectSpec))
+                .argument(GraphQLArgument.newArgument()
+                        .name(lookupConfig.getArgument())   // eg "object"
+                        .type(getGqlInputObjectType())
+                        .build())
+                .build();
+    }
+
     public void addTypesInto(GraphQLTypeRegistry graphQLTypeRegistry) {
         gqlObjectType = gqlObjectTypeBuilder.build();
         graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlObjectType);
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
index e2d6773dc3..86a1b923e8 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
+++ 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
@@ -18,22 +18,18 @@
  */
 package org.apache.causeway.viewer.graphql.viewer.integration;
 
-import java.util.Comparator;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
-import org.apache.causeway.commons.functional.Either;
-import 
org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.viewer.graphql.viewer.toplevel.GqlvTopLevelMutation;
 
 import org.springframework.graphql.execution.GraphQlSource;
 import org.springframework.stereotype.Service;
 
-import org.apache.causeway.applib.id.HasLogicalType;
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
 import org.apache.causeway.core.config.CausewayConfiguration;
@@ -111,6 +107,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
 
         // domain objects
         val domainObjects = new LinkedHashMap<ObjectSpecification, 
GqlvDomainObject>();
+        val domainObjectList = new ArrayList<GqlvDomainObject>();
         context.objectSpecifications().forEach(objectSpec -> {
             switch (objectSpec.getBeanSort()) {
 
@@ -122,6 +119,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
                     domainObject.addTypesInto(graphQLTypeRegistry);
                     domainObject.addDataFetchers();
 
+                    domainObjectList.add(domainObject);
                     domainObjects.put(objectSpec, domainObject);
 
                     break;
@@ -129,7 +127,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
         });
 
         // top-level query type and (dependent on configuration) the top-level 
mutation type
-        val topLevelQuery = new GqlvTopLevelQuery(context, domainObjects);
+        val topLevelQuery = new GqlvTopLevelQuery(context, domainObjectList);
 
 
         val topLevelMutation =
@@ -143,7 +141,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
 
         // build the schema
         val schemaBuilder = GraphQLSchema.newSchema()
-                .query(topLevelQuery.getQueryType())
+                .query(topLevelQuery.getObjectType())
                 .additionalTypes(graphQLTypeRegistry.getGraphQLTypes())
                 .codeRegistry(codeRegistry);
         if (topLevelMutation != null) {
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
index e8a4c3487b..f8dd4cbd35 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
+++ 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
@@ -2,10 +2,8 @@ package org.apache.causeway.viewer.graphql.viewer.toplevel;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 import graphql.schema.DataFetcher;
-import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLArgument;
 import graphql.schema.GraphQLFieldDefinition;
@@ -30,18 +28,19 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder {
 
     private final List<GqlvDomainService> domainServices = new ArrayList<>();
     private final Context context;
+    private final List<GqlvDomainObject> domainObjects;
 
 
-    @Getter private final GraphQLObjectType queryType;
+    @Getter private final GraphQLObjectType objectType;
 
 
     public GqlvTopLevelQuery(
             final Context context,
-            final Map<ObjectSpecification, GqlvDomainObject> domainObjects) {
+            final List<GqlvDomainObject> domainObjects) {
         this.context = context;
+        this.domainObjects = domainObjects;
         this.objectTypeBuilder = newObject().name("Query");
 
-
         // add services to top-level query
         context.objectSpecifications().forEach(objectSpec -> {
             switch (objectSpec.getBeanSort()) {
@@ -67,9 +66,12 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder {
         });
 
         // add lookup to top-level query
-        domainObjects.forEach(this::addLookupFor);
+        for (GqlvDomainObject domainObject : this.domainObjects) {
+            addField(domainObject.getField());
+        }
+
 
-        queryType = objectTypeBuilder.build();
+        objectType = objectTypeBuilder.build();
     }
 
 
@@ -96,36 +98,18 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder {
                 domainService.addDataFetchers();
             }
         });
-    }
 
-    public void addLookupFor(
-            final ObjectSpecification objectSpec,
-            final GqlvDomainObject domainObject) {
-        val lookupConfig = 
context.causewayConfiguration.getViewer().getGraphql().getLookup();
-        val field = newFieldDefinition()
-                        .name(String.format("%s%s%s",
-                                lookupConfig.getFieldNamePrefix(),          // 
eg "_gqlv_lookup__"
-                                TypeNames.objectTypeNameFor(objectSpec),
-                                lookupConfig.getFieldNameSuffix())          // 
eg ""
-                        )
-                        .type(context.typeMapper.outputTypeFor(objectSpec))
-                        .argument(GraphQLArgument.newArgument()
-                                        .name(lookupConfig.getArgument())   // 
eg "object"
-                                        
.type(domainObject.getGqlInputObjectType())
-                                        .build())
-                        .build();
-        addField(field);
-
-        context.codeRegistryBuilder.dataFetcher(
-                coordinatesFor(field),
-                (DataFetcher<Object>) environment -> lookup(objectSpec, 
environment));
-
-    }
+        domainObjects.forEach(domainObject -> {
+            ObjectSpecification objectSpec = 
domainObject.getObjectSpecification();
+            this.context.codeRegistryBuilder.dataFetcher(
+                    coordinatesFor(domainObject.getField()),
+                    (DataFetcher<Object>) environment -> {
+                        Object target = environment.getArgument("object");
+                        return GqlvAction.asPojo(objectSpec, target, 
this.context.bookmarkService)
+                                .orElse(null);
+                    });
+        });
 
-    private Object lookup(ObjectSpecification objectSpec, 
DataFetchingEnvironment dataFetchingEnvironment) {
-        Object target = dataFetchingEnvironment.getArgument("object");
-        return GqlvAction.asPojo(objectSpec, target, context.bookmarkService)
-                .orElse(null);
     }
 
 

Reply via email to