graphql.kickstart.execution.config.GraphQLBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of graphql-java-kickstart Show documentation
Show all versions of graphql-java-kickstart Show documentation
relay.js-compatible GraphQL servlet
package graphql.kickstart.execution.config;
import graphql.GraphQL;
import graphql.execution.ExecutionStrategy;
import graphql.execution.instrumentation.ChainedInstrumentation;
import graphql.execution.instrumentation.Instrumentation;
import graphql.execution.instrumentation.SimpleInstrumentation;
import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentation;
import graphql.execution.preparsed.NoOpPreparsedDocumentProvider;
import graphql.execution.preparsed.PreparsedDocumentProvider;
import graphql.schema.GraphQLSchema;
import java.util.function.Supplier;
import lombok.Getter;
public class GraphQLBuilder {
private Supplier executionStrategyProviderSupplier = DefaultExecutionStrategyProvider::new;
private Supplier preparsedDocumentProviderSupplier = () -> NoOpPreparsedDocumentProvider.INSTANCE;
@Getter
private Supplier instrumentationSupplier = () -> SimpleInstrumentation.INSTANCE;
public GraphQLBuilder executionStrategyProvider(Supplier supplier) {
if (supplier != null) {
executionStrategyProviderSupplier = supplier;
}
return this;
}
public GraphQLBuilder preparsedDocumentProvider(Supplier supplier) {
if (supplier != null) {
preparsedDocumentProviderSupplier = supplier;
}
return this;
}
public GraphQLBuilder instrumentation(Supplier supplier) {
if (supplier != null) {
instrumentationSupplier = supplier;
}
return this;
}
public GraphQL build(GraphQLSchemaProvider schemaProvider) {
return build(schemaProvider.getSchema());
}
public GraphQL build(GraphQLSchema schema) {
return build(schema, instrumentationSupplier);
}
public GraphQL build(GraphQLSchema schema, Supplier configuredInstrumentationSupplier) {
ExecutionStrategyProvider executionStrategyProvider = executionStrategyProviderSupplier.get();
ExecutionStrategy queryExecutionStrategy = executionStrategyProvider.getQueryExecutionStrategy();
ExecutionStrategy mutationExecutionStrategy = executionStrategyProvider.getMutationExecutionStrategy();
ExecutionStrategy subscriptionExecutionStrategy = executionStrategyProvider.getSubscriptionExecutionStrategy();
GraphQL.Builder builder = GraphQL.newGraphQL(schema)
.preparsedDocumentProvider(preparsedDocumentProviderSupplier.get());
if (queryExecutionStrategy != null) {
builder.queryExecutionStrategy(queryExecutionStrategy);
}
if (mutationExecutionStrategy != null) {
builder.mutationExecutionStrategy(mutationExecutionStrategy);
}
if (subscriptionExecutionStrategy != null) {
builder.subscriptionExecutionStrategy(subscriptionExecutionStrategy);
}
Instrumentation instrumentation = configuredInstrumentationSupplier.get();
builder.instrumentation(instrumentation);
if (containsDispatchInstrumentation(instrumentation)) {
builder.doNotAddDefaultInstrumentations();
}
return builder.build();
}
private boolean containsDispatchInstrumentation(Instrumentation instrumentation) {
if (instrumentation instanceof ChainedInstrumentation) {
return ((ChainedInstrumentation) instrumentation).getInstrumentations().stream()
.anyMatch(this::containsDispatchInstrumentation);
}
return instrumentation instanceof DataLoaderDispatcherInstrumentation;
}
}