From 07c7a29adc8631ece782d319d1b17609bdd066eb Mon Sep 17 00:00:00 2001 From: Sjaak Derksen Date: Tue, 29 Jan 2019 20:02:23 +0100 Subject: [PATCH] #1700 Optimizing code for adders and stream adders (#1701) --- .../ap/internal/model/MethodReference.java | 14 +++- .../ap/internal/model/PropertyMapping.java | 2 +- .../ap/internal/model/TypeConversion.java | 14 +++- .../model/assignment/AdderWrapper.java | 18 ++++- .../model/assignment/ArrayCopyWrapper.java | 2 +- .../model/assignment/AssignmentWrapper.java | 14 +++- .../model/assignment/StreamAdderWrapper.java | 14 +++- .../WrapperForCollectionsAndMaps.java | 2 +- .../ap/internal/model/common/Assignment.java | 19 ++++- .../ap/internal/model/common/SourceRHS.java | 11 ++- .../model/assignment/AdderWrapper.ftl | 7 +- .../model/assignment/StreamAdderWrapper.ftl | 7 +- .../ap/internal/model/common/SourceRHS.ftl | 2 +- .../_1561/{java8 => }/Issue1561Mapper.java | 6 +- .../bugs/_1561/{java8 => }/Issue1561Test.java | 18 +++-- .../{java8/Target.java => NestedTarget.java} | 4 +- .../test/bugs/_1561/{java8 => }/Source.java | 2 +- .../mapstruct/ap/test/bugs/_1561/Target.java | 19 +++++ .../test/bugs/_1561/Issue1561MapperImpl.java | 77 +++++++++++++++++++ .../ap/test/bugs/_1685/UserMapperImpl.java | 19 +++-- 20 files changed, 233 insertions(+), 38 deletions(-) rename processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/{java8 => }/Issue1561Mapper.java (71%) rename processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/{java8 => }/Issue1561Test.java (65%) rename processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/{java8/Target.java => NestedTarget.java} (87%) rename processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/{java8 => }/Source.java (91%) create mode 100644 processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Target.java create mode 100644 processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1561/Issue1561MapperImpl.java diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/MethodReference.java b/processor/src/main/java/org/mapstruct/ap/internal/model/MethodReference.java index 03dd68dd5..7ef976660 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/MethodReference.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/MethodReference.java @@ -169,8 +169,8 @@ public class MethodReference extends ModelElement implements Assignment { } @Override - public String createLocalVarName( String desiredName ) { - return assignment.createLocalVarName( desiredName ); + public String createUniqueVarName(String desiredName ) { + return assignment.createUniqueVarName( desiredName ); } @Override @@ -183,6 +183,16 @@ public class MethodReference extends ModelElement implements Assignment { assignment.setSourceLocalVarName( sourceLocalVarName ); } + @Override + public String getSourceLoopVarName() { + return assignment.getSourceLoopVarName(); + } + + @Override + public void setSourceLoopVarName(String sourceLoopVarName) { + assignment.setSourceLoopVarName( sourceLoopVarName ); + } + @Override public String getSourceParameterName() { return assignment.getSourceParameterName(); diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/PropertyMapping.java b/processor/src/main/java/org/mapstruct/ap/internal/model/PropertyMapping.java index e44c4d9a3..5dffad9d8 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/PropertyMapping.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/PropertyMapping.java @@ -621,7 +621,7 @@ public class PropertyMapping extends ModelElement { // create a local variable to which forged method can be assigned. String desiredName = last( sourceReference.getPropertyEntries() ).getName(); - sourceRhs.setSourceLocalVarName( sourceRhs.createLocalVarName( desiredName ) ); + sourceRhs.setSourceLocalVarName( sourceRhs.createUniqueVarName( desiredName ) ); return sourceRhs; diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/TypeConversion.java b/processor/src/main/java/org/mapstruct/ap/internal/model/TypeConversion.java index cdca4a6ed..d0481cdc2 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/TypeConversion.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/TypeConversion.java @@ -89,8 +89,8 @@ public class TypeConversion extends ModelElement implements Assignment { } @Override - public String createLocalVarName( String desiredName ) { - return assignment.createLocalVarName( desiredName ); + public String createUniqueVarName(String desiredName ) { + return assignment.createUniqueVarName( desiredName ); } @Override @@ -103,6 +103,16 @@ public class TypeConversion extends ModelElement implements Assignment { assignment.setSourceLocalVarName( sourceLocalVarName ); } + @Override + public String getSourceLoopVarName() { + return assignment.getSourceLoopVarName(); + } + + @Override + public void setSourceLoopVarName(String sourceLoopVarName) { + assignment.setSourceLoopVarName( sourceLoopVarName ); + } + @Override public String getSourceParameterName() { return assignment.getSourceParameterName(); diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java index 0cb2a2302..71b5f10a9 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java @@ -33,8 +33,12 @@ public class AdderWrapper extends AssignmentWrapper { String adderIteratorName ) { super( rhs, fieldAssignment ); this.thrownTypesToExclude = thrownTypesToExclude; + // a method local var has been added earlier. + + + // localVar is iteratorVariable String desiredName = Nouns.singularize( adderIteratorName ); - rhs.setSourceLocalVarName( rhs.createLocalVarName( desiredName ) ); + rhs.setSourceLoopVarName( rhs.createUniqueVarName( desiredName ) ); adderType = first( getSourceType().determineTypeArguments( Collection.class ) ); } @@ -56,6 +60,18 @@ public class AdderWrapper extends AssignmentWrapper { return adderType; } + public boolean isIncludeSourceNullCheck() { + return true; + } + + public boolean isSetExplicitlyToNull() { + return false; + } + + public boolean isSetExplicitlyToDefault() { + return false; + } + @Override public Set getImportTypes() { Set imported = new HashSet<>(); diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ArrayCopyWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ArrayCopyWrapper.java index 4f70e4ec7..db2c7be5a 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ArrayCopyWrapper.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ArrayCopyWrapper.java @@ -33,7 +33,7 @@ public class ArrayCopyWrapper extends AssignmentWrapper { super( rhs, fieldAssignment ); this.arraysType = arraysType; this.targetType = targetType; - rhs.setSourceLocalVarName( rhs.createLocalVarName( targetPropertyName ) ); + rhs.setSourceLocalVarName( rhs.createUniqueVarName( targetPropertyName ) ); this.setExplicitlyToDefault = setExplicitlyToDefault; this.setExplicitlyToNull = setExplicitlyToNull; } diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AssignmentWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AssignmentWrapper.java index 321e1f3ec..551d20d72 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AssignmentWrapper.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AssignmentWrapper.java @@ -76,6 +76,16 @@ public abstract class AssignmentWrapper extends ModelElement implements Assignme decoratedAssignment.setSourceLocalVarName( sourceLocalVarName ); } + @Override + public String getSourceLoopVarName() { + return decoratedAssignment.getSourceLoopVarName(); + } + + @Override + public void setSourceLoopVarName(String sourceLoopVarName) { + decoratedAssignment.setSourceLoopVarName( sourceLoopVarName ); + } + @Override public String getSourceParameterName() { return decoratedAssignment.getSourceParameterName(); @@ -92,8 +102,8 @@ public abstract class AssignmentWrapper extends ModelElement implements Assignme } @Override - public String createLocalVarName( String desiredName ) { - return decoratedAssignment.createLocalVarName( desiredName ); + public String createUniqueVarName(String desiredName ) { + return decoratedAssignment.createUniqueVarName( desiredName ); } /** diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.java index 7aabbd249..1deff95a2 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.java @@ -34,7 +34,7 @@ public class StreamAdderWrapper extends AssignmentWrapper { super( rhs, fieldAssignment ); this.thrownTypesToExclude = thrownTypesToExclude; String desiredName = Nouns.singularize( targetPropertyName ); - rhs.setSourceLocalVarName( rhs.createLocalVarName( desiredName ) ); + rhs.setSourceLocalVarName( rhs.createUniqueVarName( desiredName ) ); adderType = first( getSourceType().determineTypeArguments( Stream.class ) ); } @@ -56,6 +56,18 @@ public class StreamAdderWrapper extends AssignmentWrapper { return adderType; } + public boolean isIncludeSourceNullCheck() { + return true; + } + + public boolean isSetExplicitlyToNull() { + return false; + } + + public boolean isSetExplicitlyToDefault() { + return false; + } + @Override public Set getImportTypes() { Set imported = new HashSet<>(); diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/WrapperForCollectionsAndMaps.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/WrapperForCollectionsAndMaps.java index e0dbaf389..e8b1f8845 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/WrapperForCollectionsAndMaps.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/WrapperForCollectionsAndMaps.java @@ -37,7 +37,7 @@ public class WrapperForCollectionsAndMaps extends AssignmentWrapper { else { this.nullCheckLocalVarType = targetType; } - this.nullCheckLocalVarName = rhs.createLocalVarName( nullCheckLocalVarType.getName() ); + this.nullCheckLocalVarName = rhs.createUniqueVarName( nullCheckLocalVarType.getName() ); } @Override diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/common/Assignment.java b/processor/src/main/java/org/mapstruct/ap/internal/model/common/Assignment.java index cc14e035d..3cd32c82e 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/common/Assignment.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/common/Assignment.java @@ -106,7 +106,7 @@ public interface Assignment { * * @return the desired name, made unique in the scope of the bean mapping. */ - String createLocalVarName( String desiredName ); + String createUniqueVarName(String desiredName ); /** * See {@link #setSourceLocalVarName(java.lang.String) } @@ -131,6 +131,23 @@ public interface Assignment { */ void setSourceLocalVarName(String sourceLocalVarName); + /** + * See {@link #getSourceLoopVarName()} (java.lang.String) } + * + * @return loop variable (can be null if not set) + */ + String getSourceLoopVarName(); + + /** + * Replaces the sourceLocalVar or sourceReference at the call site in the assignment in the template with this + * sourceLoopVarName. + * The sourceLocalVar can subsequently be used for e.g. null checking. + * + * @param sourceLoopVarName loop variable + */ + void setSourceLoopVarName(String sourceLoopVarName); + + /** * Returns whether the type of assignment * diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java b/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java index fddf0a4b1..5dc5d9183 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java @@ -27,6 +27,7 @@ public class SourceRHS extends ModelElement implements Assignment { private final String sourceReference; private final Type sourceType; private String sourceLocalVarName; + private String sourceLoopVarName; private final Set existingVariableNames; private final String sourceErrorMessagePart; private final String sourcePresenceCheckerReference; @@ -69,7 +70,7 @@ public class SourceRHS extends ModelElement implements Assignment { } @Override - public String createLocalVarName(String desiredName) { + public String createUniqueVarName(String desiredName) { String result = Strings.getSafeVariableName( desiredName, existingVariableNames ); existingVariableNames.add( result ); return result; @@ -85,6 +86,14 @@ public class SourceRHS extends ModelElement implements Assignment { this.sourceLocalVarName = sourceLocalVarName; } + public String getSourceLoopVarName() { + return sourceLoopVarName; + } + + public void setSourceLoopVarName(String sourceLoopVarName) { + this.sourceLoopVarName = sourceLoopVarName; + } + @Override public Set getImportTypes() { return Collections.emptySet(); diff --git a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl index c75942de9..361fedaa5 100644 --- a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl +++ b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl @@ -8,9 +8,10 @@ <#-- @ftlvariable name="" type="org.mapstruct.ap.internal.model.assignment.AdderWrapper" --> <#import "../macro/CommonMacros.ftl" as lib> <@lib.handleExceptions> - if ( ${sourceReference} != null ) { - for ( <@includeModel object=adderType.typeBound/> ${sourceLocalVarName} : ${sourceReference} ) { + <@lib.sourceLocalVarAssignment/> + <@lib.handleSourceReferenceNullCheck> + for ( <@includeModel object=adderType.typeBound/> ${sourceLoopVarName} : <#if sourceLocalVarName??>${sourceLocalVarName}<#else>${sourceReference} ) { ${ext.targetBeanName}.${ext.targetWriteAccessorName}<@lib.handleWrite><@lib.handleAssignment/>; } - } + \ No newline at end of file diff --git a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.ftl b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.ftl index 1a308844c..6e7683e05 100644 --- a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.ftl +++ b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/StreamAdderWrapper.ftl @@ -8,7 +8,8 @@ <#-- @ftlvariable name="" type="org.mapstruct.ap.internal.model.assignment.StreamAdderWrapper" --> <#import "../macro/CommonMacros.ftl" as lib> <@lib.handleExceptions> - if ( ${sourceReference} != null ) { - ${sourceReference}.forEach( ${ext.targetBeanName}::${ext.targetWriteAccessorName} ); - } + <@lib.sourceLocalVarAssignment/> + <@lib.handleSourceReferenceNullCheck> + <#if sourceLocalVarName??>${sourceLocalVarName}<#else>${sourceReference}.forEach( ${ext.targetBeanName}::${ext.targetWriteAccessorName} ); + \ No newline at end of file diff --git a/processor/src/main/resources/org/mapstruct/ap/internal/model/common/SourceRHS.ftl b/processor/src/main/resources/org/mapstruct/ap/internal/model/common/SourceRHS.ftl index 7cab67b52..0b60bd39a 100644 --- a/processor/src/main/resources/org/mapstruct/ap/internal/model/common/SourceRHS.ftl +++ b/processor/src/main/resources/org/mapstruct/ap/internal/model/common/SourceRHS.ftl @@ -6,4 +6,4 @@ --> <#-- @ftlvariable name="" type="org.mapstruct.ap.internal.model.common.SourceRHS" --> -<#if sourceLocalVarName??>${sourceLocalVarName}<#else>${sourceReference} \ No newline at end of file +<#if sourceLoopVarName??>${sourceLoopVarName}<#elseif sourceLocalVarName??>${sourceLocalVarName}<#else>${sourceReference} \ No newline at end of file diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Issue1561Mapper.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Issue1561Mapper.java similarity index 71% rename from processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Issue1561Mapper.java rename to processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Issue1561Mapper.java index b50015337..95065f5df 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Issue1561Mapper.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Issue1561Mapper.java @@ -3,10 +3,12 @@ * * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 */ -package org.mapstruct.ap.test.bugs._1561.java8; +package org.mapstruct.ap.test.bugs._1561; import org.mapstruct.CollectionMappingStrategy; +import org.mapstruct.InheritInverseConfiguration; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; /** @@ -18,7 +20,9 @@ public interface Issue1561Mapper { Issue1561Mapper INSTANCE = Mappers.getMapper( Issue1561Mapper.class ); + @Mapping( target = "nestedTarget.properties", source = "properties") Target map(Source source); + @InheritInverseConfiguration Source map(Target target); } diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Issue1561Test.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Issue1561Test.java similarity index 65% rename from processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Issue1561Test.java rename to processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Issue1561Test.java index d15a53f48..4b8e5704e 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Issue1561Test.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Issue1561Test.java @@ -3,13 +3,15 @@ * * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 */ -package org.mapstruct.ap.test.bugs._1561.java8; +package org.mapstruct.ap.test.bugs._1561; +import org.junit.Rule; 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 org.mapstruct.ap.testutil.runner.GeneratedSource; import static org.assertj.core.api.Assertions.assertThat; @@ -21,10 +23,16 @@ import static org.assertj.core.api.Assertions.assertThat; @WithClasses({ Issue1561Mapper.class, Source.class, - Target.class + Target.class, + NestedTarget.class }) public class Issue1561Test { + @Rule + public final GeneratedSource generatedSource = new GeneratedSource().addComparisonToFixtureFor( + Issue1561Mapper.class + ); + @Test public void shouldCorrectlyUseAdder() { @@ -34,12 +42,10 @@ public class Issue1561Test { Target target = Issue1561Mapper.INSTANCE.map( source ); - assertThat( target.getProperties() ) - .containsExactly( "first", "second" ); + assertThat( target.getNestedTarget().getProperties() ).containsExactly( "first", "second" ); Source mapped = Issue1561Mapper.INSTANCE.map( target ); - assertThat( mapped.getProperties() ) - .containsExactly( "first", "second" ); + assertThat( mapped.getProperties() ).containsExactly( "first", "second" ); } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Target.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/NestedTarget.java similarity index 87% rename from processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Target.java rename to processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/NestedTarget.java index 1a46477dd..a2f104052 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Target.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/NestedTarget.java @@ -3,7 +3,7 @@ * * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 */ -package org.mapstruct.ap.test.bugs._1561.java8; +package org.mapstruct.ap.test.bugs._1561; import java.util.ArrayList; import java.util.List; @@ -12,7 +12,7 @@ import java.util.stream.Stream; /** * @author Sebastian Haberey */ -public class Target { +public class NestedTarget { private List properties = new ArrayList(); diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Source.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Source.java similarity index 91% rename from processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Source.java rename to processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Source.java index 5f52689ce..23195b81d 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/java8/Source.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Source.java @@ -3,7 +3,7 @@ * * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 */ -package org.mapstruct.ap.test.bugs._1561.java8; +package org.mapstruct.ap.test.bugs._1561; import java.util.ArrayList; import java.util.List; diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Target.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Target.java new file mode 100644 index 000000000..29c4f28b0 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1561/Target.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._1561; + +public class Target { + + private NestedTarget nestedTarget; + + public NestedTarget getNestedTarget() { + return nestedTarget; + } + + public void setNestedTarget(NestedTarget nestedTarget) { + this.nestedTarget = nestedTarget; + } +} diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1561/Issue1561MapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1561/Issue1561MapperImpl.java new file mode 100644 index 000000000..dde54d65b --- /dev/null +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1561/Issue1561MapperImpl.java @@ -0,0 +1,77 @@ +/* + * 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._1561; + +import java.util.stream.Stream; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2019-01-29T19:40:52+0100", + comments = "version: , compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)" +) +public class Issue1561MapperImpl implements Issue1561Mapper { + + @Override + public Target map(Source source) { + if ( source == null ) { + return null; + } + + Target target = new Target(); + + target.setNestedTarget( sourceToNestedTarget( source ) ); + + return target; + } + + @Override + public Source map(Target target) { + if ( target == null ) { + return null; + } + + Source source = new Source(); + + Stream nestedTargetProperty = targetNestedTargetProperties( target ); + if ( nestedTargetProperty != null ) { + nestedTargetProperty.forEach( source::addProperty ); + } + + return source; + } + + protected NestedTarget sourceToNestedTarget(Source source) { + if ( source == null ) { + return null; + } + + NestedTarget nestedTarget = new NestedTarget(); + + if ( source.getProperties() != null ) { + for ( String property : source.getProperties() ) { + nestedTarget.addProperty( property ); + } + } + + return nestedTarget; + } + + private Stream targetNestedTargetProperties(Target target) { + if ( target == null ) { + return null; + } + NestedTarget nestedTarget = target.getNestedTarget(); + if ( nestedTarget == null ) { + return null; + } + Stream properties = nestedTarget.getProperties(); + if ( properties == null ) { + return null; + } + return properties; + } +} diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1685/UserMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1685/UserMapperImpl.java index 811fca4a5..fcf8bc2a3 100644 --- a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1685/UserMapperImpl.java +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_1685/UserMapperImpl.java @@ -12,8 +12,8 @@ import javax.annotation.Generated; @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2019-01-28T21:17:39+0100", - comments = "version: , compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)" + date = "2019-01-27T12:40:32+0100", + comments = "version: , compiler: Eclipse JDT (Batch) 1.2.100.v20160418-1457, environment: Java 1.8.0_181 (Oracle Corporation)" ) public class UserMapperImpl implements UserMapper { @@ -44,8 +44,9 @@ public class UserMapperImpl implements UserMapper { else { user.setSettings( null ); } - if ( userDTOContactDataDTOPreferences( userDTO ) != null ) { - for ( String contactDataDTOPreference : userDTOContactDataDTOPreferences( userDTO ) ) { + List preferences = userDTOContactDataDTOPreferences( userDTO ); + if ( preferences != null ) { + for ( String contactDataDTOPreference : preferences ) { user.addPreference( contactDataDTOPreference ); } } @@ -71,8 +72,9 @@ public class UserMapperImpl implements UserMapper { if ( settings1 != null ) { user.setSettings( Arrays.copyOf( settings1, settings1.length ) ); } - if ( userDTOContactDataDTOPreferences( userDTO ) != null ) { - for ( String contactDataDTOPreference : userDTOContactDataDTOPreferences( userDTO ) ) { + List preferences = userDTOContactDataDTOPreferences( userDTO ); + if ( preferences != null ) { + for ( String contactDataDTOPreference : preferences ) { user.addPreference( contactDataDTOPreference ); } } @@ -106,8 +108,9 @@ public class UserMapperImpl implements UserMapper { else { user.setSettings( new String[0] ); } - if ( userDTOContactDataDTOPreferences( userDTO ) != null ) { - for ( String contactDataDTOPreference : userDTOContactDataDTOPreferences( userDTO ) ) { + List preferences = userDTOContactDataDTOPreferences( userDTO ); + if ( preferences != null ) { + for ( String contactDataDTOPreference : preferences ) { user.addPreference( contactDataDTOPreference ); } }