From d5b446d851c41e280a1316cf564eeb22b1cef419 Mon Sep 17 00:00:00 2001 From: ksrinivasan Date: Mon, 15 Jan 2024 11:02:19 -0800 Subject: [PATCH 1/2] Inject schema resources from spring-graphql into DgsSchemaProvider. --- .../dgs/autoconfig/DgsAutoConfiguration.kt | 2 +- .../springgraphql/DgsGraphQLSourceBuilder.kt | 23 ++++++------------- .../graphql/dgs/internal/DgsSchemaProvider.kt | 10 ++++++-- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt index 0a303e26f..94ec9046f 100644 --- a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt +++ b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt @@ -236,7 +236,7 @@ open class DgsAutoConfiguration( @Bean @ConditionalOnMissingBean open fun schema(dgsSchemaProvider: DgsSchemaProvider, fieldVisibility: GraphqlFieldVisibility): GraphQLSchema { - return dgsSchemaProvider.schema(null, fieldVisibility) + return dgsSchemaProvider.schema(null, null, fieldVisibility) } @Bean diff --git a/graphql-dgs-spring-graphql/src/main/kotlin/com/netflix/graphql/dgs/springgraphql/DgsGraphQLSourceBuilder.kt b/graphql-dgs-spring-graphql/src/main/kotlin/com/netflix/graphql/dgs/springgraphql/DgsGraphQLSourceBuilder.kt index c35f536e8..e98a4e34b 100644 --- a/graphql-dgs-spring-graphql/src/main/kotlin/com/netflix/graphql/dgs/springgraphql/DgsGraphQLSourceBuilder.kt +++ b/graphql-dgs-spring-graphql/src/main/kotlin/com/netflix/graphql/dgs/springgraphql/DgsGraphQLSourceBuilder.kt @@ -21,26 +21,15 @@ import com.netflix.graphql.dgs.internal.DgsSchemaProvider import graphql.GraphQL import graphql.execution.instrumentation.ChainedInstrumentation import graphql.execution.instrumentation.Instrumentation -import graphql.schema.GraphQLCodeRegistry -import graphql.schema.GraphQLSchema +import graphql.schema.* import graphql.schema.GraphQLSchema.BuilderWithoutTypes -import graphql.schema.GraphQLTypeVisitor -import graphql.schema.SchemaTransformer -import graphql.schema.SchemaTraverser -import graphql.schema.TypeResolver import graphql.schema.idl.RuntimeWiring import graphql.schema.idl.TypeDefinitionRegistry import org.springframework.core.io.Resource -import org.springframework.graphql.execution.ContextDataFetcherDecorator -import org.springframework.graphql.execution.DataFetcherExceptionResolver -import org.springframework.graphql.execution.GraphQlSource +import org.springframework.graphql.execution.* import org.springframework.graphql.execution.GraphQlSource.SchemaResourceBuilder -import org.springframework.graphql.execution.RuntimeWiringConfigurer -import org.springframework.graphql.execution.SchemaReport -import org.springframework.graphql.execution.SubscriptionExceptionResolver -import org.springframework.graphql.execution.TypeDefinitionConfigurer -import org.springframework.graphql.execution.TypeVisitorHelper import org.springframework.lang.Nullable +import java.util.* import java.util.function.BiFunction import java.util.function.Consumer @@ -48,6 +37,7 @@ class DgsGraphQLSourceBuilder(private val dgsSchemaProvider: DgsSchemaProvider, private val typeDefinitionConfigurers = mutableListOf() private val runtimeWiringConfigurers = mutableListOf() + private val schemaResources: Set = LinkedHashSet() private val exceptionResolvers = mutableListOf() private val subscriptionExceptionResolvers = mutableListOf() private val typeVisitors = mutableListOf() @@ -96,7 +86,7 @@ class DgsGraphQLSourceBuilder(private val dgsSchemaProvider: DgsSchemaProvider, } fun reload(): GraphQlSource { - var schema: GraphQLSchema = dgsSchemaProvider.schema() + var schema: GraphQLSchema = dgsSchemaProvider.schema(schemaResources = schemaResources) val schemaTransformer = SchemaTransformer() typeVisitorsToTransformSchema.forEach { schemaTransformer.transform(schema, it) @@ -144,7 +134,8 @@ class DgsGraphQLSourceBuilder(private val dgsSchemaProvider: DgsSchemaProvider, } override fun schemaResources(vararg resources: Resource?): SchemaResourceBuilder { - throw IllegalStateException("Setting schema resources in this builder is not supported - DGS SchemaProvider is already handling schema loading") + schemaResources.plus(listOf(*resources)) + return this } override fun configureTypeDefinitions(configurer: TypeDefinitionConfigurer): SchemaResourceBuilder { diff --git a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt index 7aa0bd793..cfb84f420 100644 --- a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt +++ b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt @@ -143,17 +143,18 @@ class DgsSchemaProvider( fun schema( @Language("GraphQL") schema: String? = null, + schemaResources: Set? = null, fieldVisibility: GraphqlFieldVisibility = DefaultGraphqlFieldVisibility.DEFAULT_FIELD_VISIBILITY ): GraphQLSchema { schemaReadWriteLock.write { dataFetchers.clear() dataFetcherTracingInstrumentationEnabled.clear() dataFetcherMetricsInstrumentationEnabled.clear() - return computeSchema(schema, fieldVisibility) + return computeSchema(schema, schemaResources, fieldVisibility) } } - private fun computeSchema(schema: String? = null, fieldVisibility: GraphqlFieldVisibility): GraphQLSchema { + private fun computeSchema(schema: String? = null, schemaResources: Set? = emptySet(), fieldVisibility: GraphqlFieldVisibility): GraphQLSchema { val startTime = System.currentTimeMillis() val dgsComponents = applicationContext.getBeansWithAnnotation().values.let { beans -> if (componentFilter != null) beans.filter(componentFilter) else beans @@ -171,6 +172,11 @@ class DgsSchemaProvider( // the source files aren't newline-terminated. readerBuilder.reader("\n".reader(), "newline") } + if (schemaResources != null) { + for (resource in schemaResources) { + readerBuilder.reader(resource.inputStream.reader(), resource.filename) + } + } SchemaParser().parse(readerBuilder.build()) } else { SchemaParser().parse(schema) From 816572a9ad4f0cb4e52f5014c9372f630496af2f Mon Sep 17 00:00:00 2001 From: ksrinivasan Date: Mon, 15 Jan 2024 15:19:25 -0800 Subject: [PATCH 2/2] Minor fixes. --- .../dgs/autoconfig/DgsAutoConfiguration.kt | 2 +- .../graphql/dgs/internal/DgsSchemaProvider.kt | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt index 94ec9046f..0a303e26f 100644 --- a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt +++ b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt @@ -236,7 +236,7 @@ open class DgsAutoConfiguration( @Bean @ConditionalOnMissingBean open fun schema(dgsSchemaProvider: DgsSchemaProvider, fieldVisibility: GraphqlFieldVisibility): GraphQLSchema { - return dgsSchemaProvider.schema(null, null, fieldVisibility) + return dgsSchemaProvider.schema(null, fieldVisibility) } @Bean diff --git a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt index cfb84f420..6e91f02dd 100644 --- a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt +++ b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt @@ -143,18 +143,18 @@ class DgsSchemaProvider( fun schema( @Language("GraphQL") schema: String? = null, - schemaResources: Set? = null, - fieldVisibility: GraphqlFieldVisibility = DefaultGraphqlFieldVisibility.DEFAULT_FIELD_VISIBILITY + fieldVisibility: GraphqlFieldVisibility = DefaultGraphqlFieldVisibility.DEFAULT_FIELD_VISIBILITY, + schemaResources: Set = emptySet() ): GraphQLSchema { schemaReadWriteLock.write { dataFetchers.clear() dataFetcherTracingInstrumentationEnabled.clear() dataFetcherMetricsInstrumentationEnabled.clear() - return computeSchema(schema, schemaResources, fieldVisibility) + return computeSchema(schema, fieldVisibility, schemaResources) } } - private fun computeSchema(schema: String? = null, schemaResources: Set? = emptySet(), fieldVisibility: GraphqlFieldVisibility): GraphQLSchema { + private fun computeSchema(schema: String? = null, fieldVisibility: GraphqlFieldVisibility, schemaResources: Set = emptySet()): GraphQLSchema { val startTime = System.currentTimeMillis() val dgsComponents = applicationContext.getBeansWithAnnotation().values.let { beans -> if (componentFilter != null) beans.filter(componentFilter) else beans @@ -172,10 +172,9 @@ class DgsSchemaProvider( // the source files aren't newline-terminated. readerBuilder.reader("\n".reader(), "newline") } - if (schemaResources != null) { - for (resource in schemaResources) { - readerBuilder.reader(resource.inputStream.reader(), resource.filename) - } + + for (resource in schemaResources) { + readerBuilder.reader(resource.inputStream.reader(), resource.filename) } SchemaParser().parse(readerBuilder.build()) } else {