#92 Making generated code more null-safe and avoiding unnecessary collection instantiation

This commit is contained in:
Gunnar Morling 2014-01-21 00:13:10 +01:00
parent 8dd505b63e
commit d7864e0566
2 changed files with 21 additions and 12 deletions

View File

@ -39,7 +39,7 @@ public class PropertyMapping extends AbstractModelElement {
private final String targetName;
private final String targetAccessorName;
private final Type targetType;
private final boolean isHasTargetSetter;
private final boolean isTargetAccessorSetter;
private final MappingMethodReference mappingMethod;
private final TypeConversion conversion;
@ -56,7 +56,7 @@ public class PropertyMapping extends AbstractModelElement {
this.targetName = targetName;
this.targetAccessorName = targetAccessorName;
this.targetType = targetType;
this.isHasTargetSetter = targetAccessorName.startsWith( "set" );
this.isTargetAccessorSetter = targetAccessorName.startsWith( "set" );
this.mappingMethod = mappingMethod;
this.conversion = conversion;
@ -98,8 +98,15 @@ public class PropertyMapping extends AbstractModelElement {
return conversion;
}
public boolean isHasTargetSetter() {
return isHasTargetSetter;
/**
* Whether the target accessor is a setter method or not. The only case where it is not a setter but a getter is a
* collection-typed property without a getter, to which elements are set by adding the source elements to the
* collection retrieved via the getter.
*
* @return {@code true} if the target accessor is a setter, {@code false} otherwise
*/
public boolean isTargetAccessorSetter() {
return isTargetAccessorSetter;
}
@Override

View File

@ -20,11 +20,11 @@
-->
<#-- a) invoke mapping method -->
<#if mappingMethod??>
<#if hasTargetSetter>
<#if targetAccessorSetter>
${ext.targetBeanName}.${targetAccessorName}( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> );
<#else>
if ( ${sourceBeanName}.${sourceAccessorName}() != null ) {
${ext.targetBeanName}.${targetAccessorName}().addAll( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> );
<#elseif targetType.collectionType>
if ( ${sourceBeanName}.${sourceAccessorName}() != null && ${ext.targetBeanName}.${targetAccessorName}() != null ) {
${ext.targetBeanName}.${targetAccessorName}().addAll( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> );
}
</#if>
<#-- b) simple conversion -->
@ -39,13 +39,15 @@ if ( ${sourceBeanName}.${sourceAccessorName}() != null ) {
<#-- c) simply set -->
<#else>
<#if targetType.collectionType || targetType.mapType>
<#if targetAccessorSetter>
if ( ${sourceBeanName}.${sourceAccessorName}() != null ) {
<#if hasTargetSetter>
${ext.targetBeanName}.${targetAccessorName}( new <#if targetType.implementationType??><@includeModel object=targetType.implementationType/><#else><@includeModel object=targetType/></#if>( ${sourceBeanName}.${sourceAccessorName}() ) );
<#else>
${ext.targetBeanName}.${targetAccessorName}().addAll( new <#if targetType.implementationType??><@includeModel object=targetType.implementationType/><#else><@includeModel object=targetType/></#if>( ${sourceBeanName}.${sourceAccessorName}() ) );
</#if>
}
<#else>
if ( ${sourceBeanName}.${sourceAccessorName}() != null && ${ext.targetBeanName}.${targetAccessorName}() != null ) {
${ext.targetBeanName}.${targetAccessorName}().addAll( ${sourceBeanName}.${sourceAccessorName}() );
}
</#if>
<#else>
${ext.targetBeanName}.${targetAccessorName}( ${sourceBeanName}.${sourceAccessorName}() );
</#if>