diff --git a/core/src/main/java/org/mapstruct/MapperConfig.java b/core/src/main/java/org/mapstruct/MapperConfig.java index e042d4011..079388cc4 100644 --- a/core/src/main/java/org/mapstruct/MapperConfig.java +++ b/core/src/main/java/org/mapstruct/MapperConfig.java @@ -44,6 +44,16 @@ public @interface MapperConfig { */ Class[] uses() default { }; + /** + * Additional types for which an import statement is to be added to the generated mapper implementation class. + * This allows to refer to those types from within mapping expressions given via {@link Mapping#expression()}, + * {@link Mapping#defaultExpression()} or using + * their simple name rather than their fully-qualified name. + * + * @return classes to add in the imports of the generated implementation. + */ + Class[] imports() default { }; + /** * How unmapped properties of the source type of a mapping should be * reported. diff --git a/processor/src/main/java/org/mapstruct/ap/internal/util/MapperConfiguration.java b/processor/src/main/java/org/mapstruct/ap/internal/util/MapperConfiguration.java index 1545e115a..cb812b53b 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/util/MapperConfiguration.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/util/MapperConfiguration.java @@ -5,6 +5,7 @@ */ package org.mapstruct.ap.internal.util; +import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -97,7 +98,12 @@ public class MapperConfiguration { } public List imports() { - return mapperPrism.imports(); + List imports = new ArrayList<>(); + imports.addAll( mapperPrism.imports() ); + if ( mapperConfigPrism != null ) { + imports.addAll( mapperConfigPrism.imports() ); + } + return imports; } public ReportingPolicyPrism unmappedTargetPolicy(Options options) { diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Config.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Config.java new file mode 100644 index 000000000..911cbf1f9 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Config.java @@ -0,0 +1,19 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1435; + +import org.mapstruct.MapperConfig; +import org.mapstruct.Mapping; +import org.mapstruct.MappingInheritanceStrategy; + +import java.util.Objects; + +@MapperConfig(mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG, imports = Objects.class) +public interface Config { + @Mapping(expression = "java( Objects.equals( source.getName(), \"Rainbow Dash\" ) )", target = "rainbowDash") + OutObject map(InObject source); + +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/InObject.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/InObject.java new file mode 100644 index 000000000..27b6fa274 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/InObject.java @@ -0,0 +1,19 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1435; + +public class InObject { + + private final String name; + + public InObject(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Issue1435Mapper.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Issue1435Mapper.java new file mode 100644 index 000000000..c98eba2ed --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Issue1435Mapper.java @@ -0,0 +1,17 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1435; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper(config = Config.class) +public interface Issue1435Mapper { + + Issue1435Mapper INSTANCE = Mappers.getMapper( Issue1435Mapper.class ); + + OutObject map(InObject source); +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Issue1435Test.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Issue1435Test.java new file mode 100644 index 000000000..ade951f2b --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/Issue1435Test.java @@ -0,0 +1,33 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1435; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mapstruct.ap.testutil.IssueKey; +import org.mapstruct.ap.testutil.WithClasses; +import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(AnnotationProcessorTestRunner.class) +@IssueKey("1435") +@WithClasses({ + Config.class, + Issue1435Mapper.class, + InObject.class, + OutObject.class, +}) +public class Issue1435Test { + @Test + public void mustNotSetListToNull() { + InObject source = new InObject( "Rainbow Dash" ); + + OutObject result = Issue1435Mapper.INSTANCE.map( source ); + + assertThat( result.isRainbowDash() ).isTrue(); + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/OutObject.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/OutObject.java new file mode 100644 index 000000000..b3a16f225 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1435/OutObject.java @@ -0,0 +1,19 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1435; + +public class OutObject { + + private boolean isRainbowDash; + + public boolean isRainbowDash() { + return isRainbowDash; + } + + public void setRainbowDash(boolean rainbowDash) { + isRainbowDash = rainbowDash; + } +}