Skip to content

Commit 1bf1e35

Browse files
a-stewartkobylynskyi
authored andcommitted
Adding the option to generate an equals and hashcode method (#12)
1 parent ff14469 commit 1bf1e35

File tree

8 files changed

+60
-1
lines changed

8 files changed

+60
-1
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ Please refer to:
2020
| outputDir | String | None | The output target directory into which code will be generated. |
2121
| apiPackage | String | Empty | Java package for generated api classes (Query, Mutation, Subscription). |
2222
| modelPackage | String | Empty | Java package for generated model classes (type, input, interface, enum, union). |
23-
| generateApis | Boolean | True | Java package for generated model classes (type, input, interface, enum, union). |
23+
| generateApis | Boolean | True | Specifies whether api classes should be generated as well as model classes. |
2424
| customTypesMapping | Map(String,String) | Empty | Can be used to supply custom mappings for scalars. <br/> Supports:<br/> * Map of (GraphqlObjectName.fieldName) to (JavaType) <br/> * Map of (GraphqlType) to (JavaType) |
2525
| customAnnotationsMapping | Map(String,String) | Empty | Can be used to supply custom annotations (serializers) for scalars. <br/> Supports:<br/> * Map of (GraphqlObjectName.fieldName) to (JavaType) <br/> * Map of (GraphqlType) to (JavaType) |
2626
| modelValidationAnnotation | String | @javax.validation.<br>constraints.NotNull | Annotation for mandatory (NonNull) fields. Can be null/empty. |
2727
| modelNamePrefix | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). |
2828
| modelNameSuffix | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). |
29+
| generateEqualsAndHashCode | Boolean | False | Specifies whether generated model classes should have equals and hashCode methods defined. |
2930

3031

3132
### Inspired by

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public static Map<String, Object> map(MappingConfig mappingConfig, InputObjectTy
3030
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, typeDefinition));
3131
dataModel.put(NAME, typeDefinition.getName());
3232
dataModel.put(FIELDS, InputValueDefinitionToParameterMapper.map(mappingConfig, typeDefinition.getInputValueDefinitions(), typeDefinition.getName()));
33+
dataModel.put(EQUALS_AND_HASH_CODE, mappingConfig.isGenerateEqualsAndHashCode());
3334
return dataModel;
3435
}
3536

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public static Map<String, Object> map(MappingConfig mappingConfig, ObjectTypeDef
4848
.map(i -> FieldDefinitionToParameterMapper.map(mappingConfig, i.getFieldDefinitions(), i.getName()))
4949
.forEach(allParameters::addAll);
5050
dataModel.put(FIELDS, allParameters);
51+
dataModel.put(EQUALS_AND_HASH_CODE, mappingConfig.isGenerateEqualsAndHashCode());
5152

5253
return dataModel;
5354
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ public final class DataModelFields {
1414
public static final String FIELDS = "fields";
1515
public static final String IMPLEMENTS = "implements";
1616
public static final String OPERATIONS = "operations";
17+
public static final String EQUALS_AND_HASH_CODE = "equalsAndHashCode";
1718
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ public class DefaultMappingConfigValues {
44

55
public static final String DEFAULT_VALIDATION_ANNOTATION = "javax.validation.constraints.NotNull";
66
public static final boolean DEFAULT_GENERATE_APIS = true;
7+
public static final boolean DEFAULT_EQUALS_AND_HASHCODE = false;
78
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class MappingConfig {
2828
private String modelNamePrefix;
2929
private String modelNameSuffix;
3030
private String modelValidationAnnotation = DefaultMappingConfigValues.DEFAULT_VALIDATION_ANNOTATION;
31+
private boolean generateEqualsAndHashCode = DefaultMappingConfigValues.DEFAULT_EQUALS_AND_HASHCODE;
3132

3233
public void putCustomTypeMappingIfAbsent(String from, String to) {
3334
if (customTypesMapping == null) {

src/main/resources/templates/javaClassGraphqlType.ftl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,26 @@ public class ${className} <#if implements?has_content>implements <#list implemen
3535
}
3636

3737
</#list>
38+
<#if equalsAndHashCode>
39+
@Override
40+
public boolean equals(Object obj) {
41+
if (this == obj) {
42+
return true;
43+
}
44+
if (that == null || getClass() != obj.getClass()) {
45+
return false;
46+
}
47+
final ${className} that = (FormField) obj;
48+
return <#list fields as field>Objects.equals(${field.name}, that.${field.name}) <#if field_has_next>
49+
&& </#if></#list>;
50+
}
51+
52+
@Override
53+
public int hashCode() {
54+
return Objects.hash(
55+
<#list fields as field>
56+
${field.name}<#if field_has_next>, </#if>
57+
</#list>;
58+
}
59+
</#if>
3860
}

src/test/java/com/kobylynskyi/graphql/codegen/GraphqlCodegenTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static java.util.stream.Collectors.toList;
1919
import static org.hamcrest.MatcherAssert.assertThat;
2020
import static org.junit.jupiter.api.Assertions.assertEquals;
21+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
2122
import static org.junit.jupiter.api.Assertions.fail;
2223

2324
class GraphqlCodegenTest {
@@ -211,6 +212,36 @@ void generate_CustomModelAndApiPackages() throws Exception {
211212
});
212213
}
213214

215+
@Test
216+
void generate_EqualsAndHashCode() throws Exception {
217+
mappingConfig.setGenerateEqualsAndHashCode(true);
218+
mappingConfig.setModelNameSuffix("TO");
219+
220+
221+
generator.generate();
222+
223+
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
224+
assertNotEquals(files.length, 0);
225+
226+
for (File eventFile : files) {
227+
if (eventFile.getName().endsWith("TO.java")) {
228+
String content = Utils.getFileContent(eventFile.getPath());
229+
230+
if (content.contains("public interface ") || content.contains("public enum ")) {
231+
continue;
232+
}
233+
234+
assertThat(content,
235+
StringContains.containsString("public boolean equals(Object obj)"));
236+
237+
assertThat(content,
238+
StringContains.containsString("public int hashCode()"));
239+
}
240+
}
241+
242+
243+
}
244+
214245
@Test
215246
void generate_NoSchemas() throws Exception {
216247
generator.setSchemas(Collections.emptyList());

0 commit comments

Comments
 (0)