11package graphql .validation .constraints .standard ;
22
33import graphql .GraphQLError ;
4+ import graphql .schema .GraphQLDirective ;
45import graphql .schema .GraphQLFieldDefinition ;
56import graphql .schema .GraphQLFieldsContainer ;
67import graphql .schema .GraphQLInputType ;
78import graphql .validation .constraints .AbstractDirectiveConstraint ;
89import graphql .validation .constraints .Documentation ;
10+ import graphql .validation .el .ELSupport ;
911import graphql .validation .rules .ValidationEnvironment ;
1012
11- import javax .el .ELContext ;
12- import javax .el .ExpressionFactory ;
13- import javax .el .ValueExpression ;
1413import java .util .Collections ;
1514import java .util .List ;
15+ import java .util .Map ;
1616
1717public class ArgumentsConstraint extends AbstractDirectiveConstraint {
1818
1919 public ArgumentsConstraint () {
20- super ("@ Arguments" );
20+ super ("Arguments" );
2121 }
2222
2323
@@ -26,14 +26,14 @@ public Documentation getDocumentation() {
2626 return Documentation .newDocumentation ()
2727 .messageTemplate (getMessageTemplate ())
2828
29- .description ("TODO " )
29+ .description ("The provided expression must evaluate to true. " )
3030
3131 .example ("drivers( first : Int, after : String!, last : Int, before : String) \n " +
32- " : DriverConnection @Arguments(expr : \" ${(! empty first && ! empty after) || (! empty last && ! empty before) }\" " )
32+ " : DriverConnection @Arguments(expression : \" ${args.containsOneOf(' first',' last') }\" " )
3333
3434 .applicableTypeNames ("Output Fields" )
3535
36- .directiveSDL ("directive @Arguments(expr : String!, message : String = \" %s\" ) " +
36+ .directiveSDL ("directive @Arguments(expression : String!, message : String = \" %s\" ) " +
3737 "on FIELD_DEFINITION" ,
3838 getMessageTemplate ())
3939 .build ();
@@ -53,16 +53,32 @@ public boolean appliesTo(GraphQLFieldDefinition fieldDefinition, GraphQLFieldsCo
5353 public List <GraphQLError > runValidation (ValidationEnvironment validationEnvironment ) {
5454
5555 GraphQLFieldDefinition fieldDefinition = validationEnvironment .getFieldDefinition ();
56+ GraphQLDirective directive = validationEnvironment .getContextObject (GraphQLDirective .class );
57+ String expression = curlyBraces (getStrArg (directive , "expression" ));
5658
57- // TODO
59+ Map <String , Object > variables = mkMap (
60+ "fieldDefinition" , fieldDefinition ,
61+ "args" , validationEnvironment .getArgumentValues ()
62+ );
63+ ELSupport elSupport = new ELSupport (validationEnvironment .getLocale ());
64+ boolean isOK = elSupport .evaluateBoolean (expression , variables );
65+
66+ if (!isOK ) {
67+ return mkError (validationEnvironment , directive , mkMessageParams (null , validationEnvironment ,
68+ "expression" , expression ));
69+
70+ }
5871 return Collections .emptyList ();
5972 }
6073
61- private void bindVariable (ExpressionFactory expressionFactory , ELContext elContext , String variableName , Object variable , Class variableClass ) {
62- ValueExpression valueExpression = expressionFactory .createValueExpression (
63- variable ,
64- variableClass
65- );
66- elContext .getVariableMapper ().setVariable (variableName , valueExpression );
74+ private String curlyBraces (String expression ) {
75+ expression = expression .trim ();
76+ if (!expression .startsWith ("${" ) && !expression .startsWith ("#{" )) {
77+ expression = "${" + expression ;
78+ }
79+ if (!expression .startsWith ("}" )) {
80+ expression = expression + "}" ;
81+ }
82+ return expression ;
6783 }
6884}
0 commit comments