From 79854ec0369fb30971223e1b8d8d866181b8f5d7 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 2 May 2024 17:01:33 +0100 Subject: [PATCH] Minor update related to schema inspection The change updates the registration of explicit mappings from any registered ClassNameTypeResolver's. 1. Check if there are any explicit mappings 2. Check all TypeResolver's Also, change factory method to make it more clear that all it needs from a ClassNameTypeResolver are the explicit mappings. --- ...ultSchemaResourceGraphQlSourceBuilder.java | 29 +++++++++++++------ .../execution/SchemaMappingInspector.java | 16 ++++------ .../SchemaMappingInspectorInterfaceTests.java | 2 +- .../SchemaMappingInspectorUnionTests.java | 2 +- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java index 1224546f..99d79115 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java @@ -166,15 +166,8 @@ final class DefaultSchemaResourceGraphQlSourceBuilder // visitors may transform the schema, for example to add Connection types. if (this.schemaReportConsumer != null) { - this.schemaReportRunner = (schema) -> { - SchemaMappingInspector.Initializer initializer = SchemaMappingInspector.initializer(); - if (this.typeResolver instanceof ClassNameTypeResolver cntr) { - initializer.classResolver(SchemaMappingInspector.ClassResolver.fromClassNameTypeResolver(cntr)); - } - this.inspectorInitializerConsumer.accept(initializer); - SchemaReport report = initializer.inspect(schema, runtimeWiring.getDataFetchers()); - this.schemaReportConsumer.accept(report); - }; + this.schemaReportRunner = (schema) -> + this.schemaReportConsumer.accept(createSchemaReport(schema, runtimeWiring)); } return (this.schemaFactory != null) ? @@ -239,6 +232,24 @@ final class DefaultSchemaResourceGraphQlSourceBuilder return (this.typeResolver != null) ? this.typeResolver : new ClassNameTypeResolver(); } + private SchemaReport createSchemaReport(GraphQLSchema schema, RuntimeWiring runtimeWiring) { + SchemaMappingInspector.Initializer initializer = SchemaMappingInspector.initializer(); + + // Add explicit mappings from ClassNameTypeResolver's + runtimeWiring.getTypeResolvers().values().stream().distinct().forEach((resolver) -> { + if (resolver instanceof ClassNameTypeResolver cntr) { + Map, String> mappings = cntr.getMappings(); + if (!mappings.isEmpty()) { + initializer.classResolver(SchemaMappingInspector.ClassResolver.create(mappings)); + } + } + }); + + this.inspectorInitializerConsumer.accept(initializer); + + return initializer.inspect(schema, runtimeWiring.getDataFetchers()); + } + @Override protected void applyGraphQlConfigurers(GraphQL.Builder builder) { super.applyGraphQlConfigurers(builder); diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java index 2024f983..259c452b 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java @@ -362,16 +362,12 @@ public final class SchemaMappingInspector { /** - * Create a resolver by re-using the explicit, reverse mappings of - * {@link ClassNameTypeResolver}. - * @param resolver the type resolver using class names + * Create a resolver from the given mappings. + * @param mappings from Class to GraphQL type name */ - static ClassResolver fromClassNameTypeResolver(ClassNameTypeResolver resolver) { - MappingClassResolver mappingResolver = new MappingClassResolver(); - resolver.getMappings().forEach((key, value) -> mappingResolver.addMapping(value, key)); - return mappingResolver; + static ClassResolver create(Map, String> mappings) { + return new MappingClassResolver(mappings); } - } @@ -415,8 +411,8 @@ public final class SchemaMappingInspector { private final MultiValueMap> map = new LinkedMultiValueMap<>(); - void addMapping(String typeName, Class clazz) { - this.map.add(typeName, clazz); + MappingClassResolver(Map, String> mappings) { + mappings.forEach((key, value) -> this.map.add(value, key)); } @Override diff --git a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java index f8cd6a33..d5deaeeb 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java @@ -106,7 +106,7 @@ public class SchemaMappingInspectorInterfaceTests extends SchemaMappingInspector typeResolver.addMapping(CarImpl.class, "Car"); SchemaReport report = inspectSchema(schema, - initializer -> initializer.classResolver(ClassResolver.fromClassNameTypeResolver(typeResolver)), + initializer -> initializer.classResolver(ClassResolver.create(typeResolver.getMappings())), VehicleController.class); assertThatReport(report) diff --git a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java index 32350a1f..49cb350a 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java @@ -120,7 +120,7 @@ public class SchemaMappingInspectorUnionTests extends SchemaMappingInspectorTest typeResolver.addMapping(PhotoImpl.class, "Photo"); SchemaReport report = inspectSchema(schema, - initializer -> initializer.classResolver(ClassResolver.fromClassNameTypeResolver(typeResolver)), + initializer -> initializer.classResolver(ClassResolver.create(typeResolver.getMappings())), SearchController.class); assertThatReport(report)