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 c53725963e CAUSEWAY-3676: moves functionality to ServiceBehaviour
c53725963e is described below
commit c53725963ec2771f082ae588b8ba7b2e6d4b0f96
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 17:54:15 2024 +0000
CAUSEWAY-3676: moves functionality to ServiceBehaviour
---
.../viewer/source/GqlvServiceBehaviour.java | 51 ++++++++++++++++++++++
.../viewer/source/GqlvServiceStructure.java | 41 +++--------------
.../graphql/viewer/source/QueryFieldFactory.java | 13 +++---
3 files changed, 64 insertions(+), 41 deletions(-)
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
index ce1ac9f176..942d7270ec 100644
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
+++
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceBehaviour.java
@@ -1,15 +1,66 @@
package org.apache.causeway.viewer.graphql.viewer.source;
+import graphql.schema.DataFetcher;
+import graphql.schema.FieldCoordinates;
import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLObjectType;
+
import lombok.RequiredArgsConstructor;
+import java.util.Map;
+
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import
org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead;
+import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+
@RequiredArgsConstructor
public class GqlvServiceBehaviour {
private final GqlvServiceStructure structure;
private final Object service;
+ private final SpecificationLoader specificationLoader;
private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+ public void addAction(
+ final ObjectAction objectAction,
+ final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
+
+ final GraphQLObjectType graphQLObjectType =
structure.getGqlObjectType();
+
+ String fieldName = objectAction.getId();
+ codeRegistryBuilder.dataFetcher(
+ FieldCoordinates.coordinates(graphQLObjectType, fieldName),
+ (DataFetcher<Object>) dataFetchingEnvironment -> {
+
+ Object domainObjectInstance =
dataFetchingEnvironment.getSource();
+
+ Class<?> domainObjectInstanceClass =
domainObjectInstance.getClass();
+ ObjectSpecification specification = specificationLoader
+ .loadSpecification(domainObjectInstanceClass);
+
+ ManagedObject owner =
ManagedObject.adaptSingular(specification, domainObjectInstance);
+
+ ActionInteractionHead actionInteractionHead =
objectAction.interactionHead(owner);
+
+ Map<String, Object> arguments =
dataFetchingEnvironment.getArguments();
+ Can<ObjectActionParameter> parameters =
objectAction.getParameters();
+ Can<ManagedObject> canOfParams = parameters
+ .map(oap -> {
+ Object argumentValue =
arguments.get(oap.getId());
+ return ManagedObject.adaptParameter(oap,
argumentValue);
+ });
+
+ ManagedObject managedObject = objectAction
+ .execute(actionInteractionHead, canOfParams,
InteractionInitiatedBy.USER);
+
+ return managedObject.getPojo();
+ });
+ }
}
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
index a24a714d39..4e5889c6b3 100644
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
+++
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvServiceStructure.java
@@ -143,43 +143,12 @@ public class GqlvServiceStructure {
.build())
.collect(Collectors.toList()));
}
- gqlObjectTypeBuilder.field(fieldBuilder.build());
- }
-
-
- void addBehaviour(
- final ObjectAction objectAction,
- final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
-
- final GraphQLObjectType graphQLObjectType = getGqlObjectType();
-
- String fieldName = objectAction.getId();
- codeRegistryBuilder.dataFetcher(
- FieldCoordinates.coordinates(graphQLObjectType, fieldName),
- (DataFetcher<Object>) dataFetchingEnvironment -> {
+ GraphQLFieldDefinition fieldDefinition = fieldBuilder.build();
+ gqlObjectTypeBuilder.field(fieldDefinition);
- Object domainObjectInstance =
dataFetchingEnvironment.getSource();
-
- Class<?> domainObjectInstanceClass =
domainObjectInstance.getClass();
- ObjectSpecification specification = specificationLoader
- .loadSpecification(domainObjectInstanceClass);
-
- ManagedObject owner =
ManagedObject.adaptSingular(specification, domainObjectInstance);
-
- ActionInteractionHead actionInteractionHead =
objectAction.interactionHead(owner);
-
- Map<String, Object> arguments =
dataFetchingEnvironment.getArguments();
- Can<ObjectActionParameter> parameters =
objectAction.getParameters();
- Can<ManagedObject> canOfParams = parameters
- .map(oap -> {
- Object argumentValue = arguments.get(oap.getId());
- return ManagedObject.adaptParameter(oap,
argumentValue);
- });
+ // TODO: either safe or mutator
+ safeActionToField.put(objectAction, fieldDefinition);
+ }
- ManagedObject managedObject = objectAction
- .execute(actionInteractionHead, canOfParams,
InteractionInitiatedBy.USER);
- return managedObject.getPojo();
- });
- }
}
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
index 2ac81d0693..630cbd0e52 100644
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
+++
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
@@ -67,7 +67,7 @@ public class QueryFieldFactory {
final GqlvTopLevelQueryStructure topLevelQueryStructure,
final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
- val gqlvServiceStructure = new GqlvServiceStructure(serviceSpec,
topLevelQueryStructure, specificationLoader);
+ val serviceStructure = new GqlvServiceStructure(serviceSpec,
topLevelQueryStructure, specificationLoader);
List<ObjectAction> objectActionList =
serviceSpec.streamRuntimeActions(MixedIn.INCLUDED)
.map(ObjectAction.class::cast)
@@ -77,15 +77,18 @@ public class QueryFieldFactory {
return;
}
- objectActionList.forEach(gqlvServiceStructure::addAction);
+ objectActionList.forEach(serviceStructure::addAction);
- gqlvServiceStructure.buildObjectGqlType();
+ serviceStructure.buildObjectGqlType();
- objectActionList.forEach(objectAction ->
gqlvServiceStructure.addBehaviour(objectAction, codeRegistryBuilder));
+ GqlvServiceBehaviour serviceBehaviour = new
GqlvServiceBehaviour(serviceStructure, service, specificationLoader,
codeRegistryBuilder);
- GraphQLFieldDefinition topLevelQueryField =
gqlvServiceStructure.addTopLevelQueryField();
+ objectActionList.forEach(objectAction ->
serviceBehaviour.addAction(objectAction, codeRegistryBuilder));
+
+ GraphQLFieldDefinition topLevelQueryField =
serviceStructure.addTopLevelQueryField();
codeRegistryBuilder.dataFetcher(
+ // TODO: it would be nice to make these typesafe...
FieldCoordinates.coordinates("Query",
topLevelQueryField.getName()),
(DataFetcher<Object>) environment -> service);
}