Skip to content

Commit d31f5e1

Browse files
joffrey-bionJoffrey Bion
andauthored
Parse all schemas as one Document (#28)
This makes use of the MultiSourceReader provided by the graphQL library. Using this reader allows to read a single document from multiple files, while correctly associating line numbers and errors to their original source file. This doesn't bring any overhead because the method Parser.parseDocument(String) that was previously used already created a MultiSourceReader itself. Note that the previous method didn't associate the source file name with the content used for parsing, while the new one does. It allows to solve cross-reference problems with union types for instance. Resolves: #27 Co-authored-by: Joffrey Bion <joffrey.bion@booking.com>
1 parent 9aeea21 commit d31f5e1

File tree

8 files changed

+139
-6
lines changed

8 files changed

+139
-6
lines changed

src/main/java/com/kobylynskyi/graphql/codegen/GraphqlCodegen.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,14 @@ private void initDefaultValues(MappingConfig mappingConfig) {
6565

6666
public void generate() throws Exception {
6767
GraphqlCodegenFileCreator.prepareOutputDir(outputDir);
68-
for (String schema : schemas) {
69-
long startTime = System.currentTimeMillis();
70-
Document document = GraphqlDocumentParser.getDocument(schema);
68+
long startTime = System.currentTimeMillis();
69+
if (!schemas.isEmpty()) {
70+
Document document = GraphqlDocumentParser.getDocument(schemas);
7171
addScalarsToCustomMappingConfig(document);
7272
processDocument(document);
73-
System.out.println(String.format("Finished processing schema '%s' in %d ms", schema, System.currentTimeMillis() - startTime));
7473
}
74+
long elapsed = System.currentTimeMillis() - startTime;
75+
System.out.println(String.format("Finished processing %d schemas in %d ms", schemas.size(), elapsed));
7576
}
7677

7778
private void processDocument(Document document) throws IOException, TemplateException {

src/main/java/com/kobylynskyi/graphql/codegen/GraphqlDocumentParser.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,33 @@
22

33
import com.kobylynskyi.graphql.codegen.utils.Utils;
44
import graphql.language.Document;
5+
import graphql.parser.MultiSourceReader;
56
import graphql.parser.Parser;
67

78
import java.io.IOException;
9+
import java.util.Collections;
10+
import java.util.List;
811

912
class GraphqlDocumentParser {
1013

1114
private static final Parser GRAPHQL_PARSER = new Parser();
1215

1316
static Document getDocument(String schemaFilePath) throws IOException {
14-
String fileContent = Utils.getFileContent(schemaFilePath);
15-
return GRAPHQL_PARSER.parseDocument(fileContent);
17+
return getDocument(Collections.singletonList(schemaFilePath));
1618
}
1719

20+
static Document getDocument(List<String> schemaPaths) throws IOException {
21+
MultiSourceReader reader = createMultiSourceReader(schemaPaths);
22+
return GRAPHQL_PARSER.parseDocument(reader);
23+
}
24+
25+
private static MultiSourceReader createMultiSourceReader(List<String> schemaPaths) throws IOException {
26+
MultiSourceReader.Builder builder = MultiSourceReader.newMultiSourceReader();
27+
for (String path : schemaPaths) {
28+
// appending EOL to ensure that schema tokens are not mixed in case files are not properly ended with EOL
29+
String content = Utils.getFileContent(path) + System.lineSeparator();
30+
builder.string(content, path);
31+
}
32+
return builder.trackData(true).build();
33+
}
1834
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.kobylynskyi.graphql.codegen;
2+
3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
import java.util.Objects;
8+
9+
import org.junit.jupiter.api.AfterEach;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.Test;
12+
13+
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
14+
import com.kobylynskyi.graphql.codegen.utils.Utils;
15+
16+
import static java.util.stream.Collectors.toList;
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
19+
class GraphqlCodegenMultiFilesTest {
20+
21+
private GraphqlCodegen generator;
22+
23+
private File outputBuildDir = new File("build/generated");
24+
private File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/multifiles");
25+
26+
@BeforeEach
27+
void init() {
28+
MappingConfig mappingConfig = new MappingConfig();
29+
mappingConfig.setPackageName("com.kobylynskyi.graphql.multifiles");
30+
List<String> schemas = Arrays.asList(
31+
"src/test/resources/schemas/multi1.graphqls",
32+
"src/test/resources/schemas/multi2.graphqls"
33+
);
34+
generator = new GraphqlCodegen(schemas, outputBuildDir, mappingConfig);
35+
}
36+
37+
@AfterEach
38+
void cleanup() throws IOException {
39+
Utils.deleteDir(new File("build/generated"));
40+
}
41+
42+
@Test
43+
void generate_CheckFiles() throws Exception {
44+
generator.generate();
45+
46+
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
47+
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
48+
assertEquals(Arrays.asList("MyUnion.java", "UnionMember1.java", "UnionMember2.java"), generatedFileNames);
49+
50+
for (File file : files) {
51+
File expected = new File(String.format("src/test/resources/expected-classes/%s.txt", file.getName()));
52+
TestUtils.assertSameTrimmedContent(expected, file);
53+
}
54+
}
55+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.kobylynskyi.graphql.multifiles;
2+
3+
import java.util.*;
4+
5+
public interface MyUnion {
6+
7+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.kobylynskyi.graphql.multifiles;
2+
3+
import java.util.*;
4+
5+
public class UnionMember1 implements MyUnion{
6+
7+
private Integer someField;
8+
9+
public UnionMember1() {
10+
}
11+
12+
public UnionMember1(Integer someField) {
13+
this.someField = someField;
14+
}
15+
16+
public Integer getSomeField() {
17+
return someField;
18+
}
19+
public void setSomeField(Integer someField) {
20+
this.someField = someField;
21+
}
22+
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.kobylynskyi.graphql.multifiles;
2+
3+
import java.util.*;
4+
5+
public class UnionMember2 implements MyUnion{
6+
7+
private String someField;
8+
9+
public UnionMember2() {
10+
}
11+
12+
public UnionMember2(String someField) {
13+
this.someField = someField;
14+
}
15+
16+
public String getSomeField() {
17+
return someField;
18+
}
19+
public void setSomeField(String someField) {
20+
this.someField = someField;
21+
}
22+
23+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type UnionMember1 {
2+
someField: Int
3+
}
4+
5+
union MyUnion = UnionMember1 | UnionMember2
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type UnionMember2 {
2+
someField: String
3+
}

0 commit comments

Comments
 (0)