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

Reply via email to