77import com .intuit .graphql .orchestrator .schema .SchemaParseException ;
88import java .io .IOException ;
99import java .io .InputStream ;
10+ import java .nio .charset .Charset ;
1011import java .util .List ;
1112import java .util .Map ;
1213import java .util .concurrent .ConcurrentHashMap ;
1314import java .util .stream .Collectors ;
15+
16+ import lombok .extern .slf4j .Slf4j ;
1417import org .apache .commons .io .IOUtils ;
18+ import org .apache .commons .lang3 .StringUtils ;
1519import org .eclipse .emf .common .util .URI ;
1620import org .eclipse .xtext .EcoreUtil2 ;
1721import org .eclipse .xtext .resource .IResourceFactory ;
1822import org .eclipse .xtext .resource .XtextResource ;
1923import org .eclipse .xtext .resource .XtextResourceSet ;
2024import org .eclipse .xtext .util .CancelIndicator ;
25+ import org .eclipse .xtext .util .Files ;
2126import org .eclipse .xtext .validation .CheckMode ;
2227import org .eclipse .xtext .validation .IResourceValidator ;
2328import org .eclipse .xtext .validation .Issue ;
2429
30+ @ Slf4j
2531/**
2632 * The Xtext resource set builder.
2733 */
@@ -30,6 +36,9 @@ public class XtextResourceSetBuilder {
3036 private XtextResourceSet graphqlResourceSet ;
3137 private static Injector GRAPHQL_INJECTOR = new GraphQLStandaloneSetupGenerated ().createInjectorAndDoEMFRegistration ();
3238 private Map <String , String > files = new ConcurrentHashMap <>();
39+ private boolean isFederatedResourceSet = false ;
40+
41+ public static final String FEDERATION_DIRECTIVES = getFederationDirectives ();
3342
3443 private XtextResourceSetBuilder () {
3544 }
@@ -57,20 +66,36 @@ public XtextResourceSetBuilder file(String fileName, String file) {
5766 return this ;
5867 }
5968
69+ public XtextResourceSetBuilder isFederatedResourceSet (boolean isFederatedResourceSet ) {
70+ this .isFederatedResourceSet = isFederatedResourceSet ;
71+ return this ;
72+ }
73+
6074 /**
6175 * Build xtext resource set.
6276 *
6377 * @return the xtext resource set
6478 */
6579 public XtextResourceSet build () {
6680 graphqlResourceSet = GRAPHQL_INJECTOR .getInstance (XtextResourceSet .class );
67- files .forEach ((fileName , content ) -> {
81+
82+ if (isFederatedResourceSet ) {
83+ String content = FEDERATION_DIRECTIVES + "\n " + StringUtils .join (files .values (), "\n " );
84+
6885 try {
69- createGraphqlResourceFromString (content , fileName );
86+ createGraphqlResourceFromString (content , "appended_federation" );
7087 } catch (IOException e ) {
71- throw new SchemaParseException ("Unable to parse file:" + fileName , e );
88+ throw new SchemaParseException ("Unable to parse file: appended federation file" , e );
7289 }
73- });
90+ } else {
91+ files .forEach ((fileName , content ) -> {
92+ try {
93+ createGraphqlResourceFromString (content , fileName );
94+ } catch (IOException e ) {
95+ throw new SchemaParseException ("Unable to parse file:" + fileName , e );
96+ }
97+ });
98+ }
7499
75100 List <Issue > issues = validate ();
76101 if (!issues .isEmpty ()) {
@@ -100,8 +125,8 @@ private List<Issue> validate() {
100125 IResourceValidator validator = GRAPHQL_INJECTOR .getInstance (IResourceValidator .class );
101126 // collect issues
102127 return graphqlResourceSet .getResources ().stream ()
103- .flatMap (resource -> validator .validate (resource , CheckMode .ALL , CancelIndicator .NullImpl ).stream ()
104- ).collect (Collectors .toList ());
128+ .flatMap (resource -> validator .validate (resource , CheckMode .ALL , CancelIndicator .NullImpl ).stream ()
129+ ).collect (Collectors .toList ());
105130
106131 }
107132
@@ -116,7 +141,22 @@ public static XtextResourceSetBuilder newBuilder() {
116141
117142 public static XtextResourceSet singletonSet (String fileName , String file ) {
118143 return newBuilder ()
119- .file (fileName , file )
120- .build ();
144+ .file (fileName , file )
145+ .build ();
146+ }
147+
148+ private static String getFederationDirectives () {
149+ String directives = "" ;
150+ try {
151+ directives = IOUtils .toString (
152+ XtextResourceSetBuilder .class .getClassLoader ()
153+ .getResourceAsStream ( "federation_built_in_directives.graphqls" ),
154+ Charset .defaultCharset ()
155+ );
156+ } catch (IOException ex ) {
157+ log .error ("Failed to read resource" );
158+ }
159+
160+ return directives ;
121161 }
122162}
0 commit comments