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 07a09e94c8bed5add214c520a7d236384e8e53f5 Author: danhaywood <[email protected]> AuthorDate: Thu Jan 25 19:35:28 2024 +0000 CAUSEWAY-3676: uses Evaluator for ActionInvoke also --- .../viewer/graphql/model/domain/Evaluator.java | 10 ++++- .../viewer/graphql/model/domain/GqlvAction.java | 48 ++++++++++++++++++++++ .../graphql/model/domain/GqlvActionInvoke.java | 46 ++++++++++----------- .../model/domain/GqlvActionParamDisabled.java | 29 +------------ .../model/domain/GqlvActionParamHidden.java | 8 +--- 5 files changed, 83 insertions(+), 58 deletions(-) diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Evaluator.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Evaluator.java index 2bc5f8d7ee..b6d2fa2e1a 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Evaluator.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Evaluator.java @@ -6,12 +6,18 @@ import org.apache.causeway.commons.collections.Can; import org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead; import org.apache.causeway.core.metamodel.object.ManagedObject; import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter; +import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature; +/** + * + * @param <T> + * @param <U> - either an {@link org.apache.causeway.core.metamodel.spec.feature.ObjectAction} or an {@link ObjectActionParameter}. + */ @RequiredArgsConstructor -abstract class Evaluator<T> { +abstract class Evaluator<T, U extends ObjectFeature> { private final T unexpected; - abstract T evaluate(ActionInteractionHead head, ObjectActionParameter objectActionParameter, Can<ManagedObject> argumentManagedObjects); + abstract T evaluate(ActionInteractionHead head, U objectFeature, Can<ManagedObject> argumentManagedObjects); public T unexpected() { return unexpected; 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 1f62e239aa..901f0c7268 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 @@ -25,6 +25,7 @@ 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.spec.feature.ObjectFeature; import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter; import org.apache.causeway.viewer.graphql.model.types.TypeMapper; import org.apache.causeway.viewer.graphql.model.util.TypeNames; @@ -156,6 +157,53 @@ public class GqlvAction .build(); } + static <T> T evaluate( + ObjectActionProvider holder, + Context context, + DataFetchingEnvironment dataFetchingEnvironment, + Evaluator<T, ObjectAction> evaluator) { + + val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment); + + val objectSpecification = context.specificationLoader.loadSpecification(sourcePojo.getClass()); + if (objectSpecification == null) { + return evaluator.unexpected(); + } + + val objectAction = holder.getObjectAction(); + val managedObject = ManagedObject.adaptSingular(objectSpecification, sourcePojo); + val actionInteractionHead = objectAction.interactionHead(managedObject); + + val argumentManagedObjects = GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, context.bookmarkService); + + return evaluator.evaluate(actionInteractionHead, objectAction, argumentManagedObjects); + } + + static <T> T evaluate( + ObjectActionParameterProvider holder, + Context context, + DataFetchingEnvironment dataFetchingEnvironment, + Evaluator<T, ObjectActionParameter> evaluator) { + + val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment); + + val sourcePojoClass = sourcePojo.getClass(); + val objectSpecification = context.specificationLoader.loadSpecification(sourcePojoClass); + if (objectSpecification == null) { + return evaluator.unexpected(); + } + + val objectAction = holder.getObjectAction(); + val managedObject = ManagedObject.adaptSingular(objectSpecification, sourcePojo); + val actionInteractionHead = objectAction.interactionHead(managedObject); + + val objectActionParameter = objectAction.getParameterById(holder.getObjectActionParameter().getId()); + + final Can<ManagedObject> argumentManagedObjects = argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, context.bookmarkService); + + return evaluator.evaluate(actionInteractionHead, objectActionParameter, argumentManagedObjects); + } + @Override public ObjectSpecification getObjectSpecification() { return holder.getObjectSpecification(); diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java index 666843f2cd..6193442a0d 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java @@ -20,6 +20,11 @@ package org.apache.causeway.viewer.graphql.model.domain; import org.apache.causeway.applib.services.bookmark.BookmarkService; +import org.apache.causeway.commons.collections.Can; +import org.apache.causeway.core.metamodel.consent.Consent; +import org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead; +import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter; + import org.springframework.lang.Nullable; import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy; @@ -130,39 +135,34 @@ public class GqlvActionInvoke { private Object invoke(final DataFetchingEnvironment dataFetchingEnvironment) { - final ObjectAction objectAction = holder.getObjectAction(); - val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment); + val evaluator = new Evaluator<Object, ObjectAction>(null) { + @Override + public Object evaluate(ActionInteractionHead head, ObjectAction objectAction, final Can<ManagedObject> argumentManagedObjects) { - val sourcePojoClass = sourcePojo.getClass(); - val specificationLoader = objectAction.getSpecificationLoader(); - val objectSpecification = specificationLoader.loadSpecification(sourcePojoClass); - if (objectSpecification == null) { - // not expected - return null; - } + // TODO: should also check visibility and usability + + val consent = objectAction.isArgumentSetValid(head, argumentManagedObjects, InteractionInitiatedBy.USER); + if (consent.isVetoed()) { + throw new IllegalArgumentException(consent.getReasonAsString().orElse("Invalid")); + } - val managedObject = ManagedObject.adaptSingular(objectSpecification, sourcePojo); - val actionInteractionHead = objectAction.interactionHead(managedObject); + val resultManagedObject = objectAction.execute(head, argumentManagedObjects, InteractionInitiatedBy.USER); - val argumentManagedObjects = GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, context.bookmarkService); + return resultManagedObject.getPojo(); - val consent = objectAction.isArgumentSetValid(actionInteractionHead, argumentManagedObjects, InteractionInitiatedBy.USER); - if (consent.isVetoed()) { - throw new IllegalArgumentException(consent.getReasonAsString().orElse("Invalid")); - } + } + }; - val resultManagedObject = objectAction - .execute(actionInteractionHead, argumentManagedObjects, InteractionInitiatedBy.USER); + return GqlvAction.evaluate(holder, context, dataFetchingEnvironment, evaluator); - return resultManagedObject.getPojo(); } - public interface Holder extends GqlvHolder { - - ObjectSpecification getObjectSpecification(); + public interface Holder + extends GqlvHolder, + ObjectSpecificationProvider, + ObjectActionProvider { - ObjectAction getObjectAction(); } } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java index 84dafb6e6e..6052c67ce4 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java @@ -23,8 +23,6 @@ import org.apache.causeway.core.metamodel.consent.Consent; 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.viewer.graphql.model.types.TypeMapper; @@ -71,38 +69,15 @@ public class GqlvActionParamDisabled { private String disabled( final DataFetchingEnvironment dataFetchingEnvironment) { - val evaluator = new Evaluator<>("Disabled") { - + val evaluator = new Evaluator<String, ObjectActionParameter>("Disabled") { @Override public String evaluate(ActionInteractionHead head, ObjectActionParameter objectActionParameter, final Can<ManagedObject> argumentManagedObjects) { Consent usable = objectActionParameter.isUsable(head, argumentManagedObjects, InteractionInitiatedBy.USER); return usable.isVetoed() ? usable.getReasonAsString().orElse("Disabled") : null; } - }; - return evaluate(holder, context, dataFetchingEnvironment, evaluator); - } - - static <T> T evaluate(ObjectActionParameterProvider holder, Context context, DataFetchingEnvironment dataFetchingEnvironment, Evaluator<T> evaluator) { - final ObjectAction objectAction = holder.getObjectAction(); - val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment); - - val sourcePojoClass = sourcePojo.getClass(); - val specificationLoader = objectAction.getSpecificationLoader(); - val objectSpecification = specificationLoader.loadSpecification(sourcePojoClass); - if (objectSpecification == null) { - return evaluator.unexpected(); - } - - val managedObject = ManagedObject.adaptSingular(objectSpecification, sourcePojo); - val actionInteractionHead = objectAction.interactionHead(managedObject); - - val objectActionParameter = objectAction.getParameterById(holder.getObjectActionParameter().getId()); - - final Can<ManagedObject> argumentManagedObjects = GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, context.bookmarkService); - - return evaluator.evaluate(actionInteractionHead, objectActionParameter, argumentManagedObjects); + return GqlvAction.evaluate(holder, context, dataFetchingEnvironment, evaluator); } public interface Holder diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java index 1a11538f8d..140676dd59 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java @@ -18,15 +18,12 @@ */ package org.apache.causeway.viewer.graphql.model.domain; -import org.apache.causeway.applib.services.bookmark.BookmarkService; import org.apache.causeway.commons.collections.Can; import org.apache.causeway.core.metamodel.consent.Consent; 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.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.types.TypeMapper; import static org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments; @@ -35,7 +32,6 @@ import lombok.val; import lombok.extern.log4j.Log4j2; import graphql.schema.DataFetchingEnvironment; -import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; @@ -71,7 +67,7 @@ public class GqlvActionParamHidden { private boolean hidden(final DataFetchingEnvironment dataFetchingEnvironment) { - val evaluator = new Evaluator<>(true) { + val evaluator = new Evaluator<Boolean, ObjectActionParameter>(true) { @Override public Boolean evaluate(ActionInteractionHead head, ObjectActionParameter objectActionParameter, final Can<ManagedObject> argumentManagedObjects) { @@ -80,7 +76,7 @@ public class GqlvActionParamHidden { } }; - return GqlvActionParamDisabled.evaluate(holder, context, dataFetchingEnvironment, evaluator); + return GqlvAction.evaluate(holder, context, dataFetchingEnvironment, evaluator); } public interface Holder
