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 3e7166db6e3dc769c4e7b02c8bc61348840318f6
Author: danhaywood <[email protected]>
AuthorDate: Sat Jan 20 16:44:45 2024 +0000

    CAUSEWAY-3676: factors out more into GqlvDomainObjectMeta
---
 .../graphql/model/domain/GqlvDomainObject.java     | 102 ++++--------------
 .../graphql/model/domain/GqlvDomainObjectMeta.java | 114 +++++++++++++++++++++
 .../integration/GraphQlSourceForCauseway.java      |  10 +-
 3 files changed, 137 insertions(+), 89 deletions(-)

diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
index cf814cda4f..8916e4d46f 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
@@ -21,7 +21,6 @@ import 
org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
-import org.apache.causeway.viewer.graphql.model.parts.GqlvMeta;
 import org.apache.causeway.viewer.graphql.model.types._Constants;
 import org.apache.causeway.viewer.graphql.model.util._LTN;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
@@ -35,7 +34,6 @@ import graphql.schema.GraphQLCodeRegistry;
 
 import lombok.Getter;
 import lombok.val;
-import lombok.experimental.UtilityClass;
 
 import graphql.Scalars;
 import graphql.schema.GraphQLArgument;
@@ -59,33 +57,13 @@ import static graphql.schema.GraphQLTypeReference.typeRef;
  */
 public class GqlvDomainObject {
 
-    private final GqlvDomainObjectMutators mutators;
-
-    @UtilityClass
-    static class Fields {
-        static GraphQLFieldDefinition id =
-                newFieldDefinition()
-                        .name("id")
-                        .type(nonNull(Scalars.GraphQLString))
-                        .build();
-        static GraphQLFieldDefinition logicalTypeName =
-                newFieldDefinition()
-                        .name("logicalTypeName")
-                        .type(nonNull(Scalars.GraphQLString))
-                        .build();
-        static GraphQLFieldDefinition version =
-                newFieldDefinition()
-                        .name("version")
-                        .type(Scalars.GraphQLString).build();
-    }
+    @Getter private final GqlvDomainObjectMeta meta;
+    @Getter private final GqlvDomainObjectMutators mutators;
 
     private final ObjectSpecification objectSpec;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final BookmarkService bookmarkService;
-    private final ObjectManager objectManager;
     private final SpecificationLoader specificationLoader;
 
-    @Getter private final GraphQLFieldDefinition metaField;
     @Getter private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     @Getter private final GraphQLInputObjectType gqlInputObjectType;
 
@@ -101,9 +79,6 @@ public class GqlvDomainObject {
         return objectSpec.getBeanSort();
     }
 
-    public GraphQLObjectType getMetaType() {
-        return (GraphQLObjectType) metaField.getType();
-    }
 
 
 
@@ -133,14 +108,11 @@ public class GqlvDomainObject {
             final SpecificationLoader specificationLoader) {
         this.objectSpec = objectSpec;
         this.codeRegistryBuilder = codeRegistryBuilder;
-        this.bookmarkService = bookmarkService;
-        this.objectManager = objectManager;
         this.specificationLoader = specificationLoader;
         this.gqlObjectTypeBuilder = 
newObject().name(getLogicalTypeNameSanitized());
 
-        // object type's meta field
-        metaField = 
newFieldDefinition().name("_gql_meta").type(metaType()).build();
-        gqlObjectTypeBuilder.field(metaField);
+        meta = new GqlvDomainObjectMeta(this, codeRegistryBuilder, 
bookmarkService, objectManager);
+        mutators = new GqlvDomainObjectMutators(this);
 
         // input object type
         String inputTypeName = GQL_INPUTTYPE_PREFIX + 
getLogicalTypeNameSanitized();
@@ -152,19 +124,12 @@ public class GqlvDomainObject {
                         .build());
         gqlInputObjectType = inputTypeBuilder.build();
 
-        mutators = new GqlvDomainObjectMutators(this);
+        // object type's meta field
+        gqlObjectTypeBuilder.field(meta.getMetaField());
+
     }
 
 
-    private GraphQLObjectType metaType() {
-        val metaTypeBuilder = newObject().name(getLogicalTypeNameSanitized() + 
"__DomainObject_meta");
-        metaTypeBuilder.field(Fields.id);
-        metaTypeBuilder.field(Fields.logicalTypeName);
-        if (getBeanSort() == BeanSort.ENTITY) {
-            metaTypeBuilder.field(Fields.version);
-        }
-        return metaTypeBuilder.build();
-    }
 
 
     public void addPropertiesAsFields() {
@@ -361,52 +326,19 @@ public class GqlvDomainObject {
 
     }
 
-    public void createAndRegisterDataFetchersForMetaData() {
-
-        codeRegistryBuilder.dataFetcher(
-                coordinates(getGqlObjectType(), getMetaField()),
-                (DataFetcher<Object>) environment -> {
-                    return bookmarkService.bookmarkFor(environment.getSource())
-                            .map(bookmark -> new GqlvMeta(bookmark, 
bookmarkService, objectManager))
-                            .orElse(null); //TODO: is this correct ?
-                });
-
-        codeRegistryBuilder.dataFetcher(
-                coordinates(getMetaType(), GqlvDomainObject.Fields.id),
-                (DataFetcher<Object>) environment -> {
-                    GqlvMeta gqlvMeta = environment.getSource();
-                    return gqlvMeta.id();
-                });
-
-        codeRegistryBuilder.dataFetcher(
-                coordinates(getMetaType(), 
GqlvDomainObject.Fields.logicalTypeName),
-                (DataFetcher<Object>) environment -> {
-                    GqlvMeta gqlvMeta = environment.getSource();
-                    return gqlvMeta.logicalTypeName();
-                });
-
-        if (getBeanSort() == BeanSort.ENTITY) {
-            codeRegistryBuilder.dataFetcher(
-                    coordinates(getMetaType(), 
GqlvDomainObject.Fields.version),
-                    (DataFetcher<Object>) environment -> {
-                        GqlvMeta gqlvMeta = environment.getSource();
-                        return gqlvMeta.version();
-                    });
-        }
-
+    public void addDataFetchersForMetaData() {
+        meta.addDataFetchers();
     }
 
-
-    public void createAndRegisterDataFetchersForField() {
-        
getProperties().forEach(this::createAndRegisterDataFetcherForAssociation);
+    public void addDataFetchersForProperties() {
+        getProperties().forEach(this::addDataFetcherForAssociation);
     }
 
-    public void createAndRegisterDataFetchersForCollection() {
-        getCollections().forEach(
-                this::createAndRegisterDataFetcherForAssociation);
+    public void addDataFetchersForCollections() {
+        getCollections().forEach(this::addDataFetcherForAssociation);
     }
 
-    private void createAndRegisterDataFetcherForAssociation(final 
GqlvAssociation<?> property) {
+    private void addDataFetcherForAssociation(final GqlvAssociation<?> 
property) {
 
         final ObjectAssociation association = property.getObjectMember();
         final GraphQLFieldDefinition field = property.getFieldDefinition();
@@ -443,9 +375,11 @@ public class GqlvDomainObject {
         }
     }
 
-    public void createAndRegisterDataFetchersForMutators() {
+    public void addDataFetchersForMutators() {
+
+        // TODO: something similar to addFetchers for safe actions, but 
applied to GqlvDomainObjectMutators instead; perhaps they share a common 
interface?
 
-        // something like:
+        // earlier code...
 
 //            
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(graphQLTypeReference,
 gql_mutations), new DataFetcher<Object>() {
 //                @Override
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java
new file mode 100644
index 0000000000..d5319ead92
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java
@@ -0,0 +1,114 @@
+package org.apache.causeway.viewer.graphql.model.domain;
+
+import graphql.Scalars;
+import graphql.schema.DataFetcher;
+import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLFieldDefinition;
+
+import graphql.schema.GraphQLObjectType;
+
+import lombok.Getter;
+import lombok.experimental.UtilityClass;
+import lombok.val;
+
+import org.apache.causeway.applib.services.bookmark.BookmarkService;
+import org.apache.causeway.applib.services.metamodel.BeanSort;
+import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvMeta;
+
+import static graphql.schema.FieldCoordinates.coordinates;
+import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
+import static graphql.schema.GraphQLNonNull.nonNull;
+import static graphql.schema.GraphQLObjectType.newObject;
+
+public class GqlvDomainObjectMeta {
+
+    @UtilityClass
+    static class Fields {
+        static GraphQLFieldDefinition id =
+                newFieldDefinition()
+                        .name("id")
+                        .type(nonNull(Scalars.GraphQLString))
+                        .build();
+        static GraphQLFieldDefinition logicalTypeName =
+                newFieldDefinition()
+                        .name("logicalTypeName")
+                        .type(nonNull(Scalars.GraphQLString))
+                        .build();
+        static GraphQLFieldDefinition version =
+                newFieldDefinition()
+                        .name("version")
+                        .type(Scalars.GraphQLString).build();
+    }
+
+    private final GqlvDomainObject domainObject;
+
+    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    private final BookmarkService bookmarkService;
+    private final ObjectManager objectManager;
+
+    @Getter private final GraphQLFieldDefinition metaField;
+
+    public GqlvDomainObjectMeta(
+            final GqlvDomainObject domainObject,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
+            final BookmarkService bookmarkService,
+            final ObjectManager objectManager
+    ) {
+        this.domainObject = domainObject;
+
+        this.codeRegistryBuilder = codeRegistryBuilder;
+        this.bookmarkService = bookmarkService;
+        this.objectManager = objectManager;
+
+        metaField = 
newFieldDefinition().name("_gql_meta").type(metaType()).build();
+    }
+
+    public GraphQLObjectType getMetaType() {
+        return (GraphQLObjectType) metaField.getType();
+    }
+
+    private GraphQLObjectType metaType() {
+        val metaTypeBuilder = 
newObject().name(domainObject.getLogicalTypeNameSanitized() + 
"__DomainObject_meta");
+        metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.id);
+        metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.logicalTypeName);
+        if (domainObject.getBeanSort() == BeanSort.ENTITY) {
+            metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.version);
+        }
+        return metaTypeBuilder.build();
+    }
+
+    public void addDataFetchers() {
+
+        codeRegistryBuilder.dataFetcher(
+                coordinates(domainObject.getGqlObjectType(), getMetaField()),
+                (DataFetcher<Object>) environment -> {
+                    return bookmarkService.bookmarkFor(environment.getSource())
+                            .map(bookmark -> new GqlvMeta(bookmark, 
bookmarkService, objectManager))
+                            .orElse(null); //TODO: is this correct ?
+                });
+
+        codeRegistryBuilder.dataFetcher(
+                coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.id),
+                (DataFetcher<Object>) environment -> {
+                    GqlvMeta gqlvMeta = environment.getSource();
+                    return gqlvMeta.id();
+                });
+
+        codeRegistryBuilder.dataFetcher(
+                coordinates(getMetaType(), 
GqlvDomainObjectMeta.Fields.logicalTypeName),
+                (DataFetcher<Object>) environment -> {
+                    GqlvMeta gqlvMeta = environment.getSource();
+                    return gqlvMeta.logicalTypeName();
+                });
+
+        if (domainObject.getBeanSort() == BeanSort.ENTITY) {
+            codeRegistryBuilder.dataFetcher(
+                    coordinates(getMetaType(), 
GqlvDomainObjectMeta.Fields.version),
+                    (DataFetcher<Object>) environment -> {
+                        GqlvMeta gqlvMeta = environment.getSource();
+                        return gqlvMeta.version();
+                    });
+        }
+    }
+}
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 4d5617f1f9..b5c803eab6 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
@@ -199,7 +199,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
 
         val gqlvDomainObject = new GqlvDomainObject(objectSpec, 
codeRegistryBuilder, bookmarkService, objectManager, specificationLoader);
 
-        
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getMetaField().getType());
+        
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getMeta().getMetaField().getType());
         
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getGqlInputObjectType());
 
         gqlvDomainObject.addPropertiesAsFields();
@@ -214,11 +214,11 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
         graphQLTypeRegistry.addTypeIfNotAlreadyPresent(graphQLObjectType);
 
         // create and register data fetchers
-        gqlvDomainObject.createAndRegisterDataFetchersForMetaData();
-        gqlvDomainObject.createAndRegisterDataFetchersForMutators();
+        gqlvDomainObject.addDataFetchersForMetaData();
+        gqlvDomainObject.addDataFetchersForMutators();
 
-        gqlvDomainObject.createAndRegisterDataFetchersForField();
-        gqlvDomainObject.createAndRegisterDataFetchersForCollection();
+        gqlvDomainObject.addDataFetchersForProperties();
+        gqlvDomainObject.addDataFetchersForCollections();
     }
 
 }

Reply via email to