From b651ad34b54d157bfa5121a7849cd09284df0720 Mon Sep 17 00:00:00 2001 From: Sjaak Derksen Date: Sun, 18 Nov 2018 08:44:57 +0100 Subject: [PATCH] #1649 Improvement: builder for Mapper/Decorator/GeneratedType --- .../ap/internal/model/Decorator.java | 48 +---- .../ap/internal/model/GeneratedType.java | 48 +++++ .../mapstruct/ap/internal/model/Mapper.java | 193 ++++++++---------- .../processor/MapperCreationProcessor.java | 2 +- 4 files changed, 137 insertions(+), 154 deletions(-) diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/Decorator.java b/processor/src/main/java/org/mapstruct/ap/internal/model/Decorator.java index ad88c0e38..ce034837e 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/Decorator.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/Decorator.java @@ -11,7 +11,6 @@ import java.util.SortedSet; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; -import javax.lang.model.util.Elements; import org.mapstruct.ap.internal.model.common.Accessibility; import org.mapstruct.ap.internal.model.common.Type; @@ -27,28 +26,17 @@ import org.mapstruct.ap.internal.version.VersionInformation; */ public class Decorator extends GeneratedType { - public static class Builder { + public static class Builder extends GeneratedTypeBuilder { - private Elements elementUtils; - private TypeFactory typeFactory; private TypeElement mapperElement; private DecoratedWithPrism decoratorPrism; - private List methods; - private Options options; - private VersionInformation versionInformation; + private boolean hasDelegateConstructor; private String implName; private String implPackage; - private SortedSet extraImportedTypes; - public Builder elementUtils(Elements elementUtils) { - this.elementUtils = elementUtils; - return this; - } - - public Builder typeFactory(TypeFactory typeFactory) { - this.typeFactory = typeFactory; - return this; + public Builder() { + super( Builder.class ); } public Builder mapperElement(TypeElement mapperElement) { @@ -61,21 +49,6 @@ public class Decorator extends GeneratedType { return this; } - public Builder methods(List methods) { - this.methods = methods; - return this; - } - - public Builder options(Options options) { - this.options = options; - return this; - } - - public Builder versionInformation(VersionInformation versionInformation) { - this.versionInformation = versionInformation; - return this; - } - public Builder hasDelegateConstructor(boolean hasDelegateConstructor) { this.hasDelegateConstructor = hasDelegateConstructor; return this; @@ -91,20 +64,15 @@ public class Decorator extends GeneratedType { return this; } - public Builder extraImports(SortedSet extraImportedTypes) { - this.extraImportedTypes = extraImportedTypes; - return this; - } - public Decorator build() { String implementationName = implName.replace( Mapper.CLASS_NAME_PLACEHOLDER, - Mapper.getFlatName( mapperElement ) ); + Mapper.getFlatName( mapperElement ) ); Type decoratorType = typeFactory.getType( decoratorPrism.value() ); DecoratorConstructor decoratorConstructor = new DecoratorConstructor( - implementationName, - implementationName + "_", - hasDelegateConstructor ); + implementationName, + implementationName + "_", + hasDelegateConstructor ); String elementPackage = elementUtils.getPackageOf( mapperElement ).getQualifiedName().toString(); diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/GeneratedType.java b/processor/src/main/java/org/mapstruct/ap/internal/model/GeneratedType.java index de16a5ce0..81ccc779a 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/GeneratedType.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/GeneratedType.java @@ -12,6 +12,7 @@ import java.util.SortedSet; import java.util.TreeSet; import javax.lang.model.type.TypeKind; +import javax.lang.model.util.Elements; import org.mapstruct.ap.internal.model.common.Accessibility; import org.mapstruct.ap.internal.model.common.ModelElement; @@ -30,6 +31,53 @@ public abstract class GeneratedType extends ModelElement { private static final String JAVA_LANG_PACKAGE = "java.lang"; + protected abstract static class GeneratedTypeBuilder { + + private T myself; + protected TypeFactory typeFactory; + protected Elements elementUtils; + protected Options options; + protected VersionInformation versionInformation; + protected SortedSet extraImportedTypes; + + protected List methods; + + GeneratedTypeBuilder(Class selfType) { + myself = selfType.cast( this ); + } + + public T elementUtils(Elements elementUtils) { + this.elementUtils = elementUtils; + return myself; + } + + public T typeFactory(TypeFactory typeFactory) { + this.typeFactory = typeFactory; + return myself; + } + + public T options(Options options) { + this.options = options; + return myself; + } + + public T versionInformation(VersionInformation versionInformation) { + this.versionInformation = versionInformation; + return myself; + } + + public T extraImports(SortedSet extraImportedTypes) { + this.extraImportedTypes = extraImportedTypes; + return myself; + } + + public T methods(List methods) { + this.methods = methods; + return myself; + } + + } + private final String packageName; private final String name; private final String superClassName; diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/Mapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/Mapper.java index e4b89b4c0..0ebd1f0ff 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/Mapper.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/Mapper.java @@ -12,7 +12,6 @@ import java.util.SortedSet; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; -import javax.lang.model.util.Elements; import org.mapstruct.ap.internal.model.common.Accessibility; import org.mapstruct.ap.internal.model.common.Type; @@ -33,6 +32,86 @@ public class Mapper extends GeneratedType { static final String DEFAULT_IMPLEMENTATION_CLASS = CLASS_NAME_PLACEHOLDER + "Impl"; static final String DEFAULT_IMPLEMENTATION_PACKAGE = PACKAGE_NAME_PLACEHOLDER; + public static class Builder extends GeneratedTypeBuilder { + + private TypeElement element; + private List fields; + private Set fragments; + + private Decorator decorator; + private String implName; + private boolean customName; + private String implPackage; + private boolean customPackage; + + public Builder() { + super( Builder.class ); + } + + public Builder element(TypeElement element) { + this.element = element; + return this; + } + + public Builder fields(List fields) { + this.fields = fields; + return this; + } + + public Builder constructorFragments(Set fragments) { + this.fragments = fragments; + return this; + } + + public Builder decorator(Decorator decorator) { + this.decorator = decorator; + return this; + } + + public Builder implName(String implName) { + this.implName = implName; + this.customName = !DEFAULT_IMPLEMENTATION_CLASS.equals( this.implName ); + return this; + } + + public Builder implPackage(String implPackage) { + this.implPackage = implPackage; + this.customPackage = !DEFAULT_IMPLEMENTATION_PACKAGE.equals( this.implPackage ); + return this; + } + + public Mapper build() { + String implementationName = implName.replace( CLASS_NAME_PLACEHOLDER, getFlatName( element ) ) + + ( decorator == null ? "" : "_" ); + + String elementPackage = elementUtils.getPackageOf( element ).getQualifiedName().toString(); + String packageName = implPackage.replace( PACKAGE_NAME_PLACEHOLDER, elementPackage ); + Constructor constructor = null; + if ( !fragments.isEmpty() ) { + constructor = new NoArgumentConstructor( implementationName, fragments ); + } + return new Mapper( + typeFactory, + packageName, + implementationName, + element.getKind() != ElementKind.INTERFACE ? element.getSimpleName().toString() : null, + elementPackage, + element.getKind() == ElementKind.INTERFACE ? element.getSimpleName().toString() : null, + customPackage, + customName, + methods, + options, + versionInformation, + Accessibility.fromModifiers( element.getModifiers() ), + fields, + constructor, + decorator, + extraImportedTypes + ); + } + + } + private final boolean customPackage; private final boolean customImplName; private Decorator decorator; @@ -65,118 +144,6 @@ public class Mapper extends GeneratedType { this.decorator = decorator; } - public static class Builder { - - private TypeFactory typeFactory; - private TypeElement element; - private List mappingMethods; - private List fields; - private Set fragments; - private SortedSet extraImportedTypes; - - private Elements elementUtils; - private Options options; - private VersionInformation versionInformation; - private Decorator decorator; - private String implName; - private boolean customName; - private String implPackage; - private boolean customPackage; - - public Builder element(TypeElement element) { - this.element = element; - return this; - } - - public Builder mappingMethods(List mappingMethods) { - this.mappingMethods = mappingMethods; - return this; - } - - public Builder fields(List fields) { - this.fields = fields; - return this; - } - - public Builder constructorFragments(Set fragments) { - this.fragments = fragments; - return this; - } - - public Builder options(Options options) { - this.options = options; - return this; - } - - public Builder versionInformation(VersionInformation versionInformation) { - this.versionInformation = versionInformation; - return this; - } - - public Builder typeFactory(TypeFactory typeFactory) { - this.typeFactory = typeFactory; - return this; - } - - public Builder elementUtils(Elements elementUtils) { - this.elementUtils = elementUtils; - return this; - } - - public Builder decorator(Decorator decorator) { - this.decorator = decorator; - return this; - } - - public Builder extraImports(SortedSet extraImportedTypes) { - this.extraImportedTypes = extraImportedTypes; - return this; - } - - public Builder implName(String implName) { - this.implName = implName; - this.customName = !DEFAULT_IMPLEMENTATION_CLASS.equals( this.implName ); - return this; - } - - public Builder implPackage(String implPackage) { - this.implPackage = implPackage; - this.customPackage = !DEFAULT_IMPLEMENTATION_PACKAGE.equals( this.implPackage ); - return this; - } - - public Mapper build() { - String implementationName = implName.replace( CLASS_NAME_PLACEHOLDER, getFlatName( element ) ) + - ( decorator == null ? "" : "_" ); - - String elementPackage = elementUtils.getPackageOf( element ).getQualifiedName().toString(); - String packageName = implPackage.replace( PACKAGE_NAME_PLACEHOLDER, elementPackage ); - Constructor constructor = null; - if ( !fragments.isEmpty() ) { - constructor = new NoArgumentConstructor( implementationName, fragments ); - } - return new Mapper( - typeFactory, - packageName, - implementationName, - element.getKind() != ElementKind.INTERFACE ? element.getSimpleName().toString() : null, - elementPackage, - element.getKind() == ElementKind.INTERFACE ? element.getSimpleName().toString() : null, - customPackage, - customName, - mappingMethods, - options, - versionInformation, - Accessibility.fromModifiers( element.getModifiers() ), - fields, - constructor, - decorator, - extraImportedTypes - ); - } - - } - public Decorator getDecorator() { return decorator; } diff --git a/processor/src/main/java/org/mapstruct/ap/internal/processor/MapperCreationProcessor.java b/processor/src/main/java/org/mapstruct/ap/internal/processor/MapperCreationProcessor.java index b55422cf7..974822216 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/processor/MapperCreationProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/processor/MapperCreationProcessor.java @@ -162,7 +162,7 @@ public class MapperCreationProcessor implements ModelElementProcessor