diff --git a/core-common/src/main/java/org/mapstruct/ObjectFactory.java b/core-common/src/main/java/org/mapstruct/ObjectFactory.java index 13f7f246c..7319900b6 100644 --- a/core-common/src/main/java/org/mapstruct/ObjectFactory.java +++ b/core-common/src/main/java/org/mapstruct/ObjectFactory.java @@ -30,7 +30,7 @@ import java.lang.annotation.Target; * return type that is assignable to the required object type is present, then the factory method is used instead. *
* Factory methods can be defined without parameters, with an {@code @}{@link TargetType} parameter, a {@code @} - * {@link Context} parameter, or with a mapping methods source parameter. If any of those parameters are defined, then + * {@link Context} parameter, or with the mapping source parameter. If any of those parameters are defined, then * the mapping method that is supposed to use the factory method needs to be declared with an assignable result type, * assignable context parameter, and/or assignable source types. *
diff --git a/documentation/src/main/asciidoc/mapstruct-reference-guide.asciidoc b/documentation/src/main/asciidoc/mapstruct-reference-guide.asciidoc
index c98afcda6..f3011a531 100644
--- a/documentation/src/main/asciidoc/mapstruct-reference-guide.asciidoc
+++ b/documentation/src/main/asciidoc/mapstruct-reference-guide.asciidoc
@@ -1579,7 +1579,7 @@ The mapping of enum to enum via the `@Mapping` annotation is *DEPRECATED*. It wi
[[object-factories]]
== Object factories
-By default, the generated code for mapping one bean type into another will call the default constructor to instantiate the target type.
+By default, the generated code for mapping one bean type into another or updating a bean will call the default constructor to instantiate the target type.
Alternatively you can plug in custom object factories which will be invoked to obtain instances of the target type. One use case for this is JAXB which creates `ObjectFactory` classes for obtaining new instances of schema types.
@@ -1613,7 +1613,7 @@ public class EntityFactory {
@Mapper(uses= { DtoFactory.class, EntityFactory.class } )
public interface CarMapper {
- OrderMapper INSTANCE = Mappers.getMapper( CarMapper.class );
+ CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
CarDto carToCarDto(Car car);
@@ -1659,6 +1659,74 @@ public class CarMapperImpl implements CarMapper {
----
====
+.Custom object factories with update methods
+====
+[source, java, linenums]
+[subs="verbatim,attributes"]
+----
+@Mapper(uses = { DtoFactory.class, EntityFactory.class, CarMapper.class } )
+public interface OwnerMapper {
+
+ OwnerMapper INSTANCE = Mappers.getMapper( OwnerMapper.class );
+
+ void updateOwnerDto(Owner owner, @MappingTarget OwnerDto ownerDto);
+
+ void updateOwner(OwnerDto ownerDto, @MappingTarget Owner owner);
+}
+----
+[source, java, linenums]
+[subs="verbatim,attributes"]
+----
+//GENERATED CODE
+public class OwnerMapperImpl implements OwnerMapper {
+
+ private final DtoFactory dtoFactory = new DtoFactory();
+
+ private final EntityFactory entityFactory = new EntityFactory();
+
+ private final OwnerMapper ownerMapper = Mappers.getMapper( OwnerMapper.class );
+
+ @Override
+ public void updateOwnerDto(Owner owner, @MappingTarget OwnerDto ownerDto) {
+ if ( owner == null ) {
+ return;
+ }
+
+ if ( owner.getCar() != null ) {
+ if ( ownerDto.getCar() == null ) {
+ ownerDto.setCar( dtoFactory.createCarDto() );
+ }
+ // update car within ownerDto
+ }
+ else {
+ ownerDto.setCar( null );
+ }
+
+ // updating other properties
+ }
+
+ @Override
+ public void updateOwner(OwnerDto ownerDto, @MappingTarget Owner owner) {
+ if ( ownerDto == null ) {
+ return;
+ }
+
+ if ( ownerDto.getCar() != null ) {
+ if ( owner.getCar() == null ) {
+ owner.setCar( entityFactory.createEntity( Car.class ) );
+ }
+ // update car within owner
+ }
+ else {
+ owner.setCar( null );
+ }
+
+ // updating other properties
+ }
+}
+----
+====
+
In addition, annotating a factory method with `@ObjectFactory` lets you gain access to the mapping sources.
Source objects can be added as parameters in the same way as for mapping method. The `@ObjectFactory`
annotation is necessary to let MapStruct know that the given method is only a factory method.
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionProvider.java b/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionProvider.java
index f0095c1e4..574f73dca 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionProvider.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionProvider.java
@@ -20,7 +20,7 @@ package org.mapstruct.ap.internal.conversion;
import java.util.List;
import org.mapstruct.ap.internal.model.TypeConversion;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.HelperMethod;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/conversion/DateToStringConversion.java b/processor/src/main/java/org/mapstruct/ap/internal/conversion/DateToStringConversion.java
index 9a27a9c79..f16a50095 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/conversion/DateToStringConversion.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/conversion/DateToStringConversion.java
@@ -27,10 +27,10 @@ import java.util.Collections;
import java.util.Date;
import java.util.List;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
-import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.HelperMethod;
import org.mapstruct.ap.internal.model.TypeConversion;
+import org.mapstruct.ap.internal.model.common.Assignment;
+import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.common.Type;
/**
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/conversion/ReverseConversion.java b/processor/src/main/java/org/mapstruct/ap/internal/conversion/ReverseConversion.java
index 282c87f02..3c914591e 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/conversion/ReverseConversion.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/conversion/ReverseConversion.java
@@ -20,7 +20,7 @@ package org.mapstruct.ap.internal.conversion;
import java.util.Collections;
import java.util.List;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.HelperMethod;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/conversion/SimpleConversion.java b/processor/src/main/java/org/mapstruct/ap/internal/conversion/SimpleConversion.java
index 12846bad7..a69cbfbca 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/conversion/SimpleConversion.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/conversion/SimpleConversion.java
@@ -23,7 +23,7 @@ import java.util.List;
import java.util.Set;
import org.mapstruct.ap.internal.model.TypeConversion;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.HelperMethod;
import org.mapstruct.ap.internal.model.common.Type;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractBaseBuilder.java b/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractBaseBuilder.java
index a7bc1b77b..9a2ec6b4a 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractBaseBuilder.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractBaseBuilder.java
@@ -18,8 +18,9 @@
*/
package org.mapstruct.ap.internal.model;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.ParameterBinding;
+import org.mapstruct.ap.internal.model.common.SourceRHS;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.ForgedMethod;
import org.mapstruct.ap.internal.model.source.MappingMethodUtils;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractMappingMethodBuilder.java b/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractMappingMethodBuilder.java
index da40bf0dd..597ad093b 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractMappingMethodBuilder.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/AbstractMappingMethodBuilder.java
@@ -19,7 +19,8 @@
package org.mapstruct.ap.internal.model;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
+import org.mapstruct.ap.internal.model.common.SourceRHS;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.ForgedMethod;
import org.mapstruct.ap.internal.model.source.ForgedMethodHistory;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/CollectionAssignmentBuilder.java b/processor/src/main/java/org/mapstruct/ap/internal/model/CollectionAssignmentBuilder.java
index ea9f6dd6b..ee8e3e8ee 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/CollectionAssignmentBuilder.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/CollectionAssignmentBuilder.java
@@ -18,14 +18,16 @@
*/
package org.mapstruct.ap.internal.model;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
import org.mapstruct.ap.internal.model.assignment.ExistingInstanceSetterWrapperForCollectionsAndMaps;
import org.mapstruct.ap.internal.model.assignment.GetterWrapperForCollectionsAndMaps;
import org.mapstruct.ap.internal.model.assignment.SetterWrapperForCollectionsAndMaps;
import org.mapstruct.ap.internal.model.assignment.SetterWrapperForCollectionsAndMapsWithNullCheck;
import org.mapstruct.ap.internal.model.assignment.UpdateWrapper;
+import org.mapstruct.ap.internal.model.common.Assignment;
+import org.mapstruct.ap.internal.model.common.SourceRHS;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.Method;
+import org.mapstruct.ap.internal.model.source.SelectionParameters;
import org.mapstruct.ap.internal.prism.CollectionMappingStrategyPrism;
import org.mapstruct.ap.internal.prism.NullValueCheckStrategyPrism;
import org.mapstruct.ap.internal.util.Message;
@@ -65,7 +67,8 @@ public class CollectionAssignmentBuilder {
private Type targetType;
private String targetPropertyName;
private PropertyMapping.TargetWriteAccessorType targetAccessorType;
- private Assignment rhs;
+ private Assignment assignment;
+ private SourceRHS sourceRHS;
public CollectionAssignmentBuilder mappingBuilderContext(MappingBuilderContext ctx) {
this.ctx = ctx;
@@ -97,13 +100,28 @@ public class CollectionAssignmentBuilder {
return this;
}
- public CollectionAssignmentBuilder rightHandSide(Assignment rhs) {
- this.rhs = rhs;
+ /**
+ * @param assignment the assignment that needs to be invoked
+ *
+ * @return this builder for chaining
+ */
+ public CollectionAssignmentBuilder assignment(Assignment assignment) {
+ this.assignment = assignment;
+ return this;
+ }
+
+ /**
+ * @param sourceRHS the source right hand side for getting the property for mapping
+ *
+ * @return this builder for chaining
+ */
+ public CollectionAssignmentBuilder rightHandSide(SourceRHS sourceRHS) {
+ this.sourceRHS = sourceRHS;
return this;
}
public Assignment build() {
- Assignment result = rhs;
+ Assignment result = assignment;
CollectionMappingStrategyPrism cms = method.getMapperConfiguration().getCollectionMappingStrategy();
boolean targetImmutable = cms == CollectionMappingStrategyPrism.TARGET_IMMUTABLE;
@@ -121,7 +139,8 @@ public class CollectionAssignmentBuilder {
targetPropertyName
);
}
- Assignment factoryMethod = ctx.getMappingResolver().getFactoryMethod( method, targetType, null );
+ Assignment factoryMethod = ctx.getMappingResolver()
+ .getFactoryMethod( method, targetType, SelectionParameters.forSourceRHS( sourceRHS ) );
result = new UpdateWrapper(
result,
method.getThrownTypes(),
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethod.java b/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethod.java
index 984753509..1bb72088a 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethod.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethod.java
@@ -22,7 +22,7 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Parameter;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.Method;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethodBuilder.java b/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethodBuilder.java
index 7a262fb46..5e7ce4995 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethodBuilder.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/ContainerMappingMethodBuilder.java
@@ -25,10 +25,11 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
+import org.mapstruct.ap.internal.model.common.FormattingParameters;
+import org.mapstruct.ap.internal.model.common.SourceRHS;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.ForgedMethod;
-import org.mapstruct.ap.internal.model.common.FormattingParameters;
import org.mapstruct.ap.internal.model.source.Method;
import org.mapstruct.ap.internal.model.source.SelectionParameters;
import org.mapstruct.ap.internal.prism.NullValueMappingStrategyPrism;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/IterableMappingMethod.java b/processor/src/main/java/org/mapstruct/ap/internal/model/IterableMappingMethod.java
index 2edafea3b..d9f2b41ca 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/IterableMappingMethod.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/IterableMappingMethod.java
@@ -23,9 +23,9 @@ import static org.mapstruct.ap.internal.util.Collections.first;
import java.util.Collection;
import java.util.List;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
import org.mapstruct.ap.internal.model.assignment.LocalVarWrapper;
import org.mapstruct.ap.internal.model.assignment.SetterWrapper;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.Method;
import org.mapstruct.ap.internal.model.source.SelectionParameters;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/MapMappingMethod.java b/processor/src/main/java/org/mapstruct/ap/internal/model/MapMappingMethod.java
index d7733479d..1f02b7756 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/MapMappingMethod.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/MapMappingMethod.java
@@ -24,12 +24,13 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
import org.mapstruct.ap.internal.model.assignment.LocalVarWrapper;
+import org.mapstruct.ap.internal.model.common.Assignment;
+import org.mapstruct.ap.internal.model.common.FormattingParameters;
import org.mapstruct.ap.internal.model.common.Parameter;
+import org.mapstruct.ap.internal.model.common.SourceRHS;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.ForgedMethod;
-import org.mapstruct.ap.internal.model.common.FormattingParameters;
import org.mapstruct.ap.internal.model.source.Method;
import org.mapstruct.ap.internal.model.source.SelectionParameters;
import org.mapstruct.ap.internal.prism.NullValueMappingStrategyPrism;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/MappingBuilderContext.java b/processor/src/main/java/org/mapstruct/ap/internal/model/MappingBuilderContext.java
index e1e466a36..77bca9fcf 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/MappingBuilderContext.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/MappingBuilderContext.java
@@ -28,8 +28,9 @@ import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.FormattingParameters;
+import org.mapstruct.ap.internal.model.common.SourceRHS;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.common.TypeFactory;
import org.mapstruct.ap.internal.model.source.ForgedMethod;
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 aee3fd30f..17c862962 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
@@ -24,7 +24,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.common.Parameter;
import org.mapstruct.ap.internal.model.common.ParameterBinding;
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 db7fa579f..a4dc9f3df 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
@@ -18,7 +18,7 @@
*/
package org.mapstruct.ap.internal.model;
-import static org.mapstruct.ap.internal.model.assignment.Assignment.AssignmentType.DIRECT;
+import static org.mapstruct.ap.internal.model.common.Assignment.AssignmentType.DIRECT;
import static org.mapstruct.ap.internal.prism.NullValueCheckStrategyPrism.ALWAYS;
import static org.mapstruct.ap.internal.util.Collections.first;
import static org.mapstruct.ap.internal.util.Collections.last;
@@ -34,14 +34,15 @@ import javax.lang.model.type.DeclaredType;
import org.mapstruct.ap.internal.model.assignment.AdderWrapper;
import org.mapstruct.ap.internal.model.assignment.ArrayCopyWrapper;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
import org.mapstruct.ap.internal.model.assignment.EnumConstantWrapper;
import org.mapstruct.ap.internal.model.assignment.GetterWrapperForCollectionsAndMaps;
import org.mapstruct.ap.internal.model.assignment.SetterWrapper;
import org.mapstruct.ap.internal.model.assignment.UpdateWrapper;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.FormattingParameters;
import org.mapstruct.ap.internal.model.common.ModelElement;
import org.mapstruct.ap.internal.model.common.Parameter;
+import org.mapstruct.ap.internal.model.common.SourceRHS;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.ForgedMethod;
import org.mapstruct.ap.internal.model.source.ForgedMethodHistory;
@@ -393,7 +394,8 @@ public class PropertyMapping extends ModelElement {
targetPropertyName
);
}
- Assignment factory = ctx.getMappingResolver().getFactoryMethod( method, targetType, null );
+ Assignment factory = ctx.getMappingResolver()
+ .getFactoryMethod( method, targetType, SelectionParameters.forSourceRHS( rightHandSide ) );
return new UpdateWrapper( rhs, method.getThrownTypes(), factory, isFieldAssignment(), targetType,
!rhs.isSourceReferenceParameter() );
}
@@ -426,7 +428,8 @@ public class PropertyMapping extends ModelElement {
.targetType( targetType )
.targetPropertyName( targetPropertyName )
.targetAccessorType( targetAccessorType )
- .rightHandSide( rhs )
+ .rightHandSide( rightHandSide )
+ .assignment( rhs )
.build();
}
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/StreamMappingMethod.java b/processor/src/main/java/org/mapstruct/ap/internal/model/StreamMappingMethod.java
index e4f41caef..6e2d067b8 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/StreamMappingMethod.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/StreamMappingMethod.java
@@ -26,8 +26,8 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
import org.mapstruct.ap.internal.model.assignment.Java8FunctionWrapper;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.Method;
import org.mapstruct.ap.internal.model.source.SelectionParameters;
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 c5d62aff7..19c6a6f9e 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
@@ -22,7 +22,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import org.mapstruct.ap.internal.model.assignment.Assignment;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.ModelElement;
import org.mapstruct.ap.internal.model.common.Type;
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 b41aa683c..3c7e03505 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
@@ -23,6 +23,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.util.Nouns;
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 c0354f053..2dfc5b6cd 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
@@ -21,6 +21,7 @@ package org.mapstruct.ap.internal.model.assignment;
import java.util.HashSet;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
/**
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 641c1e61e..6bcdb93ff 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
@@ -21,6 +21,7 @@ package org.mapstruct.ap.internal.model.assignment;
import java.util.List;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.ModelElement;
import org.mapstruct.ap.internal.model.common.Type;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/EnumConstantWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/EnumConstantWrapper.java
index 2d6bf8a63..80d9e403c 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/EnumConstantWrapper.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/EnumConstantWrapper.java
@@ -20,6 +20,8 @@ package org.mapstruct.ap.internal.model.assignment;
import java.util.HashSet;
import java.util.Set;
+
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
/**
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.java
index b6b1aac7e..0e4ba1dc8 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/ExistingInstanceSetterWrapperForCollectionsAndMaps.java
@@ -20,6 +20,7 @@ package org.mapstruct.ap.internal.model.assignment;
import java.util.List;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.common.TypeFactory;
import org.mapstruct.ap.internal.prism.NullValueCheckStrategyPrism;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/GetterWrapperForCollectionsAndMaps.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/GetterWrapperForCollectionsAndMaps.java
index 47dcae6e1..2d0c2429a 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/GetterWrapperForCollectionsAndMaps.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/GetterWrapperForCollectionsAndMaps.java
@@ -22,6 +22,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
/**
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/Java8FunctionWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/Java8FunctionWrapper.java
index 74c111b11..6d4a00e5f 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/Java8FunctionWrapper.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/Java8FunctionWrapper.java
@@ -21,6 +21,7 @@ package org.mapstruct.ap.internal.model.assignment;
import java.util.HashSet;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
/**
@@ -53,7 +54,7 @@ public class Java8FunctionWrapper extends AssignmentWrapper {
/**
*
* @return {@code true} if the wrapped assignment is
- * {@link org.mapstruct.ap.internal.model.assignment.Assignment.AssignmentType#DIRECT}, {@code false} otherwise
+ * {@link Assignment.AssignmentType#DIRECT}, {@code false} otherwise
*/
public boolean isDirectAssignment() {
return getAssignment().getType() == AssignmentType.DIRECT;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/LocalVarWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/LocalVarWrapper.java
index 88052ef3f..8b28b331f 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/LocalVarWrapper.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/LocalVarWrapper.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
/**
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapper.java
index c3c79afb3..97ccc25f0 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapper.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapper.java
@@ -21,6 +21,7 @@ package org.mapstruct.ap.internal.model.assignment;
import java.util.ArrayList;
import java.util.List;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.prism.NullValueCheckStrategyPrism;
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMaps.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMaps.java
index ffcb387c6..98b298f56 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMaps.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMaps.java
@@ -20,6 +20,7 @@ package org.mapstruct.ap.internal.model.assignment;
import java.util.List;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
/**
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMapsWithNullCheck.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMapsWithNullCheck.java
index dc6921fae..cd5b9eb07 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMapsWithNullCheck.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/SetterWrapperForCollectionsAndMapsWithNullCheck.java
@@ -23,10 +23,11 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.common.TypeFactory;
-import static org.mapstruct.ap.internal.model.assignment.Assignment.AssignmentType.DIRECT;
+import static org.mapstruct.ap.internal.model.common.Assignment.AssignmentType.DIRECT;
/**
* This wrapper handles the situation where an assignment is done via the setter and a null check is needed.
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.java
index 8fb5b9e5f..e23f59899 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import org.mapstruct.ap.internal.model.common.Assignment;
import org.mapstruct.ap.internal.model.common.Type;
/**
@@ -51,17 +52,17 @@ public class UpdateWrapper extends AssignmentWrapper {
}
private static Type determineImplType(Assignment factoryMethod, Type targetType) {
+ if ( factoryMethod != null ) {
+ //If we have factory method then we won't use the targetType
+ return null;
+ }
if ( targetType.getImplementationType() != null ) {
// it's probably a collection or something
return targetType.getImplementationType();
}
- if ( factoryMethod == null ) {
- // no factory method means we create a new instance ourself and thus need to import the type
- return targetType;
- }
-
- return null;
+ // no factory method means we create a new instance ourself and thus need to import the type
+ return targetType;
}
@Override
@@ -82,6 +83,9 @@ public class UpdateWrapper extends AssignmentWrapper {
public Set