diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java index b8d7158582db9e5ccf15993b9a9834a7fa2b12f0..e721020779504beb612ac0181a52eb58d0cb7e12 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java @@ -32,7 +32,6 @@ public class InputDefinitionToDataModelMapper { dataModel.put(FIELDS, InputValueDefinitionToParameterMapper.map(mappingConfig, typeDefinition.getInputValueDefinitions(), typeDefinition.getName())); dataModel.put(EQUALS_AND_HASH_CODE, mappingConfig.getGenerateEqualsAndHashCode()); dataModel.put(TO_STRING, mappingConfig.getGenerateToString()); - return dataModel; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java index f5734bd6c929cfe655d4a063c1d73c52deb78316..b241bca91939196b56126bdf86af00fbf5f98518 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java @@ -33,16 +33,16 @@ public class TypeDefinitionToDataModelMapper { dataModel.put(PACKAGE, packageName); dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName)); dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, typeDefinition)); - Set allInterfaces = new LinkedHashSet<>(); - allInterfaces.addAll(MapperUtils.getUnionsHavingType(mappingConfig, typeDefinition, document)); + Set allInterfaces = new LinkedHashSet<>( + MapperUtils.getUnionsHavingType(mappingConfig, typeDefinition, document)); typeDefinition.getImplements().stream() .map(anImplement -> GraphqlTypeToJavaTypeMapper.getJavaType(mappingConfig, anImplement)) .forEach(allInterfaces::add); dataModel.put(IMPLEMENTS, allInterfaces); - Set allParameters = new LinkedHashSet<>(); // Merge attributes from the type and attributes from the interface - allParameters.addAll(FieldDefinitionToParameterMapper.map(mappingConfig, typeDefinition.getFieldDefinitions(), typeDefinition.getName())); + Set allParameters = new LinkedHashSet<>(FieldDefinitionToParameterMapper + .map(mappingConfig, typeDefinition.getFieldDefinitions(), typeDefinition.getName())); List interfaces = getInterfacesOfType(mappingConfig, typeDefinition, document); interfaces.stream() .map(i -> FieldDefinitionToParameterMapper.map(mappingConfig, i.getFieldDefinitions(), i.getName())) @@ -51,7 +51,6 @@ public class TypeDefinitionToDataModelMapper { dataModel.put(EQUALS_AND_HASH_CODE, mappingConfig.getGenerateEqualsAndHashCode()); dataModel.put(TO_STRING, mappingConfig.getGenerateToString()); - return dataModel; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java index 1d787d1c21bc88f65beb0c465b086445082ec719..af27fdb4cc9ccf78ff10ba783a4b986a8a31fee9 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -1,7 +1,9 @@ package com.kobylynskyi.graphql.codegen.model; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import lombok.Data; @@ -53,30 +55,29 @@ public class MappingConfig implements Combinable { } } - @Override public void combine(MappingConfig source) { - if (source != null) { - if (this.customTypesMapping != null && source.customTypesMapping != null) { - this.customTypesMapping.putAll(source.customTypesMapping); - } else if (this.customTypesMapping == null && source.customTypesMapping != null) { - this.customTypesMapping = source.customTypesMapping; - } - if (this.customAnnotationsMapping != null && source.customAnnotationsMapping != null) { - this.customAnnotationsMapping.putAll(source.customAnnotationsMapping); - } else if (this.customAnnotationsMapping == null && source.customAnnotationsMapping != null) { - this.customAnnotationsMapping = source.customAnnotationsMapping; - } - this.generateApis = source.generateApis != null ? source.generateApis : this.generateApis; - this.packageName = source.packageName != null ? source.packageName : this.packageName; - this.apiPackageName = source.apiPackageName != null ? source.apiPackageName : this.apiPackageName; - this.modelPackageName = source.modelPackageName != null ? source.modelPackageName : this.modelPackageName; - this.modelNamePrefix = source.modelNamePrefix != null ? source.modelNamePrefix : this.modelNamePrefix; - this.modelNameSuffix = source.modelNameSuffix != null ? source.modelNameSuffix : this.modelNameSuffix; - this.modelValidationAnnotation = source.modelValidationAnnotation != null ? source.modelValidationAnnotation : this.modelValidationAnnotation; - this.generateEqualsAndHashCode = source.generateEqualsAndHashCode != null ? source.generateEqualsAndHashCode : this.generateEqualsAndHashCode; - this.generateToString = source.generateToString != null ? source.generateToString : this.generateToString; - + if (source == null) { + return; + } + if (this.customTypesMapping != null && source.customTypesMapping != null) { + this.customTypesMapping.putAll(source.customTypesMapping); + } else if (this.customTypesMapping == null) { + this.customTypesMapping = source.customTypesMapping; + } + if (this.customAnnotationsMapping != null && source.customAnnotationsMapping != null) { + this.customAnnotationsMapping.putAll(source.customAnnotationsMapping); + } else if (this.customAnnotationsMapping == null) { + this.customAnnotationsMapping = source.customAnnotationsMapping; } + this.generateApis = source.generateApis != null ? source.generateApis : this.generateApis; + this.packageName = source.packageName != null ? source.packageName : this.packageName; + this.apiPackageName = source.apiPackageName != null ? source.apiPackageName : this.apiPackageName; + this.modelPackageName = source.modelPackageName != null ? source.modelPackageName : this.modelPackageName; + this.modelNamePrefix = source.modelNamePrefix != null ? source.modelNamePrefix : this.modelNamePrefix; + this.modelNameSuffix = source.modelNameSuffix != null ? source.modelNameSuffix : this.modelNameSuffix; + this.modelValidationAnnotation = source.modelValidationAnnotation != null ? source.modelValidationAnnotation : this.modelValidationAnnotation; + this.generateEqualsAndHashCode = source.generateEqualsAndHashCode != null ? source.generateEqualsAndHashCode : this.generateEqualsAndHashCode; + this.generateToString = source.generateToString != null ? source.generateToString : this.generateToString; } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b9ebf943afcf68dbcbd4e9df732498bdb827fc7a --- /dev/null +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java @@ -0,0 +1,137 @@ +package com.kobylynskyi.graphql.codegen.model; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonMap; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + +@SuppressWarnings("unchecked") +class MappingConfigTest { + + @Test + public void combineDefaultWithNull() { + MappingConfig mappingConfig = buildEmptyMappingConfig(); + mappingConfig.combine(null); + + assertEquals(buildEmptyMappingConfig(), mappingConfig); + } + + @Test + void combineDefaultWithDefault() { + MappingConfig mappingConfig = buildEmptyMappingConfig(); + mappingConfig.combine(buildEmptyMappingConfig()); + + assertEquals(buildEmptyMappingConfig(), mappingConfig); + } + + @Test + void combineDefaultWithCustom() { + MappingConfig mappingConfig = buildEmptyMappingConfig(); + mappingConfig.combine(buildMappingConfig()); + + assertEquals(singletonMap("1", "2"), mappingConfig.getCustomTypesMapping()); + assertEquals(singletonMap("3", "4"), mappingConfig.getCustomAnnotationsMapping()); + assertEquals("ApiPackageName", mappingConfig.getApiPackageName()); + assertTrue(mappingConfig.getGenerateApis()); + assertTrue(mappingConfig.getGenerateEqualsAndHashCode()); + assertTrue(mappingConfig.getGenerateToString()); + assertEquals("ModelNamePrefix", mappingConfig.getModelNamePrefix()); + assertEquals("ModelNameSuffix", mappingConfig.getModelNameSuffix()); + assertEquals("ModelPackageName", mappingConfig.getModelPackageName()); + assertEquals("ModelValidationAnnotation", mappingConfig.getModelValidationAnnotation()); + assertEquals("PackageName", mappingConfig.getPackageName()); + } + + @Test + void combineCustomWithDefault() { + MappingConfig mappingConfig = buildMappingConfig(); + mappingConfig.combine(buildEmptyMappingConfig()); + + assertEquals(singletonMap("1", "2"), mappingConfig.getCustomTypesMapping()); + assertEquals(singletonMap("3", "4"), mappingConfig.getCustomAnnotationsMapping()); + assertEquals("ApiPackageName", mappingConfig.getApiPackageName()); + assertTrue(mappingConfig.getGenerateApis()); + assertTrue(mappingConfig.getGenerateEqualsAndHashCode()); + assertTrue(mappingConfig.getGenerateToString()); + assertEquals("ModelNamePrefix", mappingConfig.getModelNamePrefix()); + assertEquals("ModelNameSuffix", mappingConfig.getModelNameSuffix()); + assertEquals("ModelPackageName", mappingConfig.getModelPackageName()); + assertEquals("ModelValidationAnnotation", mappingConfig.getModelValidationAnnotation()); + assertEquals("PackageName", mappingConfig.getPackageName()); + } + + @Test + void combineCustomWithCustom() { + MappingConfig mappingConfig = buildMappingConfig(); + mappingConfig.combine(buildMappingConfig2()); + + assertEquals(hashMap(new HashMap.SimpleEntry<>("1", "2"), new HashMap.SimpleEntry<>("11", "22")), + mappingConfig.getCustomTypesMapping()); + assertEquals(hashMap(new HashMap.SimpleEntry<>("3", "4"), new HashMap.SimpleEntry<>("33", "44")), + mappingConfig.getCustomAnnotationsMapping()); + assertEquals("ApiPackageName2", mappingConfig.getApiPackageName()); + assertFalse(mappingConfig.getGenerateApis()); + assertFalse(mappingConfig.getGenerateEqualsAndHashCode()); + assertFalse(mappingConfig.getGenerateToString()); + assertEquals("ModelNamePrefix2", mappingConfig.getModelNamePrefix()); + assertEquals("ModelNameSuffix2", mappingConfig.getModelNameSuffix()); + assertEquals("ModelPackageName2", mappingConfig.getModelPackageName()); + assertEquals("ModelValidationAnnotation2", mappingConfig.getModelValidationAnnotation()); + assertEquals("PackageName2", mappingConfig.getPackageName()); + } + + private static Map hashMap(AbstractMap.SimpleEntry... entries) { + return Arrays.stream(entries).collect( + Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue, (a, b) -> b)); + } + + private static MappingConfig buildMappingConfig() { + MappingConfig config = new MappingConfig(); + config.setCustomTypesMapping(new HashMap<>(singletonMap("1", "2"))); + config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("3", "4"))); + config.setApiPackageName("ApiPackageName"); + config.setGenerateApis(true); + config.setGenerateEqualsAndHashCode(true); + config.setGenerateToString(true); + config.setModelNamePrefix("ModelNamePrefix"); + config.setModelNameSuffix("ModelNameSuffix"); + config.setModelPackageName("ModelPackageName"); + config.setModelValidationAnnotation("ModelValidationAnnotation"); + config.setPackageName("PackageName"); + return config; + } + + private static MappingConfig buildMappingConfig2() { + MappingConfig config = new MappingConfig(); + config.setCustomTypesMapping(new HashMap<>(singletonMap("11", "22"))); + config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("33", "44"))); + config.setApiPackageName("ApiPackageName2"); + config.setGenerateApis(false); + config.setGenerateEqualsAndHashCode(false); + config.setGenerateToString(false); + config.setModelNamePrefix("ModelNamePrefix2"); + config.setModelNameSuffix("ModelNameSuffix2"); + config.setModelPackageName("ModelPackageName2"); + config.setModelValidationAnnotation("ModelValidationAnnotation2"); + config.setPackageName("PackageName2"); + return config; + } + + private static MappingConfig buildEmptyMappingConfig() { + MappingConfig mappingConfig = new MappingConfig(); + mappingConfig.setCustomTypesMapping(null); + mappingConfig.setCustomAnnotationsMapping(null); + return mappingConfig; + } + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/Event_with_lombok_annotations.java.txt b/src/test/resources/expected-classes/Event_with_lombok_annotations.java.txt new file mode 100644 index 0000000000000000000000000000000000000000..7b0502e467ebaf5575a494d031c45b8a86521f12 --- /dev/null +++ b/src/test/resources/expected-classes/Event_with_lombok_annotations.java.txt @@ -0,0 +1,88 @@ +package com.kobylynskyi.graphql.test1; + +import java.util.*; + +@lombok.Builder +@lombok.Data +public class Event { + + private String id; + private String categoryId; + private Collection properties; + private EventStatus status; + private String createdBy; + private String createdDateTime; + private Boolean active; + private Integer rating; + + public Event() { + } + + public Event(String id, String categoryId, Collection 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 void setId(String id) { + this.id = id; + } + + public String getCategoryId() { + return categoryId; + } + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } + + public Collection getProperties() { + return properties; + } + public void setProperties(Collection properties) { + this.properties = properties; + } + + public EventStatus getStatus() { + return status; + } + public void setStatus(EventStatus status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getCreatedDateTime() { + return createdDateTime; + } + public void setCreatedDateTime(String createdDateTime) { + this.createdDateTime = createdDateTime; + } + + public Boolean getActive() { + return active; + } + public void setActive(Boolean active) { + this.active = active; + } + + public Integer getRating() { + return rating; + } + public void setRating(Integer rating) { + this.rating = rating; + } + +} \ No newline at end of file