Content-Length: 19719 | pFad | http://github.com/mapstruct/mapstruct/pull/3871.diff
thub.com
diff --git a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.ftl b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.ftl
index cee722e2d3..95662c4c79 100644
--- a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.ftl
+++ b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.ftl
@@ -30,6 +30,10 @@
<@lib.handleLocalVarNullCheck needs_explicit_local_var=directAssignment>
${ext.targetBeanName}.${ext.targetWriteAccessorName}<@lib.handleWrite><#if directAssignment><@wrapLocalVarInCollectionInitializer/><#else><@lib.handleWithAssignmentOrNullCheckVar/>#if>@lib.handleWrite>;
@lib.handleLocalVarNullCheck>
+ <#if !ext.defaultValueAssignment?? && !sourcePresenceCheckerReference?? && mapNullToDefault>else {
+ ${ext.targetBeanName}.${ext.targetWriteAccessorName}<@lib.handleWrite><@lib.initTargetObject/>@lib.handleWrite>;
+ }
+ #if>
#macro>
<#--
wraps the local variable in a collection initializer (new collection, or EnumSet.copyOf)
diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/DestinationType.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/DestinationType.java
new file mode 100644
index 0000000000..3b4cb00850
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/DestinationType.java
@@ -0,0 +1,30 @@
+/*
+ * 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._3865;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Destination type interface for testing null value property mapping strategy with Map properties.
+ */
+public interface DestinationType {
+ Map getAttributes();
+
+ void setAttributes(Map attributes);
+
+ Map getInitializedAttributes();
+
+ void setInitializedAttributes(Map attributes);
+
+ List getItems();
+
+ void setItems(List items);
+
+ List getInitializedItems();
+
+ void setInitializedItems(List items);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/Issue3865Mapper.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/Issue3865Mapper.java
new file mode 100644
index 0000000000..55e87290f0
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/Issue3865Mapper.java
@@ -0,0 +1,21 @@
+/*
+ * 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._3865;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingTarget;
+import org.mapstruct.NullValuePropertyMappingStrategy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * Mapper for testing null value property mapping strategy with Map properties.
+ */
+@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)
+public interface Issue3865Mapper {
+ Issue3865Mapper INSTANCE = Mappers.getMapper( Issue3865Mapper.class );
+
+ void update(@MappingTarget DestinationType destination, SourceType source);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/Issue3865Test.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/Issue3865Test.java
new file mode 100644
index 0000000000..0d1751e60d
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/Issue3865Test.java
@@ -0,0 +1,140 @@
+/*
+ * 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._3865;
+
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.List;
+
+import org.mapstruct.ap.testutil.IssueKey;
+import org.mapstruct.ap.testutil.ProcessorTest;
+import org.mapstruct.ap.testutil.WithClasses;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Test for issue 3865: NullValuePropertyMappingStrategy.SET_TO_DEFAULT should set target Map/Collection to default
+ * when source and target are all null.
+ */
+@IssueKey("3865")
+@WithClasses({
+ DestinationType.class,
+ SourceType.class,
+ Issue3865Mapper.class
+})
+public class Issue3865Test {
+
+ @ProcessorTest
+ public void shouldSetTargetToDefaultWhenBothSourceAndTargetAreNull() {
+ DestinationType target = new SourceType();
+ SourceType source = new SourceType();
+
+ assertThat( source.getAttributes() ).isNull();
+ assertThat( target.getAttributes() ).isNull();
+ assertThat( source.getItems() ).isNull();
+ assertThat( target.getItems() ).isNull();
+
+ Issue3865Mapper.INSTANCE.update( target, source );
+
+ assertThat( target.getAttributes() ).isNotNull();
+ assertThat( target.getAttributes() ).isEmpty();
+ assertThat( target.getItems() ).isNotNull();
+ assertThat( target.getItems() ).isEmpty();
+
+ assertThat( target.getInitializedAttributes() ).containsKey( "key1" );
+ assertThat( target.getInitializedItems() ).contains( "item1" );
+ }
+
+ @ProcessorTest
+ public void shouldClearTargetWhenSourceIsNullAndTargetIsInitialized() {
+ DestinationType target = new SourceType();
+ SourceType source = new SourceType();
+
+ Map targetAttributes = new HashMap<>();
+ targetAttributes.put( "targetKey", "targetValue" );
+ target.setAttributes( targetAttributes );
+
+ List targetItems = new ArrayList<>();
+ targetItems.add( "targetItem" );
+ target.setItems( targetItems );
+
+ assertThat( source.getAttributes() ).isNull();
+ assertThat( target.getAttributes() ).isNotNull();
+ assertThat( source.getItems() ).isNull();
+ assertThat( target.getItems() ).isNotNull();
+
+ Issue3865Mapper.INSTANCE.update( target, source );
+
+ assertThat( target.getAttributes() ).isNotNull();
+ assertThat( target.getAttributes() ).isEmpty();
+ assertThat( target.getItems() ).isNotNull();
+ assertThat( target.getItems() ).isEmpty();
+ }
+
+ @ProcessorTest
+ public void shouldCopySourceToTargetWhenSourceIsInitializedAndTargetIsNull() {
+ DestinationType target = new SourceType();
+ SourceType source = new SourceType();
+
+ Map sourceAttributes = new HashMap<>();
+ sourceAttributes.put( "sourceKey", "sourceValue" );
+ source.setAttributes( sourceAttributes );
+
+ List sourceItems = new ArrayList<>();
+ sourceItems.add( "sourceItem" );
+ source.setItems( sourceItems );
+
+ assertThat( source.getAttributes() ).isNotNull();
+ assertThat( target.getAttributes() ).isNull();
+ assertThat( source.getItems() ).isNotNull();
+ assertThat( target.getItems() ).isNull();
+
+ Issue3865Mapper.INSTANCE.update( target, source );
+
+ assertThat( target.getAttributes() ).isNotNull();
+ assertThat( target.getAttributes() ).containsEntry( "sourceKey", "sourceValue" );
+ assertThat( target.getItems() ).isNotNull();
+ assertThat( target.getItems() ).contains( "sourceItem" );
+ }
+
+ @ProcessorTest
+ public void shouldCopySourceToTargetWhenBothSourceAndTargetAreInitialized() {
+ DestinationType target = new SourceType();
+ SourceType source = new SourceType();
+
+ Map sourceAttributes = new HashMap<>();
+ sourceAttributes.put( "sourceKey", "sourceValue" );
+ source.setAttributes( sourceAttributes );
+
+ Map targetAttributes = new HashMap<>();
+ targetAttributes.put( "targetKey", "targetValue" );
+ target.setAttributes( targetAttributes );
+
+ List sourceItems = new ArrayList<>();
+ sourceItems.add( "sourceItem" );
+ source.setItems( sourceItems );
+
+ List targetItems = new ArrayList<>();
+ targetItems.add( "targetItem" );
+ target.setItems( targetItems );
+
+ assertThat( source.getAttributes() ).isNotNull();
+ assertThat( target.getAttributes() ).isNotNull();
+ assertThat( source.getItems() ).isNotNull();
+ assertThat( target.getItems() ).isNotNull();
+
+ Issue3865Mapper.INSTANCE.update( target, source );
+
+ assertThat( target.getAttributes() ).isNotNull();
+ assertThat( target.getAttributes() ).containsEntry( "sourceKey", "sourceValue" );
+ assertThat( target.getAttributes() ).doesNotContainKey( "targetKey" );
+
+ assertThat( target.getItems() ).isNotNull();
+ assertThat( target.getItems() ).contains( "sourceItem" );
+ assertThat( target.getItems() ).doesNotContain( "targetItem" );
+ }
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/SourceType.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/SourceType.java
new file mode 100644
index 0000000000..107e275983
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3865/SourceType.java
@@ -0,0 +1,67 @@
+/*
+ * 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._3865;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Source type class implementing DestinationType for testing null value property mapping strategy with Map properties.
+ */
+public class SourceType implements DestinationType {
+ private Map attributes;
+ private List items;
+
+ private Map initializedAttributes = new HashMap<>();
+ private List initializedItems = new ArrayList<>();
+
+ public SourceType() {
+ initializedAttributes.put( "key1", "value1" );
+ initializedItems.add( "item1" );
+ }
+
+ @Override
+ public Map getAttributes() {
+ return attributes;
+ }
+
+ @Override
+ public void setAttributes(Map attributes) {
+ this.attributes = attributes;
+ }
+
+ @Override
+ public Map getInitializedAttributes() {
+ return initializedAttributes;
+ }
+
+ @Override
+ public void setInitializedAttributes(Map attributes) {
+ this.initializedAttributes = attributes;
+ }
+
+ @Override
+ public List getItems() {
+ return items;
+ }
+
+ @Override
+ public void setItems(List items) {
+ this.items = items;
+ }
+
+ @Override
+ public List getInitializedItems() {
+ return initializedItems;
+ }
+
+ @Override
+ public void setInitializedItems(List items) {
+ this.initializedItems = items;
+ }
+}
diff --git a/processor/src/test/resources/fixtures/21/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java b/processor/src/test/resources/fixtures/21/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java
index 76de94378b..f36e2e437d 100644
--- a/processor/src/test/resources/fixtures/21/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java
+++ b/processor/src/test/resources/fixtures/21/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java
@@ -67,6 +67,9 @@ public void update(Dto source, Domain target) {
if ( list != null ) {
target.setStrings( new LinkedHashSet( list ) );
}
+ else {
+ target.setStrings( new LinkedHashSet() );
+ }
}
if ( target.getLongs() != null ) {
Set set = stringListToLongSet( source.getStrings() );
@@ -83,6 +86,9 @@ public void update(Dto source, Domain target) {
if ( set != null ) {
target.setLongs( set );
}
+ else {
+ target.setLongs( new LinkedHashSet() );
+ }
}
if ( target.getStringsInitialized() != null ) {
List list1 = source.getStringsInitialized();
@@ -99,6 +105,9 @@ public void update(Dto source, Domain target) {
if ( list1 != null ) {
target.setStringsInitialized( new LinkedHashSet( list1 ) );
}
+ else {
+ target.setStringsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getLongsInitialized() != null ) {
Set set1 = stringListToLongSet( source.getStringsInitialized() );
@@ -115,6 +124,9 @@ public void update(Dto source, Domain target) {
if ( set1 != null ) {
target.setLongsInitialized( set1 );
}
+ else {
+ target.setLongsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getStringsWithDefault() != null ) {
List list2 = source.getStringsWithDefault();
@@ -157,6 +169,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( list != null ) {
target.setStrings( new LinkedHashSet( list ) );
}
+ else {
+ target.setStrings( new LinkedHashSet() );
+ }
}
if ( target.getLongs() != null ) {
Set set = stringListToLongSet( source.getStrings() );
@@ -173,6 +188,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( set != null ) {
target.setLongs( set );
}
+ else {
+ target.setLongs( new LinkedHashSet() );
+ }
}
if ( target.getStringsInitialized() != null ) {
List list1 = source.getStringsInitialized();
@@ -189,6 +207,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( list1 != null ) {
target.setStringsInitialized( new LinkedHashSet( list1 ) );
}
+ else {
+ target.setStringsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getLongsInitialized() != null ) {
Set set1 = stringListToLongSet( source.getStringsInitialized() );
@@ -205,6 +226,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( set1 != null ) {
target.setLongsInitialized( set1 );
}
+ else {
+ target.setLongsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getStringsWithDefault() != null ) {
List list2 = source.getStringsWithDefault();
diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java
index f1bf0fa78f..87d2fccb26 100644
--- a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java
+++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/bugs/_913/DomainDtoWithNvmsDefaultMapperImpl.java
@@ -67,6 +67,9 @@ public void update(Dto source, Domain target) {
if ( list != null ) {
target.setStrings( new LinkedHashSet( list ) );
}
+ else {
+ target.setStrings( new LinkedHashSet() );
+ }
}
if ( target.getLongs() != null ) {
Set set = stringListToLongSet( source.getStrings() );
@@ -83,6 +86,9 @@ public void update(Dto source, Domain target) {
if ( set != null ) {
target.setLongs( set );
}
+ else {
+ target.setLongs( new LinkedHashSet() );
+ }
}
if ( target.getStringsInitialized() != null ) {
List list1 = source.getStringsInitialized();
@@ -99,6 +105,9 @@ public void update(Dto source, Domain target) {
if ( list1 != null ) {
target.setStringsInitialized( new LinkedHashSet( list1 ) );
}
+ else {
+ target.setStringsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getLongsInitialized() != null ) {
Set set1 = stringListToLongSet( source.getStringsInitialized() );
@@ -115,6 +124,9 @@ public void update(Dto source, Domain target) {
if ( set1 != null ) {
target.setLongsInitialized( set1 );
}
+ else {
+ target.setLongsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getStringsWithDefault() != null ) {
List list2 = source.getStringsWithDefault();
@@ -157,6 +169,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( list != null ) {
target.setStrings( new LinkedHashSet( list ) );
}
+ else {
+ target.setStrings( new LinkedHashSet() );
+ }
}
if ( target.getLongs() != null ) {
Set set = stringListToLongSet( source.getStrings() );
@@ -173,6 +188,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( set != null ) {
target.setLongs( set );
}
+ else {
+ target.setLongs( new LinkedHashSet() );
+ }
}
if ( target.getStringsInitialized() != null ) {
List list1 = source.getStringsInitialized();
@@ -189,6 +207,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( list1 != null ) {
target.setStringsInitialized( new LinkedHashSet( list1 ) );
}
+ else {
+ target.setStringsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getLongsInitialized() != null ) {
Set set1 = stringListToLongSet( source.getStringsInitialized() );
@@ -205,6 +226,9 @@ public Domain updateWithReturn(Dto source, Domain target) {
if ( set1 != null ) {
target.setLongsInitialized( set1 );
}
+ else {
+ target.setLongsInitialized( new LinkedHashSet() );
+ }
}
if ( target.getStringsWithDefault() != null ) {
List list2 = source.getStringsWithDefault();
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/mapstruct/mapstruct/pull/3871.diff
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy