Search in sources :

Example 1 with Assignment

use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.

the class AbstractBaseBuilder method createForgedAssignment.

/**
 * Creates a forged assignment from the provided {@code sourceRHS} and {@code forgedMethod}. If a mapping method
 * for the {@code forgedMethod} already exists, then this method used for the assignment.
 *
 * @param sourceRHS that needs to be used for the assignment
 * @param forgedMethod the forged method for which we want to create an {@link Assignment}
 *
 * @return See above
 */
Assignment createForgedAssignment(SourceRHS sourceRHS, ForgedMethod forgedMethod) {
    if (ctx.getForgedMethodsUnderCreation().containsKey(forgedMethod)) {
        return createAssignment(sourceRHS, ctx.getForgedMethodsUnderCreation().get(forgedMethod));
    } else {
        ctx.getForgedMethodsUnderCreation().put(forgedMethod, forgedMethod);
    }
    MappingMethod forgedMappingMethod;
    if (MappingMethodUtils.isEnumMapping(forgedMethod)) {
        forgedMappingMethod = new ValueMappingMethod.Builder().method(forgedMethod).valueMappings(forgedMethod.getMappingOptions().getValueMappings()).mappingContext(ctx).build();
    } else {
        forgedMappingMethod = new BeanMappingMethod.Builder().forgedMethod(forgedMethod).mappingContext(ctx).build();
    }
    Assignment forgedAssignment = createForgedAssignment(sourceRHS, forgedMethod, forgedMappingMethod);
    ctx.getForgedMethodsUnderCreation().remove(forgedMethod);
    return forgedAssignment;
}
Also used : Assignment(org.mapstruct.ap.internal.model.common.Assignment)

Example 2 with Assignment

use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.

the class CollectionAssignmentBuilder method build.

public Assignment build() {
    Assignment result = assignment;
    CollectionMappingStrategyGem cms = method.getOptions().getMapper().getCollectionMappingStrategy();
    boolean targetImmutable = cms == CollectionMappingStrategyGem.TARGET_IMMUTABLE || targetReadAccessor == null;
    if (targetAccessorType == AccessorType.SETTER || targetAccessorType.isFieldAssignment()) {
        if (result.isCallingUpdateMethod() && !targetImmutable) {
            // call to an update method
            if (targetReadAccessor == null) {
                ctx.getMessager().printMessage(method.getExecutable(), Message.PROPERTYMAPPING_NO_READ_ACCESSOR_FOR_TARGET_TYPE, targetPropertyName);
            }
            Assignment factoryMethod = ObjectFactoryMethodResolver.getFactoryMethod(method, targetType, SelectionParameters.forSourceRHS(sourceRHS), ctx);
            result = new UpdateWrapper(result, method.getThrownTypes(), factoryMethod, targetAccessorType.isFieldAssignment(), targetType, true, nvpms == SET_TO_NULL && !targetType.isPrimitive(), nvpms == SET_TO_DEFAULT);
        } else if (method.isUpdateMethod() && !targetImmutable) {
            result = new ExistingInstanceSetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, nvcs, nvpms, ctx.getTypeFactory(), targetAccessorType.isFieldAssignment());
        } else if (setterWrapperNeedsSourceNullCheck(result) && canBeMappedOrDirectlyAssigned(result)) {
            result = new SetterWrapperForCollectionsAndMapsWithNullCheck(result, method.getThrownTypes(), targetType, ctx.getTypeFactory(), targetAccessorType.isFieldAssignment());
        } else if (canBeMappedOrDirectlyAssigned(result)) {
            // TODO init default value
            // target accessor is setter, so wrap the setter in setter map/ collection handling
            result = new SetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, targetAccessorType.isFieldAssignment());
        } else if (hasNoArgsConstructor()) {
            result = new NewInstanceSetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, ctx.getTypeFactory(), targetAccessorType.isFieldAssignment());
        } else {
            ctx.getMessager().printMessage(method.getExecutable(), Message.PROPERTYMAPPING_NO_SUITABLE_COLLECTION_OR_MAP_CONSTRUCTOR, targetType);
        }
    } else {
        if (targetImmutable) {
            ctx.getMessager().printMessage(method.getExecutable(), Message.PROPERTYMAPPING_NO_WRITE_ACCESSOR_FOR_TARGET_TYPE, targetPropertyName);
        }
        // target accessor is getter, so wrap the setter in getter map/ collection handling
        result = new GetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, targetAccessorType.isFieldAssignment());
    }
    return result;
}
Also used : Assignment(org.mapstruct.ap.internal.model.common.Assignment) SetterWrapperForCollectionsAndMaps(org.mapstruct.ap.internal.model.assignment.SetterWrapperForCollectionsAndMaps) ExistingInstanceSetterWrapperForCollectionsAndMaps(org.mapstruct.ap.internal.model.assignment.ExistingInstanceSetterWrapperForCollectionsAndMaps) NewInstanceSetterWrapperForCollectionsAndMaps(org.mapstruct.ap.internal.model.assignment.NewInstanceSetterWrapperForCollectionsAndMaps) UpdateWrapper(org.mapstruct.ap.internal.model.assignment.UpdateWrapper) GetterWrapperForCollectionsAndMaps(org.mapstruct.ap.internal.model.assignment.GetterWrapperForCollectionsAndMaps) SetterWrapperForCollectionsAndMapsWithNullCheck(org.mapstruct.ap.internal.model.assignment.SetterWrapperForCollectionsAndMapsWithNullCheck) ExistingInstanceSetterWrapperForCollectionsAndMaps(org.mapstruct.ap.internal.model.assignment.ExistingInstanceSetterWrapperForCollectionsAndMaps) NewInstanceSetterWrapperForCollectionsAndMaps(org.mapstruct.ap.internal.model.assignment.NewInstanceSetterWrapperForCollectionsAndMaps) CollectionMappingStrategyGem(org.mapstruct.ap.internal.gem.CollectionMappingStrategyGem)

Example 3 with Assignment

use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.

the class ContainerMappingMethodBuilder method build.

@Override
public final M build() {
    Type sourceParameterType = first(method.getSourceParameters()).getType();
    Type resultType = method.getResultType();
    Type sourceElementType = getElementType(sourceParameterType);
    Type targetElementType = getElementType(resultType);
    String loopVariableName = Strings.getSafeVariableName(sourceElementType.getName(), method.getParameterNames());
    SourceRHS sourceRHS = new SourceRHS(loopVariableName, sourceElementType, new HashSet<>(), errorMessagePart);
    SelectionCriteria criteria = SelectionCriteria.forMappingMethods(selectionParameters, method.getOptions().getIterableMapping().getMappingControl(ctx.getElementUtils()), callingContextTargetPropertyName, false);
    Assignment assignment = ctx.getMappingResolver().getTargetAssignment(method, getDescription(), targetElementType, formattingParameters, criteria, sourceRHS, positionHint, () -> forge(sourceRHS, sourceElementType, targetElementType));
    if (assignment == null) {
        if (method instanceof ForgedMethod) {
            // leave messaging to calling property mapping
            return null;
        } else {
            reportCannotCreateMapping(method, String.format("%s \"%s\"", sourceRHS.getSourceErrorMessagePart(), sourceRHS.getSourceType().describe()), sourceRHS.getSourceType(), targetElementType, "");
        }
    } else {
        ctx.getMessager().note(2, Message.ITERABLEMAPPING_SELECT_ELEMENT_NOTE, assignment);
        if (method instanceof ForgedMethod) {
            ForgedMethod forgedMethod = (ForgedMethod) method;
            forgedMethod.addThrownTypes(assignment.getThrownTypes());
        }
    }
    assignment = getWrapper(assignment, method);
    // mapNullToDefault
    boolean mapNullToDefault = method.getOptions().getIterableMapping().getNullValueMappingStrategy().isReturnDefault();
    MethodReference factoryMethod = null;
    if (!method.isUpdateMethod()) {
        factoryMethod = ObjectFactoryMethodResolver.getFactoryMethod(method, null, ctx);
    }
    Set<String> existingVariables = new HashSet<>(method.getParameterNames());
    existingVariables.add(loopVariableName);
    List<LifecycleCallbackMethodReference> beforeMappingMethods = LifecycleMethodResolver.beforeMappingMethods(method, selectionParameters, ctx, existingVariables);
    List<LifecycleCallbackMethodReference> afterMappingMethods = LifecycleMethodResolver.afterMappingMethods(method, selectionParameters, ctx, existingVariables);
    return instantiateMappingMethod(method, existingVariables, assignment, factoryMethod, mapNullToDefault, loopVariableName, beforeMappingMethods, afterMappingMethods, selectionParameters);
}
Also used : Assignment(org.mapstruct.ap.internal.model.common.Assignment) Type(org.mapstruct.ap.internal.model.common.Type) SourceRHS(org.mapstruct.ap.internal.model.common.SourceRHS) SelectionCriteria(org.mapstruct.ap.internal.model.source.selector.SelectionCriteria) HashSet(java.util.HashSet)

Example 4 with Assignment

use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.

the class AbstractBaseBuilder method createAssignment.

private Assignment createAssignment(SourceRHS source, ForgedMethod methodRef) {
    Assignment assignment = MethodReference.forForgedMethod(methodRef, ParameterBinding.fromParameters(methodRef.getParameters()));
    assignment.setAssignment(source);
    return assignment;
}
Also used : Assignment(org.mapstruct.ap.internal.model.common.Assignment)

Example 5 with Assignment

use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.

the class AbstractBaseBuilder method createForgedAssignment.

/**
 * Creates a forged assignment from the provided {@code sourceRHS} and {@code forgedMethod}. If a mapping method
 * for the {@code forgedMethod} already exists, then this method used for the assignment.
 *
 * @param sourceRHS that needs to be used for the assignment
 * @param forgedMethod the forged method for which we want to create an {@link Assignment}
 *
 * @return See above
 */
Assignment createForgedAssignment(SourceRHS sourceRHS, BuilderType builderType, ForgedMethod forgedMethod) {
    if (ctx.getForgedMethodsUnderCreation().containsKey(forgedMethod)) {
        return createAssignment(sourceRHS, ctx.getForgedMethodsUnderCreation().get(forgedMethod));
    } else {
        ctx.getForgedMethodsUnderCreation().put(forgedMethod, forgedMethod);
    }
    MappingMethod forgedMappingMethod;
    if (MappingMethodUtils.isEnumMapping(forgedMethod)) {
        forgedMappingMethod = new ValueMappingMethod.Builder().method(forgedMethod).valueMappings(forgedMethod.getOptions().getValueMappings()).enumMapping(forgedMethod.getOptions().getEnumMappingOptions()).mappingContext(ctx).build();
    } else {
        forgedMappingMethod = new BeanMappingMethod.Builder().forgedMethod(forgedMethod).returnTypeBuilder(builderType).mappingContext(ctx).build();
    }
    Assignment forgedAssignment = createForgedAssignment(sourceRHS, forgedMethod, forgedMappingMethod);
    ctx.getForgedMethodsUnderCreation().remove(forgedMethod);
    return forgedAssignment;
}
Also used : Assignment(org.mapstruct.ap.internal.model.common.Assignment)

Aggregations

Assignment (org.mapstruct.ap.internal.model.common.Assignment)5 HashSet (java.util.HashSet)1 CollectionMappingStrategyGem (org.mapstruct.ap.internal.gem.CollectionMappingStrategyGem)1 ExistingInstanceSetterWrapperForCollectionsAndMaps (org.mapstruct.ap.internal.model.assignment.ExistingInstanceSetterWrapperForCollectionsAndMaps)1 GetterWrapperForCollectionsAndMaps (org.mapstruct.ap.internal.model.assignment.GetterWrapperForCollectionsAndMaps)1 NewInstanceSetterWrapperForCollectionsAndMaps (org.mapstruct.ap.internal.model.assignment.NewInstanceSetterWrapperForCollectionsAndMaps)1 SetterWrapperForCollectionsAndMaps (org.mapstruct.ap.internal.model.assignment.SetterWrapperForCollectionsAndMaps)1 SetterWrapperForCollectionsAndMapsWithNullCheck (org.mapstruct.ap.internal.model.assignment.SetterWrapperForCollectionsAndMapsWithNullCheck)1 UpdateWrapper (org.mapstruct.ap.internal.model.assignment.UpdateWrapper)1 SourceRHS (org.mapstruct.ap.internal.model.common.SourceRHS)1 Type (org.mapstruct.ap.internal.model.common.Type)1 SelectionCriteria (org.mapstruct.ap.internal.model.source.selector.SelectionCriteria)1