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 90c7d99815a1af0ba74b3cb03c0211bc383ce209 Author: danhaywood <[email protected]> AuthorDate: Sun Feb 11 16:15:31 2024 +0000 CAUSEWAY-3676: further refactorings --- .../viewer/graphql/model/context/Context.java | 5 +++ .../graphql/model/domain/GqlvDomainObject.java | 22 +++++----- .../viewer/graphql/model/domain/GqlvMeta.java | 47 +++++++++++----------- .../integration/GraphQlSourceForCauseway.java | 7 +--- .../graphql/viewer/toplevel/GqlvTopLevelQuery.java | 12 +----- 5 files changed, 43 insertions(+), 50 deletions(-) diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java index 0a9ffe1fbc..aeced311fe 100644 --- a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java +++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java @@ -27,9 +27,11 @@ import org.apache.causeway.commons.collections.ImmutableEnumSet; import org.apache.causeway.commons.functional.Either; import org.apache.causeway.core.config.CausewayConfiguration; import org.apache.causeway.core.config.environment.CausewaySystemEnvironment; +import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; import org.apache.causeway.core.metamodel.spec.ActionScope; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; 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 lombok.RequiredArgsConstructor; @@ -39,6 +41,7 @@ import java.util.List; @RequiredArgsConstructor public class Context { + public final GraphQLCodeRegistry.Builder codeRegistryBuilder; public final BookmarkService bookmarkService; public final SpecificationLoader specificationLoader; @@ -46,6 +49,8 @@ public class Context { public final ServiceRegistry serviceRegistry; public final CausewayConfiguration causewayConfiguration; public final CausewaySystemEnvironment causewaySystemEnvironment; + public final ObjectManager objectManager; + public final GraphQLTypeRegistry graphQLTypeRegistry; public ImmutableEnumSet<ActionScope> getActionScope() { return causewaySystemEnvironment.getDeploymentType().isProduction() diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java index 7595c0fefb..11016e04b6 100644 --- a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java +++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java @@ -36,7 +36,6 @@ import static graphql.schema.GraphQLInputObjectType.newInputObject; import static graphql.schema.GraphQLNonNull.nonNull; import static graphql.schema.GraphQLObjectType.newObject; -import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; import org.apache.causeway.core.metamodel.spec.ActionScope; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.spec.feature.MixedIn; @@ -54,8 +53,9 @@ import lombok.val; public class GqlvDomainObject implements GqlvAction.Holder, GqlvProperty.Holder, GqlvCollection.Holder, GqlvMeta.Holder { - private final Holder holder; @Getter private final ObjectSpecification objectSpecification; + + private final Holder holder; private final Context context; @Getter @@ -69,16 +69,14 @@ public class GqlvDomainObject private final SortedMap<String, GqlvCollection> collections = new TreeMap<>(); private final Map<String, GqlvAction> actions = new TreeMap<>(); - private GraphQLObjectType gqlObjectType; + private GraphQLObjectType objectType; @Getter private final GraphQLInputObjectType gqlInputObjectType; public GqlvDomainObject( final GqlvDomainObject.Holder holder, final ObjectSpecification objectSpecification, - final Context context, - final ObjectManager objectManager, - final GraphQLTypeRegistry graphQLTypeRegistry) { + final Context context) { this.holder = holder; this.objectSpecification = objectSpecification; @@ -86,7 +84,7 @@ public class GqlvDomainObject this.gqlObjectTypeBuilder = newObject().name(TypeNames.objectTypeNameFor(objectSpecification)); - this.meta = new GqlvMeta(this, context, objectManager); + this.meta = new GqlvMeta(this, context); GraphQLInputObjectType.Builder inputTypeBuilder = newInputObject().name(TypeNames.inputTypeNameFor(objectSpecification)); inputTypeBuilder @@ -100,10 +98,10 @@ public class GqlvDomainObject addMembers(); - gqlObjectType = gqlObjectTypeBuilder.build(); - graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlObjectType); - meta.registerTypesInto(graphQLTypeRegistry); - graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlInputObjectType); + objectType = gqlObjectTypeBuilder.build(); + + context.graphQLTypeRegistry.addTypeIfNotAlreadyPresent(objectType); + context.graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlInputObjectType); } @@ -183,7 +181,7 @@ public class GqlvDomainObject @Override public FieldCoordinates coordinatesFor(final GraphQLFieldDefinition fieldDefinition) { - return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition); + return FieldCoordinates.coordinates(objectType, fieldDefinition); } diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java index c8a6482f79..bf0c5f2e1a 100644 --- a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java +++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java @@ -38,7 +38,6 @@ import org.apache.causeway.core.metamodel.facets.object.entity.EntityFacet; import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; import org.apache.causeway.viewer.graphql.model.context.Context; import org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider; -import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry; import lombok.Getter; import lombok.val; @@ -52,60 +51,62 @@ public class GqlvMeta { private final Holder holder; private final Context context; - private final ObjectManager objectManager; - @Getter private final GraphQLFieldDefinition metaField; + private final GraphQLObjectType objectType; + + @Getter private final GraphQLFieldDefinition field; public GqlvMeta( final Holder holder, - final Context context, - final ObjectManager objectManager + final Context context ) { this.holder = holder; this.context = context; - this.objectManager = objectManager; // we can build the metafield and meta type eagerly because we know exactly which fields it has. - val metaTypeBuilder = newObject().name(TypeNames.metaTypeNameFor(this.holder.getObjectSpecification())); - metaTypeBuilder.field(id); - metaTypeBuilder.field(logicalTypeName); + val objectTypeBuilder = newObject().name(TypeNames.metaTypeNameFor(this.holder.getObjectSpecification())); + + objectTypeBuilder.field(id); + objectTypeBuilder.field(logicalTypeName); if (this.holder.getObjectSpecification().getBeanSort() == BeanSort.ENTITY) { - metaTypeBuilder.field(version); + objectTypeBuilder.field(version); } - metaField = newFieldDefinition().name(context.causewayConfiguration.getViewer().getGraphql().getMetaData().getFieldName()).type(metaTypeBuilder.build()).build(); - holder.addField(metaField); - } + val fieldName = context.causewayConfiguration.getViewer().getGraphql().getMetaData().getFieldName(); - GraphQLObjectType getMetaType() { - return (GraphQLObjectType) metaField.getType(); - } + this.objectType = objectTypeBuilder.build(); + field = newFieldDefinition() + .name(fieldName) + .type(objectType) + .build(); + + holder.addField(field); - void registerTypesInto(GraphQLTypeRegistry graphQLTypeRegistry) { - graphQLTypeRegistry.addTypeIfNotAlreadyPresent(getMetaType()); + context.graphQLTypeRegistry.addTypeIfNotAlreadyPresent(objectType); } + public void addDataFetchers() { context.codeRegistryBuilder.dataFetcher( - holder.coordinatesFor(getMetaField()), + holder.coordinatesFor(getField()), (DataFetcher<Object>) environment -> context.bookmarkService.bookmarkFor(environment.getSource()) - .map(bookmark -> new Fetcher(bookmark, context.bookmarkService, objectManager)) + .map(bookmark -> new Fetcher(bookmark, context.bookmarkService, context.objectManager)) .orElseThrow()); context.codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), logicalTypeName), + coordinates(objectType, logicalTypeName), (DataFetcher<Object>) environment -> environment.<Fetcher>getSource().logicalTypeName()); context.codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), id), + coordinates(objectType, id), (DataFetcher<Object>) environment -> environment.<Fetcher>getSource().id()); if (holder.getObjectSpecification().getBeanSort() == BeanSort.ENTITY) { context.codeRegistryBuilder.dataFetcher( - coordinates(getMetaType(), version), + coordinates(objectType, version), (DataFetcher<Object>) environment -> environment.<Fetcher>getSource().version()); } } diff --git a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java index 0c0c4c0420..c2827adf8a 100644 --- a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java +++ b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java @@ -18,8 +18,6 @@ */ package org.apache.causeway.viewer.graphql.viewer.integration; -import java.util.ArrayList; - import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -37,7 +35,6 @@ import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; import org.apache.causeway.viewer.graphql.model.types.TypeMapper; import org.apache.causeway.viewer.graphql.model.context.Context; -import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainObject; import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry; import org.apache.causeway.viewer.graphql.viewer.toplevel.GqlvTopLevelQuery; @@ -101,10 +98,10 @@ public class GraphQlSourceForCauseway implements GraphQlSource { } val codeRegistryBuilder = GraphQLCodeRegistry.newCodeRegistry(); - val context = new Context(codeRegistryBuilder, bookmarkService, specificationLoader, typeMapper, serviceRegistry, causewayConfiguration, causewaySystemEnvironment); + val context = new Context(codeRegistryBuilder, bookmarkService, specificationLoader, typeMapper, serviceRegistry, causewayConfiguration, causewaySystemEnvironment, objectManager, graphQLTypeRegistry); // top-level query and mutation type - val topLevelQuery = new GqlvTopLevelQuery(context, objectManager, graphQLTypeRegistry); + val topLevelQuery = new GqlvTopLevelQuery(context); val topLevelMutation = causewayConfiguration.getViewer().getGraphql().getApiVariant() == CausewayConfiguration.Viewer.Graphql.ApiVariant.QUERY_AND_MUTATIONS ? new GqlvTopLevelMutation(context) diff --git a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java index 53f87e4887..693996f8bb 100644 --- a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java +++ b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java @@ -9,15 +9,12 @@ import graphql.schema.GraphQLObjectType; import static graphql.schema.GraphQLObjectType.newObject; -import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.viewer.graphql.model.context.Context; import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainObject; import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainService; -import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry; import lombok.Getter; -import lombok.val; public class GqlvTopLevelQuery implements GqlvDomainService.Holder, GqlvDomainObject.Holder { @@ -28,14 +25,9 @@ public class GqlvTopLevelQuery implements GqlvDomainService.Holder, GqlvDomainOb private final List<GqlvDomainService> domainServices = new ArrayList<>(); private final List<GqlvDomainObject> domainObjects = new ArrayList<>(); - private final Context context; - public GqlvTopLevelQuery( - final Context context, - final ObjectManager objectManager, - final GraphQLTypeRegistry graphQLTypeRegistry) { + public GqlvTopLevelQuery(final Context context) { - this.context = context; this.objectTypeBuilder = newObject().name(OBJECT_TYPE_NAME); context.objectSpecifications().forEach(objectSpec -> { @@ -45,7 +37,7 @@ public class GqlvTopLevelQuery implements GqlvDomainService.Holder, GqlvDomainOb case VIEW_MODEL: // @DomainObject(nature=VIEW_MODEL) case ENTITY: // @DomainObject(nature=ENTITY) - domainObjects.add(new GqlvDomainObject(this, objectSpec, context, objectManager, graphQLTypeRegistry)); + domainObjects.add(new GqlvDomainObject(this, objectSpec, context)); break; }
