#19 Adding template for Parameter, simplifying PropertyMapping by passing source and target bean via template

This commit is contained in:
Gunnar Morling 2013-07-21 11:59:02 +02:00
parent a931cff0e5
commit 9e5fc2af8e
12 changed files with 49 additions and 42 deletions

View File

@ -25,7 +25,6 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import org.mapstruct.ap.model.source.Method; import org.mapstruct.ap.model.source.Method;
import org.mapstruct.ap.model.source.Parameter;
import org.mapstruct.ap.util.Strings; import org.mapstruct.ap.util.Strings;
/** /**

View File

@ -16,16 +16,18 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.model.source; package org.mapstruct.ap.model;
import org.mapstruct.ap.model.Type; import java.util.Set;
import org.mapstruct.ap.util.Collections;
/** /**
* A parameter of a mapping method. * A parameter of a mapping method.
* *
* @author Gunnar Morling * @author Gunnar Morling
*/ */
public class Parameter { public class Parameter extends AbstractModelElement {
private final String name; private final String name;
private final Type type; private final Type type;
@ -57,4 +59,9 @@ public class Parameter {
public String toString() { public String toString() {
return ( mappingTarget ? "@MappingTarget " : "" ) + type.toString() + " " + name; return ( mappingTarget ? "@MappingTarget " : "" ) + type.toString() + " " + name;
} }
@Override
public Set<Type> getImportTypes() {
return Collections.asSet( type );
}
} }

View File

@ -31,9 +31,6 @@ import java.util.Set;
*/ */
public class PropertyMapping extends AbstractModelElement { public class PropertyMapping extends AbstractModelElement {
private final String sourceBeanName;
private final String targetBeanName;
private final String sourceName; private final String sourceName;
private final String sourceAccessorName; private final String sourceAccessorName;
private final Type sourceType; private final Type sourceType;
@ -45,11 +42,9 @@ public class PropertyMapping extends AbstractModelElement {
private final MappingMethodReference mappingMethod; private final MappingMethodReference mappingMethod;
private final TypeConversion conversion; private final TypeConversion conversion;
public PropertyMapping(String sourceBeanName, String targetBeanName, String sourceName, String sourceAccessorName, public PropertyMapping(String sourceName, String sourceAccessorName, Type sourceType, String targetName,
Type sourceType, String targetName, String targetAccessorName, Type targetType, String targetAccessorName, Type targetType, MappingMethodReference mappingMethod,
MappingMethodReference mappingMethod, TypeConversion conversion) { TypeConversion conversion) {
this.sourceBeanName = sourceBeanName;
this.targetBeanName = targetBeanName;
this.sourceName = sourceName; this.sourceName = sourceName;
this.sourceAccessorName = sourceAccessorName; this.sourceAccessorName = sourceAccessorName;
@ -63,14 +58,6 @@ public class PropertyMapping extends AbstractModelElement {
this.conversion = conversion; this.conversion = conversion;
} }
public String getSourceBeanName() {
return sourceBeanName;
}
public String getTargetBeanName() {
return targetBeanName;
}
public String getSourceName() { public String getSourceName() {
return sourceName; return sourceName;
} }

View File

@ -18,13 +18,13 @@
*/ */
package org.mapstruct.ap.model.source; package org.mapstruct.ap.model.source;
import java.beans.Introspector;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
import org.mapstruct.ap.model.Parameter;
import org.mapstruct.ap.model.Type; import org.mapstruct.ap.model.Type;
import org.mapstruct.ap.util.Strings; import org.mapstruct.ap.util.Strings;
@ -145,11 +145,6 @@ public class Method {
return parameterNames; return parameterNames;
} }
public String getResultName() {
return targetParameter != null ? targetParameter.getName() :
Strings.getSaveVariableName( Introspector.decapitalize( getResultType().getName() ), getParameterNames() );
}
public Type getResultType() { public Type getResultType() {
return targetParameter != null ? targetParameter.getType() : returnType; return targetParameter != null ? targetParameter.getType() : returnType;
} }

View File

@ -48,13 +48,13 @@ import org.mapstruct.ap.model.MapperReference;
import org.mapstruct.ap.model.MappingMethod; import org.mapstruct.ap.model.MappingMethod;
import org.mapstruct.ap.model.MappingMethodReference; import org.mapstruct.ap.model.MappingMethodReference;
import org.mapstruct.ap.model.Options; import org.mapstruct.ap.model.Options;
import org.mapstruct.ap.model.Parameter;
import org.mapstruct.ap.model.PropertyMapping; import org.mapstruct.ap.model.PropertyMapping;
import org.mapstruct.ap.model.ReportingPolicy; import org.mapstruct.ap.model.ReportingPolicy;
import org.mapstruct.ap.model.Type; import org.mapstruct.ap.model.Type;
import org.mapstruct.ap.model.TypeConversion; import org.mapstruct.ap.model.TypeConversion;
import org.mapstruct.ap.model.source.Mapping; import org.mapstruct.ap.model.source.Mapping;
import org.mapstruct.ap.model.source.Method; import org.mapstruct.ap.model.source.Method;
import org.mapstruct.ap.model.source.Parameter;
import org.mapstruct.ap.util.Executables; import org.mapstruct.ap.util.Executables;
import org.mapstruct.ap.util.Filters; import org.mapstruct.ap.util.Filters;
import org.mapstruct.ap.util.Strings; import org.mapstruct.ap.util.Strings;
@ -334,8 +334,6 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Metho
); );
PropertyMapping property = new PropertyMapping( PropertyMapping property = new PropertyMapping(
method.getSingleSourceParameter().getName(),
method.getResultName(),
executables.getPropertyName( getterMethod ), executables.getPropertyName( getterMethod ),
getterMethod.getSimpleName().toString(), getterMethod.getSimpleName().toString(),
sourceType, sourceType,

View File

@ -35,12 +35,12 @@ import org.mapstruct.ap.MapMappingPrism;
import org.mapstruct.ap.MapperPrism; import org.mapstruct.ap.MapperPrism;
import org.mapstruct.ap.MappingPrism; import org.mapstruct.ap.MappingPrism;
import org.mapstruct.ap.MappingsPrism; import org.mapstruct.ap.MappingsPrism;
import org.mapstruct.ap.model.Parameter;
import org.mapstruct.ap.model.Type; import org.mapstruct.ap.model.Type;
import org.mapstruct.ap.model.source.IterableMapping; import org.mapstruct.ap.model.source.IterableMapping;
import org.mapstruct.ap.model.source.MapMapping; import org.mapstruct.ap.model.source.MapMapping;
import org.mapstruct.ap.model.source.Mapping; import org.mapstruct.ap.model.source.Mapping;
import org.mapstruct.ap.model.source.Method; import org.mapstruct.ap.model.source.Method;
import org.mapstruct.ap.model.source.Parameter;
import org.mapstruct.ap.util.Executables; import org.mapstruct.ap.util.Executables;
import org.mapstruct.ap.util.TypeUtil; import org.mapstruct.ap.util.TypeUtil;

View File

@ -29,8 +29,8 @@ import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeKind;
import org.mapstruct.ap.MappingTargetPrism; import org.mapstruct.ap.MappingTargetPrism;
import org.mapstruct.ap.model.Parameter;
import org.mapstruct.ap.model.Type; import org.mapstruct.ap.model.Type;
import org.mapstruct.ap.model.source.Parameter;
/** /**
* Provides functionality around {@link ExecutableElement}s. * Provides functionality around {@link ExecutableElement}s.

View File

@ -19,7 +19,7 @@
--> -->
@Override @Override
public ${returnType.name} ${name}(<#list parameters as param>${param.type.name} ${param.name}<#if param_has_next>, </#if></#list>) { public ${returnType.name} ${name}(<#list parameters as param><@includeModel object=param/><#if param_has_next>, </#if></#list>) {
if ( ${singleSourceParameter.name} == null ) { if ( ${singleSourceParameter.name} == null ) {
return<#if returnType.name != "void"> null</#if>; return<#if returnType.name != "void"> null</#if>;
} }
@ -29,7 +29,7 @@
</#if> </#if>
<#list propertyMappings as propertyMapping> <#list propertyMappings as propertyMapping>
<@includeModel object=propertyMapping/> <@includeModel object=propertyMapping sourceBeanName=singleSourceParameter.name targetBeanName=resultName/>
</#list> </#list>
<#if returnType.name != "void"> <#if returnType.name != "void">

View File

@ -19,7 +19,7 @@
--> -->
@Override @Override
public <@includeModel object=returnType/> ${name}(<#list parameters as param><@includeModel object=param.type/> ${param.name}<#if param_has_next>, </#if></#list>) { public <@includeModel object=returnType/> ${name}(<#list parameters as param><@includeModel object=param/><#if param_has_next>, </#if></#list>) {
if ( ${singleSourceParameter.name} == null ) { if ( ${singleSourceParameter.name} == null ) {
return<#if returnType.name != "void"> null</#if>; return<#if returnType.name != "void"> null</#if>;
} }

View File

@ -19,7 +19,7 @@
--> -->
@Override @Override
public <@includeModel object=returnType /> ${name}(<#list parameters as param><@includeModel object=param.type/> ${param.name}<#if param_has_next>, </#if></#list>) { public <@includeModel object=returnType /> ${name}(<#list parameters as param><@includeModel object=param/><#if param_has_next>, </#if></#list>) {
if ( ${singleSourceParameter.name} == null ) { if ( ${singleSourceParameter.name} == null ) {
return<#if returnType.name != "void"> null</#if>; return<#if returnType.name != "void"> null</#if>;
} }

View File

@ -0,0 +1,21 @@
<#--
Copyright 2012-2013 Gunnar Morling (http://www.gunnarmorling.de/)
and/or other contributors as indicated by the @authors tag. See the
copyright.txt file in the distribution for a full listing of all
contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
${type} ${name}

View File

@ -20,24 +20,24 @@
--> -->
<#-- a) invoke mapping method --> <#-- a) invoke mapping method -->
<#if mappingMethod??> <#if mappingMethod??>
${targetBeanName}.${targetAccessorName}( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> ); ${ext.targetBeanName}.${targetAccessorName}( <@includeModel object=mappingMethod input="${ext.sourceBeanName}.${sourceAccessorName}()"/> );
<#-- b) simple conversion --> <#-- b) simple conversion -->
<#elseif conversion??> <#elseif conversion??>
<#if sourceType.primitive == false> <#if sourceType.primitive == false>
if ( ${sourceBeanName}.${sourceAccessorName}() != null ) { if ( ${ext.sourceBeanName}.${sourceAccessorName}() != null ) {
<@applyConversion targetBeanName=targetBeanName targetAccessorName=targetAccessorName conversion=conversion/> <@applyConversion targetBeanName=ext.targetBeanName targetAccessorName=targetAccessorName conversion=conversion/>
} }
<#else> <#else>
<@applyConversion targetBeanName=targetBeanName targetAccessorName=targetAccessorName conversion=conversion/> <@applyConversion targetBeanName=ext.targetBeanName targetAccessorName=targetAccessorName conversion=conversion/>
</#if> </#if>
<#-- c) simply set --> <#-- c) simply set -->
<#else> <#else>
<#if targetType.collectionType == true> <#if targetType.collectionType == true>
if ( ${sourceBeanName}.${sourceAccessorName}() != null ) { if ( ${ext.sourceBeanName}.${sourceAccessorName}() != null ) {
${targetBeanName}.${targetAccessorName}( new <#if targetType.collectionImplementationType??>${targetType.collectionImplementationType.name}<#else>${targetType.name}</#if><#if targetType.elementType??><${targetType.elementType.name}></#if>( ${sourceBeanName}.${sourceAccessorName}() ) ); ${ext.targetBeanName}.${targetAccessorName}( new <#if targetType.collectionImplementationType??>${targetType.collectionImplementationType.name}<#else>${targetType.name}</#if><#if targetType.elementType??><${targetType.elementType.name}></#if>( ${ext.sourceBeanName}.${sourceAccessorName}() ) );
} }
<#else> <#else>
${targetBeanName}.${targetAccessorName}( ${sourceBeanName}.${sourceAccessorName}() ); ${ext.targetBeanName}.${targetAccessorName}( ${ext.sourceBeanName}.${sourceAccessorName}() );
</#if> </#if>
</#if> </#if>
<#macro applyConversion targetBeanName targetAccessorName conversion> <#macro applyConversion targetBeanName targetAccessorName conversion>