Skip to content

Commit cc22f09

Browse files
gflores-jahiafedericorispo
authored andcommitted
Add new GraphQLDirectiveProvider for building/verifying custom directive defs in schema
1 parent 1818e89 commit cc22f09

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

+18
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import graphql.kickstart.servlet.core.GraphQLServletListener;
1616
import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder;
1717
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider;
18+
import graphql.kickstart.servlet.osgi.GraphQLDirectiveProvider;
1819
import graphql.kickstart.servlet.osgi.GraphQLMutationProvider;
1920
import graphql.kickstart.servlet.osgi.GraphQLProvider;
2021
import graphql.kickstart.servlet.osgi.GraphQLQueryProvider;
@@ -75,6 +76,9 @@ public void bindProvider(GraphQLProvider provider) {
7576
if (provider instanceof GraphQLTypesProvider) {
7677
schemaBuilder.add((GraphQLTypesProvider) provider);
7778
}
79+
if (provider instanceof GraphQLDirectiveProvider) {
80+
schemaBuilder.add((GraphQLDirectiveProvider) provider);
81+
}
7882
if (provider instanceof GraphQLCodeRegistryProvider) {
7983
schemaBuilder.setCodeRegistryProvider((GraphQLCodeRegistryProvider) provider);
8084
}
@@ -94,6 +98,9 @@ public void unbindProvider(GraphQLProvider provider) {
9498
if (provider instanceof GraphQLTypesProvider) {
9599
schemaBuilder.remove((GraphQLTypesProvider) provider);
96100
}
101+
if (provider instanceof GraphQLDirectiveProvider) {
102+
schemaBuilder.remove((GraphQLDirectiveProvider) provider);
103+
}
97104
if (provider instanceof GraphQLCodeRegistryProvider) {
98105
schemaBuilder.setCodeRegistryProvider(() -> GraphQLCodeRegistry.newCodeRegistry().build());
99106
}
@@ -144,6 +151,17 @@ public void unbindTypesProvider(GraphQLTypesProvider typesProvider) {
144151
updateSchema();
145152
}
146153

154+
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
155+
public void bindDirectivesProvider(GraphQLDirectiveProvider directiveProvider) {
156+
schemaBuilder.add(directiveProvider);
157+
updateSchema();
158+
}
159+
160+
public void unbindDirectivesProvider(GraphQLDirectiveProvider directiveProvider) {
161+
schemaBuilder.remove(directiveProvider);
162+
updateSchema();
163+
}
164+
147165
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
148166
public void bindServletListener(GraphQLServletListener listener) {
149167
schemaBuilder.add(listener);

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

+19
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.GraphQLFieldProvider;
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;
@@ -50,6 +52,7 @@ class OsgiSchemaBuilder {
5052
private final List<GraphQLMutationProvider> mutationProviders = new ArrayList<>();
5153
private final List<GraphQLSubscriptionProvider> subscriptionProviders = new ArrayList<>();
5254
private final List<GraphQLTypesProvider> typesProviders = new ArrayList<>();
55+
private final List<GraphQLDirectiveProvider> directiveProviders = new ArrayList<>();
5356
private final List<GraphQLServletListener> listeners = new ArrayList<>();
5457

5558
private GraphQLServletContextBuilder contextBuilder = new DefaultGraphQLServletContextBuilder();
@@ -103,6 +106,7 @@ private void doUpdateSchema() {
103106
.mutation(buildMutationType())
104107
.subscription(buildSubscriptionType())
105108
.additionalTypes(buildTypes())
109+
.additionalDirectives(buildDirectives())
106110
.codeRegistry(codeRegistryProvider.getCodeRegistry())
107111
.build());
108112
}
@@ -159,6 +163,13 @@ private GraphQLObjectType buildObjectType(String name, List<GraphQLFieldProvider
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
}
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

+37
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)