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 3e7166db6e3dc769c4e7b02c8bc61348840318f6 Author: danhaywood <[email protected]> AuthorDate: Sat Jan 20 16:44:45 2024 +0000 CAUSEWAY-3676: factors out more into GqlvDomainObjectMeta --- .../graphql/model/domain/GqlvDomainObject.java | 102 ++++-------------- .../graphql/model/domain/GqlvDomainObjectMeta.java | 114 +++++++++++++++++++++ .../integration/GraphQlSourceForCauseway.java | 10 +- 3 files changed, 137 insertions(+), 89 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 cf814cda4f..8916e4d46f 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,7 +21,6 @@ import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation; import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation; import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation; import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; -import org.apache.causeway.viewer.graphql.model.parts.GqlvMeta; 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.types.TypeMapper; @@ -35,7 +34,6 @@ import graphql.schema.GraphQLCodeRegistry; import lombok.Getter; import lombok.val; -import lombok.experimental.UtilityClass; import graphql.Scalars; import graphql.schema.GraphQLArgument; @@ -59,33 +57,13 @@ import static graphql.schema.GraphQLTypeReference.typeRef; */ public class GqlvDomainObject { - private final GqlvDomainObjectMutators mutators; - - @UtilityClass - static class Fields { - static GraphQLFieldDefinition id = - newFieldDefinition() - .name("id") - .type(nonNull(Scalars.GraphQLString)) - .build(); - static GraphQLFieldDefinition logicalTypeName = - newFieldDefinition() - .name("logicalTypeName") - .type(nonNull(Scalars.GraphQLString)) - .build(); - static GraphQLFieldDefinition version = - newFieldDefinition() - .name("version") - .type(Scalars.GraphQLString).build(); - } + @Getter private final GqlvDomainObjectMeta meta; + @Getter private final GqlvDomainObjectMutators mutators; private final ObjectSpecification objectSpec; private final GraphQLCodeRegistry.Builder codeRegistryBuilder; - private final BookmarkService bookmarkService; - private final ObjectManager objectManager; private final SpecificationLoader specificationLoader; - @Getter private final GraphQLFieldDefinition metaField; @Getter private final GraphQLObjectType.Builder gqlObjectTypeBuilder; @Getter private final GraphQLInputObjectType gqlInputObjectType; @@ -101,9 +79,6 @@ public class GqlvDomainObject { return objectSpec.getBeanSort(); } - public GraphQLObjectType getMetaType() { - return (GraphQLObjectType) metaField.getType(); - } @@ -133,14 +108,11 @@ public class GqlvDomainObject { final SpecificationLoader specificationLoader) { this.objectSpec = objectSpec; this.codeRegistryBuilder = codeRegistryBuilder; - this.bookmarkService = bookmarkService; - this.objectManager = objectManager; this.specificationLoader = specificationLoader; this.gqlObjectTypeBuilder = newObject().name(getLogicalTypeNameSanitized()); - // object type's meta field - metaField = newFieldDefinition().name("_gql_meta").type(metaType()).build(); - gqlObjectTypeBuilder.field(metaField); + meta = new GqlvDomainObjectMeta(this, codeRegistryBuilder, bookmarkService, objectManager); + mutators = new GqlvDomainObjectMutators(this); // input object type String inputTypeName = GQL_INPUTTYPE_PREFIX + getLogicalTypeNameSanitized(); @@ -152,19 +124,12 @@ public class GqlvDomainObject { .build()); gqlInputObjectType = inputTypeBuilder.build(); - mutators = new GqlvDomainObjectMutators(this); + // object type's meta field + gqlObjectTypeBuilder.field(meta.getMetaField()); + } - private GraphQLObjectType metaType() { - val metaTypeBuilder = newObject().name(getLogicalTypeNameSanitized() + "__DomainObject_meta"); - metaTypeBuilder.field(Fields.id); - metaTypeBuilder.field(Fields.logicalTypeName); - if (getBeanSort() == BeanSort.ENTITY) { - metaTypeBuilder.field(Fields.version); - } - return metaTypeBuilder.build(); - } public void addPropertiesAsFields() { @@ -361,52 +326,19 @@ public class GqlvDomainObject { } - public void createAndRegisterDataFetchersForMetaData() { - - codeRegistryBuilder.dataFetcher( - coordinates(getGqlObjectType(), getMetaField()), - (DataFetcher<Object>) environment -> { - return bookmarkService.bookmarkFor(environment.getSource()) - .map(bookmark -> new GqlvMeta(bookmark, bookmarkService, objectManager)) - .orElse(null); //TODO: is this correct ? - }); - - codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), GqlvDomainObject.Fields.id), - (DataFetcher<Object>) environment -> { - GqlvMeta gqlvMeta = environment.getSource(); - return gqlvMeta.id(); - }); - - codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), GqlvDomainObject.Fields.logicalTypeName), - (DataFetcher<Object>) environment -> { - GqlvMeta gqlvMeta = environment.getSource(); - return gqlvMeta.logicalTypeName(); - }); - - if (getBeanSort() == BeanSort.ENTITY) { - codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), GqlvDomainObject.Fields.version), - (DataFetcher<Object>) environment -> { - GqlvMeta gqlvMeta = environment.getSource(); - return gqlvMeta.version(); - }); - } - + public void addDataFetchersForMetaData() { + meta.addDataFetchers(); } - - public void createAndRegisterDataFetchersForField() { - getProperties().forEach(this::createAndRegisterDataFetcherForAssociation); + public void addDataFetchersForProperties() { + getProperties().forEach(this::addDataFetcherForAssociation); } - public void createAndRegisterDataFetchersForCollection() { - getCollections().forEach( - this::createAndRegisterDataFetcherForAssociation); + public void addDataFetchersForCollections() { + getCollections().forEach(this::addDataFetcherForAssociation); } - private void createAndRegisterDataFetcherForAssociation(final GqlvAssociation<?> property) { + private void addDataFetcherForAssociation(final GqlvAssociation<?> property) { final ObjectAssociation association = property.getObjectMember(); final GraphQLFieldDefinition field = property.getFieldDefinition(); @@ -443,9 +375,11 @@ public class GqlvDomainObject { } } - public void createAndRegisterDataFetchersForMutators() { + public void addDataFetchersForMutators() { + + // TODO: something similar to addFetchers for safe actions, but applied to GqlvDomainObjectMutators instead; perhaps they share a common interface? - // something like: + // earlier code... // codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(graphQLTypeReference, gql_mutations), new DataFetcher<Object>() { // @Override diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java new file mode 100644 index 0000000000..d5319ead92 --- /dev/null +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java @@ -0,0 +1,114 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +import graphql.Scalars; +import graphql.schema.DataFetcher; +import graphql.schema.GraphQLCodeRegistry; +import graphql.schema.GraphQLFieldDefinition; + +import graphql.schema.GraphQLObjectType; + +import lombok.Getter; +import lombok.experimental.UtilityClass; +import lombok.val; + +import org.apache.causeway.applib.services.bookmark.BookmarkService; +import org.apache.causeway.applib.services.metamodel.BeanSort; +import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; +import org.apache.causeway.viewer.graphql.model.parts.GqlvMeta; + +import static graphql.schema.FieldCoordinates.coordinates; +import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; +import static graphql.schema.GraphQLNonNull.nonNull; +import static graphql.schema.GraphQLObjectType.newObject; + +public class GqlvDomainObjectMeta { + + @UtilityClass + static class Fields { + static GraphQLFieldDefinition id = + newFieldDefinition() + .name("id") + .type(nonNull(Scalars.GraphQLString)) + .build(); + static GraphQLFieldDefinition logicalTypeName = + newFieldDefinition() + .name("logicalTypeName") + .type(nonNull(Scalars.GraphQLString)) + .build(); + static GraphQLFieldDefinition version = + newFieldDefinition() + .name("version") + .type(Scalars.GraphQLString).build(); + } + + private final GqlvDomainObject domainObject; + + private final GraphQLCodeRegistry.Builder codeRegistryBuilder; + private final BookmarkService bookmarkService; + private final ObjectManager objectManager; + + @Getter private final GraphQLFieldDefinition metaField; + + public GqlvDomainObjectMeta( + final GqlvDomainObject domainObject, + final GraphQLCodeRegistry.Builder codeRegistryBuilder, + final BookmarkService bookmarkService, + final ObjectManager objectManager + ) { + this.domainObject = domainObject; + + this.codeRegistryBuilder = codeRegistryBuilder; + this.bookmarkService = bookmarkService; + this.objectManager = objectManager; + + metaField = newFieldDefinition().name("_gql_meta").type(metaType()).build(); + } + + public GraphQLObjectType getMetaType() { + return (GraphQLObjectType) metaField.getType(); + } + + private GraphQLObjectType metaType() { + val metaTypeBuilder = newObject().name(domainObject.getLogicalTypeNameSanitized() + "__DomainObject_meta"); + metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.id); + metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.logicalTypeName); + if (domainObject.getBeanSort() == BeanSort.ENTITY) { + metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.version); + } + return metaTypeBuilder.build(); + } + + public void addDataFetchers() { + + codeRegistryBuilder.dataFetcher( + coordinates(domainObject.getGqlObjectType(), getMetaField()), + (DataFetcher<Object>) environment -> { + return bookmarkService.bookmarkFor(environment.getSource()) + .map(bookmark -> new GqlvMeta(bookmark, bookmarkService, objectManager)) + .orElse(null); //TODO: is this correct ? + }); + + codeRegistryBuilder.dataFetcher( + coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.id), + (DataFetcher<Object>) environment -> { + GqlvMeta gqlvMeta = environment.getSource(); + return gqlvMeta.id(); + }); + + codeRegistryBuilder.dataFetcher( + coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.logicalTypeName), + (DataFetcher<Object>) environment -> { + GqlvMeta gqlvMeta = environment.getSource(); + return gqlvMeta.logicalTypeName(); + }); + + if (domainObject.getBeanSort() == BeanSort.ENTITY) { + codeRegistryBuilder.dataFetcher( + coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.version), + (DataFetcher<Object>) environment -> { + GqlvMeta gqlvMeta = environment.getSource(); + return gqlvMeta.version(); + }); + } + } +} diff --git a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java index 4d5617f1f9..b5c803eab6 100644 --- a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java +++ b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java @@ -199,7 +199,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { val gqlvDomainObject = new GqlvDomainObject(objectSpec, codeRegistryBuilder, bookmarkService, objectManager, specificationLoader); - graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getMetaField().getType()); + graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getMeta().getMetaField().getType()); graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getGqlInputObjectType()); gqlvDomainObject.addPropertiesAsFields(); @@ -214,11 +214,11 @@ public class GraphQlSourceForCauseway implements GraphQlSource { graphQLTypeRegistry.addTypeIfNotAlreadyPresent(graphQLObjectType); // create and register data fetchers - gqlvDomainObject.createAndRegisterDataFetchersForMetaData(); - gqlvDomainObject.createAndRegisterDataFetchersForMutators(); + gqlvDomainObject.addDataFetchersForMetaData(); + gqlvDomainObject.addDataFetchersForMutators(); - gqlvDomainObject.createAndRegisterDataFetchersForField(); - gqlvDomainObject.createAndRegisterDataFetchersForCollection(); + gqlvDomainObject.addDataFetchersForProperties(); + gqlvDomainObject.addDataFetchersForCollections(); } }
