/**
* Copyright 2012-2017 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.internal.model;
import java.util.List;
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;
import org.mapstruct.ap.internal.model.common.TypeFactory;
import org.mapstruct.ap.internal.option.Options;
import org.mapstruct.ap.internal.version.VersionInformation;
/**
* Represents a type implementing a mapper interface (annotated with {@code @Mapper}). This is the root object of the
* mapper model.
*
* @author Gunnar Morling
*/
public class Mapper extends GeneratedType {
static final String CLASS_NAME_PLACEHOLDER = "<CLASS_NAME>";
static final String PACKAGE_NAME_PLACEHOLDER = "<PACKAGE_NAME>";
static final String DEFAULT_IMPLEMENTATION_CLASS = CLASS_NAME_PLACEHOLDER + "Impl";
static final String DEFAULT_IMPLEMENTATION_PACKAGE = PACKAGE_NAME_PLACEHOLDER;
private final boolean customPackage;
private final boolean customImplName;
private final List<MapperReference> referencedMappers;
private Decorator decorator;
@SuppressWarnings( "checkstyle:parameternumber" )
private Mapper(TypeFactory typeFactory, String packageName, String name, String superClassName,
String interfacePackage, String interfaceName, boolean customPackage, boolean customImplName,
List<MappingMethod> methods, Options options, VersionInformation versionInformation,
Accessibility accessibility, List<MapperReference> referencedMappers, Decorator decorator,
SortedSet<Type> extraImportedTypes) {
super(
typeFactory,
packageName,
name,
superClassName,
interfacePackage,
interfaceName,
methods,
referencedMappers,
options,
versionInformation,
accessibility,
extraImportedTypes,
null
);
this.customPackage = customPackage;
this.customImplName = customImplName;
this.referencedMappers = referencedMappers;
this.decorator = decorator;
}
public static class Builder {
private TypeFactory typeFactory;
private TypeElement element;
private List<MappingMethod> mappingMethods;
private List<MapperReference> mapperReferences;
private SortedSet<Type> 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<MappingMethod> mappingMethods) {
this.mappingMethods = mappingMethods;
return this;
}
public Builder mapperReferences(List<MapperReference> mapperReferences) {
this.mapperReferences = mapperReferences;
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<Type> 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, element.getSimpleName() ) +
( decorator == null ? "" : "_" );
String elementPackage = elementUtils.getPackageOf( element ).getQualifiedName().toString();
String packageName = implPackage.replace( PACKAGE_NAME_PLACEHOLDER, elementPackage );
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() ),
mapperReferences,
decorator,
extraImportedTypes
);
}
}
public List<MapperReference> getReferencedMappers() {
return referencedMappers;
}
public Decorator getDecorator() {
return decorator;
}
public void removeDecorator() {
this.decorator = null;
}
public boolean hasCustomImplementation() {
return customImplName || customPackage;
}
@Override
protected String getTemplateName() {
return getTemplateNameForClass( GeneratedType.class );
}
}