Skip to content

Commit 2ab0e0e

Browse files
authored
Merge pull request #4 from kobylynskyi/develop
0.2
2 parents f3532a6 + 58a869b commit 2ab0e0e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+806
-105
lines changed

README.md

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ This Gradle plugin is able to generate the following classes based on your Graph
1717
### Plugin Setup
1818

1919
plugins {
20-
id "com.kobylynskyi.graphql.codegen" version "0.1"
20+
id "com.kobylynskyi.graphql.codegen" version "0.2"
2121
}
2222

2323
Using [legacy plugin application](https://docs.gradle.org/current/userguide/plugins.html#sec:old_plugin_application):
@@ -29,7 +29,7 @@ Using [legacy plugin application](https://docs.gradle.org/current/userguide/plug
2929
}
3030
}
3131
dependencies {
32-
classpath "com.kobylynskyi.graphql.codegen:graphql-codegen-gradle-plugin:0.1"
32+
classpath "com.kobylynskyi.graphql.codegen:graphql-codegen-gradle-plugin:0.2"
3333
}
3434
}
3535

@@ -53,13 +53,7 @@ Using [legacy plugin application](https://docs.gradle.org/current/userguide/plug
5353
```
5454
* Add generated sources to your project source sets:
5555
```
56-
sourceSets {
57-
main {
58-
java {
59-
srcDir "$buildDir/generated/graphql"
60-
}
61-
}
62-
}
56+
sourceSets.main.java.srcDir "$buildDir/generated"
6357
```
6458

6559

@@ -71,11 +65,10 @@ Using [legacy plugin application](https://docs.gradle.org/current/userguide/plug
7165
| packageName | String | Empty | Java package for generated classes. |
7266
| outputDir | String | None | The output target directory into which code will be generated. |
7367
| customTypesMapping | Map(String,String) | Empty | Map of (GraphQL Schema Type) to (Java Type). Can be used to supply custom mappings for scalars. |
74-
| - | - | - | - |
75-
| **TBD** apiPackage | String | Empty | |
76-
| **TBD** modelPackage | String | Empty | |
77-
| **TBD** modelNamePrefix | String | Empty | |
78-
| **TBD** modelNameSuffix | String | Empty | |
68+
| modelNamePrefix | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). |
69+
| modelNameSuffix | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). |
70+
| apiPackage | String | Empty | Java package for generated api classes (Query, Mutation, Subscription). |
71+
| modelPackage | String | Empty | Java package for generated model classes (type, input, interface, enum, union). |
7972

8073

8174
### Example

graphql-codegen-gradle-plugin-example/build.gradle

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
id "java"
1010
id "net.ltgt.apt" version "0.21"
1111
id "net.ltgt.apt-idea" version "0.21"
12-
id "com.kobylynskyi.graphql.codegen" version "0.1"
12+
id "com.kobylynskyi.graphql.codegen" version "0.2"
1313
}
1414

1515
ext {
@@ -21,19 +21,18 @@ ext {
2121
}
2222

2323
group = "com.kobylynskyi"
24-
version = "0.1-SNAPSHOT"
24+
version = "0.2"
2525
description = "graphql-java-codegen-example"
26-
sourceCompatibility = "1.8"
2726

28-
compileJava.dependsOn tasks.graphqlCodegen
27+
compileJava.dependsOn "graphqlCodegen"
2928

30-
sourceSets.main.java.srcDir "build/generated"
29+
sourceSets.main.java.srcDir "$buildDir/generated"
3130

3231
graphqlCodegen {
3332
graphqlSchemaPaths = [
3433
"$projectDir/src/main/resources/schema.graphqls".toString()
3534
]
36-
outputDir = "$buildDir/generated"
35+
outputDir = new File("$buildDir/generated")
3736
packageName = "com.kobylynskyi.graphql.codegen"
3837
}
3938

graphql-codegen-gradle-plugin/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ apply plugin: "java"
1515
apply plugin: "idea"
1616
apply plugin: "maven-publish"
1717

18-
version = "0.1"
18+
version = "0.2"
1919
group = "com.kobylynskyi.graphql.codegen"
2020

2121
dependencies {

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.kobylynskyi.graphql.codegen;
22

3+
import com.kobylynskyi.graphql.codegen.model.UnableToLoadFreeMarkerTemplateException;
34
import freemarker.template.Configuration;
45
import freemarker.template.Template;
56
import freemarker.template.TemplateExceptionHandler;
@@ -29,7 +30,7 @@ class FreeMarkerTemplatesRegistry {
2930
interfaceTemplate = configuration.getTemplate("templates/javaClassGraphqlInterface.ftl");
3031
operationsTemplate = configuration.getTemplate("templates/javaClassGraphqlOperations.ftl");
3132
} catch (IOException e) {
32-
throw new RuntimeException("Unable to load FreeMarker templates", e);
33+
throw new UnableToLoadFreeMarkerTemplateException(e);
3334
}
3435
}
3536
}

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/GraphqlCodegen.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,17 @@
3535
public class GraphqlCodegen {
3636

3737
private List<String> schemas;
38-
private String outputDir;
38+
private File outputDir;
3939
private MappingConfig mappingConfig;
4040

41-
private File classesOutputDir;
42-
43-
public GraphqlCodegen(List<String> schemas, String outputDir, MappingConfig mappingConfig) {
41+
public GraphqlCodegen(List<String> schemas, File outputDir, MappingConfig mappingConfig) {
4442
this.schemas = schemas;
4543
this.outputDir = outputDir;
4644
this.mappingConfig = mappingConfig;
4745
}
4846

4947
public void generate() throws IOException, TemplateException {
50-
classesOutputDir = prepareOutputDir(outputDir, mappingConfig);
48+
prepareOutputDir();
5149
for (String schema : schemas) {
5250
long startTime = System.currentTimeMillis();
5351
Document document = GraphqlDocumentParser.getDocument(schema);
@@ -81,7 +79,7 @@ private void processDocument(Document document) throws IOException, TemplateExce
8179
}
8280
}
8381
System.out.println(String.format("Generated %d definitions in folder '%s'", document.getDefinitions().size(),
84-
classesOutputDir.getAbsolutePath()));
82+
outputDir.getAbsolutePath()));
8583
}
8684

8785
private void generateUnion(UnionTypeDefinition definition) throws IOException, TemplateException {
@@ -131,27 +129,30 @@ private void addScalarsToCustomMappingConfig(Document document) {
131129
}
132130

133131
private void generateFile(Template template, Map<String, Object> dataModel) throws IOException, TemplateException {
134-
File javaSourceFile = new File(classesOutputDir, dataModel.get(DataModelFields.CLASS_NAME) + ".java");
132+
String fileName = dataModel.get(DataModelFields.CLASS_NAME) + ".java";
133+
File fileOutputDir = getFileTargetDirectory(dataModel);
134+
File javaSourceFile = new File(fileOutputDir, fileName);
135135
boolean fileCreated = javaSourceFile.createNewFile();
136136
if (!fileCreated) {
137137
throw new FileAlreadyExistsException("File already exists: " + javaSourceFile.getPath());
138138
}
139139
template.process(dataModel, new FileWriter(javaSourceFile));
140140
}
141141

142-
private static File prepareOutputDir(String outputDir, MappingConfig mappingConfig) throws IOException {
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 {
143148
File targetDir;
144-
String packageName = mappingConfig.getPackageName();
145-
if (packageName == null || packageName.trim().isEmpty()) {
146-
targetDir = new File(outputDir);
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));
147152
} else {
148-
targetDir = new File(outputDir, packageName.replace(".", File.separator));
149-
}
150-
Utils.deleteFolder(targetDir);
151-
boolean outputDirCreated = targetDir.mkdirs();
152-
if (!outputDirCreated) {
153-
throw new IOException("Unable to create output directory");
153+
targetDir = outputDir;
154154
}
155+
Utils.createDirIfAbsent(targetDir);
155156
return targetDir;
156157
}
157158

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/gradle/GraphqlCodegenGradleTask.java

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.gradle.api.tasks.OutputDirectory;
1010
import org.gradle.api.tasks.TaskAction;
1111

12+
import java.io.File;
1213
import java.io.IOException;
1314
import java.util.HashMap;
1415
import java.util.List;
@@ -22,15 +23,23 @@
2223
public class GraphqlCodegenGradleTask extends DefaultTask {
2324

2425
private List<String> graphqlSchemaPaths;
25-
private String outputDir;
26+
private File outputDir;
2627
private Map<String, String> customTypesMapping;
2728
private String packageName;
29+
private String apiPackageName;
30+
private String modelPackageName;
31+
private String modelNamePrefix;
32+
private String modelNameSuffix;
2833

2934
@TaskAction
3035
public void generate() throws IOException, TemplateException {
3136
MappingConfig mappingConfig = new MappingConfig();
3237
mappingConfig.setPackageName(packageName);
3338
mappingConfig.setCustomTypesMapping(customTypesMapping != null ? customTypesMapping : new HashMap<>());
39+
mappingConfig.setModelNamePrefix(modelNamePrefix);
40+
mappingConfig.setModelNameSuffix(modelNameSuffix);
41+
mappingConfig.setApiPackageName(apiPackageName);
42+
mappingConfig.setModelPackageName(modelPackageName);
3443
new GraphqlCodegen(graphqlSchemaPaths, outputDir, mappingConfig).generate();
3544
}
3645

@@ -44,11 +53,11 @@ public void setGraphqlSchemaPaths(List<String> graphqlSchemaPaths) {
4453
}
4554

4655
@OutputDirectory
47-
public String getOutputDir() {
56+
public File getOutputDir() {
4857
return outputDir;
4958
}
5059

51-
public void setOutputDir(String outputDir) {
60+
public void setOutputDir(File outputDir) {
5261
this.outputDir = outputDir;
5362
}
5463

@@ -72,4 +81,44 @@ public void setPackageName(String packageName) {
7281
this.packageName = packageName;
7382
}
7483

84+
@Input
85+
@Optional
86+
public String getModelNamePrefix() {
87+
return modelNamePrefix;
88+
}
89+
90+
public void setModelNameSuffix(String modelNameSuffix) {
91+
this.modelNameSuffix = modelNameSuffix;
92+
}
93+
94+
@Input
95+
@Optional
96+
public String getModelNameSuffix() {
97+
return modelNameSuffix;
98+
}
99+
100+
public void setModelNamePrefix(String modelNamePrefix) {
101+
this.modelNamePrefix = modelNamePrefix;
102+
}
103+
104+
@Input
105+
@Optional
106+
public String getApiPackageName() {
107+
return apiPackageName;
108+
}
109+
110+
public void setApiPackageName(String apiPackageName) {
111+
this.apiPackageName = apiPackageName;
112+
}
113+
114+
@Input
115+
@Optional
116+
public String getModelPackageName() {
117+
return modelPackageName;
118+
}
119+
120+
public void setModelPackageName(String modelPackageName) {
121+
this.modelPackageName = modelPackageName;
122+
}
123+
75124
}

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.kobylynskyi.graphql.codegen.mapper;
22

33
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
4-
import com.kobylynskyi.graphql.codegen.utils.Utils;
54
import graphql.language.EnumTypeDefinition;
65

76
import java.util.HashMap;
@@ -25,11 +24,11 @@ public class EnumDefinitionToDataModelMapper {
2524
*/
2625
public static Map<String, Object> map(MappingConfig mappingConfig, EnumTypeDefinition enumDef) {
2726
Map<String, Object> dataModel = new HashMap<>();
28-
29-
dataModel.put(PACKAGE, mappingConfig.getPackageName());
30-
dataModel.put(CLASS_NAME, Utils.capitalize(enumDef.getName()));
27+
String packageName = MapperUtils.getModelPackageName(mappingConfig);
28+
dataModel.put(PACKAGE, packageName);
29+
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
30+
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, enumDef));
3131
dataModel.put(FIELDS, EnumValueDefinitionToStringMapper.map(enumDef.getEnumValueDefinitions()));
32-
3332
return dataModel;
3433
}
3534

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToDataModelMapper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ public class FieldDefinitionToDataModelMapper {
2929
public static Map<String, Object> map(MappingConfig mappingConfig, FieldDefinition fieldDefinition,
3030
String objectType) {
3131
Map<String, Object> dataModel = new HashMap<>();
32-
dataModel.put(PACKAGE, mappingConfig.getPackageName());
32+
String packageName = MapperUtils.getApiPackageName(mappingConfig);
33+
dataModel.put(PACKAGE, packageName);
34+
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
3335
dataModel.put(CLASS_NAME, getClassName(fieldDefinition.getName(), objectType));
3436
Operation operation = mapFieldDefinition(mappingConfig, fieldDefinition);
3537
dataModel.put(OPERATIONS, Collections.singletonList(operation));

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphqlTypeToJavaTypeMapper.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
* @author kobylynskyi
1515
*/
16-
public class GraphqlTypeToJavaTypeMapper {
16+
class GraphqlTypeToJavaTypeMapper {
1717

1818
static String mapToJavaType(MappingConfig mappingConfig, Type type) {
1919
if (type instanceof TypeName) {
@@ -27,7 +27,7 @@ static String mapToJavaType(MappingConfig mappingConfig, Type type) {
2727
}
2828

2929
private static String wrapIntoJavaCollection(String type) {
30-
return String.format("java.util.Collection<%s>", type);
30+
return String.format("Collection<%s>", type);
3131
}
3232

3333
private static String mapToJavaType(MappingConfig mappingConfig, String graphlType) {
@@ -40,8 +40,13 @@ private static String mapToJavaType(MappingConfig mappingConfig, String graphlTy
4040
return "String";
4141
case "Int":
4242
return "Integer";
43-
default: // String, Float, Boolean
43+
case "String":
44+
case "Float":
45+
case "Boolean":
4446
return graphlType;
47+
default:
48+
// We need to refer other custom types/interfaces/unions with prefix and suffix
49+
return MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, graphlType);
4550
}
4651
}
4752

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.kobylynskyi.graphql.codegen.mapper;
22

33
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
4-
import com.kobylynskyi.graphql.codegen.utils.Utils;
54
import graphql.language.InputObjectTypeDefinition;
65

76
import java.util.HashMap;
@@ -25,8 +24,10 @@ public class InputDefinitionToDataModelMapper {
2524
*/
2625
public static Map<String, Object> map(MappingConfig mappingConfig, InputObjectTypeDefinition typeDefinition) {
2726
Map<String, Object> dataModel = new HashMap<>();
28-
dataModel.put(PACKAGE, mappingConfig.getPackageName());
29-
dataModel.put(CLASS_NAME, Utils.capitalize(typeDefinition.getName()));
27+
String packageName = MapperUtils.getModelPackageName(mappingConfig);
28+
dataModel.put(PACKAGE, packageName);
29+
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
30+
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, typeDefinition));
3031
dataModel.put(NAME, typeDefinition.getName());
3132
dataModel.put(FIELDS, InputValueDefinitionToParameterMapper.map(mappingConfig, typeDefinition.getInputValueDefinitions()));
3233
return dataModel;

graphql-codegen-gradle-plugin/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InterfaceDefinitionToDataModelMapper.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.kobylynskyi.graphql.codegen.mapper;
22

33
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
4-
import com.kobylynskyi.graphql.codegen.utils.Utils;
54
import graphql.language.InterfaceTypeDefinition;
65

76
import java.util.HashMap;
@@ -25,8 +24,10 @@ public class InterfaceDefinitionToDataModelMapper {
2524
*/
2625
public static Map<String, Object> map(MappingConfig mappingConfig, InterfaceTypeDefinition typeDefinition) {
2726
Map<String, Object> dataModel = new HashMap<>();
28-
dataModel.put(PACKAGE, mappingConfig.getPackageName());
29-
dataModel.put(CLASS_NAME, Utils.capitalize(typeDefinition.getName()));
27+
String packageName = MapperUtils.getModelPackageName(mappingConfig);
28+
dataModel.put(PACKAGE, packageName);
29+
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
30+
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, typeDefinition));
3031
dataModel.put(FIELDS, FieldDefinitionToParameterMapper.map(mappingConfig, typeDefinition.getFieldDefinitions()));
3132
return dataModel;
3233
}

0 commit comments

Comments
 (0)