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 8cfc3a47fedda60370d4ac5e7e3c96e7f069079e
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 26 06:38:51 2024 +0000

    CAUSEWAY-3676: sketches param choices
---
 .../graphql/model/domain/GqlvActionInvoke.java     |  21 ++--
 .../graphql/model/domain/GqlvActionParam.java      |  22 +++-
 .../model/domain/GqlvActionParamChoices.java       | 121 +++++++++++++++++++++
 .../model/domain/GqlvActionParamDisabled.java      |   7 +-
 .../model/domain/GqlvActionParamHidden.java        |   7 +-
 .../model/domain/GqlvActionParamValidate.java      |   7 +-
 .../graphql/model/domain/GqlvActionParams.java     |  12 +-
 .../graphql/model/domain/GqlvPropertySet.java      |   2 -
 .../graphql/model/domain/GqlvPropertyValidate.java |   1 -
 .../test/e2e/Schema_IntegTest.schema.approved.json |  54 +++++++++
 .../graphql/test/src/test/resources/schema.gql     |   3 +
 11 files changed, 219 insertions(+), 38 deletions(-)

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 59e1ee51c2..20d0a7da09 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
@@ -108,11 +108,11 @@ public class GqlvActionInvoke {
                     log.warn("Unable to locate TypeOfFacet for {}", 
objectAction.getFeatureIdentifier().getFullIdentityString());
                     return null;
                 }
-                ObjectSpecification 
objectSpecificationForElementWhenCollection = facet.elementSpec();
-                GraphQLType wrappedType = 
TypeMapper.outputTypeFor(objectSpecificationForElementWhenCollection);
+                val objectSpecificationOfCollectionElement = 
facet.elementSpec();
+                GraphQLType wrappedType = 
TypeMapper.outputTypeFor(objectSpecificationOfCollectionElement);
                 if (wrappedType == null) {
                     log.warn("Unable to create wrapped type of for {} for 
action {}",
-                            
objectSpecificationForElementWhenCollection.getFullIdentifier(),
+                            
objectSpecificationOfCollectionElement.getFullIdentifier(),
                             
objectAction.getFeatureIdentifier().getFullIdentityString());
                     return null;
                 }
@@ -145,10 +145,6 @@ public class GqlvActionInvoke {
 
         val objectAction = holder.getObjectAction();
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
-        val actionInteractionHead = 
objectAction.interactionHead(managedObject);
-
-        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
-
 
         val visibleConsent = objectAction.isVisible(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
         if (visibleConsent.isVetoed()) {
@@ -160,19 +156,22 @@ public class GqlvActionInvoke {
             throw new DisabledException(objectAction.getFeatureIdentifier());
         }
 
-        val validityConsent = 
objectAction.isArgumentSetValid(actionInteractionHead, argumentManagedObjects, 
InteractionInitiatedBy.USER);
+        val head = objectAction.interactionHead(managedObject);
+        val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
+
+        val validityConsent = objectAction.isArgumentSetValid(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
         if (validityConsent.isVetoed()) {
             throw new 
IllegalArgumentException(validityConsent.getReasonAsString().orElse("Invalid"));
         }
 
-        val resultManagedObject = objectAction.execute(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
+        val resultManagedObject = objectAction.execute(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
         return resultManagedObject.getPojo();
     }
 
     public interface Holder
             extends GqlvHolder,
-            ObjectSpecificationProvider,
-            ObjectActionProvider {
+                    ObjectSpecificationProvider,
+                    ObjectActionProvider {
 
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
index 5fb90cd79a..e76bc552f2 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
@@ -33,11 +33,17 @@ import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 
+import lombok.val;
+
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
 @Log4j2
-public class GqlvActionParam implements GqlvActionParamDisabled.Holder, 
GqlvActionParamHidden.Holder {
+public class GqlvActionParam
+        implements GqlvActionParamDisabled.Holder,
+                   GqlvActionParamHidden.Holder,
+                   GqlvActionParamChoices.Holder,
+                   GqlvActionParamValidate.Holder {
 
     @Getter private final Holder holder;
     @Getter private final ObjectActionParameter objectActionParameter;
@@ -47,6 +53,7 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     private final GraphQLObjectType gqlObjectType;
 
+    private final GqlvActionParamChoices choices;
     private final GqlvActionParamHidden hidden;
     private final GqlvActionParamDisabled disabled;
 
@@ -65,6 +72,8 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
 
         this.hidden = new GqlvActionParamHidden(this, context);
         this.disabled = new GqlvActionParamDisabled(this, context);
+        val choices = new GqlvActionParamChoices(this, context);
+        this.choices = choices.hasChoices() ? choices : null;
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
@@ -102,6 +111,9 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
 
         hidden.addDataFetcher();
         disabled.addDataFetcher();
+        if (choices != null) {
+            choices.addDataFetcher();
+        }
     }
 
 
@@ -111,12 +123,10 @@ public class GqlvActionParam implements 
GqlvActionParamDisabled.Holder, GqlvActi
     }
 
 
-    public static interface Holder
+    public interface Holder
             extends GqlvHolder,
-            ObjectSpecificationProvider,
-            ObjectActionProvider {
-
-        GqlvActionParams.Holder getHolder();
+                    ObjectSpecificationProvider,
+                    ObjectActionProvider {
 
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
new file mode 100644
index 0000000000..dfa51597a2
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
@@ -0,0 +1,121 @@
+ /*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.viewer.graphql.model.domain;
+
+import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
+import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
+import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.viewer.graphql.model.context.Context;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
+import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
+
+import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
+
+import graphql.schema.GraphQLList;
+
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+import graphql.schema.DataFetchingEnvironment;
+import graphql.schema.GraphQLFieldDefinition;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
+
+ @Log4j2
+ public class GqlvActionParamChoices {
+
+     private final Holder holder;
+     private final Context context;
+
+     /**
+      * Populated iff there are choices for this parameter.
+      */
+     private final GraphQLFieldDefinition field;
+
+     public GqlvActionParamChoices(
+             final Holder holder,
+             final Context context) {
+         this.holder = holder;
+         this.context = context;
+
+         val objectActionParameter = holder.getObjectActionParameter();
+         if (objectActionParameter.hasChoices()) {
+             val elementType = objectActionParameter.getElementType();
+             val fieldBuilder = newFieldDefinition()
+                     .name("choices")
+                     
.type(GraphQLList.list(TypeMapper.outputTypeFor(elementType)));
+             addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
+             this.field = holder.addField(fieldBuilder.build());
+         } else {
+             this.field = null;
+         }
+     }
+
+     boolean hasChoices() {
+         return field != null;
+     }
+
+     public void addDataFetcher() {
+         context.codeRegistryBuilder.dataFetcher(
+                 holder.coordinatesFor(field),
+                 this::choices
+         );
+     }
+
+     private List<Object> choices(final DataFetchingEnvironment 
dataFetchingEnvironment) {
+
+         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
+         val objectSpecification = 
context.specificationLoader.loadSpecification(sourcePojo.getClass());
+         if (objectSpecification == null) {
+             return Collections.emptyList();
+         }
+
+         val objectAction = holder.getObjectAction();
+         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
+
+         val objectActionParameter = 
objectAction.getParameterById(holder.getObjectActionParameter().getId());
+         val argumentManagedObjects = 
GqlvAction.argumentManagedObjectsFor(dataFetchingEnvironment, objectAction, 
context.bookmarkService);
+
+         val managedAction = ManagedAction.of(managedObject, objectAction, 
Where.ANYWHERE);
+         val pendingArgs = ParameterNegotiationModel.of(managedAction, 
argumentManagedObjects);
+         val choices = objectActionParameter.getChoices(pendingArgs, 
InteractionInitiatedBy.USER);
+
+         return choices.stream()
+                    .map(ManagedObject::getPojo)
+                    .collect(Collectors.toList());
+     }
+
+     public interface Holder
+             extends GqlvHolder,
+             ObjectSpecificationProvider,
+             ObjectActionProvider,
+             ObjectActionParameterProvider {
+         GqlvActionParam.Holder getHolder();
+     }
+ }
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 098acd175e..bc5946a3e7 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
@@ -90,9 +90,8 @@ public class GqlvActionParamDisabled {
 
     public interface Holder
             extends GqlvHolder,
-            ObjectSpecificationProvider,
-            ObjectActionProvider,
-            ObjectActionParameterProvider {
-        GqlvActionParam.Holder getHolder();
+                    ObjectSpecificationProvider,
+                    ObjectActionProvider,
+                    ObjectActionParameterProvider {
     }
 }
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 8ba5817b2c..8313450744 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
@@ -90,9 +90,8 @@ public class GqlvActionParamHidden {
 
     public interface Holder
             extends GqlvHolder,
-            ObjectSpecificationProvider,
-            ObjectActionProvider,
-            ObjectActionParameterProvider {
-        GqlvActionParam.Holder getHolder();
+                    ObjectSpecificationProvider,
+                    ObjectActionProvider,
+                    ObjectActionParameterProvider {
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
index f03f362ed5..d220e31fc6 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
@@ -88,9 +88,8 @@ public class GqlvActionParamValidate {
 
     public interface Holder
             extends GqlvHolder,
-            ObjectSpecificationProvider,
-            ObjectActionProvider,
-            ObjectActionParameterProvider {
-        GqlvActionParam.Holder getHolder();
+                    ObjectSpecificationProvider,
+                    ObjectActionProvider,
+                    ObjectActionParameterProvider {
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
index a340200aea..a51e461c40 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
@@ -23,6 +23,8 @@ 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.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
+import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
@@ -122,12 +124,10 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
 
-    public interface Holder extends GqlvHolder {
+    public interface Holder
+            extends GqlvHolder,
+                    ObjectSpecificationProvider,
+                    ObjectActionProvider {
 
-        ObjectSpecification getObjectSpecification();
-
-        ObjectAction getObjectAction();
-
-        GqlvAction.Holder getHolder();
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
index e09360fef3..b6da9eadb0 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
@@ -137,7 +137,5 @@ public class GqlvPropertySet {
             ObjectSpecificationProvider,
             OneToOneAssociationProvider {
 
-        GqlvProperty.Holder getHolder();
-
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
index 1fd4699a64..69a560e1eb 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
@@ -119,6 +119,5 @@ public class GqlvPropertyValidate {
             ObjectSpecificationProvider,
             OneToOneAssociationProvider {
 
-        GqlvProperty.Holder getHolder();
     }
 }
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
index 5bb809b804..1becc2ce65 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
@@ -22173,6 +22173,21 @@
           },
           "isDeprecated" : false,
           "deprecationReason" : null
+        }, {
+          "name" : "choices",
+          "description" : null,
+          "args" : [ ],
+          "type" : {
+            "kind" : "LIST",
+            "name" : null,
+            "ofType" : {
+              "kind" : "OBJECT",
+              "name" : "university_dept_StaffMember",
+              "ofType" : null
+            }
+          },
+          "isDeprecated" : false,
+          "deprecationReason" : null
         } ],
         "inputFields" : null,
         "interfaces" : [ ],
@@ -22765,6 +22780,21 @@
           },
           "isDeprecated" : false,
           "deprecationReason" : null
+        }, {
+          "name" : "choices",
+          "description" : null,
+          "args" : [ ],
+          "type" : {
+            "kind" : "LIST",
+            "name" : null,
+            "ofType" : {
+              "kind" : "OBJECT",
+              "name" : "university_dept_Department",
+              "ofType" : null
+            }
+          },
+          "isDeprecated" : false,
+          "deprecationReason" : null
         } ],
         "inputFields" : null,
         "interfaces" : [ ],
@@ -23846,6 +23876,30 @@
           },
           "isDeprecated" : false,
           "deprecationReason" : null
+        }, {
+          "name" : "choices",
+          "description" : null,
+          "args" : [ {
+            "name" : "name",
+            "description" : null,
+            "type" : {
+              "kind" : "SCALAR",
+              "name" : "String",
+              "ofType" : null
+            },
+            "defaultValue" : null
+          } ],
+          "type" : {
+            "kind" : "LIST",
+            "name" : null,
+            "ofType" : {
+              "kind" : "OBJECT",
+              "name" : "university_dept_Department",
+              "ofType" : null
+            }
+          },
+          "isDeprecated" : false,
+          "deprecationReason" : null
         } ],
         "inputFields" : null,
         "interfaces" : [ ],
diff --git a/incubator/viewers/graphql/test/src/test/resources/schema.gql 
b/incubator/viewers/graphql/test/src/test/resources/schema.gql
index 546e870d59..125da2870e 100644
--- a/incubator/viewers/graphql/test/src/test/resources/schema.gql
+++ b/incubator/viewers/graphql/test/src/test/resources/schema.gql
@@ -2262,6 +2262,7 @@ type 
university_dept_Department__removeStaffMember__gqlv_action_params {
 }
 
 type 
university_dept_Department__removeStaffMember__staffMember__gqlv_action_parameter
 {
+  choices: [university_dept_StaffMember]
   disabled: String
   hidden: Boolean
 }
@@ -2334,6 +2335,7 @@ type university_dept_DeptHead {
 }
 
 type 
university_dept_DeptHead__changeDepartment__department__gqlv_action_parameter {
+  choices: [university_dept_Department]
   disabled: String
   hidden: Boolean
 }
@@ -2453,6 +2455,7 @@ type university_dept_StaffMember__name__gqlv_property {
 }
 
 type 
university_dept_Staff__createStaffMember__department__gqlv_action_parameter {
+  choices(name: String): [university_dept_Department]
   disabled(name: String): String
   hidden(name: String): Boolean
 }

Reply via email to