Skip to content

Fix #207 added CodeRegistry provider for Osgi servlet #208

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/main/java/graphql/servlet/OsgiGraphQLHttpServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import graphql.servlet.core.DefaultGraphQLRootObjectBuilder;
import graphql.servlet.config.DefaultGraphQLSchemaProvider;
import graphql.servlet.config.ExecutionStrategyProvider;
import graphql.servlet.config.GraphQLCodeRegistryProvider;
import graphql.servlet.context.GraphQLContextBuilder;
import graphql.servlet.core.GraphQLErrorHandler;
import graphql.servlet.config.GraphQLMutationProvider;
Expand Down Expand Up @@ -45,6 +46,7 @@
import graphql.execution.preparsed.PreparsedDocumentProvider;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLType;
import graphql.schema.GraphQLCodeRegistry;

@Component(
service={javax.servlet.http.HttpServlet.class,javax.servlet.Servlet.class},
Expand All @@ -67,6 +69,7 @@ public class OsgiGraphQLHttpServlet extends AbstractGraphQLHttpServlet {
private InstrumentationProvider instrumentationProvider = new NoOpInstrumentationProvider();
private GraphQLErrorHandler errorHandler = new DefaultGraphQLErrorHandler();
private PreparsedDocumentProvider preparsedDocumentProvider = NoOpPreparsedDocumentProvider.INSTANCE;
private GraphQLCodeRegistryProvider codeRegistryProvider = () -> GraphQLCodeRegistry.newCodeRegistry().build();

private GraphQLSchemaProvider schemaProvider;

Expand Down Expand Up @@ -191,6 +194,7 @@ private void doUpdateSchema() {
.mutation(mutationType)
.subscription(subscriptionType)
.additionalTypes(types)
.codeRegistry(codeRegistryProvider.getCodeRegistry())
.build());
}

Expand All @@ -208,6 +212,9 @@ public void bindProvider(GraphQLProvider provider) {
if (provider instanceof GraphQLTypesProvider) {
typesProviders.add((GraphQLTypesProvider) provider);
}
if (provider instanceof GraphQLCodeRegistryProvider) {
codeRegistryProvider = (GraphQLCodeRegistryProvider) provider;
}
updateSchema();
}
public void unbindProvider(GraphQLProvider provider) {
Expand All @@ -223,6 +230,9 @@ public void unbindProvider(GraphQLProvider provider) {
if (provider instanceof GraphQLTypesProvider) {
typesProviders.remove(provider);
}
if (provider instanceof GraphQLCodeRegistryProvider) {
codeRegistryProvider = () -> GraphQLCodeRegistry.newCodeRegistry().build();
}
updateSchema();
}

Expand Down Expand Up @@ -322,6 +332,16 @@ public void unsetPreparsedDocumentProvider(PreparsedDocumentProvider preparsedDo
this.preparsedDocumentProvider = NoOpPreparsedDocumentProvider.INSTANCE;
}

@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy= ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
public void bindCodeRegistryProvider(GraphQLCodeRegistryProvider graphQLCodeRegistryProvider) {
this.codeRegistryProvider = graphQLCodeRegistryProvider;
updateSchema();
}
public void unbindCodeRegistryProvider(GraphQLCodeRegistryProvider graphQLCodeRegistryProvider) {
this.codeRegistryProvider = () -> GraphQLCodeRegistry.newCodeRegistry().build();
updateSchema();
}

public GraphQLContextBuilder getContextBuilder() {
return contextBuilder;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package graphql.servlet.config;

import graphql.schema.GraphQLCodeRegistry;

public interface GraphQLCodeRegistryProvider extends GraphQLProvider {
GraphQLCodeRegistry getCodeRegistry();
}
30 changes: 30 additions & 0 deletions src/test/groovy/graphql/servlet/OsgiGraphQLHttpServletSpec.groovy
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package graphql.servlet

import graphql.AssertException
import graphql.annotations.annotationTypes.GraphQLField
import graphql.annotations.annotationTypes.GraphQLName
import graphql.annotations.processor.GraphQLAnnotations
import graphql.schema.GraphQLCodeRegistry
import graphql.schema.GraphQLFieldDefinition
import graphql.schema.GraphQLInterfaceType
import graphql.servlet.config.GraphQLCodeRegistryProvider
import graphql.servlet.config.GraphQLMutationProvider
import graphql.servlet.config.GraphQLQueryProvider
import graphql.servlet.config.GraphQLSubscriptionProvider
Expand Down Expand Up @@ -122,4 +126,30 @@ class OsgiGraphQLHttpServletSpec extends Specification {
then:
servlet.getSchemaProvider().getSchema().getSubscriptionType() == null
}

static class TestCodeRegistryProvider implements GraphQLCodeRegistryProvider {
@Override
GraphQLCodeRegistry getCodeRegistry() {
return GraphQLCodeRegistry.newCodeRegistry().typeResolver("Type", { env -> null }).build();
}
}

def "code registry provider adds type resolver"() {
setup:
OsgiGraphQLHttpServlet servlet = new OsgiGraphQLHttpServlet()
TestCodeRegistryProvider codeRegistryProvider = new TestCodeRegistryProvider()

when:
servlet.bindCodeRegistryProvider(codeRegistryProvider)
servlet.getSchemaProvider().getSchema().getCodeRegistry().getTypeResolver(GraphQLInterfaceType.newInterface().name("Type").build())
then:
notThrown AssertException

when:
servlet.unbindCodeRegistryProvider(codeRegistryProvider)
servlet.getSchemaProvider().getSchema().getCodeRegistry().getTypeResolver(GraphQLInterfaceType.newInterface().name("Type").build())
then:
thrown AssertException

}
}