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 0838875ab8 CAUSEWAY-3676: simplifies
0838875ab8 is described below
commit 0838875ab8911fc1aff0fe7afaf7b59c4bb93c6b
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 17:45:30 2024 +0000
CAUSEWAY-3676: simplifies
---
.../viewer/source/GqlvServiceStructure.java | 74 +++++++++++++++++-----
.../graphql/viewer/source/QueryFieldFactory.java | 62 +-----------------
2 files changed, 61 insertions(+), 75 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 126f1a2817..a24a714d39 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,6 +1,10 @@
package org.apache.causeway.viewer.graphql.viewer.source;
+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;
@@ -12,8 +16,14 @@ 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 org.apache.causeway.viewer.graphql.viewer.util._BiMap;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
@@ -23,6 +33,7 @@ public class GqlvServiceStructure {
@Getter private final ObjectSpecification serviceSpec;
@Getter private final GqlvTopLevelQueryStructure topLevelQueryStructure;
+ private final SpecificationLoader specificationLoader;
private GraphQLFieldDefinition topLevelQueryField;
@@ -35,24 +46,23 @@ public class GqlvServiceStructure {
return _LTN.sanitized(serviceSpec);
}
+ private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
private final GraphQLObjectType.Builder queryBuilder;
- private GraphQLObjectType.Builder gqlObjectTypeBuilder;
-
private GraphQLObjectType gqlObjectType;
- // TODO - don't expose
- public GraphQLObjectType.Builder getGraphQlTypeBuilder() {
- 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;
- queryBuilder = topLevelQueryStructure.getQueryBuilder();
+ this.gqlObjectTypeBuilder =
newObject().name(_LTN.sanitized(serviceSpec));
- gqlObjectTypeBuilder = newObject().name(_LTN.sanitized(serviceSpec));
+ this.queryBuilder = topLevelQueryStructure.getQueryBuilder();
+ this.specificationLoader = specificationLoader;
}
@@ -69,7 +79,6 @@ public class GqlvServiceStructure {
}
-
/**
* @see #getGqlObjectType()
*/
@@ -101,7 +110,7 @@ public class GqlvServiceStructure {
}
topLevelQueryField = newFieldDefinition()
.name(_LTN.sanitized(serviceSpec))
- .type(getGraphQlTypeBuilder())
+ .type(gqlObjectTypeBuilder)
.build();
queryBuilder.field(topLevelQueryField);
return topLevelQueryField;
@@ -121,8 +130,6 @@ public class GqlvServiceStructure {
void addAction(final ObjectAction objectAction) {
- val serviceAsGraphQlType = getGraphQlTypeBuilder();
-
String fieldName = objectAction.getId();
GraphQLFieldDefinition.Builder fieldBuilder = newFieldDefinition()
@@ -136,6 +143,43 @@ public class GqlvServiceStructure {
.build())
.collect(Collectors.toList()));
}
- serviceAsGraphQlType.field(fieldBuilder.build());
+ 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 -> {
+
+ 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 edb9c3b227..2ac81d0693 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,23 +29,15 @@ 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.GraphQLCodeRegistry;
import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLObjectType;
import lombok.RequiredArgsConstructor;
import lombok.val;
@@ -76,27 +67,21 @@ 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)
- .filter((final ObjectAction x) ->
x.containsFacet(ActionSemanticsFacet.class))
.collect(Collectors.toList());
if (objectActionList.isEmpty()) {
return;
}
- val serviceAsGraphQlType =
gqlvServiceStructure.getGraphQlTypeBuilder();
-
objectActionList.forEach(gqlvServiceStructure::addAction);
gqlvServiceStructure.buildObjectGqlType();
- objectActionList
- .forEach(objectAction -> {
- addBehaviour(gqlvServiceStructure, objectAction,
codeRegistryBuilder);
- });
+ objectActionList.forEach(objectAction ->
gqlvServiceStructure.addBehaviour(objectAction, codeRegistryBuilder));
GraphQLFieldDefinition topLevelQueryField =
gqlvServiceStructure.addTopLevelQueryField();
@@ -105,47 +90,4 @@ public class QueryFieldFactory {
(DataFetcher<Object>) environment -> service);
}
- 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();
- }
-
- });
- }
-
}