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 032b38f0422e1c0bbf89cc2c5de30dcc7bce9011 Author: danhaywood <[email protected]> AuthorDate: Sun Jan 21 12:45:11 2024 +0000 CAUSEWAY-3676: rationalizing domain object vs service; logical type names --- .../graphql/model/domain/GqlvDomainObject.java | 38 ++++++++-------- .../graphql/model/domain/GqlvDomainService.java | 50 +++++++++++++--------- .../viewer/graphql/model/domain/GqlvMutators.java | 11 +---- .../viewer/graphql/model/types/TypeMapper.java | 6 +-- .../model/util/{_LTN.java => TypeNames.java} | 15 ++++++- .../graphql/viewer/toplevel/GqlvTopLevelQuery.java | 2 +- 6 files changed, 65 insertions(+), 57 deletions(-) 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 293e405a18..48f4ec8dec 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 @@ -18,7 +18,7 @@ import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation; import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry; 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._LTN; +import org.apache.causeway.viewer.graphql.model.util.TypeNames; import static org.apache.causeway.viewer.graphql.model.types._Constants.GQL_INPUTTYPE_PREFIX; @@ -41,7 +41,7 @@ import static graphql.schema.GraphQLObjectType.newObject; import static graphql.schema.GraphQLTypeReference.typeRef; /** - * A wrapper around {@link ObjectSpecification} + * Exposes a domain object (view model or entity) via the GQL viewer. */ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, GqlvCollectionHolder, GqlvMutatorsHolder { @@ -50,16 +50,13 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G @Getter private final GqlvMeta meta; @Getter private final GqlvMutators mutators; - - @Getter private final GraphQLObjectType.Builder objectTypeBuilder; - @Getter private final GraphQLInputObjectType gqlInputObjectType; + private final GraphQLObjectType.Builder objectTypeBuilder; String getLogicalTypeName() { return objectSpecification.getLogicalTypeName(); } - public String getLogicalTypeNameSanitized() { - return _LTN.sanitized(objectSpecification); + return TypeNames.objectTypeNameFor(objectSpecification); } public BeanSort getBeanSort() { @@ -75,13 +72,12 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G private final List<GqlvAction> safeActions = new ArrayList<>(); public List<GqlvAction> getSafeActions() {return Collections.unmodifiableList(safeActions);} - /** * Built using {@link #buildGqlObjectType()} */ private GraphQLObjectType gqlObjectType; - + @Getter private final GraphQLInputObjectType gqlInputObjectType; public GqlvDomainObject( final ObjectSpecification objectSpecification, @@ -90,10 +86,13 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G final ObjectManager objectManager) { this.objectSpecification = objectSpecification; this.codeRegistryBuilder = codeRegistryBuilder; - this.objectTypeBuilder = newObject().name(getLogicalTypeNameSanitized()); - meta = new GqlvMeta(this, codeRegistryBuilder, bookmarkService, objectManager); - mutators = new GqlvMutators(this, codeRegistryBuilder); + this.objectTypeBuilder = newObject().name(TypeNames.objectTypeNameFor(objectSpecification)); + + this.meta = new GqlvMeta(this, codeRegistryBuilder, bookmarkService, objectManager); + this.mutators = new GqlvMutators(this, codeRegistryBuilder); + + objectTypeBuilder.field(meta.getMetaField()); // input object type String inputTypeName = GQL_INPUTTYPE_PREFIX + getLogicalTypeNameSanitized(); @@ -105,9 +104,6 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G .build()); gqlInputObjectType = inputTypeBuilder.build(); - // object type's meta field - objectTypeBuilder.field(meta.getMetaField()); - } @@ -127,11 +123,11 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G case VIEW_MODEL: case ENTITY: - GraphQLTypeReference fieldTypeRef = typeRef(_LTN.sanitized(otoaObjectSpec)); + GraphQLTypeReference fieldTypeRef = typeRef(TypeNames.objectTypeNameFor(otoaObjectSpec)); fieldDefinition = newFieldDefinition() .name(otoa.getId()) .type(otoa.isOptional() ? fieldTypeRef : nonNull(fieldTypeRef)).build(); - getObjectTypeBuilder().field( + objectTypeBuilder.field( fieldDefinition ); @@ -147,7 +143,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G ? Scalars.GraphQLString : nonNull(Scalars.GraphQLString)); fieldDefinition = valueBuilder.build(); - getObjectTypeBuilder().field(fieldDefinition); + objectTypeBuilder.field(fieldDefinition); break; } @@ -170,7 +166,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G case VIEW_MODEL: case ENTITY: - GraphQLTypeReference typeRef = typeRef(_LTN.sanitized(elementType)); + GraphQLTypeReference typeRef = typeRef(TypeNames.objectTypeNameFor(elementType)); fieldDefinition = newFieldDefinition() .name(otom.getId()) .type(GraphQLList.list(typeRef)).build(); @@ -211,7 +207,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 = getObjectTypeBuilder().name(getLogicalTypeNameSanitized()).build(); + return gqlObjectType = objectTypeBuilder.name(getLogicalTypeNameSanitized()).build(); } /** @@ -252,7 +248,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G .name(_Constants.GQL_MUTATIONS_FIELDNAME) .type(mutatorsType) .build(); - getObjectTypeBuilder().field(gql_mutations); + objectTypeBuilder.field(gql_mutations); }); 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 d1b1bb5777..2e6654a925 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 @@ -1,11 +1,5 @@ package org.apache.causeway.viewer.graphql.model.domain; -import graphql.schema.GraphQLCodeRegistry; -import graphql.schema.GraphQLFieldDefinition; -import graphql.schema.GraphQLObjectType; - -import lombok.Getter; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -18,47 +12,61 @@ import org.apache.causeway.core.metamodel.spec.feature.MixedIn; import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry; import org.apache.causeway.viewer.graphql.model.types._Constants; -import org.apache.causeway.viewer.graphql.model.util._LTN; +import org.apache.causeway.viewer.graphql.model.util.TypeNames; + +import lombok.Getter; + +import graphql.schema.GraphQLCodeRegistry; +import graphql.schema.GraphQLFieldDefinition; +import graphql.schema.GraphQLObjectType; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLObjectType.newObject; +/** + * Exposes a domain service (view model or entity) via the GQL viewer. + */ public class GqlvDomainService implements GqlvActionHolder, GqlvMutatorsHolder { @Getter private final ObjectSpecification objectSpecification; - @Getter private final Object pojo; + @Getter private final Object servicePojo; private final GraphQLCodeRegistry.Builder codeRegistryBuilder; - private final GqlvMutators mutators; - private String getLogicalTypeName() { + @Getter private final GqlvMutators mutators; + private final GraphQLObjectType.Builder objectTypeBuilder; + + String getLogicalTypeName() { return objectSpecification.getLogicalTypeName(); } + public String getLogicalTypeNameSanitized() { + return TypeNames.objectTypeNameFor(objectSpecification); + } - private final GraphQLObjectType.Builder objectTypeBuilder; + private final List<GqlvAction> safeActions = new ArrayList<>(); + public List<GqlvAction> getSafeActions() {return Collections.unmodifiableList(safeActions);} + + /** + * Built using {@link #buildGqlObjectType()} + */ private GraphQLObjectType gqlObjectType; public GqlvDomainService( final ObjectSpecification objectSpecification, - final Object pojo, + final Object servicePojo, final GraphQLCodeRegistry.Builder codeRegistryBuilder ) { this.objectSpecification = objectSpecification; - this.pojo = pojo; + this.servicePojo = servicePojo; this.codeRegistryBuilder = codeRegistryBuilder; + this.objectTypeBuilder = newObject().name(TypeNames.objectTypeNameFor(objectSpecification)); + this.mutators = new GqlvMutators(this, codeRegistryBuilder); - this.objectTypeBuilder = newObject().name(_LTN.sanitized(objectSpecification)); } - private final List<GqlvAction> safeActions = new ArrayList<>(); - public List<GqlvAction> getSafeActions() {return Collections.unmodifiableList(safeActions);} - - private final List<GqlvAction> mutatorActions = new ArrayList<>(); - public List<GqlvAction> getMutatorActions() {return Collections.unmodifiableList(mutatorActions);} - /** * @see #getGqlObjectType() */ @@ -82,7 +90,7 @@ public class GqlvDomainService implements GqlvActionHolder, GqlvMutatorsHolder { public GraphQLFieldDefinition createTopLevelQueryField() { return newFieldDefinition() - .name(_LTN.sanitized(objectSpecification)) + .name(TypeNames.objectTypeNameFor(objectSpecification)) .type(objectTypeBuilder) .build(); } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java index 9c1c273111..a940286da6 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java @@ -1,11 +1,7 @@ package org.apache.causeway.viewer.graphql.model.domain; import graphql.schema.GraphQLCodeRegistry; -import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLObjectType; -import graphql.schema.GraphQLOutputType; - -import lombok.val; import java.util.ArrayList; import java.util.Collections; @@ -13,14 +9,11 @@ import java.util.List; import java.util.Optional; import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; -import org.apache.causeway.viewer.graphql.model.types.TypeMapper; -import org.apache.causeway.viewer.graphql.model.util._LTN; +import org.apache.causeway.viewer.graphql.model.util.TypeNames; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLObjectType.newObject; -import static org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments; - public class GqlvMutators implements GqlvActionHolder { private final GqlvMutatorsHolder holder; @@ -41,7 +34,7 @@ public class GqlvMutators implements GqlvActionHolder { this.holder = holder; this.codeRegistryBuilder = codeRegistryBuilder; - objectTypeBuilder = newObject().name(_LTN.sanitized(this.holder.getObjectSpecification()) + "__mutators"); + objectTypeBuilder = newObject().name(TypeNames.mutatorTypeNameFor(this.holder.getObjectSpecification())); } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java index ec7dd3d233..be8467cd5e 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java @@ -27,7 +27,7 @@ import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; 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.util._LTN; +import org.apache.causeway.viewer.graphql.model.util.TypeNames; import graphql.Scalars; import graphql.schema.GraphQLInputType; @@ -62,7 +62,7 @@ public class TypeMapper { case ENTITY: case VIEW_MODEL: - return GraphQLTypeReference.typeRef(_Constants.GQL_INPUTTYPE_PREFIX + _LTN.sanitized(elementType)); + return GraphQLTypeReference.typeRef(TypeNames.inputTypeNameFor(elementType)); case VALUE: return (GraphQLInputType) typeFor(elementType.getCorrespondingClass()); @@ -102,7 +102,7 @@ public class TypeMapper { case ABSTRACT: case ENTITY: case VIEW_MODEL: - return GraphQLTypeReference.typeRef(_LTN.sanitized(objectSpecification)); + return GraphQLTypeReference.typeRef(TypeNames.objectTypeNameFor(objectSpecification)); case VALUE: return typeFor(objectSpecification.getCorrespondingClass()); diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/_LTN.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/TypeNames.java similarity index 69% rename from incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/_LTN.java rename to incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/TypeNames.java index e3206f8651..2438a65226 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/_LTN.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/util/TypeNames.java @@ -21,13 +21,24 @@ package org.apache.causeway.viewer.graphql.model.util; import lombok.experimental.UtilityClass; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; +import org.apache.causeway.viewer.graphql.model.types._Constants; @UtilityClass -public final class _LTN { - public static String sanitized(ObjectSpecification objectSpecification) { +public final class TypeNames { + public static String objectTypeNameFor(ObjectSpecification objectSpecification) { return sanitized(objectSpecification.getLogicalTypeName()); } + + public static String mutatorTypeNameFor(ObjectSpecification objectSpecification) { + return objectTypeNameFor(objectSpecification) + "__mutators"; + } + + public static String inputTypeNameFor(ObjectSpecification objectSpecification) { + return _Constants.GQL_INPUTTYPE_PREFIX + objectTypeNameFor(objectSpecification); + } + private static String sanitized(final String name) { return name.replace('.', '_'); } + } diff --git a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java index bf350109cf..054cf2e23a 100644 --- a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java +++ b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java @@ -75,7 +75,7 @@ public class GqlvTopLevelQuery { codeRegistryBuilder.dataFetcher( // TODO: it would be nice to make these typesafe... FieldCoordinates.coordinates("Query", topLevelQueryField.getName()), - (DataFetcher<Object>) environment -> domainService.getPojo()); + (DataFetcher<Object>) environment -> domainService.getServicePojo()); }
