mirror of
https://github.com/mapstruct/mapstruct.git
synced 2025-07-12 00:00:08 +08:00
#160 Refactoring into targetReadAccessor and targetWriteAccessor and making them available to ftl templates
This commit is contained in:
parent
bcf28c1cc1
commit
776bc3d157
@ -90,7 +90,7 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
public Builder souceMethod(SourceMethod sourceMethod) {
|
public Builder souceMethod(SourceMethod sourceMethod) {
|
||||||
this.method = sourceMethod;
|
this.method = sourceMethod;
|
||||||
CollectionMappingStrategyPrism cms = sourceMethod.getMapperConfiguration().getCollectionMappingStrategy();
|
CollectionMappingStrategyPrism cms = sourceMethod.getMapperConfiguration().getCollectionMappingStrategy();
|
||||||
Map<String, ExecutableElement> accessors = method.getResultType().getTargetAccessors( cms );
|
Map<String, ExecutableElement> accessors = method.getResultType().getPropertyWriteAccessors( cms );
|
||||||
this.targetProperties = accessors.keySet();
|
this.targetProperties = accessors.keySet();
|
||||||
this.unprocessedTargetProperties = new HashMap<String, ExecutableElement>( accessors );
|
this.unprocessedTargetProperties = new HashMap<String, ExecutableElement>( accessors );
|
||||||
for ( Parameter sourceParameter : method.getSourceParameters() ) {
|
for ( Parameter sourceParameter : method.getSourceParameters() ) {
|
||||||
@ -237,8 +237,8 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
PropertyMapping propertyMapping = null;
|
PropertyMapping propertyMapping = null;
|
||||||
|
|
||||||
// fetch the target property
|
// fetch the target property
|
||||||
ExecutableElement targetProperty = unprocessedTargetProperties.get( mapping.getTargetName() );
|
ExecutableElement targetWriteAccessor = unprocessedTargetProperties.get( mapping.getTargetName() );
|
||||||
if ( targetProperty == null ) {
|
if ( targetWriteAccessor == null ) {
|
||||||
ctx.getMessager().printMessage(
|
ctx.getMessager().printMessage(
|
||||||
method.getExecutable(),
|
method.getExecutable(),
|
||||||
mapping.getMirror(),
|
mapping.getMirror(),
|
||||||
@ -277,14 +277,15 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
SourceReference sourceRef = mapping.getSourceReference();
|
SourceReference sourceRef = mapping.getSourceReference();
|
||||||
if ( sourceRef.isValid() ) {
|
if ( sourceRef.isValid() ) {
|
||||||
|
|
||||||
if ( targetProperty != null ) {
|
if ( targetWriteAccessor != null ) {
|
||||||
|
|
||||||
// targetProperty == null can occur: we arrived here because we want as many errors
|
// targetProperty == null can occur: we arrived here because we want as many errors
|
||||||
// as possible before we stop analysing
|
// as possible before we stop analysing
|
||||||
propertyMapping = new PropertyMappingBuilder()
|
propertyMapping = new PropertyMappingBuilder()
|
||||||
.mappingContext( ctx )
|
.mappingContext( ctx )
|
||||||
.souceMethod( method )
|
.souceMethod( method )
|
||||||
.targetAccessor( targetProperty )
|
.targetWriteAccessor( targetWriteAccessor )
|
||||||
|
.targetReadAccessor( getTargetPropertyReadAccessor( mapping.getTargetName() ) )
|
||||||
.targetPropertyName( mapping.getTargetName() )
|
.targetPropertyName( mapping.getTargetName() )
|
||||||
.sourceReference( sourceRef )
|
.sourceReference( sourceRef )
|
||||||
.qualifiers( mapping.getQualifiers() )
|
.qualifiers( mapping.getQualifiers() )
|
||||||
@ -303,13 +304,14 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// its a constant
|
// its a constant
|
||||||
else if ( mapping.getConstant() != null && targetProperty != null ) {
|
else if ( mapping.getConstant() != null && targetWriteAccessor != null ) {
|
||||||
|
|
||||||
propertyMapping = new ConstantMappingBuilder()
|
propertyMapping = new ConstantMappingBuilder()
|
||||||
.mappingContext( ctx )
|
.mappingContext( ctx )
|
||||||
.sourceMethod( method )
|
.sourceMethod( method )
|
||||||
.constantExpression( "\"" + mapping.getConstant() + "\"" )
|
.constantExpression( "\"" + mapping.getConstant() + "\"" )
|
||||||
.targetAccessor( targetProperty )
|
.targetWriteAccessor( targetWriteAccessor )
|
||||||
|
.targetReadAccessor( getTargetPropertyReadAccessor( mapping.getTargetName() ) )
|
||||||
.targetPropertyName( mapping.getTargetName() )
|
.targetPropertyName( mapping.getTargetName() )
|
||||||
.dateFormat( mapping.getDateFormat() )
|
.dateFormat( mapping.getDateFormat() )
|
||||||
.qualifiers( mapping.getQualifiers() )
|
.qualifiers( mapping.getQualifiers() )
|
||||||
@ -321,14 +323,15 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// its an expression
|
// its an expression
|
||||||
else if ( mapping.getJavaExpression() != null && targetProperty != null ) {
|
else if ( mapping.getJavaExpression() != null && targetWriteAccessor != null ) {
|
||||||
|
|
||||||
propertyMapping = new JavaExpressionMappingBuilder()
|
propertyMapping = new JavaExpressionMappingBuilder()
|
||||||
.mappingContext( ctx )
|
.mappingContext( ctx )
|
||||||
.souceMethod( method )
|
.souceMethod( method )
|
||||||
.javaExpression( mapping.getJavaExpression() )
|
.javaExpression( mapping.getJavaExpression() )
|
||||||
.targetAccessor( targetProperty )
|
|
||||||
.existingVariableNames( existingVariableNames )
|
.existingVariableNames( existingVariableNames )
|
||||||
|
.targetWriteAccessor( targetWriteAccessor )
|
||||||
|
.targetReadAccessor( targetWriteAccessor )
|
||||||
.targetPropertyName( mapping.getTargetName() )
|
.targetPropertyName( mapping.getTargetName() )
|
||||||
.dependsOn( mapping.getDependsOn() )
|
.dependsOn( mapping.getDependsOn() )
|
||||||
.build();
|
.build();
|
||||||
@ -378,11 +381,13 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( ExecutableElement sourceAccessor : sourceParameter.getType().getGetters() ) {
|
Collection<ExecutableElement> sourceReadAccessors =
|
||||||
String sourcePropertyName = Executables.getPropertyName( sourceAccessor );
|
sourceParameter.getType().getPropertyReadAccessors().values();
|
||||||
|
for ( ExecutableElement sourceReadAccessor : sourceReadAccessors ) {
|
||||||
|
String sourcePropertyName = Executables.getPropertyName( sourceReadAccessor );
|
||||||
|
|
||||||
if ( sourcePropertyName.equals( targetProperty.getKey() ) ) {
|
if ( sourcePropertyName.equals( targetProperty.getKey() ) ) {
|
||||||
candidates.add( sourceAccessor );
|
candidates.add( sourceReadAccessor );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,7 +406,8 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
newPropertyMapping = new PropertyMappingBuilder()
|
newPropertyMapping = new PropertyMappingBuilder()
|
||||||
.mappingContext( ctx )
|
.mappingContext( ctx )
|
||||||
.souceMethod( method )
|
.souceMethod( method )
|
||||||
.targetAccessor( targetProperty.getValue() )
|
.targetWriteAccessor( targetProperty.getValue() )
|
||||||
|
.targetReadAccessor( getTargetPropertyReadAccessor( targetProperty.getKey() ) )
|
||||||
.targetPropertyName( targetProperty.getKey() )
|
.targetPropertyName( targetProperty.getKey() )
|
||||||
.sourceReference( sourceRef )
|
.sourceReference( sourceRef )
|
||||||
.qualifiers( mapping != null ? mapping.getQualifiers() : null )
|
.qualifiers( mapping != null ? mapping.getQualifiers() : null )
|
||||||
@ -464,7 +470,8 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
PropertyMapping propertyMapping = new PropertyMappingBuilder()
|
PropertyMapping propertyMapping = new PropertyMappingBuilder()
|
||||||
.mappingContext( ctx )
|
.mappingContext( ctx )
|
||||||
.souceMethod( method )
|
.souceMethod( method )
|
||||||
.targetAccessor( targetProperty.getValue() )
|
.targetWriteAccessor( targetProperty.getValue() )
|
||||||
|
.targetReadAccessor( getTargetPropertyReadAccessor( targetProperty.getKey() ) )
|
||||||
.targetPropertyName( targetProperty.getKey() )
|
.targetPropertyName( targetProperty.getKey() )
|
||||||
.sourceReference( sourceRef )
|
.sourceReference( sourceRef )
|
||||||
.qualifiers( mapping != null ? mapping.getQualifiers() : null )
|
.qualifiers( mapping != null ? mapping.getQualifiers() : null )
|
||||||
@ -510,6 +517,10 @@ public class BeanMappingMethod extends MappingMethod {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ExecutableElement getTargetPropertyReadAccessor( String propertyName ) {
|
||||||
|
return method.getResultType().getPropertyReadAccessors().get( propertyName );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the effective policy for reporting unmapped getReturnType properties. If explicitly set via
|
* Returns the effective policy for reporting unmapped getReturnType properties. If explicitly set via
|
||||||
* {@code Mapper}, this value will be returned. Otherwise the value from the corresponding processor option will
|
* {@code Mapper}, this value will be returned. Otherwise the value from the corresponding processor option will
|
||||||
|
@ -61,7 +61,8 @@ public class PropertyMapping extends ModelElement {
|
|||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final String sourceBeanName;
|
private final String sourceBeanName;
|
||||||
private final String targetAccessorName;
|
private final String targetWriteAccessorName;
|
||||||
|
private final String targetReadAccessorName;
|
||||||
private final Type targetType;
|
private final Type targetType;
|
||||||
private final Assignment assignment;
|
private final Assignment assignment;
|
||||||
private final List<String> dependsOn;
|
private final List<String> dependsOn;
|
||||||
@ -71,7 +72,8 @@ public class PropertyMapping extends ModelElement {
|
|||||||
// initial properties
|
// initial properties
|
||||||
private MappingBuilderContext ctx;
|
private MappingBuilderContext ctx;
|
||||||
private SourceMethod method;
|
private SourceMethod method;
|
||||||
private ExecutableElement targetAccessor;
|
private ExecutableElement targetWriteAccessor;
|
||||||
|
private ExecutableElement targetReadAccessor;
|
||||||
private String targetPropertyName;
|
private String targetPropertyName;
|
||||||
private String dateFormat;
|
private String dateFormat;
|
||||||
private List<TypeMirror> qualifiers;
|
private List<TypeMirror> qualifiers;
|
||||||
@ -90,8 +92,13 @@ public class PropertyMapping extends ModelElement {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PropertyMappingBuilder targetAccessor(ExecutableElement targetAccessor) {
|
public PropertyMappingBuilder targetReadAccessor(ExecutableElement targetReadAccessor) {
|
||||||
this.targetAccessor = targetAccessor;
|
this.targetReadAccessor = targetReadAccessor;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PropertyMappingBuilder targetWriteAccessor(ExecutableElement targetWriteAccessor) {
|
||||||
|
this.targetWriteAccessor = targetWriteAccessor;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,8 +137,7 @@ public class PropertyMapping extends ModelElement {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum TargetAccessorType {
|
private enum TargetWriteAccessorType {
|
||||||
|
|
||||||
GETTER,
|
GETTER,
|
||||||
SETTER,
|
SETTER,
|
||||||
ADDER
|
ADDER
|
||||||
@ -140,18 +146,18 @@ public class PropertyMapping extends ModelElement {
|
|||||||
public PropertyMapping build() {
|
public PropertyMapping build() {
|
||||||
|
|
||||||
// handle target
|
// handle target
|
||||||
TargetAccessorType targetAccessorType = getTargetAcccessorType();
|
TargetWriteAccessorType targetAccessorType = getTargetAcccessorType();
|
||||||
Type targetType = getTargetType( targetAccessorType );
|
Type targetType = getTargetType( targetAccessorType );
|
||||||
|
|
||||||
// handle source
|
// handle source
|
||||||
String sourceElement = getSourceElement();
|
String sourceElement = getSourceElement();
|
||||||
Type sourceType = getSourceType();
|
Type sourceType = getSourceType();
|
||||||
String sourceRefStr;
|
String sourceRefStr;
|
||||||
if ( targetAccessorType == TargetAccessorType.ADDER && sourceType.isCollectionType() ) {
|
if ( targetAccessorType == TargetWriteAccessorType.ADDER && sourceType.isCollectionType() ) {
|
||||||
// handle adder, if source is collection then use iterator element type as source type.
|
// handle adder, if source is collection then use iterator element type as source type.
|
||||||
// sourceRef becomes a local variable in the itereation.
|
// sourceRef becomes a local variable in the itereation.
|
||||||
sourceType = sourceType.getTypeParameters().get( 0 );
|
sourceType = sourceType.getTypeParameters().get( 0 );
|
||||||
sourceRefStr = Executables.getElementNameForAdder( targetAccessor );
|
sourceRefStr = Executables.getElementNameForAdder( targetWriteAccessor );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sourceRefStr = getSourceRef();
|
sourceRefStr = getSourceRef();
|
||||||
@ -208,19 +214,21 @@ public class PropertyMapping extends ModelElement {
|
|||||||
return new PropertyMapping(
|
return new PropertyMapping(
|
||||||
targetPropertyName,
|
targetPropertyName,
|
||||||
sourceReference.getParameter().getName(),
|
sourceReference.getParameter().getName(),
|
||||||
targetAccessor.getSimpleName().toString(),
|
targetWriteAccessor.getSimpleName().toString(),
|
||||||
|
targetReadAccessor != null ? targetReadAccessor.getSimpleName().toString() : null,
|
||||||
targetType,
|
targetType,
|
||||||
assignment,
|
assignment,
|
||||||
dependsOn
|
dependsOn
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Assignment assignObject(Type sourceType, Type targetType, TargetAccessorType targetAccessorType,
|
private Assignment assignObject(Type sourceType, Type targetType, TargetWriteAccessorType targetAccessorType,
|
||||||
Assignment rhs) {
|
Assignment rhs) {
|
||||||
|
|
||||||
Assignment result = rhs;
|
Assignment result = rhs;
|
||||||
|
|
||||||
if ( targetAccessorType == TargetAccessorType.SETTER ) {
|
if ( targetAccessorType == TargetWriteAccessorType.SETTER ) {
|
||||||
|
|
||||||
result = new SetterWrapper( result, method.getThrownTypes() );
|
result = new SetterWrapper( result, method.getThrownTypes() );
|
||||||
if ( !sourceType.isPrimitive()
|
if ( !sourceType.isPrimitive()
|
||||||
&& !sourceReference.getPropertyEntries().isEmpty() /* parameter null taken care of by beanmapper */
|
&& !sourceReference.getPropertyEntries().isEmpty() /* parameter null taken care of by beanmapper */
|
||||||
@ -252,12 +260,14 @@ public class PropertyMapping extends ModelElement {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Assignment assignCollection(Type targetType, TargetAccessorType targetAccessorType, Assignment rhs) {
|
private Assignment assignCollection(Type targetType,
|
||||||
|
TargetWriteAccessorType targetAccessorType,
|
||||||
|
Assignment rhs) {
|
||||||
|
|
||||||
Assignment result = rhs;
|
Assignment result = rhs;
|
||||||
|
|
||||||
// wrap the setter in the collection / map initializers
|
// wrap the setter in the collection / map initializers
|
||||||
if ( targetAccessorType == TargetAccessorType.SETTER ) {
|
if ( targetAccessorType == TargetWriteAccessorType.SETTER ) {
|
||||||
|
|
||||||
// wrap the assignment in a new Map or Collection implementation if this is not done in a
|
// wrap the assignment in a new Map or Collection implementation if this is not done in a
|
||||||
// mapping method. Note, typeconversons do not apply to collections or maps
|
// mapping method. Note, typeconversons do not apply to collections or maps
|
||||||
@ -273,7 +283,7 @@ public class PropertyMapping extends ModelElement {
|
|||||||
// target accessor is setter, so wrap the setter in setter map/ collection handling
|
// target accessor is setter, so wrap the setter in setter map/ collection handling
|
||||||
result = new SetterWrapperForCollectionsAndMaps(
|
result = new SetterWrapperForCollectionsAndMaps(
|
||||||
result,
|
result,
|
||||||
targetAccessor.getSimpleName().toString(),
|
targetWriteAccessor.getSimpleName().toString(),
|
||||||
newCollectionOrMap
|
newCollectionOrMap
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -379,26 +389,26 @@ public class PropertyMapping extends ModelElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private TargetAccessorType getTargetAcccessorType() {
|
private TargetWriteAccessorType getTargetAcccessorType() {
|
||||||
if ( Executables.isSetterMethod( targetAccessor ) ) {
|
if ( Executables.isSetterMethod( targetWriteAccessor ) ) {
|
||||||
return TargetAccessorType.SETTER;
|
return TargetWriteAccessorType.SETTER;
|
||||||
}
|
}
|
||||||
else if ( Executables.isAdderMethod( targetAccessor ) ) {
|
else if ( Executables.isAdderMethod( targetWriteAccessor ) ) {
|
||||||
return TargetAccessorType.ADDER;
|
return TargetWriteAccessorType.ADDER;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return TargetAccessorType.GETTER;
|
return TargetWriteAccessorType.GETTER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Type getTargetType(TargetAccessorType targetAccessorType) {
|
private Type getTargetType(TargetWriteAccessorType targetAccessorType) {
|
||||||
switch ( targetAccessorType ) {
|
switch ( targetAccessorType ) {
|
||||||
case ADDER:
|
case ADDER:
|
||||||
case SETTER:
|
case SETTER:
|
||||||
return ctx.getTypeFactory().getSingleParameter( targetAccessor ).getType();
|
return ctx.getTypeFactory().getSingleParameter( targetWriteAccessor ).getType();
|
||||||
case GETTER:
|
case GETTER:
|
||||||
default:
|
default:
|
||||||
return ctx.getTypeFactory().getReturnType( targetAccessor );
|
return ctx.getTypeFactory().getReturnType( targetWriteAccessor );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -477,8 +487,9 @@ public class PropertyMapping extends ModelElement {
|
|||||||
private MappingBuilderContext ctx;
|
private MappingBuilderContext ctx;
|
||||||
private SourceMethod method;
|
private SourceMethod method;
|
||||||
private String constantExpression;
|
private String constantExpression;
|
||||||
private ExecutableElement targetAccessor;
|
|
||||||
private String targetPropertyName;
|
private String targetPropertyName;
|
||||||
|
private ExecutableElement targetWriteAccessor;
|
||||||
|
private ExecutableElement targetReadAccessor;
|
||||||
private String dateFormat;
|
private String dateFormat;
|
||||||
private List<TypeMirror> qualifiers;
|
private List<TypeMirror> qualifiers;
|
||||||
private TypeMirror resultType;
|
private TypeMirror resultType;
|
||||||
@ -500,8 +511,13 @@ public class PropertyMapping extends ModelElement {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConstantMappingBuilder targetAccessor(ExecutableElement targetAccessor) {
|
public ConstantMappingBuilder targetWriteAccessor(ExecutableElement targetAccessor) {
|
||||||
this.targetAccessor = targetAccessor;
|
this.targetWriteAccessor = targetAccessor;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConstantMappingBuilder targetReadAccessor(ExecutableElement targetReadAccessor) {
|
||||||
|
this.targetReadAccessor = targetReadAccessor;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,11 +559,11 @@ public class PropertyMapping extends ModelElement {
|
|||||||
|
|
||||||
// target
|
// target
|
||||||
Type targetType;
|
Type targetType;
|
||||||
if ( Executables.isSetterMethod( targetAccessor ) ) {
|
if ( Executables.isSetterMethod( targetWriteAccessor ) ) {
|
||||||
targetType = ctx.getTypeFactory().getSingleParameter( targetAccessor ).getType();
|
targetType = ctx.getTypeFactory().getSingleParameter( targetWriteAccessor ).getType();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
targetType = ctx.getTypeFactory().getReturnType( targetAccessor );
|
targetType = ctx.getTypeFactory().getReturnType( targetWriteAccessor );
|
||||||
}
|
}
|
||||||
|
|
||||||
Assignment assignment = ctx.getMappingResolver().getTargetAssignment(
|
Assignment assignment = ctx.getMappingResolver().getTargetAssignment(
|
||||||
@ -564,7 +580,7 @@ public class PropertyMapping extends ModelElement {
|
|||||||
|
|
||||||
if ( assignment != null ) {
|
if ( assignment != null ) {
|
||||||
|
|
||||||
if ( Executables.isSetterMethod( targetAccessor ) ) {
|
if ( Executables.isSetterMethod( targetWriteAccessor ) ) {
|
||||||
// target accessor is setter, so decorate assignment as setter
|
// target accessor is setter, so decorate assignment as setter
|
||||||
assignment = new SetterWrapper( assignment, method.getThrownTypes() );
|
assignment = new SetterWrapper( assignment, method.getThrownTypes() );
|
||||||
}
|
}
|
||||||
@ -591,7 +607,8 @@ public class PropertyMapping extends ModelElement {
|
|||||||
|
|
||||||
return new PropertyMapping(
|
return new PropertyMapping(
|
||||||
targetPropertyName,
|
targetPropertyName,
|
||||||
targetAccessor.getSimpleName().toString(),
|
targetWriteAccessor.getSimpleName().toString(),
|
||||||
|
targetReadAccessor != null ? targetReadAccessor.getSimpleName().toString() : null,
|
||||||
targetType,
|
targetType,
|
||||||
assignment,
|
assignment,
|
||||||
dependsOn
|
dependsOn
|
||||||
@ -604,10 +621,11 @@ public class PropertyMapping extends ModelElement {
|
|||||||
private MappingBuilderContext ctx;
|
private MappingBuilderContext ctx;
|
||||||
private SourceMethod method;
|
private SourceMethod method;
|
||||||
private String javaExpression;
|
private String javaExpression;
|
||||||
private ExecutableElement targetAccessor;
|
|
||||||
private Collection<String> existingVariableNames;
|
private Collection<String> existingVariableNames;
|
||||||
private String targetPropertyName;
|
private String targetPropertyName;
|
||||||
private List<String> dependsOn;
|
private List<String> dependsOn;
|
||||||
|
private ExecutableElement targetWriteAccessor;
|
||||||
|
private ExecutableElement targetReadAccessor;
|
||||||
|
|
||||||
public JavaExpressionMappingBuilder mappingContext(MappingBuilderContext mappingContext) {
|
public JavaExpressionMappingBuilder mappingContext(MappingBuilderContext mappingContext) {
|
||||||
this.ctx = mappingContext;
|
this.ctx = mappingContext;
|
||||||
@ -624,8 +642,13 @@ public class PropertyMapping extends ModelElement {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public JavaExpressionMappingBuilder targetAccessor(ExecutableElement targetAccessor) {
|
public JavaExpressionMappingBuilder targetWriteAccessor(ExecutableElement targetWriteAccessor) {
|
||||||
this.targetAccessor = targetAccessor;
|
this.targetWriteAccessor = targetWriteAccessor;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JavaExpressionMappingBuilder targetReadAccessor(ExecutableElement targetReadAccessor) {
|
||||||
|
this.targetReadAccessor = targetReadAccessor;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -649,13 +672,13 @@ public class PropertyMapping extends ModelElement {
|
|||||||
Assignment assignment = AssignmentFactory.createDirect( javaExpression );
|
Assignment assignment = AssignmentFactory.createDirect( javaExpression );
|
||||||
|
|
||||||
Type targetType;
|
Type targetType;
|
||||||
if ( Executables.isSetterMethod( targetAccessor ) ) {
|
if ( Executables.isSetterMethod( targetWriteAccessor ) ) {
|
||||||
// setter, so wrap in setter
|
// setter, so wrap in setter
|
||||||
assignment = new SetterWrapper( assignment, method.getThrownTypes() );
|
assignment = new SetterWrapper( assignment, method.getThrownTypes() );
|
||||||
targetType = ctx.getTypeFactory().getSingleParameter( targetAccessor ).getType();
|
targetType = ctx.getTypeFactory().getSingleParameter( targetWriteAccessor ).getType();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
targetType = ctx.getTypeFactory().getReturnType( targetAccessor );
|
targetType = ctx.getTypeFactory().getReturnType( targetWriteAccessor );
|
||||||
// target accessor is getter, so wrap the setter in getter map/ collection handling
|
// target accessor is getter, so wrap the setter in getter map/ collection handling
|
||||||
assignment = new GetterWrapperForCollectionsAndMaps(
|
assignment = new GetterWrapperForCollectionsAndMaps(
|
||||||
assignment,
|
assignment,
|
||||||
@ -667,7 +690,8 @@ public class PropertyMapping extends ModelElement {
|
|||||||
|
|
||||||
return new PropertyMapping(
|
return new PropertyMapping(
|
||||||
targetPropertyName,
|
targetPropertyName,
|
||||||
targetAccessor.getSimpleName().toString(),
|
targetWriteAccessor.getSimpleName().toString(),
|
||||||
|
targetReadAccessor != null ? targetReadAccessor.getSimpleName().toString() : null,
|
||||||
targetType,
|
targetType,
|
||||||
assignment,
|
assignment,
|
||||||
dependsOn
|
dependsOn
|
||||||
@ -677,16 +701,18 @@ public class PropertyMapping extends ModelElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Constructor for creating mappings of constant expressions.
|
// Constructor for creating mappings of constant expressions.
|
||||||
private PropertyMapping(String name, String targetAccessorName, Type targetType, Assignment propertyAssignment,
|
private PropertyMapping(String name, String targetWriteAccessorName, String targetReadAccessorName, Type targetType,
|
||||||
List<String> dependsOn) {
|
Assignment propertyAssignment, List<String> dependsOn) {
|
||||||
this( name, null, targetAccessorName, targetType, propertyAssignment, dependsOn );
|
this( name, null, targetWriteAccessorName, targetReadAccessorName, targetType, propertyAssignment, dependsOn );
|
||||||
}
|
}
|
||||||
|
|
||||||
private PropertyMapping(String name, String sourceBeanName, String targetAccessorName, Type targetType,
|
private PropertyMapping(String name, String sourceBeanName, String targetWriteAccessorName,
|
||||||
Assignment assignment, List<String> dependsOn) {
|
String targetReadAccessorName, Type targetType, Assignment assignment,
|
||||||
|
List<String> dependsOn) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.sourceBeanName = sourceBeanName;
|
this.sourceBeanName = sourceBeanName;
|
||||||
this.targetAccessorName = targetAccessorName;
|
this.targetWriteAccessorName = targetWriteAccessorName;
|
||||||
|
this.targetReadAccessorName = targetReadAccessorName;
|
||||||
this.targetType = targetType;
|
this.targetType = targetType;
|
||||||
this.assignment = assignment;
|
this.assignment = assignment;
|
||||||
this.dependsOn = dependsOn != null ? dependsOn : Collections.<String>emptyList();
|
this.dependsOn = dependsOn != null ? dependsOn : Collections.<String>emptyList();
|
||||||
@ -703,8 +729,12 @@ public class PropertyMapping extends ModelElement {
|
|||||||
return sourceBeanName;
|
return sourceBeanName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTargetAccessorName() {
|
public String getTargetWriteAccessorName() {
|
||||||
return targetAccessorName;
|
return targetWriteAccessorName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTargetReadAccessorName() {
|
||||||
|
return targetReadAccessorName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type getTargetType() {
|
public Type getTargetType() {
|
||||||
@ -728,6 +758,8 @@ public class PropertyMapping extends ModelElement {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return "PropertyMapping {"
|
return "PropertyMapping {"
|
||||||
+ "\n name='" + name + "\',"
|
+ "\n name='" + name + "\',"
|
||||||
|
+ "\n targetWriteAccessorName='" + targetWriteAccessorName + "\',"
|
||||||
|
+ "\n targetReadAccessorName='" + targetReadAccessorName + "\',"
|
||||||
+ "\n targetType=" + targetType + ","
|
+ "\n targetType=" + targetType + ","
|
||||||
+ "\n propertyAssignment=" + assignment + ","
|
+ "\n propertyAssignment=" + assignment + ","
|
||||||
+ "\n dependsOn=" + dependsOn
|
+ "\n dependsOn=" + dependsOn
|
||||||
|
@ -92,13 +92,13 @@ public class TypeConversion extends ModelElement implements Assignment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AssignmentType getType() {
|
public Assignment.AssignmentType getType() {
|
||||||
|
|
||||||
switch ( assignment.getType() ) {
|
switch ( assignment.getType() ) {
|
||||||
case DIRECT:
|
case DIRECT:
|
||||||
return AssignmentType.TYPE_CONVERTED;
|
return Assignment.AssignmentType.TYPE_CONVERTED;
|
||||||
case MAPPED:
|
case MAPPED:
|
||||||
return AssignmentType.MAPPED_TYPE_CONVERTED;
|
return Assignment.AssignmentType.MAPPED_TYPE_CONVERTED;
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -81,8 +82,9 @@ public class Type extends ModelElement implements Comparable<Type> {
|
|||||||
|
|
||||||
private final List<String> enumConstants;
|
private final List<String> enumConstants;
|
||||||
|
|
||||||
|
private Map<String, ExecutableElement> getters = null;
|
||||||
|
|
||||||
private List<ExecutableElement> allExecutables = null;
|
private List<ExecutableElement> allExecutables = null;
|
||||||
private List<ExecutableElement> getters = null;
|
|
||||||
private List<ExecutableElement> setters = null;
|
private List<ExecutableElement> setters = null;
|
||||||
private List<ExecutableElement> adders = null;
|
private List<ExecutableElement> adders = null;
|
||||||
private List<ExecutableElement> alternativeTargetAccessors = null;
|
private List<ExecutableElement> alternativeTargetAccessors = null;
|
||||||
@ -312,32 +314,38 @@ public class Type extends ModelElement implements Comparable<Type> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getGetters
|
* getPropertyReadAccessors
|
||||||
*
|
*
|
||||||
* @return an unmodifiable list of all getters (including 'is' for booleans).
|
* @return an unmodifiable map of all read accessors (including 'is' for booleans), indexed by property name
|
||||||
*/
|
*/
|
||||||
public List<ExecutableElement> getGetters() {
|
public Map<String, ExecutableElement> getPropertyReadAccessors() {
|
||||||
if ( getters == null ) {
|
if ( getters == null ) {
|
||||||
getters = Collections.unmodifiableList( Filters.getterMethodsIn( getAllExecutables() ) );
|
List<ExecutableElement> getterList = Filters.getterMethodsIn( getAllExecutables() );
|
||||||
|
Map<String, ExecutableElement> modifiableGetters = new LinkedHashMap<String, ExecutableElement>();
|
||||||
|
for (ExecutableElement getter : getterList) {
|
||||||
|
modifiableGetters.put( Executables.getPropertyName( getter ), getter );
|
||||||
|
}
|
||||||
|
getters = Collections.unmodifiableMap( modifiableGetters );
|
||||||
}
|
}
|
||||||
return getters;
|
return getters;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getTargetAccessors returns a list of the target accessors according to the CollectionMappingStrategy. These
|
* getPropertyWriteAccessors returns a map of the write accessors according to the CollectionMappingStrategy.
|
||||||
* accessors include:
|
*
|
||||||
|
* These accessors include:
|
||||||
* <p>
|
* <p>
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>setters, the obvious candidate :-), {@link #getSetters() }</li>
|
* <li>setters, the obvious candidate :-), {@link #getSetters() }</li>
|
||||||
* <li>getters, for collections that do not have a setter, e.g. for JAXB generated collection attributes
|
* <li>getters, for collections that do not have a setter, e.g. for JAXB generated collection attributes
|
||||||
* {@link #getGetters() }</li>
|
* {@link #getPropertyReadAccessors() }</li>
|
||||||
* <li>adders, typically for from table generated entities, {@link #getAdders() }</li>
|
* <li>adders, typically for from table generated entities, {@link #getAdders() }</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
* </p>
|
* </p>
|
||||||
* @param cmStrategy
|
* @param cmStrategy
|
||||||
* @return an unmodifiable list of all getters (including 'is' for booleans).
|
* @return an unmodifiable map of all write accessors indexed by property name
|
||||||
*/
|
*/
|
||||||
public Map<String, ExecutableElement> getTargetAccessors( CollectionMappingStrategyPrism cmStrategy ) {
|
public Map<String, ExecutableElement> getPropertyWriteAccessors( CollectionMappingStrategyPrism cmStrategy ) {
|
||||||
|
|
||||||
// collect all candidate target accessors
|
// collect all candidate target accessors
|
||||||
List<ExecutableElement> candidates = new ArrayList<ExecutableElement>();
|
List<ExecutableElement> candidates = new ArrayList<ExecutableElement>();
|
||||||
@ -482,11 +490,12 @@ public class Type extends ModelElement implements Comparable<Type> {
|
|||||||
* @return an unmodifiable list of alternative target accessors.
|
* @return an unmodifiable list of alternative target accessors.
|
||||||
*/
|
*/
|
||||||
private List<ExecutableElement> getAlternativeTargetAccessors() {
|
private List<ExecutableElement> getAlternativeTargetAccessors() {
|
||||||
|
|
||||||
if ( alternativeTargetAccessors == null ) {
|
if ( alternativeTargetAccessors == null ) {
|
||||||
|
|
||||||
List<ExecutableElement> result = new ArrayList<ExecutableElement>();
|
List<ExecutableElement> result = new ArrayList<ExecutableElement>();
|
||||||
List<ExecutableElement> setterMethods = getSetters();
|
List<ExecutableElement> setterMethods = getSetters();
|
||||||
List<ExecutableElement> getterMethods = getGetters();
|
List<ExecutableElement> getterMethods = new ArrayList( getPropertyReadAccessors().values() );
|
||||||
|
|
||||||
// there could be a getter method for a list/map that is not present as setter.
|
// there could be a getter method for a list/map that is not present as setter.
|
||||||
// a getter could substitute the setter in that case and act as setter.
|
// a getter could substitute the setter in that case and act as setter.
|
||||||
|
@ -266,7 +266,7 @@ public class Mapping {
|
|||||||
|
|
||||||
private boolean hasPropertyInReverseMethod(String name, SourceMethod method) {
|
private boolean hasPropertyInReverseMethod(String name, SourceMethod method) {
|
||||||
CollectionMappingStrategyPrism cms = method.getMapperConfiguration().getCollectionMappingStrategy();
|
CollectionMappingStrategyPrism cms = method.getMapperConfiguration().getCollectionMappingStrategy();
|
||||||
return method.getResultType().getTargetAccessors( cms ).containsKey( name );
|
return method.getResultType().getPropertyWriteAccessors( cms ).containsKey( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mapping reverse(SourceMethod method, FormattingMessager messager, TypeFactory typeFactory) {
|
public Mapping reverse(SourceMethod method, FormattingMessager messager, TypeFactory typeFactory) {
|
||||||
|
@ -21,13 +21,13 @@ package org.mapstruct.ap.model.source;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.ExecutableElement;
|
||||||
|
|
||||||
import org.mapstruct.ap.model.common.Parameter;
|
import org.mapstruct.ap.model.common.Parameter;
|
||||||
import org.mapstruct.ap.model.common.Type;
|
import org.mapstruct.ap.model.common.Type;
|
||||||
import org.mapstruct.ap.model.common.TypeFactory;
|
import org.mapstruct.ap.model.common.TypeFactory;
|
||||||
import org.mapstruct.ap.util.Executables;
|
|
||||||
import org.mapstruct.ap.util.FormattingMessager;
|
import org.mapstruct.ap.util.FormattingMessager;
|
||||||
import org.mapstruct.ap.util.Message;
|
import org.mapstruct.ap.util.Message;
|
||||||
import org.mapstruct.ap.util.Strings;
|
import org.mapstruct.ap.util.Strings;
|
||||||
@ -173,11 +173,11 @@ public class SourceReference {
|
|||||||
Type newType = type;
|
Type newType = type;
|
||||||
for ( String entryName : entryNames ) {
|
for ( String entryName : entryNames ) {
|
||||||
boolean matchFound = false;
|
boolean matchFound = false;
|
||||||
List<ExecutableElement> getters = newType.getGetters();
|
Map<String, ExecutableElement> sourceReadAccessors = newType.getPropertyReadAccessors();
|
||||||
for ( ExecutableElement getter : getters ) {
|
for ( Map.Entry<String, ExecutableElement> getter : sourceReadAccessors.entrySet() ) {
|
||||||
if ( Executables.getPropertyName( getter ).equals( entryName ) ) {
|
if ( getter.getKey().equals( entryName ) ) {
|
||||||
newType = typeFactory.getType( getter.getReturnType() );
|
newType = typeFactory.getType( getter.getValue().getReturnType() );
|
||||||
sourceEntries.add( new PropertyEntry( entryName, getter, newType ) );
|
sourceEntries.add( new PropertyEntry( entryName, getter.getValue(), newType ) );
|
||||||
matchFound = true;
|
matchFound = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
</#if>
|
</#if>
|
||||||
<@includeModel object=elementAssignment targetAccessorName=resultName+"[${index1Name}]" targetType=resultElementType isTargetDefined=true/>
|
<@includeModel object=elementAssignment targetWriteAccessorName=resultName+"[${index1Name}]" targetType=resultElementType isTargetDefined=true/>
|
||||||
${index1Name}++;
|
${index1Name}++;
|
||||||
}
|
}
|
||||||
<#else>
|
<#else>
|
||||||
@ -69,7 +69,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
for ( <@includeModel object=sourceElementType/> ${loopVariableName} : ${sourceParameter.name} ) {
|
for ( <@includeModel object=sourceElementType/> ${loopVariableName} : ${sourceParameter.name} ) {
|
||||||
<@includeModel object=elementAssignment targetBeanName=resultName targetAccessorName="add" targetType=resultElementType/>
|
<@includeModel object=elementAssignment targetBeanName=resultName targetWriteAccessorName="add" targetType=resultElementType/>
|
||||||
}
|
}
|
||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
|
@ -43,11 +43,11 @@
|
|||||||
for ( java.util.Map.Entry<<#list sourceParameter.type.typeParameters as typeParameter><@includeModel object=typeParameter /><#if typeParameter_has_next>, </#if></#list>> ${entryVariableName} : ${sourceParameter.name}.entrySet() ) {
|
for ( java.util.Map.Entry<<#list sourceParameter.type.typeParameters as typeParameter><@includeModel object=typeParameter /><#if typeParameter_has_next>, </#if></#list>> ${entryVariableName} : ${sourceParameter.name}.entrySet() ) {
|
||||||
<#-- key -->
|
<#-- key -->
|
||||||
<@includeModel object=keyAssignment
|
<@includeModel object=keyAssignment
|
||||||
targetAccessorName=keyVariableName
|
targetWriteAccessorName=keyVariableName
|
||||||
targetType=resultType.typeParameters[0]/>
|
targetType=resultType.typeParameters[0]/>
|
||||||
<#-- value -->
|
<#-- value -->
|
||||||
<@includeModel object=valueAssignment
|
<@includeModel object=valueAssignment
|
||||||
targetAccessorName=valueVariableName
|
targetWriteAccessorName=valueVariableName
|
||||||
targetType=resultType.typeParameters[1]/>
|
targetType=resultType.typeParameters[1]/>
|
||||||
${resultName}.put( ${keyVariableName}, ${valueVariableName} );
|
${resultName}.put( ${keyVariableName}, ${valueVariableName} );
|
||||||
}
|
}
|
||||||
|
@ -26,12 +26,23 @@
|
|||||||
<#if param.targetType>
|
<#if param.targetType>
|
||||||
<#-- a class is passed on for casting, see @TargetType -->
|
<#-- a class is passed on for casting, see @TargetType -->
|
||||||
<@includeModel object=ext.targetType raw=true/>.class
|
<@includeModel object=ext.targetType raw=true/>.class
|
||||||
|
<#elseif param.mappingTarget>
|
||||||
|
${ext.targetBeanName}.${ext.targetReadAccessorName}()
|
||||||
<#else>
|
<#else>
|
||||||
<@includeModel object=assignment targetType=singleSourceParameterType raw=ext.raw/>
|
<@_assignment/>
|
||||||
</#if>
|
</#if>
|
||||||
<#if param_has_next>, </#if>
|
<#if param_has_next>, </#if>
|
||||||
</#list>
|
</#list>
|
||||||
<#-- context parameter, e.g. for builtin methods concerning date conversion -->
|
<#-- context parameter, e.g. for builtin methods concerning date conversion -->
|
||||||
<#if contextParam??>, ${contextParam}</#if>
|
<#if contextParam??>, ${contextParam}</#if>
|
||||||
</#macro>
|
</#macro>
|
||||||
|
<#macro _assignment>
|
||||||
|
<@includeModel object=assignment
|
||||||
|
targetBeanName=ext.targetBeanName
|
||||||
|
raw=ext.raw
|
||||||
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
|
targetType=singleSourceParameterType/>
|
||||||
|
</#macro>
|
||||||
</@compress>
|
</@compress>
|
||||||
|
@ -22,5 +22,6 @@
|
|||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName=targetAccessorName
|
targetReadAccessorName=targetReadAccessorName
|
||||||
|
targetWriteAccessorName=targetWriteAccessorName
|
||||||
targetType=targetType/>
|
targetType=targetType/>
|
||||||
|
@ -18,4 +18,15 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
${openExpression}<@includeModel object=assignment targetType=ext.targetType raw=ext.raw/>${closeExpression}
|
<@compress single_line=true>
|
||||||
|
${openExpression}<@_assignment/>${closeExpression}
|
||||||
|
<#macro _assignment>
|
||||||
|
<@includeModel object=assignment
|
||||||
|
targetBeanName=ext.targetBeanName
|
||||||
|
raw=ext.raw
|
||||||
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
|
targetType=ext.targetType/>
|
||||||
|
</#macro>
|
||||||
|
</@compress>
|
||||||
|
@ -20,21 +20,23 @@
|
|||||||
-->
|
-->
|
||||||
<#if (exceptionTypes?size == 0) >
|
<#if (exceptionTypes?size == 0) >
|
||||||
for ( <@includeModel object=sourceType/> ${iteratorReference} : ${sourceReference} ) {
|
for ( <@includeModel object=sourceType/> ${iteratorReference} : ${sourceReference} ) {
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}( <@includeModel object=assignment
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}( <@includeModel object=assignment
|
||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName=ext.targetAccessorName
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
targetType=ext.targetType/> );
|
targetType=ext.targetType/> );
|
||||||
}
|
}
|
||||||
<#else>
|
<#else>
|
||||||
try {
|
try {
|
||||||
for ( <@includeModel object=sourceType/> ${iteratorReference} : ${sourceReference} ) {
|
for ( <@includeModel object=sourceType/> ${iteratorReference} : ${sourceReference} ) {
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}( <@includeModel object=assignment
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}( <@includeModel object=assignment
|
||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName=ext.targetAccessorName
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
targetType=ext.targetType/> );
|
targetType=ext.targetType/> );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,11 @@
|
|||||||
-->
|
-->
|
||||||
<#if (exceptionTypes?size == 0) >
|
<#if (exceptionTypes?size == 0) >
|
||||||
<@includeModel object=ext.targetType/> ${localVarName} = <@_assignment/>;
|
<@includeModel object=ext.targetType/> ${localVarName} = <@_assignment/>;
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}( Arrays.copyOf( ${localVarName}, ${localVarName}.length ) );
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}( Arrays.copyOf( ${localVarName}, ${localVarName}.length ) );
|
||||||
<#else>
|
<#else>
|
||||||
try {
|
try {
|
||||||
<@includeModel object=ext.targetType/> ${localVarName} = <@_assignment/>;
|
<@includeModel object=ext.targetType/> ${localVarName} = <@_assignment/>;
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}( Arrays.copyOf( ${localVarName}, ${localVarName}.length ) );
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}( Arrays.copyOf( ${localVarName}, ${localVarName}.length ) );
|
||||||
}
|
}
|
||||||
<#list exceptionTypes as exceptionType>
|
<#list exceptionTypes as exceptionType>
|
||||||
catch ( <@includeModel object=exceptionType/> e ) {
|
catch ( <@includeModel object=exceptionType/> e ) {
|
||||||
@ -33,5 +33,11 @@
|
|||||||
</#list>
|
</#list>
|
||||||
</#if>
|
</#if>
|
||||||
<#macro _assignment>
|
<#macro _assignment>
|
||||||
<@includeModel object=assignment raw=ext.raw targetType=ext.targetType/>
|
<@includeModel object=assignment
|
||||||
|
targetBeanName=ext.targetBeanName
|
||||||
|
raw=ext.raw
|
||||||
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
|
targetType=ext.targetType/>
|
||||||
</#macro>
|
</#macro>
|
@ -18,9 +18,9 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
if ( ${ext.targetBeanName}.${ext.targetAccessorName}() != null ) {
|
if ( ${ext.targetBeanName}.${ext.targetWriteAccessorName}() != null ) {
|
||||||
<#if ext.existingInstanceMapping>
|
<#if ext.existingInstanceMapping>
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}().clear();
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}().clear();
|
||||||
</#if>
|
</#if>
|
||||||
<#if (exceptionTypes?size == 0) >
|
<#if (exceptionTypes?size == 0) >
|
||||||
<@_assignmentLine/>
|
<@_assignmentLine/>
|
||||||
@ -38,7 +38,7 @@ if ( ${ext.targetBeanName}.${ext.targetAccessorName}() != null ) {
|
|||||||
<#macro _assignmentLine>
|
<#macro _assignmentLine>
|
||||||
<@includeModel object=ext.targetType/> ${localVarName} = <@_assignment/>;
|
<@includeModel object=ext.targetType/> ${localVarName} = <@_assignment/>;
|
||||||
if ( ${localVarName} != null ) {
|
if ( ${localVarName} != null ) {
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}().<#if ext.targetType.collectionType>addAll<#else>putAll</#if>( ${localVarName} );
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}().<#if ext.targetType.collectionType>addAll<#else>putAll</#if>( ${localVarName} );
|
||||||
}
|
}
|
||||||
</#macro>
|
</#macro>
|
||||||
<#macro _assignment>
|
<#macro _assignment>
|
||||||
@ -49,4 +49,4 @@ if ( ${ext.targetBeanName}.${ext.targetAccessorName}() != null ) {
|
|||||||
targetReadAccessorName=ext.targetReadAccessorName
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
targetWriteAccessorName=ext.targetWriteAccessorName
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
targetType=ext.targetType/>
|
targetType=ext.targetType/>
|
||||||
</#macro>
|
</#macro>
|
||||||
|
@ -19,11 +19,11 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<#if (exceptionTypes?size == 0) >
|
<#if (exceptionTypes?size == 0) >
|
||||||
<#if !ext.isTargetDefined?? ><@includeModel object=ext.targetType/></#if> ${ext.targetAccessorName} = <@includeModel object=assignment targetType=ext.targetType raw=ext.raw/>;
|
<#if !ext.isTargetDefined?? ><@includeModel object=ext.targetType/></#if> ${ext.targetWriteAccessorName} = <@_assignment/>;
|
||||||
<#else>
|
<#else>
|
||||||
<#if !ext.isTargetDefined?? ><@includeModel object=ext.targetType/> ${ext.targetAccessorName};</#if>
|
<#if !ext.isTargetDefined?? ><@includeModel object=ext.targetType/> ${ext.targetWriteAccessorName};</#if>
|
||||||
try {
|
try {
|
||||||
${ext.targetAccessorName} = <@includeModel object=assignment targetType=ext.targetType raw=ext.raw/>;
|
${ext.targetWriteAccessorName} = <@_assignment/>;
|
||||||
}
|
}
|
||||||
<#list exceptionTypes as exceptionType>
|
<#list exceptionTypes as exceptionType>
|
||||||
catch ( <@includeModel object=exceptionType/> e ) {
|
catch ( <@includeModel object=exceptionType/> e ) {
|
||||||
@ -31,3 +31,12 @@
|
|||||||
}
|
}
|
||||||
</#list>
|
</#list>
|
||||||
</#if>
|
</#if>
|
||||||
|
<#macro _assignment>
|
||||||
|
<@includeModel object=assignment
|
||||||
|
targetBeanName=ext.targetBeanName
|
||||||
|
raw=ext.raw
|
||||||
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
|
targetType=ext.targetType/>
|
||||||
|
</#macro>
|
@ -24,5 +24,5 @@ new <#if ext.targetType.implementationType??>
|
|||||||
<#else>
|
<#else>
|
||||||
<@includeModel object=ext.targetType/>
|
<@includeModel object=ext.targetType/>
|
||||||
</#if>
|
</#if>
|
||||||
( <@includeModel object=assignment targetBeanName=ext.targetBeanName targetAccessorName=ext.targetAccessorName targetType=ext.targetType raw=ext.raw/> )
|
( <@includeModel object=assignment targetBeanName=ext.targetBeanName targetReadAccessorName=ext.targetReadAccessorName targetWriteAccessorName=ext.targetWriteAccessorName targetType=ext.targetType raw=ext.raw/> )
|
||||||
</@compress>
|
</@compress>
|
@ -23,6 +23,7 @@ if ( ${sourceReference} != null ) {
|
|||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName=ext.targetAccessorName
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
targetType=ext.targetType/>
|
targetType=ext.targetType/>
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,10 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<#if (exceptionTypes?size == 0) >
|
<#if (exceptionTypes?size == 0) >
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}( <@_assignment/> );
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}( <@_assignment/> );
|
||||||
<#else>
|
<#else>
|
||||||
try {
|
try {
|
||||||
${ext.targetBeanName}.${ext.targetAccessorName}( <@_assignment/> );
|
${ext.targetBeanName}.${ext.targetWriteAccessorName}( <@_assignment/> );
|
||||||
}
|
}
|
||||||
<#list exceptionTypes as exceptionType>
|
<#list exceptionTypes as exceptionType>
|
||||||
catch ( <@includeModel object=exceptionType/> e ) {
|
catch ( <@includeModel object=exceptionType/> e ) {
|
||||||
@ -31,5 +31,11 @@
|
|||||||
</#list>
|
</#list>
|
||||||
</#if>
|
</#if>
|
||||||
<#macro _assignment>
|
<#macro _assignment>
|
||||||
<@includeModel object=assignment raw=ext.raw targetType=ext.targetType/>
|
<@includeModel object=assignment
|
||||||
|
targetBeanName=ext.targetBeanName
|
||||||
|
raw=ext.raw
|
||||||
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
|
targetType=ext.targetType/>
|
||||||
</#macro>
|
</#macro>
|
@ -26,14 +26,16 @@
|
|||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName="${targetGetterName}().addAll"
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName="${targetGetterName}().addAll"
|
||||||
targetType=ext.targetType/>
|
targetType=ext.targetType/>
|
||||||
<#else>
|
<#else>
|
||||||
<@includeModel object=assignment
|
<@includeModel object=assignment
|
||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName="${targetGetterName}().putAll"
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName="${targetGetterName}().putAll"
|
||||||
targetType=ext.targetType/>
|
targetType=ext.targetType/>
|
||||||
</#if>
|
</#if>
|
||||||
}
|
}
|
||||||
@ -56,7 +58,8 @@
|
|||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName=ext.targetAccessorName
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
targetType=ext.targetType/>
|
targetType=ext.targetType/>
|
||||||
</#macro>
|
</#macro>
|
||||||
<#macro _newCollectionOrMapAssignment>
|
<#macro _newCollectionOrMapAssignment>
|
||||||
@ -64,6 +67,7 @@
|
|||||||
targetBeanName=ext.targetBeanName
|
targetBeanName=ext.targetBeanName
|
||||||
raw=ext.raw
|
raw=ext.raw
|
||||||
existingInstanceMapping=ext.existingInstanceMapping
|
existingInstanceMapping=ext.existingInstanceMapping
|
||||||
targetAccessorName=ext.targetAccessorName
|
targetReadAccessorName=ext.targetReadAccessorName
|
||||||
|
targetWriteAccessorName=ext.targetWriteAccessorName
|
||||||
targetType=ext.targetType/>
|
targetType=ext.targetType/>
|
||||||
</#macro>
|
</#macro>
|
Loading…
x
Reference in New Issue
Block a user