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 a3726cc126d4bdd910b8b4c3da5c8a53cde7dc38 Author: danhaywood <[email protected]> AuthorDate: Sun Jan 21 14:37:36 2024 +0000 CAUSEWAY-3676: makes ObjectTypeBuilder accessible for the Holder interfaces --- .../viewer/graphql/model/domain/GqlvAction.java | 3 -- .../graphql/model/domain/GqlvDomainObject.java | 27 ++++++++-------- .../graphql/model/domain/GqlvDomainService.java | 19 ++++++------ .../graphql/model/domain/GqlvMemberHolder.java | 8 +++++ .../viewer/graphql/model/domain/GqlvMeta.java | 19 ++++++------ .../viewer/graphql/model/domain/GqlvMutations.java | 36 ++++++++++++---------- 6 files changed, 61 insertions(+), 51 deletions(-) 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 91a7737288..d518b8bffd 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 @@ -27,8 +27,6 @@ import static graphql.schema.GraphQLNonNull.nonNull; public class GqlvAction extends GqlvMember<ObjectAction, GqlvActionHolder> { - private final GraphQLObjectType.Builder objectTypeBuilder; - public GqlvAction( final GqlvActionHolder holder, final ObjectAction objectAction, @@ -36,7 +34,6 @@ public class GqlvAction extends GqlvMember<ObjectAction, GqlvActionHolder> { final GraphQLCodeRegistry.Builder codeRegistryBuilder ) { super(holder, objectAction, fieldDefinition(objectAction, objectTypeBuilder), codeRegistryBuilder); - this.objectTypeBuilder = objectTypeBuilder; } private static GraphQLFieldDefinition fieldDefinition( diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java index 6b3eab8272..c89cc210a0 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java @@ -21,8 +21,6 @@ import org.apache.causeway.viewer.graphql.model.types.TypeMapper; import org.apache.causeway.viewer.graphql.model.types._Constants; import org.apache.causeway.viewer.graphql.model.util.TypeNames; -import static org.apache.causeway.viewer.graphql.model.types._Constants.GQL_INPUTTYPE_PREFIX; - import lombok.Getter; import graphql.Scalars; @@ -53,7 +51,8 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G @Getter private final GqlvMeta meta; @Getter private final GqlvMutations mutators; - private final GraphQLObjectType.Builder objectTypeBuilder; + + @Getter private final GraphQLObjectType.Builder gqlObjectTypeBuilder; String getLogicalTypeName() { return objectSpecification.getLogicalTypeName(); @@ -90,12 +89,12 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G this.objectSpecification = objectSpecification; this.codeRegistryBuilder = codeRegistryBuilder; - this.objectTypeBuilder = newObject().name(TypeNames.objectTypeNameFor(objectSpecification)); + this.gqlObjectTypeBuilder = newObject().name(TypeNames.objectTypeNameFor(objectSpecification)); this.meta = new GqlvMeta(this, codeRegistryBuilder, bookmarkService, objectManager); this.mutators = new GqlvMutations(this, codeRegistryBuilder); - objectTypeBuilder.field(meta.getMetaField()); + gqlObjectTypeBuilder.field(meta.getMetaField()); // input object type GraphQLInputObjectType.Builder inputTypeBuilder = newInputObject().name(TypeNames.inputTypeNameFor(objectSpecification)); @@ -126,7 +125,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G fieldDefinition = newFieldDefinition() .name(otoa.getId()) .type(otoa.isOptional() ? fieldTypeRef : nonNull(fieldTypeRef)).build(); - objectTypeBuilder.field( + gqlObjectTypeBuilder.field( fieldDefinition ); @@ -142,7 +141,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G ? Scalars.GraphQLString : nonNull(Scalars.GraphQLString)); fieldDefinition = valueBuilder.build(); - objectTypeBuilder.field(fieldDefinition); + gqlObjectTypeBuilder.field(fieldDefinition); break; } @@ -169,7 +168,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G fieldDefinition = newFieldDefinition() .name(otom.getId()) .type(GraphQLList.list(typeRef)).build(); - objectTypeBuilder.field(fieldDefinition); + gqlObjectTypeBuilder.field(fieldDefinition); break; case VALUE: @@ -177,7 +176,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G fieldDefinition = newFieldDefinition() .name(otom.getId()) .type(GraphQLList.list(wrappedType)).build(); - objectTypeBuilder.field(fieldDefinition); + gqlObjectTypeBuilder.field(fieldDefinition); break; } @@ -204,7 +203,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G .name(_Constants.GQL_MUTATIONS_FIELDNAME) .type(mutatorsType) .build(); - objectTypeBuilder.field(gql_mutations); + gqlObjectTypeBuilder.field(gql_mutations); }); return anyActions.get(); @@ -212,7 +211,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G void addAction(final ObjectAction objectAction) { if (objectAction.getSemantics().isSafeInNature()) { - safeActions.add(new GqlvAction(this, objectAction, objectTypeBuilder, codeRegistryBuilder)); + safeActions.add(new GqlvAction(this, objectAction, gqlObjectTypeBuilder, codeRegistryBuilder)); } else { mutators.addAction(objectAction); } @@ -228,7 +227,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G if (gqlObjectType != null) { throw new IllegalArgumentException(String.format("GqlObjectType has already been built for %s", getLogicalTypeName())); } - return gqlObjectType = objectTypeBuilder.name(getLogicalTypeNameSanitized()).build(); + return gqlObjectType = gqlObjectTypeBuilder.name(getLogicalTypeNameSanitized()).build(); } /** @@ -247,14 +246,14 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G * @see #buildMutatorsTypeIfAny() */ public Optional<GraphQLObjectType> getMutatorsTypeIfAny() { - return mutators.getMutatorsTypeIfAny(); + return mutators.getMutationsTypeIfAny(); } /** * @see #getMutatorsTypeIfAny() */ public Optional<GraphQLObjectType> buildMutatorsTypeIfAny() { - return mutators.buildMutatorsTypeIfAny(); + return mutators.buildMutationsTypeIfAny(); } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java index 5f4f6fc3a9..c779466506 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java @@ -35,7 +35,8 @@ public class GqlvDomainService implements GqlvActionHolder, GqlvMutationsHolder private final GraphQLCodeRegistry.Builder codeRegistryBuilder; @Getter private final GqlvMutations mutators; - private final GraphQLObjectType.Builder objectTypeBuilder; + + @Getter private final GraphQLObjectType.Builder gqlObjectTypeBuilder; String getLogicalTypeName() { return objectSpecification.getLogicalTypeName(); @@ -62,7 +63,7 @@ public class GqlvDomainService implements GqlvActionHolder, GqlvMutationsHolder this.servicePojo = servicePojo; this.codeRegistryBuilder = codeRegistryBuilder; - this.objectTypeBuilder = newObject().name(TypeNames.objectTypeNameFor(objectSpecification)); + this.gqlObjectTypeBuilder = newObject().name(TypeNames.objectTypeNameFor(objectSpecification)); this.mutators = new GqlvMutations(this, codeRegistryBuilder); @@ -86,7 +87,7 @@ public class GqlvDomainService implements GqlvActionHolder, GqlvMutationsHolder .name(_Constants.GQL_MUTATIONS_FIELDNAME) .type(mutatorsType) .build(); - objectTypeBuilder.field(gql_mutations); + gqlObjectTypeBuilder.field(gql_mutations); }); return anyActions.get(); @@ -94,11 +95,11 @@ public class GqlvDomainService implements GqlvActionHolder, GqlvMutationsHolder void addAction(final ObjectAction objectAction) { if (objectAction.getSemantics().isSafeInNature()) { - safeActions.add(new GqlvAction(this, objectAction, objectTypeBuilder, codeRegistryBuilder)); + safeActions.add(new GqlvAction(this, objectAction, gqlObjectTypeBuilder, codeRegistryBuilder)); } else { // TODO: should register with mutators instead ... // mutators.addAction(objectAction); - safeActions.add(new GqlvAction(this, objectAction, objectTypeBuilder, codeRegistryBuilder)); + safeActions.add(new GqlvAction(this, objectAction, gqlObjectTypeBuilder, codeRegistryBuilder)); } } @@ -112,7 +113,7 @@ public class GqlvDomainService implements GqlvActionHolder, GqlvMutationsHolder if (gqlObjectType != null) { throw new IllegalArgumentException(String.format("GqlObjectType has already been built for %s", getLogicalTypeName())); } - return gqlObjectType = objectTypeBuilder.build(); + return gqlObjectType = gqlObjectTypeBuilder.build(); } /** @@ -131,21 +132,21 @@ public class GqlvDomainService implements GqlvActionHolder, GqlvMutationsHolder * @see #buildMutatorsTypeIfAny() */ public Optional<GraphQLObjectType> getMutatorsTypeIfAny() { - return mutators.getMutatorsTypeIfAny(); + return mutators.getMutationsTypeIfAny(); } /** * @see #getMutatorsTypeIfAny() */ public Optional<GraphQLObjectType> buildMutatorsTypeIfAny() { - return mutators.buildMutatorsTypeIfAny(); + return mutators.buildMutationsTypeIfAny(); } public GraphQLFieldDefinition createTopLevelQueryField() { return newFieldDefinition() .name(TypeNames.objectTypeNameFor(objectSpecification)) - .type(objectTypeBuilder) + .type(gqlObjectTypeBuilder) .build(); } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java index 4d29b59656..44af9c9878 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java @@ -3,5 +3,13 @@ package org.apache.causeway.viewer.graphql.model.domain; import graphql.schema.GraphQLObjectType; public interface GqlvMemberHolder { + /** + * For use when building the type, ie adding the member to the type. + */ + GraphQLObjectType.Builder getGqlObjectTypeBuilder(); + + /** + * For use once the type has been built, ie by the fetchers. + */ GraphQLObjectType getGqlObjectType(); } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java index 84c928f6d0..d0b213b6c9 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java @@ -51,13 +51,10 @@ public class GqlvMeta { this.bookmarkService = bookmarkService; this.objectManager = objectManager; + // we can build the metafield and meta type eagerly because we know exactly which fields it has. metaField = newFieldDefinition().name("_gql_meta").type(buildMetaType()).build(); } - GraphQLObjectType getMetaType() { - return (GraphQLObjectType) metaField.getType(); - } - private GraphQLObjectType buildMetaType() { val metaTypeBuilder = newObject().name(TypeNames.metaTypeNameFor(domainObject.getObjectSpecification())); metaTypeBuilder.field(id); @@ -68,6 +65,10 @@ public class GqlvMeta { return metaTypeBuilder.build(); } + GraphQLObjectType getMetaType() { + return (GraphQLObjectType) metaField.getType(); + } + public void addDataFetchers() { codeRegistryBuilder.dataFetcher( @@ -75,17 +76,17 @@ public class GqlvMeta { (DataFetcher<Object>) environment -> { return bookmarkService.bookmarkFor(environment.getSource()) .map(bookmark -> new Fetcher(bookmark, bookmarkService, objectManager)) - .orElse(null); //TODO: is this correct ? + .orElseThrow(); }); - codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), id), - (DataFetcher<Object>) environment -> environment.<Fetcher>getSource().id()); - codeRegistryBuilder.dataFetcher( coordinates(getMetaType(), logicalTypeName), (DataFetcher<Object>) environment -> environment.<Fetcher>getSource().logicalTypeName()); + codeRegistryBuilder.dataFetcher( + coordinates(getMetaType(), id), + (DataFetcher<Object>) environment -> environment.<Fetcher>getSource().id()); + if (domainObject.getBeanSort() == BeanSort.ENTITY) { codeRegistryBuilder.dataFetcher( coordinates(getMetaType(), version), diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java index d5320aa02e..c79c2561c9 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutations.java @@ -3,6 +3,8 @@ package org.apache.causeway.viewer.graphql.model.domain; import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLObjectType; +import lombok.Getter; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -19,13 +21,16 @@ public class GqlvMutations implements GqlvActionHolder { private final GqlvMutationsHolder holder; private final GraphQLCodeRegistry.Builder codeRegistryBuilder; - final GraphQLObjectType.Builder objectTypeBuilder; + /** + * Used to build {@link #mutationsTypeIfAny}. + */ + @Getter final GraphQLObjectType.Builder gqlObjectTypeBuilder; /** - * Built lazily using {@link #buildMutatorsTypeIfAny()} + * Built lazily using {@link #buildMutationsTypeIfAny()} */ @SuppressWarnings("OptionalUsedAsFieldOrParameterType") - private Optional<GraphQLObjectType> mutatorsTypeIfAny; + private Optional<GraphQLObjectType> mutationsTypeIfAny; public GqlvMutations( final GqlvMutationsHolder holder, @@ -34,12 +39,11 @@ public class GqlvMutations implements GqlvActionHolder { this.holder = holder; this.codeRegistryBuilder = codeRegistryBuilder; - objectTypeBuilder = newObject().name(TypeNames.mutationsTypeNameFor(this.holder.getObjectSpecification())); - + gqlObjectTypeBuilder = newObject().name(TypeNames.mutationsTypeNameFor(this.holder.getObjectSpecification())); } public void addAction(final ObjectAction objectAction) { - actions.add(new GqlvAction(this, objectAction, objectTypeBuilder, codeRegistryBuilder)); + actions.add(new GqlvAction(this, objectAction, gqlObjectTypeBuilder, codeRegistryBuilder)); } private final List<GqlvAction> actions = new ArrayList<>(); @@ -51,32 +55,32 @@ public class GqlvMutations implements GqlvActionHolder { /** - * @see #buildMutatorsTypeIfAny() + * @see #buildMutationsTypeIfAny() */ - public Optional<GraphQLObjectType> getMutatorsTypeIfAny() { + public Optional<GraphQLObjectType> getMutationsTypeIfAny() { //noinspection OptionalAssignedToNull - if (mutatorsTypeIfAny == null) { + if (mutationsTypeIfAny == null) { throw new IllegalArgumentException(String.format("Gql MutatorsType has not yet been built for %s", holder.getObjectSpecification().getLogicalTypeName())); } - return mutatorsTypeIfAny; + return mutationsTypeIfAny; } /** - * @see #getMutatorsTypeIfAny() + * @see #getMutationsTypeIfAny() */ - public Optional<GraphQLObjectType> buildMutatorsTypeIfAny() { + public Optional<GraphQLObjectType> buildMutationsTypeIfAny() { //noinspection OptionalAssignedToNull - if (mutatorsTypeIfAny != null) { + if (mutationsTypeIfAny != null) { throw new IllegalArgumentException("Gql MutatorsType has already been built for " + holder.getObjectSpecification().getLogicalTypeName()); } - return mutatorsTypeIfAny = hasActions() - ? Optional.of(objectTypeBuilder.build()) + return mutationsTypeIfAny = hasActions() + ? Optional.of(gqlObjectTypeBuilder.build()) : Optional.empty(); } @Override public GraphQLObjectType getGqlObjectType() { - return mutatorsTypeIfAny.orElse(null); + return mutationsTypeIfAny.orElse(null); } public void addDataFetchersForActions() {
