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 4a5a68111c CAUSEWAY-3676: fleshing out GqlvServiceStructure (4)
4a5a68111c is described below
commit 4a5a68111c79237fca0475138c9f7bbbc191f5f9
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 17:04:35 2024 +0000
CAUSEWAY-3676: fleshing out GqlvServiceStructure (4)
---
.../viewer/source/GqlvServiceStructure.java | 85 ++++++++++++++++++++-
.../graphql/viewer/source/QueryFieldFactory.java | 86 +---------------------
2 files changed, 88 insertions(+), 83 deletions(-)
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 64a65ae39e..5f1bce25c5 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
@@ -1,10 +1,28 @@
package org.apache.causeway.viewer.graphql.viewer.source;
+import graphql.schema.DataFetcher;
+import graphql.schema.FieldCoordinates;
+import graphql.schema.GraphQLArgument;
+import graphql.schema.GraphQLCodeRegistry;
+import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLObjectType;
+import graphql.schema.GraphQLOutputType;
+
import lombok.Getter;
+import lombok.val;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+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;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
import static graphql.schema.GraphQLObjectType.newObject;
@@ -13,6 +31,7 @@ public class GqlvServiceStructure {
@Getter private final ObjectSpecification serviceSpec;
@Getter private final GqlvTopLevelQueryStructure topLevelQueryStructure;
+ private final SpecificationLoader specificationLoader;
private String getLogicalTypeName() {
return serviceSpec.getLogicalTypeName();
@@ -33,9 +52,14 @@ public class GqlvServiceStructure {
return gqlObjectTypeBuilder;
}
- public GqlvServiceStructure(ObjectSpecification serviceSpec,
GqlvTopLevelQueryStructure topLevelQueryStructure) {
+ public GqlvServiceStructure(
+ final ObjectSpecification serviceSpec,
+ final GqlvTopLevelQueryStructure topLevelQueryStructure,
+ final SpecificationLoader specificationLoader
+ ) {
this.serviceSpec = serviceSpec;
this.topLevelQueryStructure = topLevelQueryStructure;
+ this.specificationLoader = specificationLoader;
queryBuilder = topLevelQueryStructure.getQueryBuilder();
@@ -69,4 +93,63 @@ public class GqlvServiceStructure {
}
return gqlObjectType;
}
+
+ void addAction(
+ final ObjectAction objectAction) {
+
+ val serviceAsGraphQlType = getGraphQlTypeBuilder();
+
+ String fieldName = objectAction.getId();
+
+ GraphQLFieldDefinition.Builder builder = newFieldDefinition()
+ .name(fieldName)
+ .type((GraphQLOutputType)
TypeMapper.typeForObjectAction(objectAction));
+ if (objectAction.getParameters().isNotEmpty()) {
+ builder.arguments(objectAction.getParameters().stream()
+ .map(objectActionParameter -> GraphQLArgument.newArgument()
+ .name(objectActionParameter.getId())
+
.type(TypeMapper.inputTypeFor(objectActionParameter))
+ .build())
+ .collect(Collectors.toList()));
+ }
+ serviceAsGraphQlType
+ .field(builder
+ .build());
+ }
+
+ void addBehaviour(
+ final ObjectAction objectAction,
+ final GraphQLCodeRegistry.Builder codeRegistryBuilder,
QueryFieldFactory queryFieldFactory) {
+
+ final GraphQLObjectType graphQLObjectType = 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/QueryFieldFactory.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
index 283552786b..3dd52de77c 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
@@ -22,7 +22,6 @@ import static
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
import static graphql.schema.GraphQLObjectType.newObject;
import java.util.List;
-import java.util.Map;
import java.util.stream.Collectors;
import javax.inject.Inject;
@@ -30,25 +29,16 @@ import javax.inject.Inject;
import org.springframework.stereotype.Component;
import org.apache.causeway.applib.services.registry.ServiceRegistry;
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
import
org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
-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.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.specloader.SpecificationLoader;
import graphql.schema.DataFetcher;
-import graphql.schema.DataFetchingEnvironment;
import graphql.schema.FieldCoordinates;
-import graphql.schema.GraphQLArgument;
import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLObjectType;
-import graphql.schema.GraphQLOutputType;
+
import lombok.RequiredArgsConstructor;
import lombok.val;
@@ -76,7 +66,7 @@ public class QueryFieldFactory {
final GqlvTopLevelQueryStructure topLevelQueryStructure,
final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
- val gqlvServiceStructure = new GqlvServiceStructure(serviceSpec,
topLevelQueryStructure);
+ val gqlvServiceStructure = new GqlvServiceStructure(serviceSpec,
topLevelQueryStructure, specificationLoader);
List<ObjectAction> objectActionList =
serviceSpec.streamRuntimeActions(MixedIn.INCLUDED)
.map(ObjectAction.class::cast)
@@ -90,13 +80,11 @@ public class QueryFieldFactory {
val serviceAsGraphQlType =
gqlvServiceStructure.getGraphQlTypeBuilder();
objectActionList
- .forEach(objectAction -> {
- addAction(objectAction, gqlvServiceStructure);
- });
+ .forEach(gqlvServiceStructure::addAction);
objectActionList
.forEach(objectAction -> {
- addBehaviour(gqlvServiceStructure, objectAction,
codeRegistryBuilder);
+ gqlvServiceStructure.addBehaviour(objectAction,
codeRegistryBuilder, this);
});
gqlvServiceStructure.addTypeToTopLevelQuery();
@@ -111,70 +99,4 @@ public class QueryFieldFactory {
}
}
- private void addBehaviour(
- final GqlvServiceStructure gqlvServiceStructure,
- final ObjectAction objectAction,
- final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
-
- final GraphQLObjectType graphQLObjectType =
gqlvServiceStructure.getGqlObjectType();
-
- String fieldName = objectAction.getId();
- codeRegistryBuilder
- .dataFetcher(
- FieldCoordinates.coordinates(graphQLObjectType, fieldName),
- new DataFetcher<Object>() {
-
- @Override
- public Object get(final DataFetchingEnvironment
dataFetchingEnvironment) throws Exception {
-
- 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();
- }
-
- });
- }
-
- private void addAction(
- ObjectAction objectAction,
- GqlvServiceStructure gqlvServiceStructure) {
-
- val serviceAsGraphQlType =
gqlvServiceStructure.getGraphQlTypeBuilder();
-
- String fieldName = objectAction.getId();
-
- GraphQLFieldDefinition.Builder builder = newFieldDefinition()
- .name(fieldName)
- .type((GraphQLOutputType)
TypeMapper.typeForObjectAction(objectAction));
- if (objectAction.getParameters().isNotEmpty()) {
- builder.arguments(objectAction.getParameters().stream()
- .map(objectActionParameter -> GraphQLArgument.newArgument()
- .name(objectActionParameter.getId())
-
.type(TypeMapper.inputTypeFor(objectActionParameter))
- .build())
- .collect(Collectors.toList()));
- }
- serviceAsGraphQlType
- .field(builder
- .build());
- }
}