Skip to content

Add new GraphQLDirectiveProvider for custom directives #557

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

Closed
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import graphql.kickstart.servlet.core.GraphQLServletListener;
import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder;
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider;
import graphql.kickstart.servlet.osgi.GraphQLDirectiveProvider;
import graphql.kickstart.servlet.osgi.GraphQLMutationProvider;
import graphql.kickstart.servlet.osgi.GraphQLProvider;
import graphql.kickstart.servlet.osgi.GraphQLQueryProvider;
Expand Down Expand Up @@ -75,6 +76,9 @@ public void bindProvider(GraphQLProvider provider) {
if (provider instanceof GraphQLTypesProvider) {
schemaBuilder.add((GraphQLTypesProvider) provider);
}
if (provider instanceof GraphQLDirectiveProvider) {
schemaBuilder.add((GraphQLDirectiveProvider) provider);
}
if (provider instanceof GraphQLCodeRegistryProvider) {
schemaBuilder.setCodeRegistryProvider((GraphQLCodeRegistryProvider) provider);
}
Expand All @@ -94,6 +98,9 @@ public void unbindProvider(GraphQLProvider provider) {
if (provider instanceof GraphQLTypesProvider) {
schemaBuilder.remove((GraphQLTypesProvider) provider);
}
if (provider instanceof GraphQLDirectiveProvider) {
schemaBuilder.remove((GraphQLDirectiveProvider) provider);
}
if (provider instanceof GraphQLCodeRegistryProvider) {
schemaBuilder.setCodeRegistryProvider(() -> GraphQLCodeRegistry.newCodeRegistry().build());
}
Expand Down Expand Up @@ -144,6 +151,17 @@ public void unbindTypesProvider(GraphQLTypesProvider typesProvider) {
updateSchema();
}

@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public void bindDirectivesProvider(GraphQLDirectiveProvider directiveProvider) {
schemaBuilder.add(directiveProvider);
updateSchema();
}

public void unbindDirectivesProvider(GraphQLDirectiveProvider directiveProvider) {
schemaBuilder.remove(directiveProvider);
updateSchema();
}

@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public void bindServletListener(GraphQLServletListener listener) {
schemaBuilder.add(listener);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
import graphql.kickstart.servlet.input.GraphQLInvocationInputFactory;
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider;
import graphql.kickstart.servlet.osgi.GraphQLFieldProvider;
import graphql.kickstart.servlet.osgi.GraphQLDirectiveProvider;
import graphql.kickstart.servlet.osgi.GraphQLMutationProvider;
import graphql.kickstart.servlet.osgi.GraphQLQueryProvider;
import graphql.kickstart.servlet.osgi.GraphQLSubscriptionProvider;
import graphql.kickstart.servlet.osgi.GraphQLTypesProvider;
import graphql.schema.GraphQLCodeRegistry;
import graphql.schema.GraphQLDirective;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLType;
Expand All @@ -50,6 +52,7 @@ class OsgiSchemaBuilder {
private final List<GraphQLMutationProvider> mutationProviders = new ArrayList<>();
private final List<GraphQLSubscriptionProvider> subscriptionProviders = new ArrayList<>();
private final List<GraphQLTypesProvider> typesProviders = new ArrayList<>();
private final List<GraphQLDirectiveProvider> directiveProviders = new ArrayList<>();
private final List<GraphQLServletListener> listeners = new ArrayList<>();

private GraphQLServletContextBuilder contextBuilder = new DefaultGraphQLServletContextBuilder();
Expand Down Expand Up @@ -103,6 +106,7 @@ private void doUpdateSchema() {
.mutation(buildMutationType())
.subscription(buildSubscriptionType())
.additionalTypes(buildTypes())
.additionalDirectives(buildDirectives())
.codeRegistry(codeRegistryProvider.getCodeRegistry())
.build());
}
Expand Down Expand Up @@ -159,6 +163,13 @@ private GraphQLObjectType buildObjectType(String name, List<GraphQLFieldProvider
return null;
}

private Set<GraphQLDirective> buildDirectives() {
return directiveProviders.stream()
.map(GraphQLDirectiveProvider::getDirectives)
.flatMap(Collection::stream)
.collect(toSet());
}

void add(GraphQLQueryProvider provider) {
queryProviders.add(provider);
}
Expand All @@ -175,6 +186,10 @@ void add(GraphQLTypesProvider provider) {
typesProviders.add(provider);
}

void add(GraphQLDirectiveProvider provider) {
directiveProviders.add(provider);
}

void remove(GraphQLQueryProvider provider) {
queryProviders.remove(provider);
}
Expand All @@ -191,6 +206,10 @@ void remove(GraphQLTypesProvider provider) {
typesProviders.remove(provider);
}

void remove(GraphQLDirectiveProvider provider) {
directiveProviders.remove(provider);
}

GraphQLSchemaServletProvider getSchemaProvider() {
return schemaProvider;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package graphql.kickstart.servlet.osgi;

import graphql.schema.GraphQLDirective;
import java.util.Collection;


public interface GraphQLDirectiveProvider extends GraphQLProvider {

/** @return A collection of directive definitions that will be added to the schema. */
Collection<GraphQLDirective> getDirectives();

}
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,43 @@ class OsgiGraphQLHttpServletSpec extends Specification {
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("Upload")
}

static class TestDirectiveProvider implements GraphQLDirectiveProvider {
@Override
Set<GraphQLDirective> getDirectives() {
return new HashSet<>(Arrays.asList(GraphQLDirective.newDirective().name("myDirective").build()));
}
}

def "directive provider adds directives"() {
setup:
OsgiGraphQLHttpServlet servlet = new OsgiGraphQLHttpServlet()
TestDirectiveProvider directiveProvider = new TestDirectiveProvider()

when:
servlet.bindDirectivesProvider(directiveProvider)

then:
def directive = servlet.configuration.invocationInputFactory.schemaProvider.schema.getDirective("myDirective")
directive != null
directive.name == "myDirective"

when:
servlet.unbindDirectivesProvider(directiveProvider)

then:
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getDirective("myDirective")

when:
servlet.bindProvider(directiveProvider)
then:
servlet.configuration.invocationInputFactory.schemaProvider.schema.getDirective("myDirective").name == "myDirective"

when:
servlet.unbindProvider(directiveProvider)
then:
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("myDirective")
}

def "servlet listener is bound and unbound"() {
setup:
def servlet = new OsgiGraphQLHttpServlet()
Expand Down