Skip to content

Commit

Permalink
Support parameterized fields resolvers #25 (#39)
Browse files Browse the repository at this point in the history
* Support parameterized fields resolvers #25

* Rename fieldsResolvers to fieldsWithResolvers #25
  • Loading branch information
kobylynskyi committed Apr 3, 2020
1 parent 1c677e5 commit 0a28021
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 26 deletions.
2 changes: 1 addition & 1 deletion plugins/graphql-java-codegen-gradle-plugin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ check.dependsOn(graphqlCodegen)
| generateToString | Boolean | False | Specifies whether generated model classes should have toString method defined. |
| generateAsyncApi | Boolean | False | If true, then wrap type into `java.util.concurrent.CompletableFuture` or `subscriptionReturnType` |
| generateParameterizedFieldsResolvers | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. |
| fieldsResolvers | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName`. |
| fieldsWithResolvers | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName`. |
| jsonConfigurationFile | String | Empty | Path to an external mapping configuration. |


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@
import org.gradle.api.tasks.TaskAction;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;

/**
* Gradle task for GraphQL code generation
Expand All @@ -37,6 +35,8 @@ public class GraphqlCodegenGradleTask extends DefaultTask {
private Boolean generateEqualsAndHashCode = false;
private Boolean generateToString = false;
private Boolean generateAsyncApi = false;
private Boolean generateParameterizedFieldsResolvers = true;
private Set<String> fieldsWithResolvers = new HashSet<>();
private String jsonConfigurationFile;

@TaskAction
Expand Down Expand Up @@ -214,6 +214,26 @@ public void setGenerateAsyncApi(Boolean generateAsyncApi) {
this.generateAsyncApi = generateAsyncApi;
}

@Input
@Optional
public Boolean getGenerateParameterizedFieldsResolvers() {
return generateParameterizedFieldsResolvers;
}

public void setGenerateParameterizedFieldsResolvers(Boolean generateParameterizedFieldsResolvers) {
this.generateParameterizedFieldsResolvers = generateParameterizedFieldsResolvers;
}

@Input
@Optional
public Set<String> getFieldsWithResolvers() {
return fieldsWithResolvers;
}

public void setFieldsWithResolvers(Set<String> fieldsWithResolvers) {
this.fieldsWithResolvers = fieldsWithResolvers;
}

@Input
@Optional
public String getJsonConfigurationFile() {
Expand Down
2 changes: 1 addition & 1 deletion plugins/graphql-java-codegen-maven-plugin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ This Maven plugin is able to generate the following classes based on your GraphQ
| generateToString | Boolean | False | Specifies whether generated model classes should have toString method defined. |
| generateAsyncApi | Boolean | False | If true, then wrap type into `java.util.concurrent.CompletableFuture` or `subscriptionReturnType` |
| generateParameterizedFieldsResolvers | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. |
| fieldsResolvers | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName`. |
| fieldsWithResolvers | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName`. |
| jsonConfigurationFile | String | Empty | Path to an external mapping configuration. |


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@
import org.apache.maven.project.MavenProject;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.*;

@Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
public class GraphqlCodegenMojo extends AbstractMojo {
Expand All @@ -28,8 +25,10 @@ public class GraphqlCodegenMojo extends AbstractMojo {

@Parameter
private Map<String, String> customTypesMapping;

@Parameter
private Map<String, String> customAnnotationsMapping;

@Parameter
private String packageName;

Expand All @@ -44,12 +43,16 @@ public class GraphqlCodegenMojo extends AbstractMojo {

@Parameter
private String apiPackageName;

@Parameter
private String modelPackageName;

@Parameter
private String modelNamePrefix;

@Parameter
private String modelNameSuffix;

@Parameter
private String subscriptionReturnType;

Expand All @@ -59,6 +62,12 @@ public class GraphqlCodegenMojo extends AbstractMojo {
@Parameter(defaultValue = "javax.validation.constraints.NotNull")
private String modelValidationAnnotation;

@Parameter(defaultValue = "true")
private boolean generateParameterizedFieldsResolvers;

@Parameter
private Set<String> fieldsWithResolvers = new HashSet<>();

@Parameter(name = "jsonConfigurationFile", required = false)
private String jsonConfigurationFile;

Expand All @@ -74,20 +83,20 @@ public void execute() throws MojoExecutionException {

MappingConfig mappingConfig = new MappingConfig();
mappingConfig.setPackageName(packageName);
mappingConfig.setCustomTypesMapping(
customTypesMapping != null ? customTypesMapping : new HashMap<>());
mappingConfig.setCustomTypesMapping(customTypesMapping != null ? customTypesMapping : new HashMap<>());
mappingConfig.setModelNamePrefix(modelNamePrefix);
mappingConfig.setModelNameSuffix(modelNameSuffix);
mappingConfig.setApiPackageName(apiPackageName);
mappingConfig.setModelPackageName(modelPackageName);
mappingConfig.setGenerateApis(generateApis);
mappingConfig.setModelValidationAnnotation(modelValidationAnnotation);
mappingConfig.setCustomAnnotationsMapping(
customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>());
mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>());
mappingConfig.setGenerateEqualsAndHashCode(generateEqualsAndHashCode);
mappingConfig.setGenerateToString(generateToString);
mappingConfig.setSubscriptionReturnType(subscriptionReturnType);
mappingConfig.setGenerateAsyncApi(generateAsyncApi);
mappingConfig.setGenerateParameterizedFieldsResolvers(generateParameterizedFieldsResolvers);
mappingConfig.setFieldsWithResolvers(fieldsWithResolvers != null ? fieldsWithResolvers : new HashSet<>());

MappingConfigSupplier mappingConfigSupplier = buildJsonSupplier(jsonConfigurationFile);

Expand Down Expand Up @@ -245,4 +254,20 @@ public void setSubscriptionReturnType(String subscriptionReturnType) {
public String getSubscriptionReturnType() {
return subscriptionReturnType;
}

public boolean isGenerateParameterizedFieldsResolvers() {
return generateParameterizedFieldsResolvers;
}

public void setGenerateParameterizedFieldsResolvers(boolean generateParameterizedFieldsResolvers) {
this.generateParameterizedFieldsResolvers = generateParameterizedFieldsResolvers;
}

public Set<String> getFieldsWithResolvers() {
return fieldsWithResolvers;
}

public void setFieldsWithResolvers(Set<String> fieldsWithResolvers) {
this.fieldsWithResolvers = fieldsWithResolvers;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public static boolean generateResolversForField(MappingConfig mappingConfig,
FieldDefinition fieldDef,
String parentTypeName) {
boolean resolverForParamField = mappingConfig.getGenerateParameterizedFieldsResolvers() && !Utils.isEmpty(fieldDef.getInputValueDefinitions());
boolean resolverForSpecificField = mappingConfig.getFieldsResolvers().contains(parentTypeName + "." + fieldDef.getName());
boolean resolverForSpecificField = mappingConfig.getFieldsWithResolvers().contains(parentTypeName + "." + fieldDef.getName());
return resolverForParamField || resolverForSpecificField;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public class MappingConfig implements Combinable<MappingConfig> {
* E.g.: "Person.friends"
* If just type is specified, then all fields of this type will
*/
private Set<String> fieldsResolvers = new HashSet<>();
private Set<String> fieldsWithResolvers = new HashSet<>();

@Override
public void combine(MappingConfig source) {
Expand Down Expand Up @@ -76,10 +76,10 @@ public void combine(MappingConfig source) {
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;
if (this.fieldsResolvers != null && source.fieldsResolvers != null) {
this.fieldsResolvers.addAll(source.fieldsResolvers);
} else if (this.fieldsResolvers == null) {
this.fieldsResolvers = source.fieldsResolvers;
if (this.fieldsWithResolvers != null && source.fieldsWithResolvers != null) {
this.fieldsWithResolvers.addAll(source.fieldsWithResolvers);
} else if (this.fieldsWithResolvers == null) {
this.fieldsWithResolvers = source.fieldsWithResolvers;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ void generate_ParametrizedFields() throws Exception {

@Test
void generate_CustomFieldsResolvers() throws Exception {
mappingConfig.setFieldsResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic"));
mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic"));

generator.generate();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ void combineDefaultWithCustom() {
assertEquals("PackageName", mappingConfig.getPackageName());
assertFalse(mappingConfig.getGenerateAsyncApi());
assertTrue(mappingConfig.getGenerateParameterizedFieldsResolvers());
assertEquals(singleton("5"), mappingConfig.getFieldsResolvers());
assertEquals(singleton("5"), mappingConfig.getFieldsWithResolvers());
}

@Test
Expand All @@ -67,7 +67,7 @@ void combineCustomWithDefault() {
assertEquals("SubscriptionsReturnType", mappingConfig.getSubscriptionReturnType());
assertFalse(mappingConfig.getGenerateAsyncApi());
assertTrue(mappingConfig.getGenerateParameterizedFieldsResolvers());
assertEquals(singleton("5"), mappingConfig.getFieldsResolvers());
assertEquals(singleton("5"), mappingConfig.getFieldsWithResolvers());
}

@Test
Expand All @@ -91,7 +91,7 @@ void combineCustomWithCustom() {
assertEquals("SubscriptionsReturnType2", mappingConfig.getSubscriptionReturnType());
assertTrue(mappingConfig.getGenerateAsyncApi());
assertFalse(mappingConfig.getGenerateParameterizedFieldsResolvers());
assertEquals(new HashSet<>(Arrays.asList("5", "55")), mappingConfig.getFieldsResolvers());
assertEquals(new HashSet<>(Arrays.asList("5", "55")), mappingConfig.getFieldsWithResolvers());
}

private static Map<String, String> hashMap(AbstractMap.SimpleEntry<String, String>... entries) {
Expand All @@ -115,7 +115,7 @@ private static MappingConfig buildMappingConfig() {
config.setSubscriptionReturnType("SubscriptionsReturnType");
config.setGenerateAsyncApi(false);
config.setGenerateParameterizedFieldsResolvers(true);
config.setFieldsResolvers(new HashSet<>(singletonList("5")));
config.setFieldsWithResolvers(new HashSet<>(singletonList("5")));
return config;
}

Expand All @@ -135,15 +135,15 @@ private static MappingConfig buildMappingConfig2() {
config.setSubscriptionReturnType("SubscriptionsReturnType2");
config.setGenerateAsyncApi(true);
config.setGenerateParameterizedFieldsResolvers(false);
config.setFieldsResolvers(singleton("55"));
config.setFieldsWithResolvers(singleton("55"));
return config;
}

private static MappingConfig buildEmptyMappingConfig() {
MappingConfig mappingConfig = new MappingConfig();
mappingConfig.setCustomTypesMapping(null);
mappingConfig.setCustomAnnotationsMapping(null);
mappingConfig.setFieldsResolvers(null);
mappingConfig.setFieldsWithResolvers(null);
return mappingConfig;
}

Expand Down

0 comments on commit 0a28021

Please sign in to comment.