33import static com .intuit .graphql .orchestrator .resolverdirective .FieldResolverDirectiveUtil .canContainFieldResolverDirective ;
44import static com .intuit .graphql .orchestrator .resolverdirective .FieldResolverDirectiveUtil .createFieldResolverContexts ;
55
6+ import com .intuit .graphql .graphQL .Directive ;
67import com .intuit .graphql .graphQL .FieldDefinition ;
78import com .intuit .graphql .orchestrator .resolverdirective .ArgumentDefinitionNotAllowed ;
89import com .intuit .graphql .orchestrator .resolverdirective .FieldResolverDirectiveUtil ;
10+ import com .intuit .graphql .orchestrator .resolverdirective .InvalidDirectivePairingException ;
911import com .intuit .graphql .orchestrator .resolverdirective .NotAValidLocationForFieldResolverDirective ;
1012import com .intuit .graphql .orchestrator .utils .XtextTypeUtils ;
1113import com .intuit .graphql .orchestrator .xtext .XtextGraph ;
1214import java .util .ArrayList ;
1315import java .util .List ;
1416import java .util .Objects ;
1517import org .apache .commons .collections4 .CollectionUtils ;
18+ import org .eclipse .emf .common .util .EList ;
1619import org .eclipse .emf .ecore .EObject ;
1720
1821public class FieldResolverTransformerPreMerge implements Transformer <XtextGraph , XtextGraph > {
@@ -39,21 +42,51 @@ public XtextGraph transform(XtextGraph sourceXtextGraph) {
3942 }
4043
4144 private void validateFieldWithResolver (List <FieldResolverContext > fieldResolverContexts ) {
42- fieldResolverContexts
43- .forEach (fieldResolverContext -> {
44- FieldDefinition fieldDefinition = fieldResolverContext .getFieldDefinition ();
45- String fieldName = fieldDefinition .getName ();
46- String parentTypeName = XtextTypeUtils .getParentTypeName (fieldDefinition );
47-
48- EObject parentType = fieldDefinition .eContainer ();
49- if (!(canContainFieldResolverDirective (parentType ))) {
50- throw new NotAValidLocationForFieldResolverDirective (fieldName , parentTypeName );
51- }
52-
53- if (hasArguments (fieldDefinition )) {
54- throw new ArgumentDefinitionNotAllowed (fieldName , parentTypeName );
55- }
56- });
45+ fieldResolverContexts
46+ .forEach (fieldResolverContext -> {
47+ FieldDefinition fieldDefinition = fieldResolverContext .getFieldDefinition ();
48+ String fieldName = fieldDefinition .getName ();
49+ String parentTypeName = XtextTypeUtils .getParentTypeName (fieldDefinition );
50+
51+ EObject parentType = fieldDefinition .eContainer ();
52+ if (!(canContainFieldResolverDirective (parentType ))) {
53+ throw new NotAValidLocationForFieldResolverDirective (fieldName , parentTypeName );
54+ }
55+
56+ if (hasArguments (fieldDefinition )) {
57+ throw new ArgumentDefinitionNotAllowed (fieldName , parentTypeName );
58+ }
59+
60+ EList <Directive > directives = fieldDefinition .getDirectives ();
61+ boolean hasResolverDirective = false ;
62+ boolean hasExternalDirective = false ;
63+ boolean hasProvidesDirective = false ;
64+ boolean hasRequiresDirective = false ;
65+
66+ for (Directive directive : directives ) {
67+ String directiveName = directive .getDefinition ().getName ();
68+ switch (directiveName ) {
69+ case "resolver" :
70+ hasResolverDirective = true ;
71+ break ;
72+ case "external" :
73+ hasExternalDirective = true ;
74+ break ;
75+ case "provides" :
76+ hasProvidesDirective = true ;
77+ break ;
78+ case "requires" :
79+ hasRequiresDirective = true ;
80+ break ;
81+ }
82+ }
83+
84+ if (hasResolverDirective ) {
85+ if (hasExternalDirective || hasProvidesDirective || hasRequiresDirective ) {
86+ throw new InvalidDirectivePairingException (fieldName , parentTypeName );
87+ }
88+ }
89+ });
5790 }
5891
5992 private boolean hasArguments (FieldDefinition fieldDefinition ) {
0 commit comments