Skip to content

Commit d193b7d

Browse files
authored
Merge pull request #227 from yarinvak/support-new-directive-in-schema-creator
Support new directives way in the schema creator
2 parents 7aad713 + 14c1ac1 commit d193b7d

File tree

6 files changed

+86
-26
lines changed

6 files changed

+86
-26
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ In order to define a default value for the argument, use the `default` keyword l
438438

439439
After you created the class, you will be able to create the ``GraphQLDirective`` object using the following code:
440440
```java
441-
GraphQLDirective directive = graphqlAnnotations.directiveViaAnnotation(Suffix.class);
441+
GraphQLDirective directive = graphqlAnnotations.directive(Suffix.class);
442442
```
443443

444444
#### Using a method declaration

src/main/java/graphql/annotations/AnnotationsSchemaCreator.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public static class Builder {
3636
private Class<?> mutationObject;
3737
private Class<?> subscriptionObject;
3838
private Set<Class<?>> directivesObjectList = new HashSet<>();
39+
private Set<Class<?>> directiveContainerClasses = new HashSet<>();
3940
private Set<Class<?>> additionalTypesList = new HashSet<>();
4041
private Set<Class<?>> typeExtensions = new HashSet<>();
4142
private Set<TypeFunction> typeFunctions = new HashSet<>();
@@ -113,6 +114,16 @@ public Builder directives(Set<Class<?>> directiveClasses) {
113114
return this;
114115
}
115116

117+
/**
118+
* Add directive declaration class to create directives for the graphql schema
119+
* @param directiveContainerClass a directive container class (directives are defined as methods inside the class)
120+
* @return the builder after adding the directive container class to the list of directive container classes
121+
*/
122+
public Builder directives(Class<?> directiveContainerClass){
123+
this.directiveContainerClasses.add(directiveContainerClass);
124+
return this;
125+
}
126+
116127
/**
117128
* Add a directive to the graphql schema
118129
* This method will generate a GraphQL Directive type out of your java class using the annotations processor
@@ -223,6 +234,8 @@ public GraphQLSchema build() {
223234
}
224235

225236
Set<GraphQLDirective> directives = directivesObjectList.stream().map(dir -> graphQLAnnotations.directive(dir)).collect(Collectors.toSet());
237+
directiveContainerClasses.forEach(dir->directives.addAll(graphQLAnnotations.directives(dir)));
238+
226239
Set<GraphQLType> additionalTypes = additionalTypesList.stream().map(additionalType ->
227240
additionalType.isInterface() ?
228241
graphQLAnnotations.generateInterface(additionalType) : graphQLAnnotations.object(additionalType)).collect(Collectors.toSet());
@@ -234,7 +247,7 @@ public GraphQLSchema build() {
234247
if (this.subscriptionObject != null) {
235248
this.graphqlSchemaBuilder.subscription(graphQLAnnotations.object(subscriptionObject));
236249
}
237-
if (!this.directivesObjectList.isEmpty()) {
250+
if (!directives.isEmpty()) {
238251
graphqlSchemaBuilder.additionalDirectives(directives);
239252
}
240253
this.graphqlSchemaBuilder.additionalTypes(additionalTypes).additionalType(Relay.pageInfoType)

src/main/java/graphql/annotations/processor/GraphQLAnnotations.java

+2-15
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import graphql.schema.GraphQLInterfaceType;
3535
import graphql.schema.GraphQLObjectType;
3636

37-
import java.lang.annotation.Retention;
3837
import java.lang.reflect.Method;
3938
import java.util.Arrays;
4039
import java.util.HashSet;
@@ -159,21 +158,9 @@ public GraphQLDirective directive(Class<?> object) throws GraphQLAnnotationsExce
159158
}
160159
}
161160

161+
@Deprecated
162162
public GraphQLDirective directiveViaAnnotation(Class<?> annotationClass) {
163-
if (!annotationClass.isAnnotationPresent(GraphQLDirectiveDefinition.class) || !annotationClass.isAnnotationPresent(Retention.class)){
164-
throw new GraphQLAnnotationsException(String.format("The supplied class %s is not annotated with a GraphQLDirectiveDefinition and/or Retention annotation", annotationClass.getSimpleName()), null);
165-
}
166-
167-
try {
168-
GraphQLDirective directive = this.directiveCreator.getDirective(annotationClass);
169-
GraphQLDirectiveDefinition annotation = annotationClass.getAnnotation(GraphQLDirectiveDefinition.class);
170-
this.getContainer().getDirectiveRegistry().put(directive.getName(), new DirectiveAndWiring(directive, annotation.wiring()));
171-
return directive;
172-
} catch (GraphQLAnnotationsException e) {
173-
this.getContainer().getProcessing().clear();
174-
this.getTypeRegistry().clear();
175-
throw e;
176-
}
163+
return this.directive(annotationClass);
177164
}
178165

179166
public Set<GraphQLDirective> directives(Class<?> directivesDeclarationClass) {

src/test/java/graphql/annotations/AnnotationsSchemaCreatorTest.java

+62-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
import graphql.annotations.annotationTypes.GraphQLDescription;
1818
import graphql.annotations.annotationTypes.GraphQLField;
1919
import graphql.annotations.annotationTypes.GraphQLName;
20+
import graphql.annotations.annotationTypes.directives.definition.DirectiveLocations;
2021
import graphql.annotations.annotationTypes.directives.definition.GraphQLDirectiveDefinition;
2122
import graphql.annotations.directives.AnnotationsDirectiveWiring;
2223
import graphql.annotations.directives.AnnotationsWiringEnvironment;
23-
import graphql.annotations.annotationTypes.directives.definition.DirectiveLocations;
2424
import graphql.annotations.processor.GraphQLAnnotations;
2525
import graphql.introspection.Introspection;
2626
import graphql.schema.GraphQLDirective;
@@ -30,6 +30,10 @@
3030
import org.testng.annotations.BeforeMethod;
3131
import org.testng.annotations.Test;
3232

33+
import java.lang.annotation.ElementType;
34+
import java.lang.annotation.Retention;
35+
import java.lang.annotation.RetentionPolicy;
36+
import java.lang.annotation.Target;
3337
import java.util.HashSet;
3438
import java.util.Set;
3539

@@ -110,7 +114,7 @@ public void build_Subscription_SchemaIsCreatedWithSubscription() {
110114
assertThat(subscriptionType.getFieldDefinitions().size(), is(1));
111115
}
112116

113-
public static class GeneralWiring implements AnnotationsDirectiveWiring{
117+
public static class GeneralWiring implements AnnotationsDirectiveWiring {
114118
@Override
115119
public GraphQLFieldDefinition onField(AnnotationsWiringEnvironment environment) {
116120
return null;
@@ -158,6 +162,62 @@ public void build_MultipleDirectives_SchemaIsCreatedWithDirectives() {
158162
assertThat(schema.getDirective("testDirective"), notNullValue());
159163
}
160164

165+
166+
@GraphQLDirectiveDefinition(wiring = GeneralWiring.class)
167+
@GraphQLName("upper")
168+
@Target(ElementType.METHOD)
169+
@Retention(RetentionPolicy.RUNTIME)
170+
@DirectiveLocations(Introspection.DirectiveLocation.FIELD_DEFINITION)
171+
@interface UpperAnnotation {
172+
boolean isActive() default true;
173+
}
174+
175+
176+
@Test
177+
public void build_directiveUsingAnnotation_schemaIsCreatedWithDirective() {
178+
// arrange + act
179+
GraphQLSchema schema = builder.query(QueryTest.class).directive(UpperAnnotation.class).build();
180+
181+
// assert
182+
GraphQLDirective testDirective = schema.getDirective("upper");
183+
assertThat(testDirective, notNullValue());
184+
assertThat(testDirective.getArguments().size(), is(1));
185+
assertThat(testDirective.getArgument("isActive"), notNullValue());
186+
}
187+
188+
189+
public static class DirectivesContainer {
190+
@GraphQLName("suffix")
191+
@GraphQLDirectiveDefinition(wiring = GeneralWiring.class)
192+
@DirectiveLocations({Introspection.DirectiveLocation.FIELD_DEFINITION, Introspection.DirectiveLocation.ARGUMENT_DEFINITION})
193+
public static void suffixDirective(@GraphQLName("suffix") String suffix) {
194+
195+
}
196+
197+
@GraphQLName("upper")
198+
@GraphQLDirectiveDefinition(wiring = GeneralWiring.class)
199+
@DirectiveLocations({Introspection.DirectiveLocation.FIELD_DEFINITION, Introspection.DirectiveLocation.ARGUMENT_DEFINITION})
200+
public static void upper() {
201+
202+
}
203+
}
204+
205+
206+
@Test
207+
public void build_directive_UsingDirectivesContainer_schemaIsCreatedWithDirective() {
208+
// arrange + act
209+
GraphQLSchema schema = builder.query(QueryTest.class).directives(DirectivesContainer.class).build();
210+
211+
// assert
212+
GraphQLDirective testDirective = schema.getDirective("suffix");
213+
assertThat(testDirective, notNullValue());
214+
assertThat(testDirective.getArguments().size(), is(1));
215+
assertThat(testDirective.getArgument("suffix"), notNullValue());
216+
217+
GraphQLDirective upper = schema.getDirective("upper");
218+
assertThat(upper, notNullValue());
219+
}
220+
161221
@GraphQLName("additional")
162222
public static class AdditionalTypeTest {
163223
public int getI() {

src/test/java/graphql/annotations/GraphQLDirectiveCreationTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
package graphql.annotations;
1616

1717
import graphql.annotations.annotationTypes.GraphQLDescription;
18-
import graphql.annotations.annotationTypes.directives.definition.GraphQLDirectiveDefinition;
1918
import graphql.annotations.annotationTypes.GraphQLName;
20-
import graphql.annotations.directives.AnnotationsDirectiveWiring;
2119
import graphql.annotations.annotationTypes.directives.definition.DirectiveLocations;
20+
import graphql.annotations.annotationTypes.directives.definition.GraphQLDirectiveDefinition;
21+
import graphql.annotations.directives.AnnotationsDirectiveWiring;
2222
import graphql.annotations.processor.GraphQLAnnotations;
2323
import graphql.annotations.processor.exceptions.GraphQLAnnotationsException;
2424
import graphql.introspection.Introspection;
@@ -171,7 +171,7 @@ public void directive_suppliedDirectiveMethodContainer_returnCorrectDirective()
171171
@Test
172172
public void directive_suppliedDirectiveAnnotation_returnCorrectDirective() {
173173
// Act
174-
GraphQLDirective upper = this.graphQLAnnotations.directiveViaAnnotation(UpperAnnotation.class);
174+
GraphQLDirective upper = this.graphQLAnnotations.directive(UpperAnnotation.class);
175175

176176
// Assert
177177
assertEquals(upper.getName(), "upper");
@@ -188,7 +188,7 @@ public void directive_suppliedDirectiveAnnotation_returnCorrectDirective() {
188188
@Test(expectedExceptions = GraphQLAnnotationsException.class)
189189
public void directive_suppliedNoDirectiveAnnotation_throwException() {
190190
// Act
191-
GraphQLDirective upper = this.graphQLAnnotations.directiveViaAnnotation(NoDirectiveAnnotation.class);
191+
GraphQLDirective upper = this.graphQLAnnotations.directive(NoDirectiveAnnotation.class);
192192
}
193193

194194

src/test/java/graphql/annotations/GraphQLDirectivesViaAnnotationDefinitionTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ public class GraphQLDirectivesViaAnnotationDefinitionTest {
4646
@BeforeMethod
4747
public void setUp() {
4848
this.graphQLAnnotations = new GraphQLAnnotations();
49-
this.graphQLAnnotations.directiveViaAnnotation(Upper.class);
50-
this.graphQLAnnotations.directiveViaAnnotation(Suffix.class);
51-
this.graphQLAnnotations.directiveViaAnnotation(DirectiveWithList.class);
49+
this.graphQLAnnotations.directive(Upper.class);
50+
this.graphQLAnnotations.directive(Suffix.class);
51+
this.graphQLAnnotations.directive(DirectiveWithList.class);
5252
GraphQLObjectType object = this.graphQLAnnotations.object(Query.class);
5353
GraphQLCodeRegistry codeRegistry = graphQLAnnotations.getContainer().getCodeRegistryBuilder().build();
5454
this.schema = newSchema().query(object).codeRegistry(codeRegistry).build();

0 commit comments

Comments
 (0)