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 7edb94941a CAUSEWAY-3676: wip to clean up QueryFieldFactory
7edb94941a is described below

commit 7edb94941a5d40a14e27bb73e845d78a43166ce9
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 15:06:54 2024 +0000

    CAUSEWAY-3676: wip to clean up QueryFieldFactory
---
 .../integration/GraphQlSourceForCauseway.java      | 29 ++++++------
 .../graphql/viewer/source/GqlvObjectStructure.java | 52 +++++++++++-----------
 .../graphql/viewer/source/ObjectTypeFactory.java   |  3 --
 .../graphql/viewer/source/QueryFieldFactory.java   |  9 ++--
 .../viewer/graphql/viewer/source/TypeMapper.java   |  4 +-
 .../viewer/graphql/viewer/source/_Constants.java   |  9 ++++
 .../source/{_LogicalTypeName.java => _LTN.java}    |  9 +++-
 7 files changed, 63 insertions(+), 52 deletions(-)

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 456edfd4e6..2ec42cc6c3 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
@@ -48,6 +48,7 @@ import graphql.GraphQL;
 import graphql.Scalars;
 import graphql.schema.DataFetcher;
 import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 import graphql.schema.GraphQLSchema;
 
@@ -62,7 +63,9 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
     private final SpecificationLoader specificationLoader;
     private final CausewayConfiguration causewayConfiguration;
     private final CausewaySystemEnvironment causewaySystemEnvironment;
+
     private final AsyncExecutionStrategyResolvingWithinInteraction 
executionStrategy;
+
     private final ObjectTypeFactory objectTypeFactory;
     private final QueryFieldFactory queryFieldFactory;
     private final GraphQLTypeRegistry graphQLTypeRegistry;
@@ -97,30 +100,31 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
         specificationLoader.snapshotSpecifications()
             .distinct((a, b) -> 
a.getLogicalTypeName().equals(b.getLogicalTypeName()))
             .sorted(Comparator.comparing(HasLogicalType::getLogicalTypeName))
-            .forEach(objectSpec -> handleObjectSpec(objectSpec, queryBuilder, 
codeRegistryBuilder));
+            .forEach(objectSpec -> addToSchema(objectSpec, queryBuilder, 
codeRegistryBuilder));
 
-        val query_numServices = newFieldDefinition()
+        final GraphQLFieldDefinition numServicesField = newFieldDefinition()
                 .name("numServices")
                 .type(Scalars.GraphQLInt)
                 .build();
 
-        queryBuilder.field(query_numServices);
-        GraphQLObjectType query = queryBuilder.build();
+        queryBuilder.field(numServicesField);
+
+        GraphQLObjectType queryType = queryBuilder.build();
 
         codeRegistryBuilder
                 .dataFetcher(
-                        coordinates(query, query_numServices.getName()),
+                        coordinates(queryType, numServicesField),
                         (DataFetcher<Object>) environment -> 
this.serviceRegistry.streamRegisteredBeans().count());
         val codeRegistry = codeRegistryBuilder.build();
 
         return GraphQLSchema.newSchema()
-                .query(query)
+                .query(queryType)
                 .additionalTypes(graphQLTypeRegistry.getGraphQLObjectTypes())
                 .codeRegistry(codeRegistry)
                 .build();
     }
 
-    private void handleObjectSpec(
+    private void addToSchema(
             final ObjectSpecification objectSpec,
             final GraphQLObjectType.Builder queryBuilder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder
@@ -128,6 +132,11 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
 
         switch (objectSpec.getBeanSort()) {
 
+            case MANAGED_BEAN_CONTRIBUTING: // @DomainService
+
+                
queryFieldFactory.queryFieldFromObjectSpecification(queryBuilder, 
codeRegistryBuilder, objectSpec);
+                break;
+
             case ABSTRACT:
             case VIEW_MODEL: // @DomainObject(nature=VIEW_MODEL)
             case ENTITY:     // @DomainObject(nature=ENTITY)
@@ -137,12 +146,6 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
 
                 break;
 
-            case MANAGED_BEAN_CONTRIBUTING: //@DomainService
-
-                queryFieldFactory
-                    .queryFieldFromObjectSpecification(queryBuilder, 
codeRegistryBuilder, objectSpec);
-                break;
-
             case MANAGED_BEAN_NOT_CONTRIBUTING: // a @Service or @Component 
... ignore
             case MIXIN:
             case VALUE:
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
index 92457b7186..f44be72ba2 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
@@ -8,6 +8,7 @@ import graphql.schema.GraphQLList;
 import graphql.schema.GraphQLObjectType;
 
 import graphql.schema.GraphQLOutputType;
+import graphql.schema.GraphQLType;
 import graphql.schema.GraphQLTypeReference;
 
 import lombok.Getter;
@@ -35,7 +36,8 @@ import static 
graphql.schema.GraphQLInputObjectType.newInputObject;
 import static graphql.schema.GraphQLNonNull.nonNull;
 import static graphql.schema.GraphQLObjectType.newObject;
 
-import static 
org.apache.causeway.viewer.graphql.viewer.source.ObjectTypeFactory.GQL_INPUTTYPE_PREFIX;
+import static graphql.schema.GraphQLTypeReference.typeRef;
+import static 
org.apache.causeway.viewer.graphql.viewer.source._Constants.GQL_INPUTTYPE_PREFIX;
 
 /**
  * A wrapper around {@link ObjectSpecification}
@@ -70,8 +72,7 @@ public class GqlvObjectStructure {
     }
 
     public String getLogicalTypeNameSanitized() {
-        val logicalTypeName = objectSpec.getLogicalTypeName();
-        return _LogicalTypeName.sanitized(logicalTypeName);
+        return _LTN.sanitized(objectSpec);
     }
 
     public BeanSort getBeanSort() {
@@ -133,8 +134,7 @@ public class GqlvObjectStructure {
 
 
     void addPropertiesAsFields() {
-        objectSpec.streamProperties(MixedIn.INCLUDED)
-        .forEach(this::addPropertyAsField);
+        
objectSpec.streamProperties(MixedIn.INCLUDED).forEach(this::addPropertyAsField);
     }
 
     private void addPropertyAsField(final OneToOneAssociation otoa) {
@@ -143,16 +143,13 @@ public class GqlvObjectStructure {
 
             case VIEW_MODEL:
             case ENTITY:
-                String logicalTypeNameOfField = 
otoaObjectSpec.getLogicalTypeName();
 
-                GraphQLFieldDefinition.Builder fieldBuilder = 
newFieldDefinition()
-                        .name(otoa.getId())
-                        .type(otoa.isOptional()
-                                ? GraphQLTypeReference.typeRef(
-                                
_LogicalTypeName.sanitized(logicalTypeNameOfField))
-                                : nonNull(GraphQLTypeReference.typeRef(
-                                
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
-                getGqlObjectTypeBuilder().field(fieldBuilder);
+                GraphQLTypeReference fieldTypeRef = 
typeRef(_LTN.sanitized(otoaObjectSpec));
+                getGqlObjectTypeBuilder().field(
+                        newFieldDefinition()
+                            .name(otoa.getId())
+                            .type(otoa.isOptional() ? fieldTypeRef : 
nonNull(fieldTypeRef))
+                        );
 
                 break;
 
@@ -179,24 +176,25 @@ public class GqlvObjectStructure {
     private void addCollection(OneToManyAssociation otom) {
 
         ObjectSpecification elementType = otom.getElementType();
-        BeanSort beanSort = elementType.getBeanSort();
-        switch (beanSort) {
+        switch (elementType.getBeanSort()) {
 
             case VIEW_MODEL:
             case ENTITY:
-                String logicalTypeNameOfField = 
elementType.getLogicalTypeName();
-                GraphQLFieldDefinition.Builder fieldBuilder = 
newFieldDefinition()
-                        .name(otom.getId())
-                        .type(GraphQLList.list(GraphQLTypeReference.typeRef(
-                                
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
-                gqlObjectTypeBuilder.field(fieldBuilder);
+                GraphQLTypeReference typeRef = 
typeRef(_LTN.sanitized(elementType));
+                gqlObjectTypeBuilder.field(
+                        newFieldDefinition()
+                            .name(otom.getId())
+                            .type(GraphQLList.list(typeRef))
+                        );
                 break;
 
             case VALUE:
-                GraphQLFieldDefinition.Builder valueBuilder = 
newFieldDefinition()
-                        .name(otom.getId())
-                        
.type(GraphQLList.list(TypeMapper.typeFor(elementType.getCorrespondingClass())));
-                gqlObjectTypeBuilder.field(valueBuilder);
+                GraphQLType wrappedType = 
TypeMapper.typeFor(elementType.getCorrespondingClass());
+                gqlObjectTypeBuilder.field(
+                        newFieldDefinition()
+                            .name(otom.getId())
+                            .type(GraphQLList.list(wrappedType))
+                        );
                 break;
         }
     }
@@ -313,7 +311,7 @@ public class GqlvObjectStructure {
         mutatorsTypeIfAny.ifPresent(mutatorsType -> {
 
             GraphQLFieldDefinition gql_mutations = newFieldDefinition()
-                    .name(ObjectTypeFactory.GQL_MUTATIONS_FIELDNAME)
+                    .name(_Constants.GQL_MUTATIONS_FIELDNAME)
                     .type(mutatorsType)
                     .build();
             getGqlObjectTypeBuilder().field(gql_mutations);
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
index 6f2a7f0fe1..642571b749 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
@@ -44,9 +44,6 @@ import lombok.val;
 @Log4j2
 public class ObjectTypeFactory {
 
-    final static String GQL_INPUTTYPE_PREFIX = "_gql_input__";
-    final static String GQL_MUTATIONS_FIELDNAME = "_gql_mutations";
-
     private final GraphQLTypeRegistry graphQLTypeRegistry;
     private final BookmarkService bookmarkService;
     private final ObjectManager objectManager;
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 a49452f383..2057b68247 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
@@ -62,15 +62,14 @@ public class QueryFieldFactory {
     public void queryFieldFromObjectSpecification(
             final GraphQLObjectType.Builder queryBuilder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final ObjectSpecification objectSpecification) {
+            final ObjectSpecification objectSpec) {
 
-        val logicalTypeName = objectSpecification.getLogicalTypeName();
-        String logicalTypeNameSanitized = 
_LogicalTypeName.sanitized(logicalTypeName);
+        String logicalTypeNameSanitized = _LTN.sanitized(objectSpec);
 
-        serviceRegistry.lookupBeanById(logicalTypeName)
+        serviceRegistry.lookupBeanById(objectSpec.getLogicalTypeName())
         .ifPresent(service -> {
 
-            List<ObjectAction> objectActionList = 
objectSpecification.streamRuntimeActions(MixedIn.INCLUDED)
+            List<ObjectAction> objectActionList = 
objectSpec.streamRuntimeActions(MixedIn.INCLUDED)
                     .map(ObjectAction.class::cast)
                     .filter((final ObjectAction x) -> 
x.containsFacet(ActionSemanticsFacet.class))
 //                            .filter(x -> 
x.getFacet(ActionSemanticsFacet.class).value() == SemanticsOf.SAFE)
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/TypeMapper.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/TypeMapper.java
index cdf79bc6d5..336d0419a3 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/TypeMapper.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/TypeMapper.java
@@ -61,7 +61,7 @@ public class TypeMapper {
             case ENTITY:
             case VIEW_MODEL:
 
-                return 
GraphQLTypeReference.typeRef(ObjectTypeFactory.GQL_INPUTTYPE_PREFIX + 
_LogicalTypeName.sanitized(elementType.getLogicalTypeName()));
+                return 
GraphQLTypeReference.typeRef(_Constants.GQL_INPUTTYPE_PREFIX + 
_LTN.sanitized(elementType));
 
             case VALUE:
                 return (GraphQLInputType) 
typeFor(elementType.getCorrespondingClass());
@@ -101,7 +101,7 @@ public class TypeMapper {
             case ABSTRACT:
             case ENTITY:
             case VIEW_MODEL:
-                return 
GraphQLTypeReference.typeRef(_LogicalTypeName.sanitized(objectSpecification.getLogicalTypeName()));
+                return 
GraphQLTypeReference.typeRef(_LTN.sanitized(objectSpecification));
 
             case VALUE:
                 return typeFor(objectSpecification.getCorrespondingClass());
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_Constants.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_Constants.java
new file mode 100644
index 0000000000..299cffc0ae
--- /dev/null
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_Constants.java
@@ -0,0 +1,9 @@
+package org.apache.causeway.viewer.graphql.viewer.source;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class _Constants {
+    final static String GQL_INPUTTYPE_PREFIX = "_gql_input__";
+    final static String GQL_MUTATIONS_FIELDNAME = "_gql_mutations";
+}
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_LogicalTypeName.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_LTN.java
similarity index 77%
rename from 
incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_LogicalTypeName.java
rename to 
incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_LTN.java
index fee3851003..e65d1e8298 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_LogicalTypeName.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/_LTN.java
@@ -20,9 +20,14 @@ package org.apache.causeway.viewer.graphql.viewer.source;
 
 import lombok.experimental.UtilityClass;
 
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+
 @UtilityClass
-final class _LogicalTypeName {
-    static String sanitized(final String name) {
+final class _LTN {
+    static String sanitized(ObjectSpecification objectSpecification) {
+        return sanitized(objectSpecification.getLogicalTypeName());
+    }
+    private static String sanitized(final String name) {
         return name.replace('.', '_');
     }
 }

Reply via email to