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 c66cea4ad8 CAUSEWAY-3676: still working on supporting mutators type in 
Domain ObjectService
c66cea4ad8 is described below

commit c66cea4ad877b2ae98928f054e8f06d9a4850baf
Author: danhaywood <[email protected]>
AuthorDate: Sun Jan 21 13:21:04 2024 +0000

    CAUSEWAY-3676: still working on supporting mutators type in Domain 
ObjectService
---
 .../viewer/graphql/model/domain/GqlvAction.java    |  1 -
 .../graphql/model/domain/GqlvDomainObject.java     | 48 +++++++-----
 .../graphql/model/domain/GqlvDomainService.java    | 90 +++++++++++++---------
 .../viewer/graphql/model/domain/GqlvMutators.java  |  4 +
 .../model/registry/GraphQLTypeRegistry.java        |  4 +-
 .../CausewayModuleIncViewerGraphqlViewer.java      |  9 +++
 .../integration/GraphQlSourceForCauseway.java      | 13 +++-
 .../viewer/src/test/resources/application-test.yml |  4 +
 8 files changed, 112 insertions(+), 61 deletions(-)

diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
index 7b3811658b..91a7737288 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
@@ -58,7 +58,6 @@ public class GqlvAction extends GqlvMember<ObjectAction, 
GqlvActionHolder> {
     }
 
     public void addDataFetcher() {
-
         codeRegistryBuilder.dataFetcher(
                 FieldCoordinates.coordinates(getHolder().getGqlObjectType(), 
getFieldDefinition()),
                 this::invoke
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 48f4ec8dec..de03dcccc6 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
@@ -5,6 +5,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.applib.services.metamodel.BeanSort;
@@ -33,6 +34,8 @@ import graphql.schema.GraphQLObjectType;
 import graphql.schema.GraphQLType;
 import graphql.schema.GraphQLTypeReference;
 
+import lombok.val;
+
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLInputObjectField.newInputObjectField;
 import static graphql.schema.GraphQLInputObjectType.newInputObject;
@@ -103,12 +106,9 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
                         .type(nonNull(Scalars.GraphQLID))
                         .build());
         gqlInputObjectType = inputTypeBuilder.build();
-
     }
 
 
-
-
     public void addPropertiesAsFields() {
         
objectSpecification.streamProperties(MixedIn.INCLUDED).forEach(this::addPropertyAsField);
     }
@@ -187,7 +187,29 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
         }
     }
 
+    /**
+     * @return <code>true</code> if any (at least one) actions were added
+     */
+    public boolean addActions() {
+
+        val anyActions = new AtomicBoolean(false);
+        objectSpecification.streamActions(ActionScope.PRODUCTION, 
MixedIn.INCLUDED)
+                .forEach(objectAction -> {
+                    anyActions.set(true);
+                    addAction(objectAction);
+                });
+
+        Optional<GraphQLObjectType> mutatorsTypeIfAny = 
buildMutatorsTypeIfAny();
+        mutatorsTypeIfAny.ifPresent(mutatorsType -> {
+            GraphQLFieldDefinition gql_mutations = newFieldDefinition()
+                    .name(_Constants.GQL_MUTATIONS_FIELDNAME)
+                    .type(mutatorsType)
+                    .build();
+            objectTypeBuilder.field(gql_mutations);
+        });
 
+        return anyActions.get();
+    }
 
     void addAction(final ObjectAction objectAction) {
         if (objectAction.getSemantics().isSafeInNature()) {
@@ -236,23 +258,6 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
         return mutators.buildMutatorsTypeIfAny();
     }
 
-    public void addActions() {
-
-        objectSpecification.streamActions(ActionScope.PRODUCTION, 
MixedIn.INCLUDED)
-                .forEach(this::addAction);
-
-        Optional<GraphQLObjectType> mutatorsTypeIfAny = 
buildMutatorsTypeIfAny();
-        mutatorsTypeIfAny.ifPresent(mutatorsType -> {
-
-            GraphQLFieldDefinition gql_mutations = newFieldDefinition()
-                    .name(_Constants.GQL_MUTATIONS_FIELDNAME)
-                    .type(mutatorsType)
-                    .build();
-            objectTypeBuilder.field(gql_mutations);
-
-        });
-
-    }
 
     public void addDataFetchersForMetaData() {
         meta.addDataFetchers();
@@ -266,6 +271,9 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
         getCollections().forEach(GqlvCollection::addDataFetcher);
     }
 
+    public void addDataFetchersForSafeActions() {
+        getSafeActions().forEach(GqlvAction::addDataFetcher);
+    }
 
     public void addDataFetchersForMutators() {
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
index 2e6654a925..2a4a0d4e65 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 import org.apache.causeway.core.metamodel.spec.ActionScope;
@@ -20,6 +21,8 @@ import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 
+import lombok.val;
+
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
@@ -66,8 +69,44 @@ public class GqlvDomainService implements GqlvActionHolder, 
GqlvMutatorsHolder {
 
     }
 
+    /**
+     * @return <code>true</code> if any (at least one) actions were added
+     */
+    public boolean addActions() {
+
+        val anyActions = new AtomicBoolean(false);
+        objectSpecification.streamActions(ActionScope.PRODUCTION, 
MixedIn.INCLUDED)
+                .forEach(objectAction -> {
+                    anyActions.set(true);
+                    addAction(objectAction);
+                });
+
+        Optional<GraphQLObjectType> mutatorsTypeIfAny = 
buildMutatorsTypeIfAny();
+        mutatorsTypeIfAny.ifPresent(mutatorsType -> {
+            GraphQLFieldDefinition gql_mutations = newFieldDefinition()
+                    .name(_Constants.GQL_MUTATIONS_FIELDNAME)
+                    .type(mutatorsType)
+                    .build();
+            objectTypeBuilder.field(gql_mutations);
+        });
+
+        return anyActions.get();
+    }
+
+    void addAction(final ObjectAction objectAction) {
+        if (objectAction.getSemantics().isSafeInNature()) {
+            safeActions.add(new GqlvAction(this, objectAction, 
objectTypeBuilder, codeRegistryBuilder));
+        } else {
+             // TODO: should register with mutators instead ...
+//            mutators.addAction(objectAction);
+            safeActions.add(new GqlvAction(this, objectAction, 
objectTypeBuilder, codeRegistryBuilder));
+        }
+    }
+
 
     /**
+     * Should be called only after fields etc have been added.
+     *
      * @see #getGqlObjectType()
      */
     public GraphQLObjectType buildGqlObjectType() {
@@ -88,49 +127,30 @@ public class GqlvDomainService implements 
GqlvActionHolder, GqlvMutatorsHolder {
         return gqlObjectType;
     }
 
-    public GraphQLFieldDefinition createTopLevelQueryField() {
-        return newFieldDefinition()
-                .name(TypeNames.objectTypeNameFor(objectSpecification))
-                .type(objectTypeBuilder)
-                .build();
-    }
-
 
-    public void addAction(final ObjectAction objectAction) {
-        if (objectAction.getSemantics().isSafeInNature()) {
-            safeActions.add(new GqlvAction(this, objectAction, 
objectTypeBuilder, codeRegistryBuilder));
-        } else {
-            // TODO: should register with mutators instead ...
-//            mutators.addAction(objectAction);
-            safeActions.add(new GqlvAction(this, objectAction, 
objectTypeBuilder, codeRegistryBuilder));
-        }
+    /**
+     * @see #buildMutatorsTypeIfAny()
+     */
+    public Optional<GraphQLObjectType> getMutatorsTypeIfAny() {
+        return mutators.getMutatorsTypeIfAny();
     }
 
+    /**
+     * @see #getMutatorsTypeIfAny()
+     */
     public Optional<GraphQLObjectType> buildMutatorsTypeIfAny() {
         return mutators.buildMutatorsTypeIfAny();
     }
 
-    /**
-     * @return <code>true</code> if any (at least one) actions were added
-     */
-    public boolean addActions() {
-
-        List<ObjectAction> objectActionList = 
objectSpecification.streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED)
-                .collect(Collectors.toList());
 
-        objectActionList.forEach(this::addAction);
+    public GraphQLFieldDefinition createTopLevelQueryField() {
+        return newFieldDefinition()
+                .name(TypeNames.objectTypeNameFor(objectSpecification))
+                .type(objectTypeBuilder)
+                .build();
+    }
 
-        Optional<GraphQLObjectType> mutatorsTypeIfAny = 
buildMutatorsTypeIfAny();
-        mutatorsTypeIfAny.ifPresent(mutatorsType -> {
-            GraphQLFieldDefinition gql_mutations = newFieldDefinition()
-                    .name(_Constants.GQL_MUTATIONS_FIELDNAME)
-                    .type(mutatorsType)
-                    .build();
-            objectTypeBuilder.field(gql_mutations);
-        });
 
-        return !objectActionList.isEmpty();
-    }
 
     public void registerTypesInto(GraphQLTypeRegistry graphQLTypeRegistry) {
 
@@ -140,8 +160,4 @@ public class GqlvDomainService implements GqlvActionHolder, 
GqlvMutatorsHolder {
         
getMutatorsTypeIfAny().ifPresent(graphQLTypeRegistry::addTypeIfNotAlreadyPresent);
     }
 
-    public Optional<GraphQLObjectType> getMutatorsTypeIfAny() {
-        return mutators.getMutatorsTypeIfAny();
-    }
-
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java
index a940286da6..e907ee6481 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java
@@ -87,4 +87,8 @@ public class GqlvMutators implements GqlvActionHolder {
     public GraphQLObjectType getGqlObjectType() {
         return mutatorsTypeIfAny.orElse(null);
     }
+
+    public void addDataFetchersForActions() {
+        // TODO
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/registry/GraphQLTypeRegistry.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/registry/GraphQLTypeRegistry.java
index 249b14802f..9593ec5435 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/registry/GraphQLTypeRegistry.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/registry/GraphQLTypeRegistry.java
@@ -67,7 +67,7 @@ public class GraphQLTypeRegistry {
     void addTypeIfNotAlreadyPresent(final GraphQLObjectType typeToAdd){
         if (isPresent(typeToAdd, GraphQLObjectType.class)){
             // For now we just log and skip
-            log.info("GraphQLObjectType for {} already present", 
typeToAdd.getName());
+            log.debug("GraphQLObjectType for {} already present", 
typeToAdd.getName());
             return;
         }
         add(typeToAdd);
@@ -77,7 +77,7 @@ public class GraphQLTypeRegistry {
     void addTypeIfNotAlreadyPresent(final GraphQLInputObjectType typeToAdd) {
         if (isPresent(typeToAdd, GraphQLInputObjectType.class)){
             // For now we just log and skip
-            log.info("GraphQLInputObjectType for {} already present", 
typeToAdd.getName());
+            log.debug("GraphQLInputObjectType for {} already present", 
typeToAdd.getName());
             return;
         }
         add(typeToAdd);
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/CausewayModuleIncViewerGraphqlViewer.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/CausewayModuleIncViewerGraphqlViewer.java
index 69148af5ba..9703764508 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/CausewayModuleIncViewerGraphqlViewer.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/CausewayModuleIncViewerGraphqlViewer.java
@@ -18,6 +18,13 @@
  */
 package org.apache.causeway.viewer.graphql.viewer;
 
+import graphql.ExceptionWhileDataFetching;
+import graphql.GraphQLError;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.graphql.GraphQlAutoConfiguration;
 import org.springframework.boot.autoconfigure.graphql.GraphQlCorsProperties;
@@ -55,5 +62,7 @@ public class CausewayModuleIncViewerGraphqlViewer {
     public BatchLoaderRegistry batchLoaderRegistry() {
         return new DefaultBatchLoaderRegistry();
     }
+
+
 }
 
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 f26ff4d2a6..758300911b 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
@@ -49,6 +49,10 @@ import 
org.apache.causeway.core.config.metamodel.specloader.IntrospectionMode;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 
 import graphql.GraphQL;
+import graphql.execution.DataFetcherExceptionHandler;
+import graphql.execution.DataFetcherExceptionHandlerParameters;
+import graphql.execution.DataFetcherExceptionHandlerResult;
+import graphql.execution.instrumentation.tracing.TracingInstrumentation;
 import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLSchema;
 
@@ -80,6 +84,12 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
     public GraphQL graphQl() {
         return GraphQL.newGraphQL(schema())
 //                .instrumentation(new TracingInstrumentation())
+                .defaultDataFetcherExceptionHandler(new 
DataFetcherExceptionHandler() {
+                    @Override
+                    public DataFetcherExceptionHandlerResult 
onException(DataFetcherExceptionHandlerParameters handlerParameters) {
+                        return 
DataFetcherExceptionHandler.super.onException(handlerParameters);
+                    }
+                })
                 .queryExecutionStrategy(executionStrategy)
                 .build();
     }
@@ -198,10 +208,11 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
 
         // create and register data fetchers
         gqlvDomainObject.addDataFetchersForMetaData();
-        gqlvDomainObject.addDataFetchersForMutators();
 
         gqlvDomainObject.addDataFetchersForProperties();
         gqlvDomainObject.addDataFetchersForCollections();
+        gqlvDomainObject.addDataFetchersForSafeActions();
+        gqlvDomainObject.getMutators().addDataFetchersForActions();
     }
 
 }
diff --git 
a/incubator/viewers/graphql/viewer/src/test/resources/application-test.yml 
b/incubator/viewers/graphql/viewer/src/test/resources/application-test.yml
index d1eea1f9ff..bd7971342e 100644
--- a/incubator/viewers/graphql/viewer/src/test/resources/application-test.yml
+++ b/incubator/viewers/graphql/viewer/src/test/resources/application-test.yml
@@ -2,3 +2,7 @@ causeway:
   persistence:
     schema:
       auto-create-schemas: "demo"
+
+server:
+  error:
+    include-stacktrace: always
\ No newline at end of file

Reply via email to