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 }
