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 584912817e006fe2f34f0ef1ba8bcc6469696521 Author: danhaywood <[email protected]> AuthorDate: Sun Feb 11 15:27:55 2024 +0000 CAUSEWAY-3676: further refactors --- .../graphql/model/domain/GqlvDomainObject.java | 19 ++++++++ .../integration/GraphQlSourceForCauseway.java | 12 ++--- .../graphql/viewer/toplevel/GqlvTopLevelQuery.java | 54 ++++++++-------------- 3 files changed, 43 insertions(+), 42 deletions(-) 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 10c1ab2491..997f780cd8 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 @@ -24,10 +24,12 @@ import java.util.TreeMap; import graphql.Scalars; import graphql.schema.FieldCoordinates; +import graphql.schema.GraphQLArgument; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLInputObjectType; import graphql.schema.GraphQLObjectType; +import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLInputObjectField.newInputObjectField; import static graphql.schema.GraphQLInputObjectType.newInputObject; import static graphql.schema.GraphQLNonNull.nonNull; @@ -91,6 +93,23 @@ public class GqlvDomainObject implements GqlvAction.Holder, GqlvProperty.Holder, addMembers(); } + public GraphQLFieldDefinition getField() { + val lookupConfig = this.context.causewayConfiguration.getViewer().getGraphql().getLookup(); + ObjectSpecification objectSpec = getObjectSpecification(); + return newFieldDefinition() + .name(String.format("%s%s%s", + lookupConfig.getFieldNamePrefix(), // eg "_gqlv_lookup__" + TypeNames.objectTypeNameFor(objectSpec), + lookupConfig.getFieldNameSuffix()) // eg "" + ) + .type(this.context.typeMapper.outputTypeFor(objectSpec)) + .argument(GraphQLArgument.newArgument() + .name(lookupConfig.getArgument()) // eg "object" + .type(getGqlInputObjectType()) + .build()) + .build(); + } + public void addTypesInto(GraphQLTypeRegistry graphQLTypeRegistry) { gqlObjectType = gqlObjectTypeBuilder.build(); graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlObjectType); 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 e2d6773dc3..86a1b923e8 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,22 +18,18 @@ */ package org.apache.causeway.viewer.graphql.viewer.integration; -import java.util.Comparator; +import java.util.ArrayList; import java.util.LinkedHashMap; import javax.annotation.PostConstruct; import javax.inject.Inject; -import org.apache.causeway.commons.functional.Either; -import org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; -import org.apache.causeway.core.metamodel.spec.feature.MixedIn; import org.apache.causeway.viewer.graphql.viewer.toplevel.GqlvTopLevelMutation; import org.springframework.graphql.execution.GraphQlSource; import org.springframework.stereotype.Service; -import org.apache.causeway.applib.id.HasLogicalType; import org.apache.causeway.applib.services.bookmark.BookmarkService; import org.apache.causeway.applib.services.registry.ServiceRegistry; import org.apache.causeway.core.config.CausewayConfiguration; @@ -111,6 +107,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { // domain objects val domainObjects = new LinkedHashMap<ObjectSpecification, GqlvDomainObject>(); + val domainObjectList = new ArrayList<GqlvDomainObject>(); context.objectSpecifications().forEach(objectSpec -> { switch (objectSpec.getBeanSort()) { @@ -122,6 +119,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { domainObject.addTypesInto(graphQLTypeRegistry); domainObject.addDataFetchers(); + domainObjectList.add(domainObject); domainObjects.put(objectSpec, domainObject); break; @@ -129,7 +127,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { }); // top-level query type and (dependent on configuration) the top-level mutation type - val topLevelQuery = new GqlvTopLevelQuery(context, domainObjects); + val topLevelQuery = new GqlvTopLevelQuery(context, domainObjectList); val topLevelMutation = @@ -143,7 +141,7 @@ public class GraphQlSourceForCauseway implements GraphQlSource { // build the schema val schemaBuilder = GraphQLSchema.newSchema() - .query(topLevelQuery.getQueryType()) + .query(topLevelQuery.getObjectType()) .additionalTypes(graphQLTypeRegistry.getGraphQLTypes()) .codeRegistry(codeRegistry); if (topLevelMutation != null) { 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 e8a4c3487b..f8dd4cbd35 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 @@ -2,10 +2,8 @@ package org.apache.causeway.viewer.graphql.viewer.toplevel; import java.util.ArrayList; import java.util.List; -import java.util.Map; import graphql.schema.DataFetcher; -import graphql.schema.DataFetchingEnvironment; import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLArgument; import graphql.schema.GraphQLFieldDefinition; @@ -30,18 +28,19 @@ public class GqlvTopLevelQuery implements GqlvDomainService.Holder { private final List<GqlvDomainService> domainServices = new ArrayList<>(); private final Context context; + private final List<GqlvDomainObject> domainObjects; - @Getter private final GraphQLObjectType queryType; + @Getter private final GraphQLObjectType objectType; public GqlvTopLevelQuery( final Context context, - final Map<ObjectSpecification, GqlvDomainObject> domainObjects) { + final List<GqlvDomainObject> domainObjects) { this.context = context; + this.domainObjects = domainObjects; this.objectTypeBuilder = newObject().name("Query"); - // add services to top-level query context.objectSpecifications().forEach(objectSpec -> { switch (objectSpec.getBeanSort()) { @@ -67,9 +66,12 @@ public class GqlvTopLevelQuery implements GqlvDomainService.Holder { }); // add lookup to top-level query - domainObjects.forEach(this::addLookupFor); + for (GqlvDomainObject domainObject : this.domainObjects) { + addField(domainObject.getField()); + } + - queryType = objectTypeBuilder.build(); + objectType = objectTypeBuilder.build(); } @@ -96,36 +98,18 @@ public class GqlvTopLevelQuery implements GqlvDomainService.Holder { domainService.addDataFetchers(); } }); - } - public void addLookupFor( - final ObjectSpecification objectSpec, - final GqlvDomainObject domainObject) { - val lookupConfig = context.causewayConfiguration.getViewer().getGraphql().getLookup(); - val field = newFieldDefinition() - .name(String.format("%s%s%s", - lookupConfig.getFieldNamePrefix(), // eg "_gqlv_lookup__" - TypeNames.objectTypeNameFor(objectSpec), - lookupConfig.getFieldNameSuffix()) // eg "" - ) - .type(context.typeMapper.outputTypeFor(objectSpec)) - .argument(GraphQLArgument.newArgument() - .name(lookupConfig.getArgument()) // eg "object" - .type(domainObject.getGqlInputObjectType()) - .build()) - .build(); - addField(field); - - context.codeRegistryBuilder.dataFetcher( - coordinatesFor(field), - (DataFetcher<Object>) environment -> lookup(objectSpec, environment)); - - } + domainObjects.forEach(domainObject -> { + ObjectSpecification objectSpec = domainObject.getObjectSpecification(); + this.context.codeRegistryBuilder.dataFetcher( + coordinatesFor(domainObject.getField()), + (DataFetcher<Object>) environment -> { + Object target = environment.getArgument("object"); + return GqlvAction.asPojo(objectSpec, target, this.context.bookmarkService) + .orElse(null); + }); + }); - private Object lookup(ObjectSpecification objectSpec, DataFetchingEnvironment dataFetchingEnvironment) { - Object target = dataFetchingEnvironment.getArgument("object"); - return GqlvAction.asPojo(objectSpec, target, context.bookmarkService) - .orElse(null); }
