From f9bfc4572edb11ffda905e2f08d78da8661dd604 Mon Sep 17 00:00:00 2001 From: Gunnar Morling Date: Mon, 6 Jan 2014 00:00:23 +0100 Subject: [PATCH] #87 Supporting iterable mapping methods where the target element type is the same as or a super-type of the source element type; Raising an error if iterable or map mapping methods can't be generated --- .../java/org/mapstruct/ap/model/Type.java | 2 + .../ap/processor/MapperCreationProcessor.java | 44 ++++++++++++++++++- ...pstruct.ap.model.IterableMappingMethod.ftl | 4 +- .../collection/CollectionMappingTest.java | 11 +++++ .../test/collection/SourceTargetMapper.java | 2 + .../test/collection/map/MapMappingTest.java | 15 +++++++ .../collection/map/SourceTargetMapper.java | 2 + 7 files changed, 78 insertions(+), 2 deletions(-) diff --git a/processor/src/main/java/org/mapstruct/ap/model/Type.java b/processor/src/main/java/org/mapstruct/ap/model/Type.java index 92fd8cf42..3b29e3ac3 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/Type.java +++ b/processor/src/main/java/org/mapstruct/ap/model/Type.java @@ -188,6 +188,8 @@ public class Type extends AbstractModelElement implements Comparable { * * @return {@code true} if and only if this type is assignable to the given other type. */ + // TODO This doesn't yet take wild card types into account; e.g. ? extends Integer wouldn't be assignable to Number + // atm. public boolean isAssignableTo(Type other) { if ( equals( other ) ) { return true; diff --git a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java index 9a2d1de4d..6fc604f2e 100644 --- a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java @@ -27,6 +27,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; + import javax.annotation.processing.Messager; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; @@ -490,9 +491,25 @@ public class MapperCreationProcessor implements ModelElementProcessor ${name}(<#list parameters as param><@i for ( <@includeModel object=sourceParameter.type.typeParameters[0]/> ${loopVariableName} : ${sourceParameter.name} ) { <#if elementMappingMethod??> ${resultName}.add( <@includeModel object=elementMappingMethod input="${loopVariableName}"/> ); - <#else> + <#elseif conversion??> <#if (conversion.exceptionTypes?size == 0) > ${resultName}.add( <@includeModel object=conversion/> ); <#else> @@ -47,6 +47,8 @@ public <@includeModel object=returnType/> ${name}(<#list parameters as param><@i } + <#else> + ${resultName}.add( ${loopVariableName} ); } <#if returnType.name != "void"> diff --git a/processor/src/test/java/org/mapstruct/ap/test/collection/CollectionMappingTest.java b/processor/src/test/java/org/mapstruct/ap/test/collection/CollectionMappingTest.java index 19fc8d444..df9b5b828 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/collection/CollectionMappingTest.java +++ b/processor/src/test/java/org/mapstruct/ap/test/collection/CollectionMappingTest.java @@ -24,6 +24,7 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.mapstruct.ap.testutil.IssueKey; import org.mapstruct.ap.testutil.MapperTestBase; @@ -287,4 +288,14 @@ public class CollectionMappingTest extends MapperTestBase { assertThat( source.getStringLongMap() ).hasSize( 2 ); } + + @Test + @IssueKey("87") + public void shouldMapIntegerSetToNumberSet() { + Set numbers = SourceTargetMapper.INSTANCE + .integerSetToNumberSet( new HashSet( Arrays.asList( 123, 456 ) ) ); + + assertThat( numbers ).isNotNull(); + assertThat( numbers ).containsOnly( 123, 456 ); + } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/collection/SourceTargetMapper.java b/processor/src/test/java/org/mapstruct/ap/test/collection/SourceTargetMapper.java index 410396a09..c99f2fb6d 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/collection/SourceTargetMapper.java +++ b/processor/src/test/java/org/mapstruct/ap/test/collection/SourceTargetMapper.java @@ -46,4 +46,6 @@ public interface SourceTargetMapper { Set colourSetToStringSet(Set colours); Set stringSetToColourSet(Set colours); + + Set integerSetToNumberSet(Set integers); } diff --git a/processor/src/test/java/org/mapstruct/ap/test/collection/map/MapMappingTest.java b/processor/src/test/java/org/mapstruct/ap/test/collection/map/MapMappingTest.java index a1139afb4..4afc9e6f0 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/collection/map/MapMappingTest.java +++ b/processor/src/test/java/org/mapstruct/ap/test/collection/map/MapMappingTest.java @@ -147,4 +147,19 @@ public class MapMappingTest extends MapperTestBase { entry( 121L, new GregorianCalendar( 2013, 6, 20 ).getTime() ) ); } + + @Test + @IssueKey("87") + public void shouldCreateMapMethodImplementationWithoutConversionOrElementMappingMethod() { + Map values = createStringStringMap(); + + Map target = SourceTargetMapper.INSTANCE.stringStringMapToObjectObjectMap( values ); + + assertThat( target ).isNotNull(); + assertThat( target ).hasSize( 2 ); + assertThat( target ).includes( + entry( "42", "01.01.1980" ), + entry( "121", "20.07.2013" ) + ); + } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/collection/map/SourceTargetMapper.java b/processor/src/test/java/org/mapstruct/ap/test/collection/map/SourceTargetMapper.java index 724f2a070..6d4cb1924 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/collection/map/SourceTargetMapper.java +++ b/processor/src/test/java/org/mapstruct/ap/test/collection/map/SourceTargetMapper.java @@ -47,4 +47,6 @@ public interface SourceTargetMapper { Target sourceToTarget(Source source); Source targetToSource(Target target); + + Map stringStringMapToObjectObjectMap(Map source); }