Skip to content

Commit eb553e6

Browse files
committed
Add new GraphQLDirectiveProvider for building/verifying custom directive defs in schema (#2)
1 parent 57b70ba commit eb553e6

File tree

4 files changed

+86
-0
lines changed

4 files changed

+86
-0
lines changed

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/OsgiGraphQLHttpServlet.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder;
1717
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider;
1818
import graphql.kickstart.servlet.osgi.GraphQLConfigurationProvider;
19+
import graphql.kickstart.servlet.osgi.GraphQLDirectiveProvider;
1920
import graphql.kickstart.servlet.osgi.GraphQLMutationProvider;
2021
import graphql.kickstart.servlet.osgi.GraphQLProvider;
2122
import graphql.kickstart.servlet.osgi.GraphQLQueryProvider;
@@ -85,6 +86,9 @@ public void bindProvider(GraphQLProvider provider) {
8586
if (provider instanceof GraphQLTypesProvider) {
8687
schemaBuilder.add((GraphQLTypesProvider) provider);
8788
}
89+
if (provider instanceof GraphQLDirectiveProvider) {
90+
schemaBuilder.add((GraphQLDirectiveProvider) provider);
91+
}
8892
if (provider instanceof GraphQLCodeRegistryProvider) {
8993
schemaBuilder.setCodeRegistryProvider((GraphQLCodeRegistryProvider) provider);
9094
}
@@ -108,6 +112,9 @@ public void unbindProvider(GraphQLProvider provider) {
108112
if (provider instanceof GraphQLTypesProvider) {
109113
schemaBuilder.remove((GraphQLTypesProvider) provider);
110114
}
115+
if (provider instanceof GraphQLDirectiveProvider) {
116+
schemaBuilder.remove((GraphQLDirectiveProvider) provider);
117+
}
111118
if (provider instanceof GraphQLCodeRegistryProvider) {
112119
schemaBuilder.setCodeRegistryProvider(() -> GraphQLCodeRegistry.newCodeRegistry().build());
113120
}
@@ -161,6 +168,17 @@ public void unbindTypesProvider(GraphQLTypesProvider typesProvider) {
161168
updateSchema();
162169
}
163170

171+
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
172+
public void bindDirectivesProvider(GraphQLDirectiveProvider directiveProvider) {
173+
schemaBuilder.add(directiveProvider);
174+
updateSchema();
175+
}
176+
177+
public void unbindDirectivesProvider(GraphQLDirectiveProvider directiveProvider) {
178+
schemaBuilder.remove(directiveProvider);
179+
updateSchema();
180+
}
181+
164182
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
165183
public void bindServletListener(GraphQLServletListener listener) {
166184
schemaBuilder.add(listener);

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/OsgiSchemaBuilder.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@
2525
import graphql.kickstart.servlet.input.GraphQLInvocationInputFactory;
2626
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider;
2727
import graphql.kickstart.servlet.osgi.GraphQLConfigurationProvider;
28+
import graphql.kickstart.servlet.osgi.GraphQLDirectiveProvider;
2829
import graphql.kickstart.servlet.osgi.GraphQLMutationProvider;
2930
import graphql.kickstart.servlet.osgi.GraphQLQueryProvider;
3031
import graphql.kickstart.servlet.osgi.GraphQLSubscriptionProvider;
3132
import graphql.kickstart.servlet.osgi.GraphQLTypesProvider;
3233
import graphql.schema.GraphQLCodeRegistry;
34+
import graphql.schema.GraphQLDirective;
3335
import graphql.schema.GraphQLFieldDefinition;
3436
import graphql.schema.GraphQLObjectType;
3537
import graphql.schema.GraphQLType;
@@ -52,6 +54,7 @@ public class OsgiSchemaBuilder {
5254
private final List<GraphQLMutationProvider> mutationProviders = new ArrayList<>();
5355
private final List<GraphQLSubscriptionProvider> subscriptionProviders = new ArrayList<>();
5456
private final List<GraphQLTypesProvider> typesProviders = new ArrayList<>();
57+
private final List<GraphQLDirectiveProvider> directiveProviders = new ArrayList<>();
5558
private final List<GraphQLServletListener> listeners = new ArrayList<>();
5659

5760
private GraphQLServletContextBuilder contextBuilder = new DefaultGraphQLServletContextBuilder();
@@ -107,6 +110,7 @@ private void doUpdateSchema() {
107110
.mutation(buildMutationType())
108111
.subscription(buildSubscriptionType())
109112
.additionalTypes(buildTypes())
113+
.additionalDirectives(buildDirectives())
110114
.codeRegistry(codeRegistryProvider.getCodeRegistry())
111115
.build());
112116
}
@@ -159,6 +163,13 @@ private GraphQLObjectType buildObjectType(String name, Stream<GraphQLFieldDefini
159163
return null;
160164
}
161165

166+
private Set<GraphQLDirective> buildDirectives() {
167+
return directiveProviders.stream()
168+
.map(GraphQLDirectiveProvider::getDirectives)
169+
.flatMap(Collection::stream)
170+
.collect(toSet());
171+
}
172+
162173
void add(GraphQLQueryProvider provider) {
163174
queryProviders.add(provider);
164175
}
@@ -175,6 +186,10 @@ void add(GraphQLTypesProvider provider) {
175186
typesProviders.add(provider);
176187
}
177188

189+
void add(GraphQLDirectiveProvider provider) {
190+
directiveProviders.add(provider);
191+
}
192+
178193
void remove(GraphQLQueryProvider provider) {
179194
queryProviders.remove(provider);
180195
}
@@ -191,6 +206,10 @@ void remove(GraphQLTypesProvider provider) {
191206
typesProviders.remove(provider);
192207
}
193208

209+
void remove(GraphQLDirectiveProvider provider) {
210+
directiveProviders.remove(provider);
211+
}
212+
194213
GraphQLSchemaServletProvider getSchemaProvider() {
195214
return schemaProvider;
196215
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package graphql.kickstart.servlet.osgi;
2+
3+
import graphql.schema.GraphQLDirective;
4+
import java.util.Collection;
5+
6+
7+
public interface GraphQLDirectiveProvider extends GraphQLProvider {
8+
9+
/** @return A collection of directive definitions that will be added to the schema. */
10+
Collection<GraphQLDirective> getDirectives();
11+
12+
}

graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,43 @@ class OsgiGraphQLHttpServletSpec extends Specification {
265265
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("Upload")
266266
}
267267

268+
static class TestDirectiveProvider implements GraphQLDirectiveProvider {
269+
@Override
270+
Set<GraphQLDirective> getDirectives() {
271+
return new HashSet<>(Arrays.asList(GraphQLDirective.newDirective().name("myDirective").build()));
272+
}
273+
}
274+
275+
def "directive provider adds directives"() {
276+
setup:
277+
OsgiGraphQLHttpServlet servlet = new OsgiGraphQLHttpServlet()
278+
TestDirectiveProvider directiveProvider = new TestDirectiveProvider()
279+
280+
when:
281+
servlet.bindDirectivesProvider(directiveProvider)
282+
283+
then:
284+
def directive = servlet.configuration.invocationInputFactory.schemaProvider.schema.getDirective("myDirective")
285+
directive != null
286+
directive.name == "myDirective"
287+
288+
when:
289+
servlet.unbindDirectivesProvider(directiveProvider)
290+
291+
then:
292+
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getDirective("myDirective")
293+
294+
when:
295+
servlet.bindProvider(directiveProvider)
296+
then:
297+
servlet.configuration.invocationInputFactory.schemaProvider.schema.getDirective("myDirective").name == "myDirective"
298+
299+
when:
300+
servlet.unbindProvider(directiveProvider)
301+
then:
302+
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("myDirective")
303+
}
304+
268305
def "servlet listener is bound and unbound"() {
269306
setup:
270307
def servlet = new OsgiGraphQLHttpServlet()

0 commit comments

Comments
 (0)