提交 64197db8 编写于 作者: L Lorenz Leutgeb 提交者: Bogdan Kobylynskyi

Add generation of immutable models

上级 1e8debd5
......@@ -14,6 +14,7 @@
| `generateAsyncApi` | Boolean | False | If true, then wrap type into `java.util.concurrent.CompletableFuture` or `subscriptionReturnType` |
| `generateDataFetchingEnvironmentArgumentInApis` | Boolean | False | If true, then `graphql.schema.DataFetchingEnvironment env` will be added as a last argument to all methods of root type resolvers and field resolvers. |
| `generateEqualsAndHashCode` | Boolean | False | Specifies whether generated model classes should have equals and hashCode methods defined. |
| `generateImmutableModels` | Boolean | False | Specifies whether generated model classes should be immutable. |
| `generateToString` | Boolean | False | Specifies whether generated model classes should have toString method defined. |
| `apiNamePrefix` | String | Empty | Sets the prefix for GraphQL api classes (query, mutation, subscription). |
| `apiNameSuffix` | String | Resolver | Sets the suffix for GraphQL api classes (query, mutation, subscription). |
......@@ -100,4 +101,4 @@ Sample content of the file:
"Price.amount": "java.math.BigDecimal"
}
}
```
\ No newline at end of file
```
......@@ -59,6 +59,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
private Boolean generateApis = MappingConfigConstants.DEFAULT_GENERATE_APIS;
private String modelValidationAnnotation;
private Boolean generateEqualsAndHashCode = MappingConfigConstants.DEFAULT_EQUALS_AND_HASHCODE;
private Boolean generateImmutableModels = MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS;
private Boolean generateToString = MappingConfigConstants.DEFAULT_TO_STRING;
private Boolean generateAsyncApi = MappingConfigConstants.DEFAULT_GENERATE_ASYNC_APIS;
private Boolean generateParameterizedFieldsResolvers = MappingConfigConstants.DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS;
......@@ -100,6 +101,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
mappingConfig.setSubscriptionReturnType(subscriptionReturnType);
mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping);
mappingConfig.setGenerateEqualsAndHashCode(generateEqualsAndHashCode);
mappingConfig.setGenerateImmutableModels(generateImmutableModels);
mappingConfig.setGenerateToString(generateToString);
mappingConfig.setGenerateAsyncApi(generateAsyncApi);
mappingConfig.setGenerateParameterizedFieldsResolvers(generateParameterizedFieldsResolvers);
......@@ -359,6 +361,17 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
this.generateEqualsAndHashCode = generateEqualsAndHashCode;
}
@Input
@Optional
@Override
public Boolean getGenerateImmutableModels() {
return generateImmutableModels;
}
public void setGenerateImmutableModels(Boolean generateImmutableModels) {
this.generateImmutableModels = generateImmutableModels;
}
@Input
@Optional
@Override
......
......@@ -59,6 +59,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_EQUALS_AND_HASHCODE_STRING)
private boolean generateEqualsAndHashCode;
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS_STRING)
private boolean generateImmutableModels;
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_TO_STRING_STRING)
private boolean generateToString;
......@@ -157,6 +160,7 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
mappingConfig.setModelValidationAnnotation(modelValidationAnnotation);
mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>());
mappingConfig.setGenerateEqualsAndHashCode(generateEqualsAndHashCode);
mappingConfig.setGenerateImmutableModels(generateImmutableModels);
mappingConfig.setGenerateToString(generateToString);
mappingConfig.setSubscriptionReturnType(subscriptionReturnType);
mappingConfig.setGenerateAsyncApi(generateAsyncApi);
......@@ -364,6 +368,15 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
this.generateEqualsAndHashCode = generateEqualsAndHashCode;
}
@Override
public Boolean getGenerateImmutableModels() {
return generateImmutableModels;
}
public void setGenerateImmutableModels(boolean generateImmutableModels) {
this.generateImmutableModels = generateImmutableModels;
}
@Override
public Boolean getGenerateToString() {
return generateToString;
......
......@@ -92,6 +92,9 @@ public class GraphQLCodegen {
if (mappingConfig.getParametrizedInputSuffix() == null) {
mappingConfig.setParametrizedInputSuffix(MappingConfigConstants.DEFAULT_PARAMETRIZED_INPUT_SUFIX);
}
if (mappingConfig.getGenerateImmutableModels() == null) {
mappingConfig.setGenerateImmutableModels(MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS);
}
if (mappingConfig.getGenerateToString() == null) {
mappingConfig.setGenerateToString(MappingConfigConstants.DEFAULT_TO_STRING);
}
......
......@@ -32,6 +32,7 @@ public class InputDefinitionToDataModelMapper {
dataModel.put(FIELDS, InputValueDefinitionToParameterMapper.map(mappingContext, definition.getValueDefinitions(), definition.getName()));
dataModel.put(BUILDER, mappingContext.getGenerateBuilder());
dataModel.put(EQUALS_AND_HASH_CODE, mappingContext.getGenerateEqualsAndHashCode());
dataModel.put(IMMUTABLE_MODELS, mappingContext.getGenerateImmutableModels());
dataModel.put(TO_STRING, mappingContext.getGenerateToString());
dataModel.put(TO_STRING_FOR_REQUEST, mappingContext.getGenerateClient());
return dataModel;
......
......@@ -20,6 +20,7 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.BUILDER;
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME;
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.EQUALS_AND_HASH_CODE;
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS;
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMMUTABLE_MODELS;
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMPLEMENTS;
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC;
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE;
......@@ -53,6 +54,7 @@ public class TypeDefinitionToDataModelMapper {
dataModel.put(FIELDS, getFields(mappingContext, definition, document));
dataModel.put(BUILDER, mappingContext.getGenerateBuilder());
dataModel.put(EQUALS_AND_HASH_CODE, mappingContext.getGenerateEqualsAndHashCode());
dataModel.put(IMMUTABLE_MODELS, mappingContext.getGenerateImmutableModels());
dataModel.put(TO_STRING, mappingContext.getGenerateToString());
dataModel.put(TO_STRING_FOR_REQUEST, mappingContext.getGenerateClient());
return dataModel;
......
......@@ -16,6 +16,7 @@ public final class DataModelFields {
public static final String OPERATIONS = "operations";
public static final String BUILDER = "builder";
public static final String EQUALS_AND_HASH_CODE = "equalsAndHashCode";
public static final String IMMUTABLE_MODELS = "immutableModels";
public static final String TO_STRING = "toString";
public static final String TO_STRING_FOR_REQUEST = "toStringForRequest";
public static final String JAVA_DOC = "javaDoc";
......
......@@ -134,6 +134,13 @@ public interface GraphQLCodegenConfiguration {
*/
Boolean getGenerateEqualsAndHashCode();
/**
* Specifies whether generated model classes should be immutable.
*
* @return <b>true</b> if generated model classes should be immutable.
*/
Boolean getGenerateImmutableModels();
/**
* Specifies whether generated model classes should have toString method defined.
*
......
......@@ -39,6 +39,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
private Boolean generateBuilder;
private Boolean generateEqualsAndHashCode;
private Boolean generateToString;
private Boolean generateImmutableModels;
private Boolean generateAsyncApi;
private Boolean generateParameterizedFieldsResolvers;
private Boolean generateExtensionFieldsResolvers;
......@@ -90,6 +91,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
this.subscriptionReturnType = source.subscriptionReturnType != null ? source.subscriptionReturnType : this.subscriptionReturnType;
this.generateBuilder = source.generateBuilder != null ? source.generateBuilder : this.generateBuilder;
this.generateEqualsAndHashCode = source.generateEqualsAndHashCode != null ? source.generateEqualsAndHashCode : this.generateEqualsAndHashCode;
this.generateImmutableModels = source.generateImmutableModels != null ? source.generateImmutableModels : this.generateImmutableModels;
this.generateToString = source.generateToString != null ? source.generateToString : this.generateToString;
this.generateAsyncApi = source.generateAsyncApi != null ? source.generateAsyncApi : this.generateAsyncApi;
this.generateParameterizedFieldsResolvers = source.generateParameterizedFieldsResolvers != null ? source.generateParameterizedFieldsResolvers : this.generateParameterizedFieldsResolvers;
......
......@@ -13,6 +13,8 @@ public class MappingConfigConstants {
public static final String DEFAULT_BUILDER_STRING = "true";
public static final boolean DEFAULT_EQUALS_AND_HASHCODE = false;
public static final String DEFAULT_EQUALS_AND_HASHCODE_STRING = "false";
public static final boolean DEFAULT_GENERATE_IMMUTABLE_MODELS = false;
public static final String DEFAULT_GENERATE_IMMUTABLE_MODELS_STRING = "false";
public static final boolean DEFAULT_TO_STRING = false;
public static final String DEFAULT_TO_STRING_STRING = "false";
public static final boolean DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS = true;
......
......@@ -94,6 +94,11 @@ public class MappingContext implements GraphQLCodegenConfiguration {
return config.getGenerateEqualsAndHashCode();
}
@Override
public Boolean getGenerateImmutableModels() {
return config.getGenerateImmutableModels();
}
@Override
public Boolean getGenerateToString() {
return config.getGenerateToString();
......
......@@ -61,6 +61,7 @@ public class ${className} implements java.io.Serializable<#if implements?has_con
public ${field.type} get${field.name?cap_first}() {
return ${field.name};
}
<#if !immutableModels>
<#if field.javaDoc?has_content>
/**
<#list field.javaDoc as javaDocLine>
......@@ -74,6 +75,7 @@ public class ${className} implements java.io.Serializable<#if implements?has_con
public void set${field.name?cap_first}(${field.type} ${field.name}) {
this.${field.name} = ${field.name};
}
</#if>
</#list>
<#if equalsAndHashCode>
......
package com.kobylynskyi.graphql.codegen;
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.utils.Utils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.Collections;
import java.util.Objects;
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName;
class GraphQLCodegenImmutableTest {
private GraphQLCodegen generator;
private final MappingConfig mappingConfig = new MappingConfig();
private final File outputBuildDir = new File("build/generated");
private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/immutable");
@BeforeEach
void init() {
mappingConfig.setPackageName("com.kobylynskyi.graphql.immutable");
generator = new GraphQLCodegen(Collections.singletonList("src/test/resources/schemas/test.graphqls"),
outputBuildDir, mappingConfig);
}
@AfterEach
void cleanup() {
Utils.deleteDir(new File("build/generated"));
}
@Test
void generate_CheckFiles() throws Exception {
mappingConfig.setGenerateImmutableModels(true);
generator.generate();
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
assertSameTrimmedContent(
new File("src/test/resources/expected-classes/immutable/Event.java.txt"),
getFileByName(files, "Event.java"));
}
}
......@@ -38,6 +38,7 @@ class MappingConfigTest {
assertTrue(mappingConfig.getGenerateBuilder());
assertTrue(mappingConfig.getGenerateApis());
assertTrue(mappingConfig.getGenerateEqualsAndHashCode());
assertFalse(mappingConfig.getGenerateImmutableModels());
assertTrue(mappingConfig.getGenerateToString());
assertEquals("ModelNamePrefix", mappingConfig.getModelNamePrefix());
assertEquals("ModelNameSuffix", mappingConfig.getModelNameSuffix());
......@@ -66,6 +67,7 @@ class MappingConfigTest {
assertTrue(mappingConfig.getGenerateBuilder());
assertTrue(mappingConfig.getGenerateApis());
assertTrue(mappingConfig.getGenerateEqualsAndHashCode());
assertFalse(mappingConfig.getGenerateImmutableModels());
assertTrue(mappingConfig.getGenerateToString());
assertEquals("ModelNamePrefix", mappingConfig.getModelNamePrefix());
assertEquals("ModelNameSuffix", mappingConfig.getModelNameSuffix());
......@@ -98,6 +100,7 @@ class MappingConfigTest {
assertFalse(mappingConfig.getGenerateBuilder());
assertFalse(mappingConfig.getGenerateApis());
assertFalse(mappingConfig.getGenerateEqualsAndHashCode());
assertTrue(mappingConfig.getGenerateImmutableModels());
assertFalse(mappingConfig.getGenerateToString());
assertEquals("ModelNamePrefix2", mappingConfig.getModelNamePrefix());
assertEquals("ModelNameSuffix2", mappingConfig.getModelNameSuffix());
......@@ -130,6 +133,7 @@ class MappingConfigTest {
config.setGenerateBuilder(true);
config.setGenerateApis(true);
config.setGenerateEqualsAndHashCode(true);
config.setGenerateImmutableModels(false);
config.setGenerateToString(true);
config.setModelNamePrefix("ModelNamePrefix");
config.setModelNameSuffix("ModelNameSuffix");
......@@ -157,6 +161,7 @@ class MappingConfigTest {
config.setApiPackageName("ApiPackageName2");
config.setGenerateBuilder(false);
config.setGenerateApis(false);
config.setGenerateImmutableModels(true);
config.setGenerateEqualsAndHashCode(false);
config.setGenerateToString(false);
config.setModelNamePrefix("ModelNamePrefix2");
......
package com.kobylynskyi.graphql.immutable;
/**
* An event that describes a thing that happens
*/
public class Event implements java.io.Serializable {
private String id;
private String categoryId;
private java.util.Collection<EventProperty> properties;
private EventStatus status;
private String createdBy;
private String createdDateTime;
private Boolean active;
private Integer rating;
public Event() {
}
public Event(String id, String categoryId, java.util.Collection<EventProperty> properties, EventStatus status, String createdBy, String createdDateTime, Boolean active, Integer rating) {
this.id = id;
this.categoryId = categoryId;
this.properties = properties;
this.status = status;
this.createdBy = createdBy;
this.createdDateTime = createdDateTime;
this.active = active;
this.rating = rating;
}
public String getId() {
return id;
}
public String getCategoryId() {
return categoryId;
}
public java.util.Collection<EventProperty> getProperties() {
return properties;
}
public EventStatus getStatus() {
return status;
}
public String getCreatedBy() {
return createdBy;
}
public String getCreatedDateTime() {
return createdDateTime;
}
public Boolean getActive() {
return active;
}
public Integer getRating() {
return rating;
}
public static Event.Builder builder() {
return new Event.Builder();
}
public static class Builder {
private String id;
private String categoryId;
private java.util.Collection<EventProperty> properties;
private EventStatus status;
private String createdBy;
private String createdDateTime;
private Boolean active;
private Integer rating;
public Builder() {
}
public Builder setId(String id) {
this.id = id;
return this;
}
public Builder setCategoryId(String categoryId) {
this.categoryId = categoryId;
return this;
}
public Builder setProperties(java.util.Collection<EventProperty> properties) {
this.properties = properties;
return this;
}
public Builder setStatus(EventStatus status) {
this.status = status;
return this;
}
public Builder setCreatedBy(String createdBy) {
this.createdBy = createdBy;
return this;
}
public Builder setCreatedDateTime(String createdDateTime) {
this.createdDateTime = createdDateTime;
return this;
}
public Builder setActive(Boolean active) {
this.active = active;
return this;
}
public Builder setRating(Integer rating) {
this.rating = rating;
return this;
}
public Event build() {
return new Event(id, categoryId, properties, status, createdBy, createdDateTime, active, rating);
}
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册