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