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
commit c469e0501fd6160a661cebc4f0d44ad7236c6448 Author: danhaywood <[email protected]> AuthorDate: Sat Jan 20 17:45:27 2024 +0000 CAUSEWAY-3676: moves responsibility from GqlvDomainService --- .../viewer/graphql/model/domain/GqlvAction.java | 51 +++++++++++++++++++++- .../graphql/model/domain/GqlvAssociation.java | 7 +-- .../graphql/model/domain/GqlvCollection.java | 8 +--- .../graphql/model/domain/GqlvDomainObject.java | 8 ++-- .../graphql/model/domain/GqlvDomainService.java | 46 ------------------- .../viewer/graphql/model/domain/GqlvMember.java | 3 ++ .../viewer/graphql/model/domain/GqlvProperty.java | 5 +-- .../integration/GraphQlSourceForCauseway.java | 2 +- 8 files changed, 63 insertions(+), 67 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 5048fba08c..6549c53d61 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 @@ -1,10 +1,22 @@ package org.apache.causeway.viewer.graphql.model.domain; +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 graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; +import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; +import java.util.Map; + public class GqlvAction extends GqlvMember<ObjectAction, GqlvActionHolder> { public GqlvAction( @@ -12,11 +24,48 @@ public class GqlvAction extends GqlvMember<ObjectAction, GqlvActionHolder> { final ObjectAction objectAction, final GraphQLFieldDefinition fieldDefinition, final GraphQLCodeRegistry.Builder codeRegistryBuilder - ) { + ) { super(holder, objectAction, fieldDefinition, codeRegistryBuilder); } public ObjectAction getObjectAction() { return getObjectMember(); } + + public void addDataFetcher() { + + codeRegistryBuilder.dataFetcher( + FieldCoordinates.coordinates(getHolder().getGqlObjectType(), getFieldDefinition()), + this::invoke + ); + } + + private Object invoke( + final DataFetchingEnvironment dataFetchingEnvironment) { + final ObjectAction objectAction = getObjectAction(); + + 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/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java index 1e38e89de8..c8c08fdff9 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java @@ -15,18 +15,13 @@ import static graphql.schema.FieldCoordinates.coordinates; public abstract class GqlvAssociation<T extends ObjectAssociation, H extends GqlvAssociationHolder> extends GqlvMember<T, H> { - - private final SpecificationLoader specificationLoader; - public GqlvAssociation( final H holder, final T objectAssociation, final GraphQLFieldDefinition fieldDefinition, - final GraphQLCodeRegistry.Builder codeRegistryBuilder, - final SpecificationLoader specificationLoader + final GraphQLCodeRegistry.Builder codeRegistryBuilder ) { super(holder, objectAssociation, fieldDefinition, codeRegistryBuilder); - this.specificationLoader = specificationLoader; } /** diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java index edd22e2c1a..d8aa958b08 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java @@ -12,17 +12,13 @@ public class GqlvCollection extends GqlvAssociation<OneToManyAssociation, GqlvCo final GqlvCollectionHolder domainObject, final OneToManyAssociation oneToManyAssociation, final GraphQLFieldDefinition fieldDefinition, - final GraphQLCodeRegistry.Builder codeRegistryBuilder, - final SpecificationLoader specificationLoader + final GraphQLCodeRegistry.Builder codeRegistryBuilder ) { - super(domainObject, oneToManyAssociation, fieldDefinition, codeRegistryBuilder, specificationLoader); + super(domainObject, oneToManyAssociation, fieldDefinition, codeRegistryBuilder); } public OneToManyAssociation getOneToManyAssociation() { return getObjectAssociation(); } - public void addDataFetcher() { - - } } 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 9712762d5b..d673811f8d 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 @@ -169,7 +169,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G break; } if (fieldDefinition != null) { - properties.add(new GqlvProperty(this, otoa, fieldDefinition, codeRegistryBuilder, specificationLoader)); + properties.add(new GqlvProperty(this, otoa, fieldDefinition, codeRegistryBuilder)); } } @@ -204,7 +204,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G } if (fieldDefinition != null) { - collections.add(new GqlvCollection(this, otom, fieldDefinition, codeRegistryBuilder, specificationLoader)); + collections.add(new GqlvCollection(this, otom, fieldDefinition, codeRegistryBuilder)); } } @@ -329,11 +329,11 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G } public void addDataFetchersForProperties() { - getProperties().forEach(property -> property.addDataFetcher()); + getProperties().forEach(GqlvAssociation::addDataFetcher); } public void addDataFetchersForCollections() { - getCollections().forEach(collection -> collection.addDataFetcher()); + getCollections().forEach(GqlvCollection::addDataFetcher); } 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 ddbf1159fb..35a15d9b95 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 @@ -1,8 +1,5 @@ package org.apache.causeway.viewer.graphql.model.domain; -import graphql.schema.DataFetcher; -import graphql.schema.DataFetchingEnvironment; -import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLArgument; import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; @@ -15,16 +12,10 @@ import lombok.Getter; import java.util.ArrayList; import java.util.Collections; import java.util.List; -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.model.util._LTN; import org.apache.causeway.viewer.graphql.model.types.TypeMapper; @@ -125,42 +116,5 @@ public class GqlvDomainService implements GqlvActionHolder { } - public void addDataFetcher(final GqlvAction gqlvAction) { - GraphQLFieldDefinition fieldDefinition = gqlvAction.getFieldDefinition(); - - codeRegistryBuilder.dataFetcher( - FieldCoordinates.coordinates(getGqlObjectType(), fieldDefinition), - (DataFetcher<Object>) dataFetchingEnvironment -> invoke(gqlvAction, dataFetchingEnvironment) - ); - } - - private Object invoke( - final GqlvAction gqlvAction, - final DataFetchingEnvironment dataFetchingEnvironment) { - final ObjectAction objectAction = gqlvAction.getObjectAction(); - - 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/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java index ee0179dedf..3db8cf753c 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java @@ -1,6 +1,7 @@ package org.apache.causeway.viewer.graphql.model.domain; import org.apache.causeway.core.metamodel.spec.feature.ObjectMember; +import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; import graphql.schema.GraphQLCodeRegistry; @@ -14,6 +15,7 @@ public abstract class GqlvMember<T extends ObjectMember, H extends GqlvMemberHol @Getter private final T objectMember; @Getter private final GraphQLFieldDefinition fieldDefinition; final GraphQLCodeRegistry.Builder codeRegistryBuilder; + final SpecificationLoader specificationLoader; public GqlvMember( final H holder, @@ -25,6 +27,7 @@ public abstract class GqlvMember<T extends ObjectMember, H extends GqlvMemberHol this.objectMember = objectMember; this.fieldDefinition = fieldDefinition; this.codeRegistryBuilder = codeRegistryBuilder; + this.specificationLoader = objectMember.getSpecificationLoader(); } public String getId() { diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java index a58b926ada..c9e11c0be1 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java @@ -12,10 +12,9 @@ public class GqlvProperty extends GqlvAssociation<OneToOneAssociation, GqlvPrope final GqlvPropertyHolder domainObject, final OneToOneAssociation oneToOneAssociation, final GraphQLFieldDefinition fieldDefinition, - final GraphQLCodeRegistry.Builder codeRegistryBuilder, - final SpecificationLoader specificationLoader + final GraphQLCodeRegistry.Builder codeRegistryBuilder ) { - super(domainObject, oneToOneAssociation, fieldDefinition, codeRegistryBuilder, specificationLoader); + super(domainObject, oneToOneAssociation, fieldDefinition, codeRegistryBuilder); } public OneToOneAssociation getOneToOneAssociation() { 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 5693f6a8fa..dba564d034 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 @@ -186,7 +186,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { domainService.buildObjectGqlType(); - domainService.getSafeActions().forEach(domainService::addDataFetcher); + domainService.getSafeActions().forEach(gqlvAction -> gqlvAction.addDataFetcher()); topLevelQueryStructure.addFieldFor(domainService, codeRegistryBuilder); }
