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