#523 fix type of assignment in GetterWrapperForCollectionsAndMaps

This commit is contained in:
Andreas Gudian 2015-03-30 20:50:38 +02:00
parent f7433466cd
commit a431581da8
7 changed files with 72 additions and 17 deletions

View File

@ -320,7 +320,7 @@ public class PropertyMapping extends ModelElement {
result = new GetterWrapperForCollectionsAndMaps(
result,
method.getThrownTypes(),
targetType,
ctx.getTypeFactory().asCollectionOrMap( targetType ),
existingVariableNames
);
}
@ -591,7 +591,7 @@ public class PropertyMapping extends ModelElement {
assignment = new GetterWrapperForCollectionsAndMaps(
assignment,
method.getThrownTypes(),
targetType,
ctx.getTypeFactory().asCollectionOrMap( targetType ),
existingVariableNames
);
}
@ -643,7 +643,7 @@ public class PropertyMapping extends ModelElement {
assignment = new GetterWrapperForCollectionsAndMaps(
assignment,
method.getThrownTypes(),
targetType,
ctx.getTypeFactory().asCollectionOrMap( targetType ),
existingVariableNames
);
}

View File

@ -23,6 +23,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.mapstruct.ap.model.common.Type;
import org.mapstruct.ap.util.Strings;
@ -42,16 +43,16 @@ import org.mapstruct.ap.util.Strings;
public class GetterWrapperForCollectionsAndMaps extends AssignmentWrapper {
private final List<Type> exceptionTypesToExclude;
private final Type targetType;
private final Type localVarType;
private final String localVarName;
public GetterWrapperForCollectionsAndMaps(Assignment decoratedAssignment, List<Type> exceptionTypesToExclude,
Type targetType, Collection<String> existingVariableNames ) {
Type localVarType, Collection<String> existingVariableNames) {
super( decoratedAssignment );
this.exceptionTypesToExclude = exceptionTypesToExclude;
this.targetType = targetType;
this.localVarName = Strings.getSaveVariableName( "target" + targetType.getName(), existingVariableNames );
this.localVarType = localVarType;
this.localVarName = Strings.getSaveVariableName( "target" + localVarType.getName(), existingVariableNames );
existingVariableNames.add( localVarName );
}
@ -73,10 +74,17 @@ public class GetterWrapperForCollectionsAndMaps extends AssignmentWrapper {
public Set<Type> getImportTypes() {
Set<Type> imported = new HashSet<Type>();
imported.addAll( super.getImportTypes() );
imported.add( targetType ); /* is a local var */
imported.add( localVarType ); /* is a local var */
return imported;
}
/**
* @return the targetType
*/
public Type getLocalVarType() {
return localVarType;
}
public String getLocalVarName() {
return localVarName;
}

View File

@ -451,4 +451,35 @@ public class TypeFactory {
return t;
}
}
/**
* Converts any collection type, e.g. List<T> to Collection<T> and any map type, e.g. HashMap<K,V> to Map<K,V>.
*
* @param collectionOrMap any collection or map type
* @return the type representing Collection<T> or Map<K,V>, if the argument type is a subtype of Collection<T> or of
* Map<K,V> respectively.
*/
public Type asCollectionOrMap(Type collectionOrMap) {
List<Type> originalParameters = collectionOrMap.getTypeParameters();
TypeMirror[] originalParameterMirrors = new TypeMirror[originalParameters.size()];
int i = 0;
for ( Type param : originalParameters ) {
originalParameterMirrors[i++] = param.getTypeMirror();
}
if ( collectionOrMap.isCollectionType()
&& !"java.util.Collection".equals( collectionOrMap.getFullyQualifiedName() ) ) {
return getType( typeUtils.getDeclaredType(
elementUtils.getTypeElement( "java.util.Collection" ),
originalParameterMirrors ) );
}
else if ( collectionOrMap.isMapType()
&& !"java.util.Map".equals( collectionOrMap.getFullyQualifiedName() ) ) {
return getType( typeUtils.getDeclaredType(
elementUtils.getTypeElement( "java.util.Map" ),
originalParameterMirrors ) );
}
return collectionOrMap;
}
}

View File

@ -36,7 +36,7 @@ if ( ${ext.targetBeanName}.${ext.targetWriteAccessorName}() != null ) {
</#if>
}
<#macro _assignmentLine>
<@includeModel object=ext.targetType/> ${localVarName} = <@_assignment/>;
<@includeModel object=localVarType/> ${localVarName} = <@_assignment/>;
if ( ${localVarName} != null ) {
${ext.targetBeanName}.${ext.targetWriteAccessorName}().<#if ext.targetType.collectionType>addAll<#else>putAll</#if>( ${localVarName} );
}

View File

@ -50,6 +50,8 @@ public class Source {
private List<String> stringList2;
private Set<String> stringSet2;
public List<String> getStringList() {
return stringList;
}
@ -154,4 +156,12 @@ public class Source {
this.otherStringLongMap = otherStringLongMap;
}
public Set<String> getStringSet2() {
return stringSet2;
}
public void setStringSet2(Set<String> stringSet2) {
this.stringSet2 = stringSet2;
}
}

View File

@ -20,11 +20,12 @@ package org.mapstruct.ap.test.collection;
import java.util.Set;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Mappings;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.factory.Mappers;
@Mapper
@ -36,19 +37,15 @@ public interface SourceTargetMapper {
@Mapping(source = "integerList", target = "integerCollection"),
@Mapping(source = "integerSet", target = "set"),
@Mapping(source = "anotherIntegerSet", target = "anotherStringSet"),
@Mapping(source = "stringList2", target = "stringListNoSetter")
@Mapping(source = "stringList2", target = "stringListNoSetter"),
@Mapping(source = "stringSet2", target = "stringListNoSetter2")
})
Target sourceToTarget(Source source);
@InheritInverseConfiguration( name = "sourceToTarget" )
Source targetToSource(Target target);
@Mappings({
@Mapping(source = "integerList", target = "integerCollection"),
@Mapping(source = "integerSet", target = "set"),
@Mapping(source = "anotherIntegerSet", target = "anotherStringSet"),
@Mapping(source = "stringList2", target = "stringListNoSetter")
})
@InheritConfiguration
Target sourceToTargetTwoArg(Source source, @MappingTarget Target target);
Set<String> integerSetToStringSet(Set<Integer> integers);

View File

@ -50,6 +50,8 @@ public class Target {
private List<String> stringListNoSetter;
private List<String> stringListNoSetter2;
@SuppressWarnings("rawtypes")
private Set set;
@ -149,6 +151,13 @@ public class Target {
return stringListNoSetter;
}
public List<String> getStringListNoSetter2() {
if ( stringListNoSetter2 == null ) {
stringListNoSetter2 = new ArrayList<String>();
}
return stringListNoSetter2;
}
public Map<String, Long> getOtherStringLongMap() {
return otherStringLongMap;
}