From 65a9628d8ddd93298a188c8e540da890f2d823e8 Mon Sep 17 00:00:00 2001 From: Robert Bor Date: Sat, 17 Jul 2021 17:05:18 +0200 Subject: [PATCH] #135 Enum to same enum conversions When performing a conversion from an enum to the same enum, the AnyToEnumConverter is triggered, which performs a full cycle conversion, using the toString() method of source and the valueOf() of the target enum. When the source enum is the same as the target enum and the source enum has an overridden toString() method, this fails because the value can not be mapped to the enum. Instead, the AnyToEnumConverter now checks whether the source is of the same enum class as the target. If this is the case, the conversion task is skipped and the source is returned literally. --- .../core/converter/impl/AnyToEnumConverter.java | 3 +++ src/test/java/io/beanmapper/BeanMapperTest.java | 17 +++++++++-------- .../testmodel/enums/EnumWithToString.java | 9 +++++++++ .../enums/SourceWithEnumWithToString.java | 5 +++++ .../enums/TargetWithEnumWithToString.java | 5 +++++ 5 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 src/test/java/io/beanmapper/testmodel/enums/EnumWithToString.java create mode 100644 src/test/java/io/beanmapper/testmodel/enums/SourceWithEnumWithToString.java create mode 100644 src/test/java/io/beanmapper/testmodel/enums/TargetWithEnumWithToString.java diff --git a/src/main/java/io/beanmapper/core/converter/impl/AnyToEnumConverter.java b/src/main/java/io/beanmapper/core/converter/impl/AnyToEnumConverter.java index 79891cf2..40ba43fd 100644 --- a/src/main/java/io/beanmapper/core/converter/impl/AnyToEnumConverter.java +++ b/src/main/java/io/beanmapper/core/converter/impl/AnyToEnumConverter.java @@ -22,6 +22,9 @@ protected Enum doConvert(Object source, Class> targetClass) if (source == null) { return null; } + if (targetClass.isInstance(source)) { + return (Enum)source; + } String sourceText = source.toString(); if (isNotEmpty(sourceText)) { return valueOf(targetClass, sourceText); diff --git a/src/test/java/io/beanmapper/BeanMapperTest.java b/src/test/java/io/beanmapper/BeanMapperTest.java index 221c29b3..bbb17d32 100644 --- a/src/test/java/io/beanmapper/BeanMapperTest.java +++ b/src/test/java/io/beanmapper/BeanMapperTest.java @@ -113,14 +113,7 @@ import io.beanmapper.testmodel.encapsulate.source_annotated.Car; import io.beanmapper.testmodel.encapsulate.source_annotated.CarDriver; import io.beanmapper.testmodel.encapsulate.source_annotated.Driver; -import io.beanmapper.testmodel.enums.ColorEntity; -import io.beanmapper.testmodel.enums.ColorResult; -import io.beanmapper.testmodel.enums.ColorStringResult; -import io.beanmapper.testmodel.enums.EnumSourceArraysAsList; -import io.beanmapper.testmodel.enums.EnumTargetList; -import io.beanmapper.testmodel.enums.RGB; -import io.beanmapper.testmodel.enums.UserRole; -import io.beanmapper.testmodel.enums.UserRoleResult; +import io.beanmapper.testmodel.enums.*; import io.beanmapper.testmodel.ignore.IgnoreSource; import io.beanmapper.testmodel.ignore.IgnoreTarget; import io.beanmapper.testmodel.initially_unmatched_source.SourceWithUnmatchedField; @@ -1626,6 +1619,14 @@ public void deepMapEnumInHolder() { assertEquals(CountryEnum.NL.getImage(), target.country.image); } + @Test + public void mapEnumWithToString() { + SourceWithEnumWithToString source = new SourceWithEnumWithToString(); + source.myEnum = EnumWithToString.SOME_VALUE; + TargetWithEnumWithToString target = beanMapper.map(source, TargetWithEnumWithToString.class); + assertEquals(EnumWithToString.SOME_VALUE, target.myEnum); + } + public Person createPerson(String name) { Person person = new Person(); person.setId(1984L); diff --git a/src/test/java/io/beanmapper/testmodel/enums/EnumWithToString.java b/src/test/java/io/beanmapper/testmodel/enums/EnumWithToString.java new file mode 100644 index 00000000..ba5c3105 --- /dev/null +++ b/src/test/java/io/beanmapper/testmodel/enums/EnumWithToString.java @@ -0,0 +1,9 @@ +package io.beanmapper.testmodel.enums; + +public enum EnumWithToString { + SOME_VALUE; + + public String toString() { + return "X" + name() + "X"; + } +} diff --git a/src/test/java/io/beanmapper/testmodel/enums/SourceWithEnumWithToString.java b/src/test/java/io/beanmapper/testmodel/enums/SourceWithEnumWithToString.java new file mode 100644 index 00000000..fd74a037 --- /dev/null +++ b/src/test/java/io/beanmapper/testmodel/enums/SourceWithEnumWithToString.java @@ -0,0 +1,5 @@ +package io.beanmapper.testmodel.enums; + +public class SourceWithEnumWithToString { + public EnumWithToString myEnum; +} diff --git a/src/test/java/io/beanmapper/testmodel/enums/TargetWithEnumWithToString.java b/src/test/java/io/beanmapper/testmodel/enums/TargetWithEnumWithToString.java new file mode 100644 index 00000000..9905deeb --- /dev/null +++ b/src/test/java/io/beanmapper/testmodel/enums/TargetWithEnumWithToString.java @@ -0,0 +1,5 @@ +package io.beanmapper.testmodel.enums; + +public class TargetWithEnumWithToString { + public EnumWithToString myEnum; +}