From 9c17909fd6312bb8510e8d99efa557cc111bbcee Mon Sep 17 00:00:00 2001 From: sjaakd Date: Sat, 22 Mar 2014 13:26:29 +0100 Subject: [PATCH] #157 renaming ParameterAssignment in the more suitable TargetAssignment, creating package creation in processor for creation helpers, refactor MappingResolver --- .../ap/model/IterableMappingMethod.java | 6 +- .../mapstruct/ap/model/MapMappingMethod.java | 10 +-- .../mapstruct/ap/model/PropertyMapping.java | 22 ++--- ...rAssignment.java => TargetAssignment.java} | 10 +-- .../ap/processor/MapperCreationProcessor.java | 13 +-- .../{ => creation}/MappingResolver.java | 85 ++++++++++--------- .../ap/processor/creation/package-info.java | 24 ++++++ ...org.mapstruct.ap.model.PropertyMapping.ftl | 6 +- ...g.mapstruct.ap.model.TargetAssignment.ftl} | 0 9 files changed, 103 insertions(+), 73 deletions(-) rename processor/src/main/java/org/mapstruct/ap/model/{ParameterAssignment.java => TargetAssignment.java} (92%) rename processor/src/main/java/org/mapstruct/ap/processor/{ => creation}/MappingResolver.java (79%) create mode 100644 processor/src/main/java/org/mapstruct/ap/processor/creation/package-info.java rename processor/src/main/resources/{org.mapstruct.ap.model.ParameterAssignment.ftl => org.mapstruct.ap.model.TargetAssignment.ftl} (100%) diff --git a/processor/src/main/java/org/mapstruct/ap/model/IterableMappingMethod.java b/processor/src/main/java/org/mapstruct/ap/model/IterableMappingMethod.java index 3e8277ab5..0d40f8dd6 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/IterableMappingMethod.java +++ b/processor/src/main/java/org/mapstruct/ap/model/IterableMappingMethod.java @@ -33,10 +33,10 @@ import org.mapstruct.ap.util.Strings; */ public class IterableMappingMethod extends MappingMethod { - private final ParameterAssignment elementAssignment; + private final TargetAssignment elementAssignment; private final MethodReference factoryMethod; - public IterableMappingMethod(SourceMethod method, ParameterAssignment parameterAssignment, + public IterableMappingMethod(SourceMethod method, TargetAssignment parameterAssignment, MethodReference factoryMethod) { super( method ); this.elementAssignment = parameterAssignment; @@ -53,7 +53,7 @@ public class IterableMappingMethod extends MappingMethod { throw new IllegalStateException( "Method " + this + " has no source parameter." ); } - public ParameterAssignment getElementAssignment() { + public TargetAssignment getElementAssignment() { return elementAssignment; } diff --git a/processor/src/main/java/org/mapstruct/ap/model/MapMappingMethod.java b/processor/src/main/java/org/mapstruct/ap/model/MapMappingMethod.java index a314c30dc..a9d7abffc 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/MapMappingMethod.java +++ b/processor/src/main/java/org/mapstruct/ap/model/MapMappingMethod.java @@ -33,11 +33,11 @@ import org.mapstruct.ap.util.Strings; */ public class MapMappingMethod extends MappingMethod { - private final ParameterAssignment keyAssignment; - private final ParameterAssignment valueAssignment; + private final TargetAssignment keyAssignment; + private final TargetAssignment valueAssignment; private final MethodReference factoryMethod; - public MapMappingMethod(SourceMethod method, ParameterAssignment keyAssignment, ParameterAssignment valueAssignment, + public MapMappingMethod(SourceMethod method, TargetAssignment keyAssignment, TargetAssignment valueAssignment, MethodReference factoryMethod) { super( method ); @@ -56,11 +56,11 @@ public class MapMappingMethod extends MappingMethod { throw new IllegalStateException( "Method " + this + " has no source parameter." ); } - public ParameterAssignment getKeyAssignment() { + public TargetAssignment getKeyAssignment() { return keyAssignment; } - public ParameterAssignment getValueAssignment() { + public TargetAssignment getValueAssignment() { return valueAssignment; } diff --git a/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java b/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java index 6f61c6403..7ff33ed1f 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java +++ b/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java @@ -23,7 +23,7 @@ import java.util.Set; import org.mapstruct.ap.model.common.ModelElement; import org.mapstruct.ap.model.common.Type; -import org.mapstruct.ap.model.ParameterAssignment.AssignmentType; +import org.mapstruct.ap.model.TargetAssignment.AssignmentType; /** * Represents the mapping between a source and target property, e.g. from * {@code String Source#foo} to {@code int Target#bar}. Name and type of source @@ -45,12 +45,12 @@ public class PropertyMapping extends ModelElement { private final boolean isTargetAccessorSetter; private final String targetReadAccessorName; - private final ParameterAssignment parameterAssignment; + private final TargetAssignment propertyAssignment; public PropertyMapping(String sourceBeanName, String sourceName, String sourceAccessorName, Type sourceType, String targetName, String targetAccessorName, Type targetType, - ParameterAssignment parameterAssignment ) { + TargetAssignment propertyAssignment ) { this.sourceBeanName = sourceBeanName; this.sourceName = sourceName; @@ -64,7 +64,7 @@ public class PropertyMapping extends ModelElement { this.targetReadAccessorName = this.isTargetAccessorSetter ? "get" + targetAccessorName.substring( 3 ) : targetAccessorName; - this.parameterAssignment = parameterAssignment; + this.propertyAssignment = propertyAssignment; } public String getSourceBeanName() { @@ -95,8 +95,8 @@ public class PropertyMapping extends ModelElement { return targetType; } - public ParameterAssignment getParameterAssignment() { - return parameterAssignment; + public TargetAssignment getPropertyAssignment() { + return propertyAssignment; } /** @@ -120,15 +120,15 @@ public class PropertyMapping extends ModelElement { @Override public Set getImportTypes() { Set importTypes = new HashSet(); - if ( parameterAssignment != null ) { + if ( propertyAssignment != null ) { if ( isTargetAccessorSetter() - && parameterAssignment.getAssignmentType().equals( AssignmentType.ASSIGNMENT ) + && propertyAssignment.getAssignmentType().equals( AssignmentType.ASSIGNMENT ) && ( targetType.isCollectionType() || targetType.isMapType() ) ) { importTypes.addAll( targetType.getImportTypes() ); } - if ( !parameterAssignment.getAssignmentType().equals( AssignmentType.ASSIGNMENT ) ) { - importTypes.addAll( parameterAssignment.getImportTypes() ); + if ( !propertyAssignment.getAssignmentType().equals( AssignmentType.ASSIGNMENT ) ) { + importTypes.addAll( propertyAssignment.getImportTypes() ); } } return importTypes; @@ -141,7 +141,7 @@ public class PropertyMapping extends ModelElement { "\n sourceType=" + sourceType + "," + "\n targetName='" + targetAccessorName + "\'," + "\n targetType=" + targetType + "," + - "\n parameterAssignment=" + parameterAssignment + + "\n propertyAssignment=" + propertyAssignment + "\n}"; } } diff --git a/processor/src/main/java/org/mapstruct/ap/model/ParameterAssignment.java b/processor/src/main/java/org/mapstruct/ap/model/TargetAssignment.java similarity index 92% rename from processor/src/main/java/org/mapstruct/ap/model/ParameterAssignment.java rename to processor/src/main/java/org/mapstruct/ap/model/TargetAssignment.java index 4d50011af..98f4bfece 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/ParameterAssignment.java +++ b/processor/src/main/java/org/mapstruct/ap/model/TargetAssignment.java @@ -32,12 +32,12 @@ import org.mapstruct.ap.model.common.Type; *
    *
  1. MethodReference
  2. *
  3. TypeConversion
  4. - *
  5. Simple Assignment (empty ParameterAssignment)
  6. + *
  7. Simple Assignment (empty TargetAssignment)
  8. *
* * @author Sjaak Derksen */ -public class ParameterAssignment extends ModelElement { +public class TargetAssignment extends ModelElement { @@ -48,16 +48,16 @@ public class ParameterAssignment extends ModelElement { private final AssignmentType assignmentType; - public ParameterAssignment() { + public TargetAssignment() { assignmentType = AssignmentType.ASSIGNMENT; } - public ParameterAssignment( MethodReference methodReference ) { + public TargetAssignment( MethodReference methodReference ) { assignmentType = AssignmentType.METHOD_REFERENCE; this.methodReference = methodReference; } - public ParameterAssignment( TypeConversion typeConversion ) { + public TargetAssignment( TypeConversion typeConversion ) { assignmentType = AssignmentType.TYPE_CONVERSION; this.typeConversion = typeConversion; } diff --git a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java index a2886e17a..ec1204f2f 100644 --- a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java @@ -18,7 +18,8 @@ */ package org.mapstruct.ap.processor; -import org.mapstruct.ap.model.ParameterAssignment; +import org.mapstruct.ap.processor.creation.MappingResolver; +import org.mapstruct.ap.model.TargetAssignment; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; @@ -642,7 +643,7 @@ public class MapperCreationProcessor implements ModelElementProcessor *
  • MethodReference
  • *
  • TypeConversion
  • - *
  • Simple Assignment (empty ParameterAssignment)
  • + *
  • Simple Assignment (empty TargetAssignment)
  • *
  • null, no assignment found
  • * */ - public ParameterAssignment getParameterAssignment( SourceMethod mappingMethod, + public TargetAssignment getTargetAssignment( SourceMethod mappingMethod, String mappedElement, List mapperReferences, List methods, @@ -121,7 +121,7 @@ public class MappingResolver { String dateFormat, String sourceReference ) { - MethodReference mappingMethodReference = getMappingMethodReferenceBasedOnMethod( + MethodReference mappingMethodReference = resolveViaMethod( mappingMethod, mappedElement, mapperReferences, @@ -132,21 +132,21 @@ public class MappingResolver { dateFormat ); - ParameterAssignment parameterAssignment = null; + TargetAssignment assignment = null; if (mappingMethodReference != null ) { - parameterAssignment = new ParameterAssignment(mappingMethodReference ); + assignment = new TargetAssignment(mappingMethodReference ); } else if (sourceType.isAssignableTo( targetType ) ) { - parameterAssignment = new ParameterAssignment(); + assignment = new TargetAssignment(); } else { - TypeConversion conversion = getConversion( sourceType, targetType, dateFormat, sourceReference ); + TypeConversion conversion = resolveViaConversion( sourceType, targetType, dateFormat, sourceReference ); if ( conversion != null ) { - parameterAssignment = new ParameterAssignment(conversion ); + assignment = new TargetAssignment(conversion ); } else { - mappingMethodReference = getMappingMethodReferenceBasedOnParameter( + mappingMethodReference = resolveViaMethodAndMethod( mappingMethod, mappedElement, mapperReferences, @@ -157,15 +157,18 @@ public class MappingResolver { dateFormat ); if ( mappingMethodReference != null ) { - parameterAssignment = new ParameterAssignment( mappingMethodReference ); + assignment = new TargetAssignment( mappingMethodReference ); } } } - return parameterAssignment; + return assignment; } - private TypeConversion getConversion(Type sourceType, Type targetType, String dateFormat, String sourceReference) { + private TypeConversion resolveViaConversion( Type sourceType, + Type targetType, + String dateFormat, + String sourceReference ) { ConversionProvider conversionProvider = conversions.getConversion( sourceType, targetType ); if ( conversionProvider == null ) { @@ -192,14 +195,15 @@ public class MappingResolver { * * @return a method reference. */ - private MethodReference getMappingMethodReferenceBasedOnMethod(SourceMethod mappingMethod, - String mappedElement, - List mapperReferences, - List methods, - Type sourceType, - Type targetType, - String targetPropertyName, - String dateFormat) { + private MethodReference resolveViaMethod( SourceMethod mappingMethod, + String mappedElement, + List mapperReferences, + List methods, + Type sourceType, + Type targetType, + String targetPropertyName, + String dateFormat ) { + // first try to find a matching source method SourceMethod matchingSourceMethod = getBestMatch( mappingMethod, @@ -249,14 +253,14 @@ public class MappingResolver { * * @return a method reference. */ - private MethodReference getMappingMethodReferenceBasedOnParameter(SourceMethod mappingMethod, - String mappedElement, - List mapperReferences, - List methods, - Type sourceType, - Type targetType, - String targetPropertyName, - String dateFormat) { + private MethodReference resolveViaMethodAndMethod( SourceMethod mappingMethod, + String mappedElement, + List mapperReferences, + List methods, + Type sourceType, + Type targetType, + String targetPropertyName, + String dateFormat ) { List methodYCandidates = new ArrayList( methods ); methodYCandidates.addAll( builtInMethods.getBuiltInMethods() ); @@ -272,7 +276,7 @@ public class MappingResolver { // a nested method call can be called. so C = methodY( methodX (A) ) for ( Method methodYCandidate : methodYCandidates ) { if ( methodYCandidate.getSourceParameters().size() == 1 ) { - methodRefY = getMappingMethodReferenceBasedOnMethod( + methodRefY = resolveViaMethod( mappingMethod, mappedElement, mapperReferences, @@ -283,7 +287,7 @@ public class MappingResolver { dateFormat ); if ( methodRefY != null ) { - MethodReference methodRefX = getMappingMethodReferenceBasedOnMethod( + MethodReference methodRefX = resolveViaMethod( mappingMethod, mappedElement, mapperReferences, @@ -307,12 +311,12 @@ public class MappingResolver { return methodRefY; } - private T getBestMatch(SourceMethod mappingMethod, - String mappedElement, - List methods, - Type sourceType, - Type returnType, - String targetPropertyName) { + private T getBestMatch( SourceMethod mappingMethod, + String mappedElement, + List methods, + Type sourceType, + Type returnType, + String targetPropertyName ) { List candidates = methodSelectors.getMatchingMethods( mappingMethod, @@ -349,8 +353,9 @@ public class MappingResolver { } - private MethodReference getMappingMethodReference(SourceMethod method, List mapperReferences, - Type targetType) { + private MethodReference getMappingMethodReference( SourceMethod method, + List mapperReferences, + Type targetType ) { MapperReference mapperReference = findMapperReference( mapperReferences, method ); return new MethodReference( diff --git a/processor/src/main/java/org/mapstruct/ap/processor/creation/package-info.java b/processor/src/main/java/org/mapstruct/ap/processor/creation/package-info.java new file mode 100644 index 000000000..b58fd3308 --- /dev/null +++ b/processor/src/main/java/org/mapstruct/ap/processor/creation/package-info.java @@ -0,0 +1,24 @@ +/** + * Copyright 2012-2014 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. + */ +/** + *

    + * Contains all helper classes for the {@link org.mapstruct.ap.processor.MapperCreationProcessor} + *

    + */ +package org.mapstruct.ap.processor.creation; diff --git a/processor/src/main/resources/org.mapstruct.ap.model.PropertyMapping.ftl b/processor/src/main/resources/org.mapstruct.ap.model.PropertyMapping.ftl index 258432fad..5c2e30f8b 100644 --- a/processor/src/main/resources/org.mapstruct.ap.model.PropertyMapping.ftl +++ b/processor/src/main/resources/org.mapstruct.ap.model.PropertyMapping.ftl @@ -20,7 +20,7 @@ --> <#if !( targetType.collectionType || targetType.mapType ) > <#-- non collections or maps --> - <#if ( !sourceType.primitive && parameterAssignment.assignmentType!="ASSIGNMENT" ) > + <#if ( !sourceType.primitive && propertyAssignment.assignmentType!="ASSIGNMENT" ) > if ( ${sourceBeanName}.${sourceAccessorName}() != null ) { <@assignmentLine/> } @@ -57,7 +57,7 @@ target="${ext.targetBeanName}.${targetAccessorName}" source="${sourceBeanName}.${sourceAccessorName}"> <#compress> - <#if parameterAssignment?? && parameterAssignment.assignmentType!="ASSIGNMENT"> + <#if propertyAssignment?? && propertyAssignment.assignmentType!="ASSIGNMENT"> <@assignmentLine target source/> <#else> ${target}( new <#if targetType.implementationType??><@includeModel object=targetType.implementationType/><#else><@includeModel object=targetType/>( ${source}() ) ); @@ -68,5 +68,5 @@ <#macro assignmentLine target="${ext.targetBeanName}.${targetAccessorName}" source="${sourceBeanName}.${sourceAccessorName}"> - <@includeModel object=parameterAssignment target=target source="${source}()" targetType=targetType raw=true/> + <@includeModel object=propertyAssignment target=target source="${source}()" targetType=targetType raw=true/> diff --git a/processor/src/main/resources/org.mapstruct.ap.model.ParameterAssignment.ftl b/processor/src/main/resources/org.mapstruct.ap.model.TargetAssignment.ftl similarity index 100% rename from processor/src/main/resources/org.mapstruct.ap.model.ParameterAssignment.ftl rename to processor/src/main/resources/org.mapstruct.ap.model.TargetAssignment.ftl