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 52dca972b8 CAUSEWAY-3676: wip on addActions, to move into 
GqlvObjectSpec (4)
52dca972b8 is described below

commit 52dca972b843c63b162986490dec3ab7a8f6b02f
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 13:09:29 2024 +0000

    CAUSEWAY-3676: wip on addActions, to move into GqlvObjectSpec (4)
---
 .../graphql/viewer/source/GqlvObjectSpec.java      | 117 +++++++++++++++------
 .../graphql/viewer/source/ObjectTypeFactory.java   |  40 +------
 2 files changed, 85 insertions(+), 72 deletions(-)

diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
index d4824b5585..94a8ffd11b 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
@@ -1,11 +1,13 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
 import graphql.Scalars;
+import graphql.schema.GraphQLArgument;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLInputObjectType;
 import graphql.schema.GraphQLList;
 import graphql.schema.GraphQLObjectType;
 
+import graphql.schema.GraphQLOutputType;
 import graphql.schema.GraphQLTypeReference;
 
 import lombok.Getter;
@@ -13,10 +15,14 @@ import lombok.val;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.causeway.applib.services.metamodel.BeanSort;
+import org.apache.causeway.commons.collections.Can;
 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.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 
@@ -51,8 +57,10 @@ public class GqlvObjectSpec {
         return (GraphQLObjectType) metaField.getType();
     }
 
+    String getMutatorsTypeName() {
+        return getLogicalTypeNameSanitized() + "__DomainObject_mutators";
+    }
 
-    final String mutatorsTypeName;
     final GraphQLObjectType.Builder mutatorsTypeBuilder;
     final List<GraphQLFieldDefinition> mutatorsTypeFields = new ArrayList<>();
 
@@ -79,11 +87,10 @@ public class GqlvObjectSpec {
                         .build());
         gqlInputObjectType = inputTypeBuilder.build();
 
-        mutatorsTypeName = getLogicalTypeNameSanitized() + 
"__DomainObject_mutators";
-        mutatorsTypeBuilder = newObject().name(mutatorsTypeName);
-
+        mutatorsTypeBuilder = newObject().name(getMutatorsTypeName());
     }
 
+
     private GraphQLObjectType metaType() {
         val metaTypeBuilder = newObject().name(getLogicalTypeNameSanitized() + 
"__DomainObject_meta");
         metaTypeBuilder.field(ObjectTypeFactory.Fields.id);
@@ -95,37 +102,26 @@ public class GqlvObjectSpec {
     }
 
 
-
     void addPropertiesAsFields() {
         objectSpec.streamProperties(MixedIn.INCLUDED)
-        .forEach(this::addSafeActionAsField);
-    }
-
-    public void addSafeActionAsField(GraphQLFieldDefinition fieldDefinition) {
-        getGqlObjectTypeBuilder().field(fieldDefinition);
-    }
-
-    public void addNonSafeActionAsMutatorField(GraphQLFieldDefinition 
fieldDefinition) {
-        mutatorsTypeBuilder.field(fieldDefinition);
-        mutatorsTypeFields.add(fieldDefinition);
+        .forEach(this::addPropertyAsField);
     }
 
-    private void addSafeActionAsField(OneToOneAssociation otoa) {
+    private void addPropertyAsField(final OneToOneAssociation otoa) {
         ObjectSpecification otoaObjectSpec = otoa.getElementType();
         switch (otoaObjectSpec.getBeanSort()) {
 
             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))));
+                        .name(otoa.getId())
+                        .type(otoa.isOptional()
+                                ? GraphQLTypeReference.typeRef(
+                                
_LogicalTypeName.sanitized(logicalTypeNameOfField))
+                                : nonNull(GraphQLTypeReference.typeRef(
+                                
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
                 getGqlObjectTypeBuilder().field(fieldBuilder);
 
                 break;
@@ -135,18 +131,18 @@ public class GqlvObjectSpec {
                 // todo: map ...
 
                 GraphQLFieldDefinition.Builder valueBuilder = 
newFieldDefinition()
-                    .name(otoa.getId())
-                    .type(otoa.isOptional()
-                            ? Scalars.GraphQLString
-                            : nonNull(Scalars.GraphQLString));
+                        .name(otoa.getId())
+                        .type(otoa.isOptional()
+                                ? Scalars.GraphQLString
+                                : nonNull(Scalars.GraphQLString));
                 getGqlObjectTypeBuilder().field(valueBuilder);
 
                 break;
-
         }
     }
 
-    void addCollections() {
+
+    void addCollectionsAsLists() {
         
objectSpec.streamCollections(MixedIn.INCLUDED).forEach(this::addCollection);
     }
 
@@ -160,21 +156,73 @@ public class GqlvObjectSpec {
             case ENTITY:
                 String logicalTypeNameOfField = 
elementType.getLogicalTypeName();
                 GraphQLFieldDefinition.Builder fieldBuilder = 
newFieldDefinition()
-                    .name(otom.getId())
-                    .type(GraphQLList.list(GraphQLTypeReference.typeRef(
-                            
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
+                        .name(otom.getId())
+                        .type(GraphQLList.list(GraphQLTypeReference.typeRef(
+                                
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
                 gqlObjectTypeBuilder.field(fieldBuilder);
                 break;
 
             case VALUE:
                 GraphQLFieldDefinition.Builder valueBuilder = 
newFieldDefinition()
-                    .name(otom.getId())
-                    
.type(GraphQLList.list(TypeMapper.typeFor(elementType.getCorrespondingClass())));
+                        .name(otom.getId())
+                        
.type(GraphQLList.list(TypeMapper.typeFor(elementType.getCorrespondingClass())));
                 gqlObjectTypeBuilder.field(valueBuilder);
                 break;
         }
     }
 
+
+
+    void addAction(final ObjectAction objectAction) {
+
+        val fieldName = objectAction.getId();
+        GraphQLFieldDefinition.Builder fieldBuilder = newFieldDefinition()
+                .name(fieldName)
+                .type((GraphQLOutputType) 
TypeMapper.typeForObjectAction(objectAction));
+        addGqlArguments(objectAction, fieldBuilder);
+        GraphQLFieldDefinition fieldDefinition = fieldBuilder.build();
+
+        if (objectAction.getSemantics().isSafeInNature()) {
+            addSafeActionAsField(fieldDefinition);
+        } else {
+            addNonSafeActionAsMutatorField(fieldDefinition);
+        }
+    }
+
+    private static void addGqlArguments(
+            final ObjectAction objectAction,
+            final GraphQLFieldDefinition.Builder builder) {
+
+        Can<ObjectActionParameter> parameters = objectAction.getParameters();
+
+        if (parameters.isNotEmpty()) {
+            builder.arguments(parameters.stream()
+                    .map(GqlvObjectSpec::gqlArgumentFor)
+                    .collect(Collectors.toList()));
+        }
+    }
+
+    private static GraphQLArgument gqlArgumentFor(final ObjectActionParameter 
objectActionParameter) {
+        return GraphQLArgument.newArgument()
+                .name(objectActionParameter.getId())
+                .type(objectActionParameter.isOptional()
+                        ? TypeMapper.inputTypeFor(objectActionParameter)
+                        : 
nonNull(TypeMapper.inputTypeFor(objectActionParameter)))
+                .build();
+    }
+
+
+    public void addSafeActionAsField(GraphQLFieldDefinition fieldDefinition) {
+        getGqlObjectTypeBuilder().field(fieldDefinition);
+    }
+
+    public void addNonSafeActionAsMutatorField(GraphQLFieldDefinition 
fieldDefinition) {
+        mutatorsTypeBuilder.field(fieldDefinition);
+        mutatorsTypeFields.add(fieldDefinition);
+    }
+
+
+
     /**
      * Should be called only after fields etc have been added.
      *
@@ -199,4 +247,5 @@ public class GqlvObjectSpec {
         return gqlObjectType;
     }
 
+
 }
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 b3404e13dc..d6412edcca 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
@@ -25,14 +25,11 @@ import static graphql.schema.GraphQLObjectType.newObject;
 
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
 import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
 
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
@@ -47,12 +44,10 @@ import 
org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import graphql.Scalars;
 import graphql.schema.DataFetcher;
 import graphql.schema.FieldCoordinates;
-import graphql.schema.GraphQLArgument;
 import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLInputType;
 import graphql.schema.GraphQLObjectType;
-import graphql.schema.GraphQLOutputType;
 import graphql.schema.GraphQLType;
 
 import lombok.AllArgsConstructor;
@@ -110,7 +105,7 @@ public class ObjectTypeFactory {
         gqlvObjectSpec.addPropertiesAsFields();
 
         // add collections
-        gqlvObjectSpec.addCollections();
+        gqlvObjectSpec.addCollectionsAsLists();
 
         // add actions
         MutatorsDataForEntity mutatorsDataForEntity = 
addActions(gqlvObjectSpec);
@@ -165,7 +160,7 @@ public class ObjectTypeFactory {
 
         gqlvObjectSpec.getObjectSpec().streamActions(ActionScope.PRODUCTION, 
MixedIn.INCLUDED)
                 .forEach(objectAction ->
-                        addAction(gqlvObjectSpec, objectAction)
+                        gqlvObjectSpec.addAction(objectAction)
                 );
 
         if (!gqlvObjectSpec.mutatorsTypeFields.isEmpty()){
@@ -208,37 +203,6 @@ public class ObjectTypeFactory {
     }
 
 
-    private static void addAction(
-            final GqlvObjectSpec gqlvObjectSpec, final ObjectAction 
objectAction) {
-
-        val fieldName = objectAction.getId();
-        GraphQLFieldDefinition.Builder builder = newFieldDefinition()
-                .name(fieldName)
-                .type((GraphQLOutputType) 
TypeMapper.typeForObjectAction(objectAction));
-        addArguments(objectAction, builder);
-        GraphQLFieldDefinition fieldDefinition = builder.build();
-
-        if (objectAction.getSemantics().isSafeInNature()) {
-
-            gqlvObjectSpec.addSafeActionAsField(fieldDefinition);
-
-        } else {
-            gqlvObjectSpec.addNonSafeActionAsMutatorField(fieldDefinition);
-        }
-    }
-
-    private static void addArguments(ObjectAction objectAction, 
GraphQLFieldDefinition.Builder builder) {
-        if (objectAction.getParameters().isNotEmpty()) {
-            builder.arguments(objectAction.getParameters().stream()
-                    .map(objectActionParameter -> GraphQLArgument.newArgument()
-                            .name(objectActionParameter.getId())
-                            .type(objectActionParameter.isOptional()
-                                    ? 
TypeMapper.inputTypeFor(objectActionParameter)
-                                    : 
nonNull(TypeMapper.inputTypeFor(objectActionParameter)))
-                            .build())
-                    .collect(Collectors.toList()));
-        }
-    }
 
     @Data
     @AllArgsConstructor

Reply via email to