Skip to content

Commit 3f0f3f4

Browse files
committed
support list
1 parent e4df24e commit 3f0f3f4

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

src/main/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilder.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@
1414
*/
1515
package graphql.annotations.processor.retrievers.fieldBuilders;
1616

17-
import com.sun.deploy.util.ReflectionUtil;
1817
import graphql.annotations.annotationTypes.directives.activation.GraphQLDirectives;
1918
import graphql.annotations.processor.ProcessingElementsContainer;
2019
import graphql.annotations.processor.exceptions.GraphQLAnnotationsException;
2120
import graphql.annotations.processor.util.DirectiveJavaAnnotationUtil;
2221
import graphql.schema.GraphQLArgument;
2322
import graphql.schema.GraphQLDirective;
2423
import graphql.schema.GraphQLScalarType;
25-
import javafx.scene.effect.Reflection;
24+
import graphql.schema.GraphQLType;
2625

2726
import java.lang.annotation.Annotation;
2827
import java.lang.reflect.AnnotatedElement;
@@ -126,11 +125,17 @@ private void transformArgument(Annotation annotation, GraphQLDirective.Builder d
126125
Method[] methods = annotation.annotationType().getDeclaredMethods();
127126
directiveBuilder.argument(graphQLArgument.transform(builder -> {
128127
// todo: add support for list
129-
if (graphQLArgument.getType() instanceof GraphQLScalarType) {
128+
if (graphQLArgument.getType() instanceof GraphQLType) {
130129
try {
131130
methods[finalI].setAccessible(true);
132131
Object argumentValue = methods[finalI].invoke(annotation);
133-
Object value = ((GraphQLScalarType) graphQLArgument.getType()).getCoercing().parseValue(argumentValue);
132+
Object value;
133+
if (graphQLArgument.getType() instanceof GraphQLScalarType) {
134+
value = ((GraphQLScalarType) graphQLArgument.getType()).getCoercing().parseValue(argumentValue);
135+
}
136+
else{
137+
value = argumentValue;
138+
}
134139
builder.value(value);
135140
} catch (Exception e) {
136141
throw new GraphQLAnnotationsException("Could not parse argument value to argument type", e);

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

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import graphql.annotations.annotationTypes.GraphQLDataFetcher;
2020
import graphql.annotations.annotationTypes.GraphQLField;
2121
import graphql.annotations.annotationTypes.GraphQLName;
22-
import graphql.annotations.annotationTypes.directives.activation.Directive;
23-
import graphql.annotations.annotationTypes.directives.activation.GraphQLDirectives;
2422
import graphql.annotations.annotationTypes.directives.definition.DirectiveLocations;
2523
import graphql.annotations.annotationTypes.directives.definition.GraphQLDirectiveDefinition;
2624
import graphql.annotations.directives.AnnotationsDirectiveWiring;
@@ -39,9 +37,7 @@
3937
import java.util.Map;
4038

4139
import static graphql.schema.GraphQLSchema.newSchema;
42-
import static org.testng.Assert.assertEquals;
43-
import static org.testng.Assert.assertNotNull;
44-
import static org.testng.Assert.assertTrue;
40+
import static org.testng.Assert.*;
4541

4642
public class GraphQLDirectivesViaAnnotationDefinitionTest {
4743
private GraphQLAnnotations graphQLAnnotations;
@@ -52,6 +48,7 @@ public void setUp() {
5248
this.graphQLAnnotations = new GraphQLAnnotations();
5349
this.graphQLAnnotations.directiveViaAnnotation(Upper.class);
5450
this.graphQLAnnotations.directiveViaAnnotation(Suffix.class);
51+
this.graphQLAnnotations.directiveViaAnnotation(DirectiveWithList.class);
5552
GraphQLObjectType object = this.graphQLAnnotations.object(Query.class);
5653
GraphQLCodeRegistry codeRegistry = graphQLAnnotations.getContainer().getCodeRegistryBuilder().build();
5754
this.schema = newSchema().query(object).codeRegistry(codeRegistry).build();
@@ -122,6 +119,16 @@ public GraphQLInputObjectType onInputObjectType(AnnotationsWiringEnvironment env
122119
}
123120
}
124121

122+
public static class DirectiveWithListWiring implements AnnotationsDirectiveWiring{
123+
@Override
124+
public GraphQLFieldDefinition onField(AnnotationsWiringEnvironment environment) {
125+
GraphQLFieldDefinition field = (GraphQLFieldDefinition) environment.getElement();
126+
String[] list= (String[]) environment.getDirective().getArgument("list").getValue();
127+
CodeRegistryUtil.wrapDataFetcher(field, environment, (dataFetchingEnvironment, value) -> value + list[0]);
128+
return field;
129+
}
130+
}
131+
125132

126133
@GraphQLDirectiveDefinition(wiring = UpperWiring.class)
127134
@GraphQLName("upper")
@@ -141,7 +148,15 @@ public GraphQLInputObjectType onInputObjectType(AnnotationsWiringEnvironment env
141148
@GraphQLName("suffix")
142149
String suffixToAdd();
143150
boolean isActive();
144-
String[] extraSuffixes() default {};
151+
}
152+
153+
@GraphQLDirectiveDefinition(wiring = DirectiveWithListWiring.class)
154+
@GraphQLName("list")
155+
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE, ElementType.METHOD})
156+
@Retention(RetentionPolicy.RUNTIME)
157+
@DirectiveLocations({Introspection.DirectiveLocation.FIELD_DEFINITION, Introspection.DirectiveLocation.ARGUMENT_DEFINITION, Introspection.DirectiveLocation.INPUT_FIELD_DEFINITION})
158+
@interface DirectiveWithList{
159+
String[] list();
145160
}
146161

147162
public static class Query{
@@ -179,6 +194,9 @@ public static String nameWithMultipleDirectives(){
179194
return "yarin";
180195
}
181196

197+
@GraphQLField
198+
@DirectiveWithList(list = {"v", "x", "y"})
199+
public static String nameWithDirectiveWithList() {return "yarin";}
182200

183201
public static class NameWithArgument implements DataFetcher {
184202
@Override
@@ -266,4 +284,15 @@ public void usingAnnotationDirective_multipleDirectivesOnField_wiringHappensInOr
266284
assertEquals(((Map<String, String>) result1.getData()).get("nameWithMultipleDirectives").toString(), "YARIN is cool");
267285
}
268286

287+
@Test
288+
public void usingAnnotationDirective_listArgument_wiringHappens(){
289+
// Act
290+
ExecutionResult result1 = GraphQL.newGraphQL(schema).build().execute("query { nameWithDirectiveWithList }");
291+
292+
// Assert
293+
assertTrue(result1.getErrors().isEmpty());
294+
assertEquals(((Map<String, String>) result1.getData()).get("nameWithDirectiveWithList").toString(), "yarinv");
295+
}
296+
297+
269298
}

0 commit comments

Comments
 (0)