Skip to content

Commit 1c03bda

Browse files
committed
Move out files generation logic to GraphqlCodegenFileCreator
1 parent b28edd9 commit 1c03bda

File tree

3 files changed

+67
-44
lines changed

3 files changed

+67
-44
lines changed

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

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
package com.kobylynskyi.graphql.codegen;
22

33
import com.kobylynskyi.graphql.codegen.mapper.*;
4-
import com.kobylynskyi.graphql.codegen.model.DataModelFields;
54
import com.kobylynskyi.graphql.codegen.model.DefinitionType;
65
import com.kobylynskyi.graphql.codegen.model.DefinitionTypeDeterminer;
76
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
8-
import com.kobylynskyi.graphql.codegen.utils.Utils;
9-
import freemarker.template.Template;
107
import freemarker.template.TemplateException;
118
import graphql.language.*;
129
import lombok.Getter;
1310
import lombok.Setter;
1411

1512
import java.io.File;
16-
import java.io.FileWriter;
1713
import java.io.IOException;
18-
import java.nio.file.FileAlreadyExistsException;
1914
import java.util.List;
2015
import java.util.Map;
2116

@@ -45,7 +40,7 @@ public GraphqlCodegen(List<String> schemas, File outputDir, MappingConfig mappin
4540
}
4641

4742
public void generate() throws Exception {
48-
prepareOutputDir();
43+
GraphqlCodegenFileCreator.prepareOutputDir(outputDir);
4944
for (String schema : schemas) {
5045
long startTime = System.currentTimeMillis();
5146
Document document = GraphqlDocumentParser.getDocument(schema);
@@ -84,76 +79,46 @@ private void processDocument(Document document) throws IOException, TemplateExce
8479

8580
private void generateUnion(UnionTypeDefinition definition) throws IOException, TemplateException {
8681
Map<String, Object> dataModel = UnionDefinitionToDataModelMapper.map(mappingConfig, definition);
87-
generateFile(FreeMarkerTemplatesRegistry.unionTemplate, dataModel);
82+
GraphqlCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.unionTemplate, dataModel, outputDir);
8883
}
8984

9085
private void generateInterface(InterfaceTypeDefinition definition) throws IOException, TemplateException {
9186
Map<String, Object> dataModel = InterfaceDefinitionToDataModelMapper.map(mappingConfig, definition);
92-
generateFile(FreeMarkerTemplatesRegistry.interfaceTemplate, dataModel);
87+
GraphqlCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.interfaceTemplate, dataModel, outputDir);
9388
}
9489

9590
private void generateOperation(ObjectTypeDefinition definition) throws IOException, TemplateException {
9691
for (FieldDefinition fieldDef : definition.getFieldDefinitions()) {
9792
Map<String, Object> dataModel = FieldDefinitionToDataModelMapper.map(mappingConfig, fieldDef, definition.getName());
98-
generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel);
93+
GraphqlCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir);
9994
}
10095
// We need to generate a root object to workaround https://github.com/facebook/relay/issues/112
10196
Map<String, Object> dataModel = ObjectDefinitionToDataModelMapper.map(mappingConfig, definition);
102-
generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel);
97+
GraphqlCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir);
10398
}
10499

105100
private void generateType(ObjectTypeDefinition definition, Document document) throws IOException, TemplateException {
106101
Map<String, Object> dataModel = TypeDefinitionToDataModelMapper.map(mappingConfig, definition, document);
107-
generateFile(FreeMarkerTemplatesRegistry.typeTemplate, dataModel);
102+
GraphqlCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.typeTemplate, dataModel, outputDir);
108103
}
109104

110105
private void generateInput(InputObjectTypeDefinition definition) throws IOException, TemplateException {
111106
Map<String, Object> dataModel = InputDefinitionToDataModelMapper.map(mappingConfig, definition);
112-
generateFile(FreeMarkerTemplatesRegistry.typeTemplate, dataModel);
107+
GraphqlCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.typeTemplate, dataModel, outputDir);
113108
}
114109

115110
private void generateEnum(EnumTypeDefinition definition) throws IOException, TemplateException {
116111
Map<String, Object> dataModel = EnumDefinitionToDataModelMapper.map(mappingConfig, definition);
117-
generateFile(FreeMarkerTemplatesRegistry.enumTemplate, dataModel);
112+
GraphqlCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.enumTemplate, dataModel, outputDir);
118113
}
119114

120115
private void addScalarsToCustomMappingConfig(Document document) {
121116
for (Definition definition : document.getDefinitions()) {
122117
if (definition instanceof ScalarTypeDefinition) {
123118
String scalarName = ((ScalarTypeDefinition) definition).getName();
124-
if (!mappingConfig.getCustomTypesMapping().containsKey(scalarName)) {
125-
mappingConfig.getCustomTypesMapping().put(scalarName, "String");
126-
}
119+
mappingConfig.putCustomTypeMappingIfAbsent(scalarName, "String");
127120
}
128121
}
129122
}
130123

131-
private void generateFile(Template template, Map<String, Object> dataModel) throws IOException, TemplateException {
132-
String fileName = dataModel.get(DataModelFields.CLASS_NAME) + ".java";
133-
File fileOutputDir = getFileTargetDirectory(dataModel);
134-
File javaSourceFile = new File(fileOutputDir, fileName);
135-
boolean fileCreated = javaSourceFile.createNewFile();
136-
if (!fileCreated) {
137-
throw new FileAlreadyExistsException("File already exists: " + javaSourceFile.getPath());
138-
}
139-
template.process(dataModel, new FileWriter(javaSourceFile));
140-
}
141-
142-
private void prepareOutputDir() throws IOException {
143-
Utils.deleteDir(outputDir);
144-
Utils.createDirIfAbsent(outputDir);
145-
}
146-
147-
private File getFileTargetDirectory(Map<String, Object> dataModel) throws IOException {
148-
File targetDir;
149-
Object packageName = dataModel.get(DataModelFields.PACKAGE);
150-
if (packageName != null && !Utils.isBlank(packageName.toString())) {
151-
targetDir = new File(outputDir, packageName.toString().replace(".", File.separator));
152-
} else {
153-
targetDir = outputDir;
154-
}
155-
Utils.createDirIfAbsent(targetDir);
156-
return targetDir;
157-
}
158-
159124
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.kobylynskyi.graphql.codegen;
2+
3+
import com.kobylynskyi.graphql.codegen.model.DataModelFields;
4+
import com.kobylynskyi.graphql.codegen.utils.Utils;
5+
import freemarker.template.Template;
6+
import freemarker.template.TemplateException;
7+
8+
import java.io.File;
9+
import java.io.FileWriter;
10+
import java.io.IOException;
11+
import java.nio.file.FileAlreadyExistsException;
12+
import java.util.Map;
13+
14+
/**
15+
* Utility class for generating files
16+
*
17+
* @author kobylynskyi
18+
*/
19+
class GraphqlCodegenFileCreator {
20+
21+
private static final String EXTENSION = ".java";
22+
23+
static void generateFile(Template template, Map<String, Object> dataModel, File outputDir)
24+
throws IOException, TemplateException {
25+
String fileName = dataModel.get(DataModelFields.CLASS_NAME) + EXTENSION;
26+
File fileOutputDir = getFileTargetDirectory(dataModel, outputDir);
27+
File javaSourceFile = new File(fileOutputDir, fileName);
28+
boolean fileCreated = javaSourceFile.createNewFile();
29+
if (!fileCreated) {
30+
throw new FileAlreadyExistsException("File already exists: " + javaSourceFile.getPath());
31+
}
32+
template.process(dataModel, new FileWriter(javaSourceFile));
33+
}
34+
35+
static void prepareOutputDir(File outputDir) throws IOException {
36+
Utils.deleteDir(outputDir);
37+
Utils.createDirIfAbsent(outputDir);
38+
}
39+
40+
private static File getFileTargetDirectory(Map<String, Object> dataModel, File outputDir) throws IOException {
41+
File targetDir;
42+
Object packageName = dataModel.get(DataModelFields.PACKAGE);
43+
if (packageName != null && !Utils.isBlank(packageName.toString())) {
44+
targetDir = new File(outputDir, packageName.toString().replace(".", File.separator));
45+
} else {
46+
targetDir = outputDir;
47+
}
48+
Utils.createDirIfAbsent(targetDir);
49+
return targetDir;
50+
}
51+
52+
}

src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,10 @@ public class MappingConfig {
1919
private String modelNamePrefix;
2020
private String modelNameSuffix;
2121

22+
public void putCustomTypeMappingIfAbsent(String from, String to) {
23+
if (!customTypesMapping.containsKey(from)) {
24+
customTypesMapping.put(from, to);
25+
}
26+
}
27+
2228
}

0 commit comments

Comments
 (0)