mirror of
https://github.com/mapstruct/mapstruct.git
synced 2025-07-12 00:00:08 +08:00
#17 Mapping attributes inherited from super types (from Andreas)
This commit is contained in:
parent
5046eda92e
commit
9318adf7b7
@ -435,12 +435,23 @@ public class MapperGenerationVisitor extends ElementKindVisitor6<Void, Void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private List<MappedProperty> getMappedProperties(ExecutableElement method, Map<String, Mapping> mappings) {
|
private List<MappedProperty> getMappedProperties(ExecutableElement method, Map<String, Mapping> mappings) {
|
||||||
Element returnTypeElement = typeUtils.asElement( method.getReturnType() );
|
TypeElement returnTypeElement = (TypeElement) typeUtils.asElement( method.getReturnType() );
|
||||||
Element parameterElement = typeUtils.asElement( method.getParameters().get( 0 ).asType() );
|
TypeElement parameterElement = (TypeElement) typeUtils.asElement( method.getParameters().get( 0 ).asType() );
|
||||||
|
|
||||||
List<MappedProperty> properties = new ArrayList<MappedProperty>();
|
List<MappedProperty> properties = new ArrayList<MappedProperty>();
|
||||||
List<ExecutableElement> sourceGetters = Filters.getterMethodsIn( parameterElement.getEnclosedElements() );
|
|
||||||
List<ExecutableElement> targetSetters = Filters.setterMethodsIn( returnTypeElement.getEnclosedElements() );
|
List<ExecutableElement> sourceGetters = Filters.getterMethodsIn(
|
||||||
|
elementUtils.getAllMembers( parameterElement )
|
||||||
|
);
|
||||||
|
List<ExecutableElement> targetSetters = Filters.setterMethodsIn(
|
||||||
|
elementUtils.getAllMembers( returnTypeElement )
|
||||||
|
);
|
||||||
|
List<ExecutableElement> sourceSetters = Filters.setterMethodsIn(
|
||||||
|
elementUtils.getAllMembers( parameterElement )
|
||||||
|
);
|
||||||
|
List<ExecutableElement> targetGetters = Filters.getterMethodsIn(
|
||||||
|
elementUtils.getAllMembers( returnTypeElement )
|
||||||
|
);
|
||||||
|
|
||||||
reportErrorIfMappedPropertiesDontExist( method, mappings, sourceGetters, targetSetters );
|
reportErrorIfMappedPropertiesDontExist( method, mappings, sourceGetters, targetSetters );
|
||||||
|
|
||||||
@ -456,12 +467,12 @@ public class MapperGenerationVisitor extends ElementKindVisitor6<Void, Void> {
|
|||||||
new MappedProperty(
|
new MappedProperty(
|
||||||
sourcePropertyName,
|
sourcePropertyName,
|
||||||
getterMethod.getSimpleName().toString(),
|
getterMethod.getSimpleName().toString(),
|
||||||
Executables.getCorrespondingSetterMethod( parameterElement, getterMethod )
|
Executables.getCorrespondingPropertyAccessor( getterMethod, sourceSetters )
|
||||||
.getSimpleName()
|
.getSimpleName()
|
||||||
.toString(),
|
.toString(),
|
||||||
retrieveReturnType( getterMethod ),
|
retrieveReturnType( getterMethod ),
|
||||||
mapping != null ? mapping.getTargetName() : targetPropertyName,
|
mapping != null ? mapping.getTargetName() : targetPropertyName,
|
||||||
Executables.getCorrespondingGetterMethod( returnTypeElement, setterMethod )
|
Executables.getCorrespondingPropertyAccessor( setterMethod, targetGetters )
|
||||||
.getSimpleName()
|
.getSimpleName()
|
||||||
.toString(),
|
.toString(),
|
||||||
setterMethod.getSimpleName().toString(),
|
setterMethod.getSimpleName().toString(),
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
package org.mapstruct.ap.util;
|
package org.mapstruct.ap.util;
|
||||||
|
|
||||||
import java.beans.Introspector;
|
import java.beans.Introspector;
|
||||||
import javax.lang.model.element.Element;
|
import java.util.List;
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.ExecutableElement;
|
||||||
import javax.lang.model.type.TypeKind;
|
import javax.lang.model.type.TypeKind;
|
||||||
|
|
||||||
@ -86,24 +86,24 @@ public class Executables {
|
|||||||
throw new IllegalArgumentException( "Executable " + getterOrSetterMethod + " is not getter or setter method." );
|
throw new IllegalArgumentException( "Executable " + getterOrSetterMethod + " is not getter or setter method." );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ExecutableElement getCorrespondingSetterMethod(Element element, ExecutableElement getterMethod) {
|
/**
|
||||||
String propertyName = getPropertyName( getterMethod );
|
* Returns that setter or getter from the given list of executables which
|
||||||
|
* corresponds to the given getter or setter method.
|
||||||
|
*
|
||||||
|
* @param getterOrSetter The getter or setter method of interest.
|
||||||
|
* @param elements A list of executables to retrieve the corresponding accessor
|
||||||
|
* from.
|
||||||
|
*
|
||||||
|
* @return The setter corresponding to the given getter or the getter
|
||||||
|
* corresponding to the given getter
|
||||||
|
*/
|
||||||
|
public static ExecutableElement getCorrespondingPropertyAccessor(ExecutableElement getterOrSetter,
|
||||||
|
List<ExecutableElement> elements) {
|
||||||
|
String propertyName = getPropertyName( getterOrSetter );
|
||||||
|
|
||||||
for ( ExecutableElement setterMethod : Filters.setterMethodsIn( element.getEnclosedElements() ) ) {
|
for ( ExecutableElement method : elements ) {
|
||||||
if ( getPropertyName( setterMethod ).equals( propertyName ) ) {
|
if ( getPropertyName( method ).equals( propertyName ) ) {
|
||||||
return setterMethod;
|
return method;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ExecutableElement getCorrespondingGetterMethod(Element element, ExecutableElement setterMethod) {
|
|
||||||
String propertyName = getPropertyName( setterMethod );
|
|
||||||
|
|
||||||
for ( ExecutableElement getterMethod : Filters.getterMethodsIn( element.getEnclosedElements() ) ) {
|
|
||||||
if ( getPropertyName( getterMethod ).equals( propertyName ) ) {
|
|
||||||
return getterMethod;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.test.inheritance;
|
||||||
|
|
||||||
|
import org.mapstruct.ap.testutil.IssueKey;
|
||||||
|
import org.mapstruct.ap.testutil.MapperTestBase;
|
||||||
|
import org.mapstruct.ap.testutil.WithClasses;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import static org.fest.assertions.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for propagation of attributes inherited from super types.
|
||||||
|
*
|
||||||
|
* @author Gunnar Morling
|
||||||
|
*/
|
||||||
|
@WithClasses({ SourceBase.class, SourceExt.class, TargetBase.class, TargetExt.class, SourceTargetMapper.class })
|
||||||
|
public class InheritanceTest extends MapperTestBase {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@IssueKey("17")
|
||||||
|
public void shouldMapAttributeFromSuperType() {
|
||||||
|
SourceExt source = new SourceExt();
|
||||||
|
source.setFoo( 42 );
|
||||||
|
source.setBar( 23L );
|
||||||
|
|
||||||
|
TargetExt target = SourceTargetMapper.INSTANCE.sourceToTarget( source );
|
||||||
|
|
||||||
|
assertThat( target ).isNotNull();
|
||||||
|
assertThat( target.getFoo() ).isEqualTo( Long.valueOf( 42 ) );
|
||||||
|
assertThat( target.getBar() ).isEqualTo( 23 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@IssueKey("17")
|
||||||
|
public void shouldReverseMapAttributeFromSuperType() {
|
||||||
|
TargetExt target = new TargetExt();
|
||||||
|
target.setFoo( 42L );
|
||||||
|
target.setBar( 23 );
|
||||||
|
|
||||||
|
SourceExt source = SourceTargetMapper.INSTANCE.targetToSource( target );
|
||||||
|
|
||||||
|
assertThat( source ).isNotNull();
|
||||||
|
assertThat( source.getFoo() ).isEqualTo( 42 );
|
||||||
|
assertThat( source.getBar() ).isEqualTo( Long.valueOf( 23 ) );
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.test.inheritance;
|
||||||
|
|
||||||
|
public class SourceBase {
|
||||||
|
|
||||||
|
private int foo;
|
||||||
|
|
||||||
|
public int getFoo() {
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFoo(int foo) {
|
||||||
|
this.foo = foo;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.test.inheritance;
|
||||||
|
|
||||||
|
public class SourceExt extends SourceBase {
|
||||||
|
|
||||||
|
private Long bar;
|
||||||
|
|
||||||
|
public Long getBar() {
|
||||||
|
return bar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBar(Long bar) {
|
||||||
|
this.bar = bar;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.test.inheritance;
|
||||||
|
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.Mappers;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface SourceTargetMapper {
|
||||||
|
|
||||||
|
SourceTargetMapper INSTANCE = Mappers.getMapper( SourceTargetMapper.class );
|
||||||
|
|
||||||
|
TargetExt sourceToTarget(SourceExt source);
|
||||||
|
|
||||||
|
SourceExt targetToSource(TargetExt target);
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.test.inheritance;
|
||||||
|
|
||||||
|
public class TargetBase {
|
||||||
|
|
||||||
|
private Long foo;
|
||||||
|
|
||||||
|
public Long getFoo() {
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFoo(Long foo) {
|
||||||
|
this.foo = foo;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.test.inheritance;
|
||||||
|
|
||||||
|
public class TargetExt extends TargetBase {
|
||||||
|
|
||||||
|
private int bar;
|
||||||
|
|
||||||
|
public int getBar() {
|
||||||
|
return bar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBar(int bar) {
|
||||||
|
this.bar = bar;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user