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 2eb625faa2 CAUSEWAY-3676: combines GqlvObjectStructure and Behaviour
2eb625faa2 is described below

commit 2eb625faa2ef7495720a9e5de44879b5baf64969
Author: danhaywood <[email protected]>
AuthorDate: Sat Jan 20 10:17:57 2024 +0000

    CAUSEWAY-3676: combines GqlvObjectStructure and Behaviour
---
 .../graphql/viewer/source/GqlvObjectBehaviour.java | 159 ---------------------
 .../graphql/viewer/source/GqlvObjectStructure.java | 156 +++++++++++++++++++-
 .../graphql/viewer/source/ObjectTypeFactory.java   |  27 ++--
 3 files changed, 165 insertions(+), 177 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
deleted file mode 100644
index fe4a96e6e0..0000000000
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.apache.causeway.viewer.graphql.viewer.source;
-
-
-import java.util.Set;
-
-import org.apache.causeway.applib.services.bookmark.BookmarkService;
-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.ObjectAssociation;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
-import org.apache.causeway.viewer.graphql.model.parts.GqlvAssociation;
-import org.apache.causeway.viewer.graphql.model.parts.GqlvProperty;
-
-import lombok.RequiredArgsConstructor;
-
-import graphql.schema.DataFetcher;
-import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLObjectType;
-import graphql.schema.GraphQLType;
-
-import static graphql.schema.FieldCoordinates.coordinates;
-import static graphql.schema.GraphQLObjectType.newObject;
-
-@RequiredArgsConstructor
-public class GqlvObjectBehaviour {
-
-    private final GqlvObjectStructure structure;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final BookmarkService bookmarkService;
-    private final ObjectManager objectManager;
-    private final SpecificationLoader specificationLoader;
-
-
-    public void createAndRegisterDataFetchersForMetaData() {
-
-        codeRegistryBuilder.dataFetcher(
-                coordinates(structure.getGqlObjectType(), 
structure.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(structure.getMetaType(), 
GqlvObjectStructure.Fields.id),
-                (DataFetcher<Object>) environment -> {
-                    GqlvMeta gqlvMeta = environment.getSource();
-                    return gqlvMeta.id();
-                });
-
-        codeRegistryBuilder.dataFetcher(
-                coordinates(structure.getMetaType(), 
GqlvObjectStructure.Fields.logicalTypeName),
-                (DataFetcher<Object>) environment -> {
-                    GqlvMeta gqlvMeta = environment.getSource();
-                    return gqlvMeta.logicalTypeName();
-                });
-
-        if (structure.getBeanSort() == BeanSort.ENTITY) {
-            codeRegistryBuilder.dataFetcher(
-                    coordinates(structure.getMetaType(), 
GqlvObjectStructure.Fields.version),
-                    (DataFetcher<Object>) environment -> {
-                        GqlvMeta gqlvMeta = environment.getSource();
-                        return gqlvMeta.version();
-                    });
-        }
-
-    }
-
-
-    public void createAndRegisterDataFetchersForField() {
-        
structure.getProperties().forEach(this::createAndRegisterDataFetcherForAssociation);
-    }
-
-    void createAndRegisterDataFetchersForCollection() {
-        structure.getCollections().forEach(
-                this::createAndRegisterDataFetcherForAssociation);
-    }
-
-    private void createAndRegisterDataFetcherForAssociation(final 
GqlvAssociation<?> property) {
-
-        final ObjectAssociation association = property.getObjectMember();
-        final GraphQLFieldDefinition field = property.getFieldDefinition();
-
-        final GraphQLObjectType graphQLObjectType = 
structure.getGqlObjectType();
-
-        ObjectSpecification fieldObjectSpecification = 
association.getElementType();
-        BeanSort beanSort = fieldObjectSpecification.getBeanSort();
-        switch (beanSort) {
-
-            case VALUE: //TODO: does this work for values as well?
-
-            case VIEW_MODEL:
-
-            case ENTITY:
-
-                codeRegistryBuilder.dataFetcher(
-                    coordinates(graphQLObjectType, field),
-                    (DataFetcher<Object>) environment -> {
-
-                        Object domainObjectInstance = environment.getSource();
-
-                        Class<?> domainObjectInstanceClass = 
domainObjectInstance.getClass();
-                        ObjectSpecification specification = 
specificationLoader.loadSpecification(domainObjectInstanceClass);
-
-                        ManagedObject owner = 
ManagedObject.adaptSingular(specification, domainObjectInstance);
-                        ManagedObject managedObject = association.get(owner);
-
-                        return managedObject!=null ? managedObject.getPojo() : 
null;
-                    });
-
-                break;
-
-        }
-    }
-
-    public void createAndRegisterDataFetchersForMutators() {
-
-        // something like:
-
-//            
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(graphQLTypeReference,
 gql_mutations), new DataFetcher<Object>() {
-//                @Override
-//                public Object get(DataFetchingEnvironment environment) 
throws Exception {
-//
-//                    Bookmark bookmark = 
bookmarkService.bookmarkFor(environment.getSource()).orElse(null);
-//                    if (bookmark == null) return null; //TODO: is this 
correct ?
-//                    return new GqlvMutations(bookmark, bookmarkService, 
mutatorsTypeFields);
-//                }
-//            });
-//
-//            // for each field something like
-//            
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(mutatorsType, 
idField), new DataFetcher<Object>() {
-//                @Override
-//                public Object get(DataFetchingEnvironment environment) 
throws Exception {
-//
-//                    GqlvMeta gqlMeta = environment.getSource();
-//
-//                    return gqlMeta.id();
-//                }
-//            });
-
-
-    }
-
-
-    GraphQLObjectType createAndRegisterMutatorsType(
-            final Set<GraphQLType> graphQLObjectTypes) {
-
-        //TODO: this is not going to work, because we need to dynamically add 
fields
-        String mutatorsTypeName = structure.getLogicalTypeNameSanitized() + 
"__DomainObject_mutators";
-        GraphQLObjectType.Builder mutatorsTypeBuilder = 
newObject().name(mutatorsTypeName);
-        GraphQLObjectType mutatorsType = mutatorsTypeBuilder.build();
-        graphQLObjectTypes.add(mutatorsType);
-        return mutatorsType;
-    }
-
-}
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 37a08e28b6..dfc2780ea0 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
@@ -4,23 +4,35 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.applib.services.metamodel.BeanSort;
 import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
 import org.apache.causeway.core.metamodel.spec.ActionScope;
 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.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.GqlvAction;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvAssociation;
 import org.apache.causeway.viewer.graphql.model.parts.GqlvCollection;
 import org.apache.causeway.viewer.graphql.model.parts.GqlvProperty;
 
+import static graphql.schema.FieldCoordinates.coordinates;
+
 import static 
org.apache.causeway.viewer.graphql.viewer.source._Constants.GQL_INPUTTYPE_PREFIX;
 
+import graphql.schema.DataFetcher;
+import graphql.schema.GraphQLCodeRegistry;
+
 import lombok.Getter;
 import lombok.val;
 import lombok.experimental.UtilityClass;
@@ -65,7 +77,12 @@ public class GqlvObjectStructure {
                         .type(Scalars.GraphQLString).build();
     }
 
-    @Getter private final ObjectSpecification objectSpec;
+    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;
@@ -115,8 +132,18 @@ public class GqlvObjectStructure {
     @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
     private Optional<GraphQLObjectType> mutatorsTypeIfAny;
 
-    public GqlvObjectStructure(final ObjectSpecification objectSpec) {
+
+    public GqlvObjectStructure(
+            final ObjectSpecification objectSpec,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
+            final BookmarkService bookmarkService,
+            final ObjectManager objectManager,
+            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
@@ -336,7 +363,7 @@ public class GqlvObjectStructure {
 
     void addActionsAsFields() {
 
-        getObjectSpec().streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED)
+        objectSpec.streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED)
                 .forEach(this::addAction);
 
         Optional<GraphQLObjectType> mutatorsTypeIfAny = 
buildMutatorsTypeIfAny();
@@ -351,4 +378,127 @@ public class GqlvObjectStructure {
         });
 
     }
+
+    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(), GqlvObjectStructure.Fields.id),
+                (DataFetcher<Object>) environment -> {
+                    GqlvMeta gqlvMeta = environment.getSource();
+                    return gqlvMeta.id();
+                });
+
+        codeRegistryBuilder.dataFetcher(
+                coordinates(getMetaType(), 
GqlvObjectStructure.Fields.logicalTypeName),
+                (DataFetcher<Object>) environment -> {
+                    GqlvMeta gqlvMeta = environment.getSource();
+                    return gqlvMeta.logicalTypeName();
+                });
+
+        if (getBeanSort() == BeanSort.ENTITY) {
+            codeRegistryBuilder.dataFetcher(
+                    coordinates(getMetaType(), 
GqlvObjectStructure.Fields.version),
+                    (DataFetcher<Object>) environment -> {
+                        GqlvMeta gqlvMeta = environment.getSource();
+                        return gqlvMeta.version();
+                    });
+        }
+
+    }
+
+
+    public void createAndRegisterDataFetchersForField() {
+        
getProperties().forEach(this::createAndRegisterDataFetcherForAssociation);
+    }
+
+    void createAndRegisterDataFetchersForCollection() {
+        getCollections().forEach(
+                this::createAndRegisterDataFetcherForAssociation);
+    }
+
+    private void createAndRegisterDataFetcherForAssociation(final 
GqlvAssociation<?> property) {
+
+        final ObjectAssociation association = property.getObjectMember();
+        final GraphQLFieldDefinition field = property.getFieldDefinition();
+
+        final GraphQLObjectType graphQLObjectType = getGqlObjectType();
+
+        ObjectSpecification fieldObjectSpecification = 
association.getElementType();
+        BeanSort beanSort = fieldObjectSpecification.getBeanSort();
+        switch (beanSort) {
+
+            case VALUE: //TODO: does this work for values as well?
+
+            case VIEW_MODEL:
+
+            case ENTITY:
+
+                codeRegistryBuilder.dataFetcher(
+                        coordinates(graphQLObjectType, field),
+                        (DataFetcher<Object>) environment -> {
+
+                            Object domainObjectInstance = 
environment.getSource();
+
+                            Class<?> domainObjectInstanceClass = 
domainObjectInstance.getClass();
+                            ObjectSpecification specification = 
specificationLoader.loadSpecification(domainObjectInstanceClass);
+
+                            ManagedObject owner = 
ManagedObject.adaptSingular(specification, domainObjectInstance);
+                            ManagedObject managedObject = 
association.get(owner);
+
+                            return managedObject!=null ? 
managedObject.getPojo() : null;
+                        });
+
+                break;
+
+        }
+    }
+
+    public void createAndRegisterDataFetchersForMutators() {
+
+        // something like:
+
+//            
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(graphQLTypeReference,
 gql_mutations), new DataFetcher<Object>() {
+//                @Override
+//                public Object get(DataFetchingEnvironment environment) 
throws Exception {
+//
+//                    Bookmark bookmark = 
bookmarkService.bookmarkFor(environment.getSource()).orElse(null);
+//                    if (bookmark == null) return null; //TODO: is this 
correct ?
+//                    return new GqlvMutations(bookmark, bookmarkService, 
mutatorsTypeFields);
+//                }
+//            });
+//
+//            // for each field something like
+//            
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(mutatorsType, 
idField), new DataFetcher<Object>() {
+//                @Override
+//                public Object get(DataFetchingEnvironment environment) 
throws Exception {
+//
+//                    GqlvMeta gqlMeta = environment.getSource();
+//
+//                    return gqlMeta.id();
+//                }
+//            });
+
+
+    }
+
+
+    GraphQLObjectType createAndRegisterMutatorsType(
+            final Set<GraphQLType> graphQLObjectTypes) {
+
+        //TODO: this is not going to work, because we need to dynamically add 
fields
+        String mutatorsTypeName = getLogicalTypeNameSanitized() + 
"__DomainObject_mutators";
+        GraphQLObjectType.Builder mutatorsTypeBuilder = 
newObject().name(mutatorsTypeName);
+        GraphQLObjectType mutatorsType = mutatorsTypeBuilder.build();
+        graphQLObjectTypes.add(mutatorsType);
+        return mutatorsType;
+    }
+
 }
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 642571b749..5153368ecd 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
@@ -53,31 +53,28 @@ public class ObjectTypeFactory {
             final ObjectSpecification objectSpec,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        val gqlvObjectStructure = new GqlvObjectStructure(objectSpec);
+        val gqlvDomainObject = new GqlvObjectStructure(objectSpec, 
codeRegistryBuilder, bookmarkService, objectManager, specificationLoader);
 
-        
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvObjectStructure.getMetaField().getType());
-        
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvObjectStructure.getGqlInputObjectType());
+        
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getMetaField().getType());
+        
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getGqlInputObjectType());
 
-        gqlvObjectStructure.addPropertiesAsFields();
-        gqlvObjectStructure.addCollectionsAsLists();
-        gqlvObjectStructure.addActionsAsFields();
+        gqlvDomainObject.addPropertiesAsFields();
+        gqlvDomainObject.addCollectionsAsLists();
+        gqlvDomainObject.addActionsAsFields();
 
-        gqlvObjectStructure.getMutatorsTypeIfAny()
+        gqlvDomainObject.getMutatorsTypeIfAny()
                 .ifPresent(graphQLTypeRegistry::addTypeIfNotAlreadyPresent);
 
         // build and register object type
-        GraphQLObjectType graphQLObjectType = 
gqlvObjectStructure.buildGqlObjectType();
+        GraphQLObjectType graphQLObjectType = 
gqlvDomainObject.buildGqlObjectType();
         graphQLTypeRegistry.addTypeIfNotAlreadyPresent(graphQLObjectType);
 
-        GqlvObjectBehaviour gqlvObjectBehaviour =
-                new GqlvObjectBehaviour(gqlvObjectStructure, 
codeRegistryBuilder, bookmarkService, objectManager, specificationLoader);
-
         // create and register data fetchers
-        gqlvObjectBehaviour.createAndRegisterDataFetchersForMetaData();
-        gqlvObjectBehaviour.createAndRegisterDataFetchersForMutators();
+        gqlvDomainObject.createAndRegisterDataFetchersForMetaData();
+        gqlvDomainObject.createAndRegisterDataFetchersForMutators();
 
-        gqlvObjectBehaviour.createAndRegisterDataFetchersForField();
-        gqlvObjectBehaviour.createAndRegisterDataFetchersForCollection();
+        gqlvDomainObject.createAndRegisterDataFetchersForField();
+        gqlvDomainObject.createAndRegisterDataFetchersForCollection();
     }
 
 }

Reply via email to