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.
This commit is contained in:
rstoyanchev
2024-05-02 17:01:33 +01:00
parent 0748a129dc
commit 79854ec036
4 changed files with 28 additions and 21 deletions

View File

@@ -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<Class<?>, 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);

View File

@@ -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<Class<?>, String> mappings) {
return new MappingClassResolver(mappings);
}
}
@@ -415,8 +411,8 @@ public final class SchemaMappingInspector {
private final MultiValueMap<String, Class<?>> map = new LinkedMultiValueMap<>();
void addMapping(String typeName, Class<?> clazz) {
this.map.add(typeName, clazz);
MappingClassResolver(Map<Class<?>, String> mappings) {
mappings.forEach((key, value) -> this.map.add(value, key));
}
@Override

View File

@@ -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)

View File

@@ -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)