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 d93ffb5e69f00e59d0567d1600a09f76726b9f89 Author: danhaywood <[email protected]> AuthorDate: Sat Jan 20 18:05:18 2024 +0000 CAUSEWAY-3676: towards introducing mutators type for domain service --- .../graphql/model/domain/GqlvDomainObject.java | 49 +++++++++------------- .../graphql/model/domain/GqlvDomainService.java | 28 +++++-------- .../{GqlvDomainObjectMeta.java => GqlvMeta.java} | 25 ++++++----- ...DomainObjectMutators.java => GqlvMutators.java} | 19 +++++---- .../graphql/model/domain/GqlvMutatorsHolder.java | 9 ++++ .../integration/GraphQlSourceForCauseway.java | 4 +- 6 files changed, 63 insertions(+), 71 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 d673811f8d..7747e5e7fe 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,23 +18,19 @@ import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter; 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.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.types.TypeMapper; - -import static graphql.schema.FieldCoordinates.coordinates; import static org.apache.causeway.viewer.graphql.model.types._Constants.GQL_INPUTTYPE_PREFIX; -import graphql.schema.GraphQLCodeRegistry; - import lombok.Getter; import lombok.val; import graphql.Scalars; import graphql.schema.GraphQLArgument; +import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLInputObjectType; import graphql.schema.GraphQLList; @@ -53,34 +49,29 @@ import static graphql.schema.GraphQLTypeReference.typeRef; /** * A wrapper around {@link ObjectSpecification} */ -public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, GqlvCollectionHolder { +public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, GqlvCollectionHolder, GqlvMutatorsHolder { - @Getter private final GqlvDomainObjectMeta meta; - @Getter private final GqlvDomainObjectMutators mutators; - - private final ObjectSpecification objectSpec; + @Getter private final ObjectSpecification objectSpecification; private final GraphQLCodeRegistry.Builder codeRegistryBuilder; - private final SpecificationLoader specificationLoader; + + @Getter private final GqlvMeta meta; + @Getter private final GqlvMutators mutators; @Getter private final GraphQLObjectType.Builder gqlObjectTypeBuilder; @Getter private final GraphQLInputObjectType gqlInputObjectType; String getLogicalTypeName() { - return objectSpec.getLogicalTypeName(); + return objectSpecification.getLogicalTypeName(); } public String getLogicalTypeNameSanitized() { - return _LTN.sanitized(objectSpec); + return _LTN.sanitized(objectSpecification); } public BeanSort getBeanSort() { - return objectSpec.getBeanSort(); + return objectSpecification.getBeanSort(); } - - - - private final List<GqlvProperty> properties = new ArrayList<>(); public List<GqlvProperty> getProperties() {return Collections.unmodifiableList(properties);} @@ -99,18 +90,16 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G public GqlvDomainObject( - final ObjectSpecification objectSpec, + final ObjectSpecification objectSpecification, final GraphQLCodeRegistry.Builder codeRegistryBuilder, final BookmarkService bookmarkService, - final ObjectManager objectManager, - final SpecificationLoader specificationLoader) { - this.objectSpec = objectSpec; + final ObjectManager objectManager) { + this.objectSpecification = objectSpecification; this.codeRegistryBuilder = codeRegistryBuilder; - this.specificationLoader = specificationLoader; this.gqlObjectTypeBuilder = newObject().name(getLogicalTypeNameSanitized()); - meta = new GqlvDomainObjectMeta(this, codeRegistryBuilder, bookmarkService, objectManager); - mutators = new GqlvDomainObjectMutators(this, codeRegistryBuilder); + meta = new GqlvMeta(this, codeRegistryBuilder, bookmarkService, objectManager); + mutators = new GqlvMutators(this, codeRegistryBuilder); // input object type String inputTypeName = GQL_INPUTTYPE_PREFIX + getLogicalTypeNameSanitized(); @@ -131,7 +120,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G public void addPropertiesAsFields() { - objectSpec.streamProperties(MixedIn.INCLUDED).forEach(this::addPropertyAsField); + objectSpecification.streamProperties(MixedIn.INCLUDED).forEach(this::addPropertyAsField); } @@ -175,7 +164,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G public void addCollectionsAsLists() { - objectSpec.streamCollections(MixedIn.INCLUDED).forEach(this::addCollection); + objectSpecification.streamCollections(MixedIn.INCLUDED).forEach(this::addCollection); } private void addCollection(OneToManyAssociation otom) { @@ -308,7 +297,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G public void addActionsAsFields() { - objectSpec.streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED) + objectSpecification.streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED) .forEach(this::addAction); Optional<GraphQLObjectType> mutatorsTypeIfAny = buildMutatorsTypeIfAny(); @@ -339,7 +328,7 @@ public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, G public void addDataFetchersForMutators() { - // TODO: something similar to addFetchers for safe actions, but applied to GqlvDomainObjectMutators instead; perhaps they share a common interface? + // TODO: something similar to addFetchers for safe actions, but applied to GqlvMutators instead; perhaps they share a common interface? // earlier code... 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 35a15d9b95..5afe4b6ccf 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 @@ -16,27 +16,21 @@ import java.util.stream.Collectors; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; -import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; import org.apache.causeway.viewer.graphql.model.util._LTN; import org.apache.causeway.viewer.graphql.model.types.TypeMapper; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLObjectType.newObject; -public class GqlvDomainService implements GqlvActionHolder { +public class GqlvDomainService implements GqlvActionHolder, GqlvMutatorsHolder { - private final ObjectSpecification serviceSpec; + @Getter private final ObjectSpecification objectSpecification; @Getter private final Object pojo; private final GraphQLCodeRegistry.Builder codeRegistryBuilder; - private final SpecificationLoader specificationLoader; - + private final GqlvMutators mutators; private String getLogicalTypeName() { - return serviceSpec.getLogicalTypeName(); - } - - public String getLogicalTypeNameSanitized() { - return _LTN.sanitized(serviceSpec); + return objectSpecification.getLogicalTypeName(); } private final GraphQLObjectType.Builder gqlObjectTypeBuilder; @@ -44,17 +38,17 @@ public class GqlvDomainService implements GqlvActionHolder { private GraphQLObjectType gqlObjectType; public GqlvDomainService( - final ObjectSpecification serviceSpec, + final ObjectSpecification objectSpecification, final Object pojo, - final GraphQLCodeRegistry.Builder codeRegistryBuilder, - final SpecificationLoader specificationLoader + final GraphQLCodeRegistry.Builder codeRegistryBuilder ) { - this.serviceSpec = serviceSpec; + this.objectSpecification = objectSpecification; this.pojo = pojo; this.codeRegistryBuilder = codeRegistryBuilder; - this.specificationLoader = specificationLoader; - this.gqlObjectTypeBuilder = newObject().name(_LTN.sanitized(serviceSpec)); + this.mutators = new GqlvMutators(this, codeRegistryBuilder); + + this.gqlObjectTypeBuilder = newObject().name(_LTN.sanitized(objectSpecification)); } @@ -87,7 +81,7 @@ public class GqlvDomainService implements GqlvActionHolder { public GraphQLFieldDefinition createTopLevelQueryField() { return newFieldDefinition() - .name(_LTN.sanitized(serviceSpec)) + .name(_LTN.sanitized(objectSpecification)) .type(gqlObjectTypeBuilder) .build(); } 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/GqlvMeta.java similarity index 79% rename from incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java rename to incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java index ea43a45056..f3f7cc9724 100644 --- 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/GqlvMeta.java @@ -14,14 +14,13 @@ 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 { +public class GqlvMeta { @UtilityClass static class Fields { @@ -49,7 +48,7 @@ public class GqlvDomainObjectMeta { @Getter private final GraphQLFieldDefinition metaField; - public GqlvDomainObjectMeta( + public GqlvMeta( final GqlvDomainObject domainObject, final GraphQLCodeRegistry.Builder codeRegistryBuilder, final BookmarkService bookmarkService, @@ -70,10 +69,10 @@ public class GqlvDomainObjectMeta { private GraphQLObjectType metaType() { val metaTypeBuilder = newObject().name(domainObject.getLogicalTypeNameSanitized() + "__meta"); - metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.id); - metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.logicalTypeName); + metaTypeBuilder.field(GqlvMeta.Fields.id); + metaTypeBuilder.field(GqlvMeta.Fields.logicalTypeName); if (domainObject.getBeanSort() == BeanSort.ENTITY) { - metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.version); + metaTypeBuilder.field(GqlvMeta.Fields.version); } return metaTypeBuilder.build(); } @@ -84,29 +83,29 @@ public class GqlvDomainObjectMeta { coordinates(domainObject.getGqlObjectType(), getMetaField()), (DataFetcher<Object>) environment -> { return bookmarkService.bookmarkFor(environment.getSource()) - .map(bookmark -> new GqlvMeta(bookmark, bookmarkService, objectManager)) + .map(bookmark -> new org.apache.causeway.viewer.graphql.model.parts.GqlvMeta(bookmark, bookmarkService, objectManager)) .orElse(null); //TODO: is this correct ? }); codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.id), + coordinates(getMetaType(), GqlvMeta.Fields.id), (DataFetcher<Object>) environment -> { - GqlvMeta gqlvMeta = environment.getSource(); + org.apache.causeway.viewer.graphql.model.parts.GqlvMeta gqlvMeta = environment.getSource(); return gqlvMeta.id(); }); codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.logicalTypeName), + coordinates(getMetaType(), GqlvMeta.Fields.logicalTypeName), (DataFetcher<Object>) environment -> { - GqlvMeta gqlvMeta = environment.getSource(); + org.apache.causeway.viewer.graphql.model.parts.GqlvMeta gqlvMeta = environment.getSource(); return gqlvMeta.logicalTypeName(); }); if (domainObject.getBeanSort() == BeanSort.ENTITY) { codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.version), + coordinates(getMetaType(), GqlvMeta.Fields.version), (DataFetcher<Object>) environment -> { - GqlvMeta gqlvMeta = environment.getSource(); + org.apache.causeway.viewer.graphql.model.parts.GqlvMeta gqlvMeta = environment.getSource(); return gqlvMeta.version(); }); } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java similarity index 76% rename from incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java rename to incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java index c64d0cf46b..3632357a4f 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java @@ -10,12 +10,13 @@ import java.util.List; import java.util.Optional; import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; +import org.apache.causeway.viewer.graphql.model.util._LTN; import static graphql.schema.GraphQLObjectType.newObject; -public class GqlvDomainObjectMutators implements GqlvActionHolder { +public class GqlvMutators implements GqlvActionHolder { - private final GqlvDomainObject domainObject; + private final GqlvMutatorsHolder holder; private final GraphQLCodeRegistry.Builder codeRegistryBuilder; final GraphQLObjectType.Builder mutatorsTypeBuilder; @@ -26,14 +27,14 @@ public class GqlvDomainObjectMutators implements GqlvActionHolder { @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private Optional<GraphQLObjectType> mutatorsTypeIfAny; - public GqlvDomainObjectMutators( - final GqlvDomainObject domainObject, + public GqlvMutators( + final GqlvMutatorsHolder holder, final GraphQLCodeRegistry.Builder codeRegistryBuilder ) { - this.domainObject = domainObject; + this.holder = holder; this.codeRegistryBuilder = codeRegistryBuilder; - mutatorsTypeBuilder = newObject().name(this.domainObject.getLogicalTypeNameSanitized() + "__mutators"); + mutatorsTypeBuilder = newObject().name(_LTN.sanitized(this.holder.getObjectSpecification()) + "__mutators"); } @@ -42,7 +43,7 @@ public class GqlvDomainObjectMutators implements GqlvActionHolder { final GraphQLFieldDefinition fieldDefinition) { mutatorsTypeBuilder.field(fieldDefinition); - actions.add(new GqlvAction(domainObject, objectAction, fieldDefinition, codeRegistryBuilder)); + actions.add(new GqlvAction(holder, objectAction, fieldDefinition, codeRegistryBuilder)); } private final List<GqlvAction> actions = new ArrayList<>(); @@ -59,7 +60,7 @@ public class GqlvDomainObjectMutators implements GqlvActionHolder { public Optional<GraphQLObjectType> getMutatorsTypeIfAny() { //noinspection OptionalAssignedToNull if (mutatorsTypeIfAny == null) { - throw new IllegalArgumentException(String.format("Gql MutatorsType has not yet been built for %s", domainObject.getLogicalTypeName())); + throw new IllegalArgumentException(String.format("Gql MutatorsType has not yet been built for %s", holder.getObjectSpecification().getLogicalTypeName())); } return mutatorsTypeIfAny; } @@ -70,7 +71,7 @@ public class GqlvDomainObjectMutators implements GqlvActionHolder { public Optional<GraphQLObjectType> buildMutatorsTypeIfAny() { //noinspection OptionalAssignedToNull if (mutatorsTypeIfAny != null) { - throw new IllegalArgumentException("Gql MutatorsType has already been built for " + domainObject.getLogicalTypeName()); + throw new IllegalArgumentException("Gql MutatorsType has already been built for " + holder.getObjectSpecification().getLogicalTypeName()); } return mutatorsTypeIfAny = hasActions() ? Optional.of(mutatorsTypeBuilder.build()) diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutatorsHolder.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutatorsHolder.java new file mode 100644 index 0000000000..f87df03c4b --- /dev/null +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutatorsHolder.java @@ -0,0 +1,9 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +import graphql.schema.GraphQLObjectType; + +import org.apache.causeway.core.metamodel.spec.ObjectSpecification; + +public interface GqlvMutatorsHolder extends GqlvActionHolder { + ObjectSpecification getObjectSpecification(); +} 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 dba564d034..6a815581b3 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 @@ -172,7 +172,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { final GqlvTopLevelQuery topLevelQueryStructure, final GraphQLCodeRegistry.Builder codeRegistryBuilder) { - val domainService = new GqlvDomainService(objectSpec, service, codeRegistryBuilder, specificationLoader); + val domainService = new GqlvDomainService(objectSpec, service, codeRegistryBuilder); List<ObjectAction> objectActionList = objectSpec.streamRuntimeActions(MixedIn.INCLUDED) .map(ObjectAction.class::cast) @@ -196,7 +196,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { final ObjectSpecification objectSpec, final GraphQLCodeRegistry.Builder codeRegistryBuilder) { - val gqlvDomainObject = new GqlvDomainObject(objectSpec, codeRegistryBuilder, bookmarkService, objectManager, specificationLoader); + val gqlvDomainObject = new GqlvDomainObject(objectSpec, codeRegistryBuilder, bookmarkService, objectManager); gqlvDomainObject.addPropertiesAsFields(); gqlvDomainObject.addCollectionsAsLists();
