#35 Extracting some code from visitor to helper class

This commit is contained in:
Gunnar Morling 2013-06-08 20:49:05 +02:00
parent bc22e6ce15
commit a5fd73f255
2 changed files with 40 additions and 12 deletions

View File

@ -62,6 +62,31 @@ import org.mapstruct.ap.writer.ModelWriter;
import static javax.lang.model.util.ElementFilter.methodsIn;
/**
* An {@link ElementVisitor} which generates the implementations for mapper
* interfaces (interfaces annotated with {@code @Mapper}.
* </p>
* Implementation notes:
* </p>
* The mapper generation happens by building up a model representation of
* the mapper to be generated (a {@link Mapper} object), which is then written
* into a file using the FreeMarker template engine.
* </p>
* The model instantiation happens in two phases/passes: The first one retrieves
* the mapping methods of the given interfaces and their configuration (the
* <i>source</i> model). In the second pass the individual methods are
* aggregated into the <i>target</i> model, which contains a {@link BeanMapping}
* each pair of source and target type which has references to forward and
* reverse mapping methods as well as the methods for mapping the element types
* (if it is a collection mapping) and {@link Conversion}s if applicable.
* </p>
* For reading annotation attributes, prisms as generated with help of the <a
* href="https://java.net/projects/hickory">Hickory</a> tool are used. These
* prisms allow a comfortable access to annotations and their attributes without
* depending on their class objects.
*
* @author Gunnar Morling
*/
public class MapperGenerationVisitor extends ElementKindVisitor6<Void, Void> {
private static final String IMPLEMENTATION_SUFFIX = "Impl";
@ -494,8 +519,8 @@ public class MapperGenerationVisitor extends ElementKindVisitor6<Void, Void> {
List<ExecutableElement> sourceGetters,
List<ExecutableElement> targetSetters) {
Set<String> sourcePropertyNames = getPropertyNames( sourceGetters );
Set<String> targetPropertyNames = getPropertyNames( targetSetters );
Set<String> sourcePropertyNames = Executables.getPropertyNames( sourceGetters );
Set<String> targetPropertyNames = Executables.getPropertyNames( targetSetters );
for ( Mapping mappedProperty : mappings.values() ) {
if ( !sourcePropertyNames.contains( mappedProperty.getSourceName() ) ) {
@ -519,16 +544,6 @@ public class MapperGenerationVisitor extends ElementKindVisitor6<Void, Void> {
}
}
private Set<String> getPropertyNames(List<ExecutableElement> propertyAccessors) {
Set<String> propertyNames = new HashSet<String>();
for ( ExecutableElement executableElement : propertyAccessors ) {
propertyNames.add( Executables.getPropertyName( executableElement ) );
}
return propertyNames;
}
private Map<String, Mapping> getMappings(MappingsPrism mappingsAnnotation) {
Map<String, Mapping> mappings = new HashMap<String, Mapping>();

View File

@ -19,7 +19,10 @@
package org.mapstruct.ap.util;
import java.beans.Introspector;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.type.TypeKind;
@ -109,4 +112,14 @@ public class Executables {
return null;
}
public static Set<String> getPropertyNames(List<ExecutableElement> propertyAccessors) {
Set<String> propertyNames = new HashSet<String>();
for ( ExecutableElement executableElement : propertyAccessors ) {
propertyNames.add( Executables.getPropertyName( executableElement ) );
}
return propertyNames;
}
}