Skip to content

Commit 134bc89

Browse files
authored
New config to generate models with public fields #864 (#1049)
generateModelsWithPublicFields
1 parent 73a342e commit 134bc89

File tree

24 files changed

+585
-53
lines changed

24 files changed

+585
-53
lines changed

docs/codegen-options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
| `useOptionalForNullableReturnTypes` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. |
4444
| `generateApisWithThrowsException` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. |
4545
| `generateNoArgsConstructorOnly` | Boolean | False | Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is <b>true</b> |
46+
| `generateModelsWithPublicFields` | Boolean | False | Specifies whether model classes should have public fields and NO getters/setters. By default, fields are private and there are getters/setters for each field. |
4647
| `apiReturnType` | String | Empty | Return type for api methods (query/mutation). For example: `reactor.core.publisher.Mono`, etc. |
4748
| `apiReturnListType` | String | Empty | Return type for api methods (query/mutation) having list type. For example: `reactor.core.publisher.Flux`, etc. By default is empty, so `apiReturnType` will be used. |
4849
| `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. |

plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
8585
private Boolean generateJacksonTypeIdResolver = MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER;
8686
private Boolean addGeneratedAnnotation = MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION;
8787
private Boolean generateNoArgsConstructorOnly = MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY;
88+
private Boolean generateModelsWithPublicFields = MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS;
8889
private String generatedAnnotation;
8990
private Set<String> fieldsWithResolvers = new HashSet<>();
9091
private Set<String> fieldsWithoutResolvers = new HashSet<>();
@@ -157,6 +158,7 @@ public void generate() throws Exception {
157158
mappingConfig.setGenerateApisWithThrowsException(generateApisWithThrowsException);
158159
mappingConfig.setGenerateJacksonTypeIdResolver(generateJacksonTypeIdResolver);
159160
mappingConfig.setGenerateNoArgsConstructorOnly(generateNoArgsConstructorOnly);
161+
mappingConfig.setGenerateModelsWithPublicFields(generateModelsWithPublicFields);
160162
mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation);
161163
mappingConfig.setGeneratedAnnotation(generatedAnnotation);
162164
mappingConfig.setApiReturnType(apiReturnType);
@@ -695,6 +697,17 @@ public void setGenerateNoArgsConstructorOnly(Boolean generateNoArgsConstructorOn
695697
this.generateNoArgsConstructorOnly = generateNoArgsConstructorOnly;
696698
}
697699

700+
@Input
701+
@Optional
702+
@Override
703+
public Boolean isGenerateModelsWithPublicFields() {
704+
return generateModelsWithPublicFields;
705+
}
706+
707+
public void setGenerateModelsWithPublicFields(Boolean generateModelsWithPublicFields) {
708+
this.generateModelsWithPublicFields = generateModelsWithPublicFields;
709+
}
710+
698711
@Input
699712
@Optional
700713
@Override

plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
158158
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY_STRING)
159159
private boolean generateNoArgsConstructorOnly;
160160

161+
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS_STRING)
162+
private boolean generateModelsWithPublicFields;
163+
161164
@Parameter
162165
private String generatedAnnotation;
163166

@@ -275,6 +278,7 @@ public void execute() throws MojoExecutionException {
275278
mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation);
276279
mappingConfig.setGeneratedAnnotation(generatedAnnotation);
277280
mappingConfig.setGenerateNoArgsConstructorOnly(generateNoArgsConstructorOnly);
281+
mappingConfig.setGenerateModelsWithPublicFields(generateModelsWithPublicFields);
278282
mappingConfig.setFieldsWithResolvers(mapToHashSet(fieldsWithResolvers));
279283
mappingConfig.setFieldsWithoutResolvers(mapToHashSet(fieldsWithoutResolvers));
280284
mappingConfig.setRelayConfig(relayConfig);
@@ -684,6 +688,11 @@ public Boolean isGenerateNoArgsConstructorOnly() {
684688
return generateNoArgsConstructorOnly;
685689
}
686690

691+
@Override
692+
public Boolean isGenerateModelsWithPublicFields() {
693+
return generateModelsWithPublicFields;
694+
}
695+
687696
public ParentInterfacesConfig getParentInterfaces() {
688697
return parentInterfaces;
689698
}

plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,16 @@ trait GraphQLCodegenKeys {
151151
"Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package."
152152
)
153153

154-
// not support in scala
154+
// not supported in scala
155155
val generateNoArgsConstructorOnly = settingKey[Boolean](
156156
"Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is .true."
157157
)
158158

159+
// not supported in scala
160+
val generateModelsWithPublicFields = settingKey[Boolean](
161+
"Specifies whether model classes should have public fields and NO getters/setters. By default, fields are private and there are getters/setters for each field."
162+
)
163+
159164
// for version
160165
val javaxValidationApiVersion = settingKey[Option[String]]("javax-validation-api version")
161166
val graphqlJavaCodegenVersion = settingKey[Option[String]]("graphql-java-codegen version")

plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,17 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co
118118
generateBuilder := MappingConfigConstants.DEFAULT_BUILDER,
119119
generateApis := MappingConfigConstants.DEFAULT_GENERATE_APIS,
120120
generateEqualsAndHashCode := MappingConfigConstants.DEFAULT_EQUALS_AND_HASHCODE,
121-
generateImmutableModels := MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS, // TODO change default value
122-
generateToString := MappingConfigConstants.DEFAULT_TO_STRING,
121+
generateImmutableModels := MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS, // TODO change default value
122+
generateToString := MappingConfigConstants.DEFAULT_TO_STRING,
123123
// parent interfaces configs:
124-
parentInterfaces := parentInterfacesConfig,
125-
generateAllMethodInProjection := MappingConfigConstants.DEFAULT_GENERATE_ALL_METHOD,
126-
responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH,
127-
supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS,
128-
unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME,
129-
generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY,
130-
skip := false
124+
parentInterfaces := parentInterfacesConfig,
125+
generateAllMethodInProjection := MappingConfigConstants.DEFAULT_GENERATE_ALL_METHOD,
126+
responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH,
127+
supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS,
128+
unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME,
129+
generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY,
130+
generateModelsWithPublicFields := MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS,
131+
skip := false
131132
)
132133

133134
private def getMappingConfig(): Def.Initialize[MappingConfig] = Def.setting {
@@ -192,6 +193,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co
192193
mappingConfig.setGenerateModelOpenClasses((GraphQLCodegenConfig / generateModelOpenClasses).value)
193194
mappingConfig.setGenerateJacksonTypeIdResolver((GraphQLCodegenConfig / generateJacksonTypeIdResolver).value);
194195
mappingConfig.setGenerateNoArgsConstructorOnly((GraphQLCodegenConfig / generateNoArgsConstructorOnly).value);
196+
mappingConfig.setGenerateModelsWithPublicFields((GraphQLCodegenConfig / generateModelsWithPublicFields).value);
195197

196198
mappingConfig.setSupportUnknownFields((GraphQLCodegenConfig / supportUnknownFields).value)
197199
mappingConfig.setUnknownFieldsPropertyName((GraphQLCodegenConfig / unknownFieldsPropertyName).value)

src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ private ParameterDefinition mapField(MappingContext mappingContext,
139139
mappingContext, fieldDef.getType(), fieldDef, parentDefinition.getName(), false));
140140
parameter.setJavaDoc(fieldDef.getJavaDoc());
141141
parameter.setDeprecated(DeprecatedDefinitionBuilder.build(mappingContext, fieldDef));
142+
parameter.setVisibility(Utils.getFieldVisibility(mappingContext));
142143
parameter.setMandatory(namedDefinition.isMandatory());
143144
parameter.setSerializeUsingObjectMapper(namedDefinition.isSerializeUsingObjectMapper());
144145
parameter.setGetterMethodName(dataModelMapper.capitalizeMethodNameIfRestricted(mappingContext,

src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ private ParameterDefinition map(MappingContext mappingContext, InputValueDefinit
6666
namedDefinition.getJavaName()));
6767
parameter.setDefaultValue(valueMapper.map(
6868
mappingContext, inputValueDefinition.getDefaultValue(), inputValueDefinition.getType()));
69+
parameter.setVisibility(Utils.getFieldVisibility(mappingContext));
6970
parameter.setAnnotations(annotationsMapper.getAnnotations(mappingContext, inputValueDefinition.getType(),
7071
inputValueDefinition, parentTypeName, false));
7172
parameter.setDeprecated(DeprecatedDefinitionBuilder.build(mappingContext, inputValueDefinition));

src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnknownFieldsSupport.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ default Optional<ParameterDefinition> createUnknownFields(MappingContext mapping
3030
unknownFields.setName(mappingContext.getUnknownFieldsPropertyName());
3131
unknownFields.setGetterMethodName("get" + Utils.capitalize(mappingContext.getUnknownFieldsPropertyName()));
3232
unknownFields.setOriginalName(mappingContext.getUnknownFieldsPropertyName());
33+
unknownFields.setVisibility(Utils.getFieldVisibility(mappingContext));
3334
unknownFields.setType("java.util.Map<String, Object>");
3435
unknownFields.setAnnotations(Arrays.asList(
3536
"com.fasterxml.jackson.annotation.JsonAnyGetter",

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,5 +522,13 @@ public interface GraphQLCodegenConfiguration {
522522
*/
523523
Boolean isGenerateNoArgsConstructorOnly();
524524

525+
/**
526+
* Specifies whether model classes should have public or private fields.
527+
*
528+
* @return <b>true</b> if model classes should have public fields and no getters/setters.
529+
* <b>false</b> if model classes should have private fields and getters/setters.
530+
*/
531+
Boolean isGenerateModelsWithPublicFields();
532+
525533

526534
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
5656
private Boolean generateJacksonTypeIdResolver;
5757
private Boolean supportUnknownFields;
5858
private Boolean generateNoArgsConstructorOnly;
59+
private Boolean generateModelsWithPublicFields;
5960

6061
// field resolvers configs:
6162
private Set<String> fieldsWithResolvers = new HashSet<>();
@@ -212,6 +213,8 @@ public void combine(MappingConfig source) {
212213
GraphQLCodegenConfiguration::getGeneratedAnnotation);
213214
generateNoArgsConstructorOnly = getValueOrDefaultToThis(source,
214215
GraphQLCodegenConfiguration::isGenerateNoArgsConstructorOnly);
216+
generateModelsWithPublicFields = getValueOrDefaultToThis(source,
217+
GraphQLCodegenConfiguration::isGenerateNoArgsConstructorOnly);
215218
}
216219

217220
private <T> T getValueOrDefaultToThis(MappingConfig source, Function<MappingConfig, T> getValueFunction) {
@@ -754,4 +757,13 @@ public Boolean isGenerateNoArgsConstructorOnly() {
754757
public void setGenerateNoArgsConstructorOnly(Boolean generateNoArgsConstructorOnly) {
755758
this.generateNoArgsConstructorOnly = generateNoArgsConstructorOnly;
756759
}
760+
761+
@Override
762+
public Boolean isGenerateModelsWithPublicFields() {
763+
return generateModelsWithPublicFields;
764+
}
765+
766+
public void setGenerateModelsWithPublicFields(Boolean generateModelsWithPublicFields) {
767+
this.generateModelsWithPublicFields = generateModelsWithPublicFields;
768+
}
757769
}

0 commit comments

Comments
 (0)