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 8a80b76da8 CAUSEWAY-3676: adds param default
8a80b76da8 is described below

commit 8a80b76da88d77f5e2124bcac2e0abf6aa2aa5d6
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 26 09:07:49 2024 +0000

    CAUSEWAY-3676: adds param default
---
 .../spec/feature/ObjectActionParameter.java        |   6 ++
 .../specimpl/ObjectActionParameterAbstract.java    |   7 ++
 .../graphql/model/domain/GqlvActionParam.java      |  17 ++-
 .../model/domain/GqlvActionParamDefault.java       | 114 +++++++++++++++++++++
 .../graphql/viewer/test/domain/DeptHead.java       |   6 ++
 .../viewer/test/domain/DeptHeadRepository.java     |   8 +-
 ...t.find_department_and_change_head_default._.gql |  19 ++++
 ...epartment_and_change_head_default.approved.json |  21 ++++
 .../graphql/viewer/test/e2e/Domain_IntegTest.java  |  10 ++
 .../test/e2e/Schema_IntegTest.schema.approved.json |  33 ++++++
 .../graphql/test/src/test/resources/schema.gql     |   3 +
 11 files changed, 236 insertions(+), 8 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java
index 386f81545b..5018eddc62 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -120,6 +120,12 @@ extends ObjectFeature, CurrentHolder {
      */
     boolean hasAutoComplete();
 
+    /**
+     * Where there is a default provided (eg <code>defaultXxx</code> 
supporting method
+     * for the parameter.
+     */
+    boolean hasDefaults();
+
     /**
      * Returns a list of possible references/values for this parameter, which 
the
      * user can choose from, based on the input search argument.
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 3570fea968..74a5774ac2 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -161,6 +161,13 @@ implements
         return 
parentAction.getFacetedMethod().getParameters().getElseFail(parameterIndex);
     }
 
+    // -- Defaults
+
+    @Override
+    public boolean hasDefaults() {
+        return 
lookupNonFallbackFacet(ActionParameterDefaultsFacet.class).isPresent();
+    }
+
     // -- AutoComplete
 
     @Override
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 a01b6d37eb..d59feaa758 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
@@ -40,11 +40,12 @@ import static graphql.schema.GraphQLObjectType.newObject;
 
 @Log4j2
 public class GqlvActionParam
-        implements GqlvActionParamValidate.Holder,
-                   GqlvActionParamHidden.Holder,
+        implements GqlvActionParamHidden.Holder,
+                   GqlvActionParamDisabled.Holder,
                    GqlvActionParamChoices.Holder,
                    GqlvActionParamAutoComplete.Holder,
-                   GqlvActionParamDisabled.Holder {
+                   GqlvActionParamDefault.Holder,
+                   GqlvActionParamValidate.Holder {
 
     @Getter private final Holder holder;
     @Getter private final ObjectActionParameter objectActionParameter;
@@ -55,10 +56,11 @@ public class GqlvActionParam
     private final GraphQLObjectType gqlObjectType;
 
     private final GqlvActionParamHidden hidden;
-    private final GqlvActionParamValidate disabled;
+    private final GqlvActionParamDisabled validate;
     private final GqlvActionParamChoices choices;
     private final GqlvActionParamAutoComplete autoComplete;
-    private final GqlvActionParamDisabled validate;
+    private final GqlvActionParamDefault default_;
+    private final GqlvActionParamValidate disabled;
 
     private final GraphQLFieldDefinition field;
 
@@ -79,6 +81,8 @@ public class GqlvActionParam
         this.choices = choices.hasChoices() ? choices : null;
         val autoComplete = new GqlvActionParamAutoComplete(this, context);
         this.autoComplete = autoComplete.hasAutoComplete() ? autoComplete : 
null;
+        val default_ = new GqlvActionParamDefault(this, context);
+        this.default_ = default_.hasDefault() ? default_ : null;
         this.validate = new GqlvActionParamDisabled(this, context);
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
@@ -123,6 +127,9 @@ public class GqlvActionParam
         if (autoComplete != null) {
             autoComplete.addDataFetcher();
         }
+        if (default_ != null) {
+            default_.addDataFetcher();
+        }
         validate.addDataFetcher();
     }
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
new file mode 100644
index 0000000000..3cd04d25c7
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
@@ -0,0 +1,114 @@
+ /*
+ *  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 java.util.Collections;
+
+ import org.apache.causeway.applib.annotation.Where;
+ 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 lombok.val;
+ import lombok.extern.log4j.Log4j2;
+
+ import graphql.schema.DataFetchingEnvironment;
+ import graphql.schema.GraphQLFieldDefinition;
+
+ import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
+
+ import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
+
+ @Log4j2
+ public class GqlvActionParamDefault {
+
+     private final Holder holder;
+     private final Context context;
+
+     /**
+      * Populated iff there are choices for this parameter.
+      */
+     private final GraphQLFieldDefinition field;
+
+     public GqlvActionParamDefault(
+             final Holder holder,
+             final Context context) {
+         this.holder = holder;
+         this.context = context;
+
+         val objectActionParameter = holder.getObjectActionParameter();
+
+         if (objectActionParameter.hasDefaults()) {
+             val elementType = objectActionParameter.getElementType();
+             val fieldBuilder = newFieldDefinition()
+                     .name("default")
+                     .type(TypeMapper.outputTypeFor(elementType));
+             addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
+             this.field = holder.addField(fieldBuilder.build());
+         } else {
+             this.field = null;
+         }
+     }
+
+     boolean hasDefault() {
+         return field != null;
+     }
+
+     public void addDataFetcher() {
+         context.codeRegistryBuilder.dataFetcher(
+                 holder.coordinatesFor(field),
+                 this::default_
+         );
+     }
+
+     private Object default_(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 defaultManagedObject = 
objectActionParameter.getDefault(pendingArgs);
+
+         return defaultManagedObject.getPojo();
+     }
+
+     public interface Holder
+             extends GqlvHolder,
+             ObjectSpecificationProvider,
+             ObjectActionProvider,
+             ObjectActionParameterProvider {
+         GqlvActionParam.Holder getHolder();
+     }
+ }
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHead.java
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHead.java
index d40f1ab1bb..ad3d4f1074 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHead.java
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHead.java
@@ -42,6 +42,7 @@ import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 import static org.apache.causeway.applib.annotation.Editing.ENABLED;
@@ -58,8 +59,13 @@ import static 
org.apache.causeway.applib.annotation.Optionality.MANDATORY;
         autoCompleteRepository = DeptHeadRepository.class,
         autoCompleteMethod = "findByNameContaining"
 )
+@NoArgsConstructor
 public class DeptHead implements Comparable<DeptHead> {
 
+    public DeptHead(String name) {
+        this.name = name;
+    }
+
     @Id
     @GeneratedValue
     private Long id;
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHeadRepository.java
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHeadRepository.java
index f7cf8e16a6..36867a719c 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHeadRepository.java
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/DeptHeadRepository.java
@@ -34,9 +34,11 @@ public class DeptHeadRepository {
     @Inject private RepositoryService repositoryService;
 
     public DeptHead create(final String name, @Nullable final Department 
department) {
-        DeptHead deptHead = new DeptHead();
-        deptHead.setName(name);
-        deptHead.setDepartment(department);
+        DeptHead deptHead = new DeptHead(name);
+        if (department != null) {
+            deptHead.setDepartment(department);
+            department.setDeptHead(deptHead);
+        }
         repositoryService.persistAndFlush(deptHead);
         return deptHead;
     }
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.find_department_and_change_head_default._.gql
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.find_department_and_change_head_default._.gql
new file mode 100644
index 0000000000..90962cbd9a
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.find_department_and_change_head_default._.gql
@@ -0,0 +1,19 @@
+{
+  university_dept_Departments {
+    findByName {
+      invoke(name: "Classics") {
+        changeDeptHead {
+          params {
+            newDeptHead {
+              default {
+                name {
+                  get
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.find_department_and_change_head_default.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.find_department_and_change_head_default.approved.json
new file mode 100644
index 0000000000..dfea4638aa
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.find_department_and_change_head_default.approved.json
@@ -0,0 +1,21 @@
+{
+  "data" : {
+    "university_dept_Departments" : {
+      "findByName" : {
+        "invoke" : {
+          "changeDeptHead" : {
+            "params" : {
+              "newDeptHead" : {
+                "default" : {
+                  "name" : {
+                    "get" : "Dr. Barney Jones"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.java
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.java
index 05c35ffda2..c6dad99f71 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.java
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Domain_IntegTest.java
@@ -95,6 +95,8 @@ public class Domain_IntegTest extends 
CausewayViewerGraphqlTestModuleIntegTestAb
     void afterEach(){
         transactionService.runTransactional(Propagation.REQUIRED, () -> {
             staffMemberRepository.removeAll();
+            deptHeadRepository.findAll().forEach(x -> x.setDepartment(null));
+            departmentRepository.findAll().forEach(x -> x.setDeptHead(null));
             deptHeadRepository.removeAll();
             departmentRepository.removeAll();
         });
@@ -139,6 +141,14 @@ public class Domain_IntegTest extends 
CausewayViewerGraphqlTestModuleIntegTestAb
         Approvals.verify(submit(), jsonOptions());
     }
 
+    @Test
+    @UseReporter(DiffReporter.class)
+    void find_department_and_change_head_default() throws Exception {
+
+        // when, then
+        Approvals.verify(submit(), jsonOptions());
+    }
+
     @Test
     @UseReporter(DiffReporter.class)
     void find_staff_member_by_name_and_edit() throws Exception {
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 41d26dd44a..04560ef981 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
@@ -23049,6 +23049,17 @@
           },
           "isDeprecated" : false,
           "deprecationReason" : null
+        }, {
+          "name" : "default",
+          "description" : null,
+          "args" : [ ],
+          "type" : {
+            "kind" : "OBJECT",
+            "name" : "university_dept_DeptHead",
+            "ofType" : null
+          },
+          "isDeprecated" : false,
+          "deprecationReason" : null
         }, {
           "name" : "disabled",
           "description" : null,
@@ -23215,6 +23226,17 @@
           },
           "isDeprecated" : false,
           "deprecationReason" : null
+        }, {
+          "name" : "default",
+          "description" : null,
+          "args" : [ ],
+          "type" : {
+            "kind" : "SCALAR",
+            "name" : "String",
+            "ofType" : null
+          },
+          "isDeprecated" : false,
+          "deprecationReason" : null
         }, {
           "name" : "disabled",
           "description" : null,
@@ -24668,6 +24690,17 @@
           },
           "isDeprecated" : false,
           "deprecationReason" : null
+        }, {
+          "name" : "default",
+          "description" : null,
+          "args" : [ ],
+          "type" : {
+            "kind" : "SCALAR",
+            "name" : "String",
+            "ofType" : null
+          },
+          "isDeprecated" : false,
+          "deprecationReason" : null
         }, {
           "name" : "disabled",
           "description" : null,
diff --git a/incubator/viewers/graphql/test/src/test/resources/schema.gql 
b/incubator/viewers/graphql/test/src/test/resources/schema.gql
index 526a1d45c9..fea9e4f6c6 100644
--- a/incubator/viewers/graphql/test/src/test/resources/schema.gql
+++ b/incubator/viewers/graphql/test/src/test/resources/schema.gql
@@ -2267,6 +2267,7 @@ type 
university_dept_Department__changeDeptHead__gqlv_action_params {
 
 type 
university_dept_Department__changeDeptHead__newDeptHead__gqlv_action_parameter {
   autoComplete(search: String): [university_dept_DeptHead]
+  default: university_dept_DeptHead
   disabled(newDeptHead: university_dept_DeptHead__gqlv_input): String
   hidden: Boolean
   validity(newDeptHead: university_dept_DeptHead__gqlv_input): String
@@ -2285,6 +2286,7 @@ type 
university_dept_Department__changeName__gqlv_action_params {
 }
 
 type university_dept_Department__changeName__newName__gqlv_action_parameter {
+  default: String
   disabled(newName: String): String
   hidden: Boolean
   validity(newName: String): String
@@ -2434,6 +2436,7 @@ type 
university_dept_DeptHead__changeName__gqlv_action_params {
 }
 
 type university_dept_DeptHead__changeName__newName__gqlv_action_parameter {
+  default: String
   disabled(newName: String): String
   hidden: Boolean
   validity(newName: String): String

Reply via email to