All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.mapping.processing.BasicProperty Maven / Gradle / Ivy

package com.moon.mapping.processing;

import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Supplier;

import static com.moon.mapping.processing.GenericUtils.findActualType;
import static com.moon.mapping.processing.StringUtils.capitalize;

/**
 * @author benshaoye
 */
final class BasicProperty extends BaseProperty {

    private final TypeElement thisElement;

    private VariableElement field;

    BasicProperty(String name, TypeElement enclosingElement, TypeElement thisElement) {
        super(name, enclosingElement);
        this.thisElement = thisElement;
    }

    public VariableElement getField() { return field; }

    @Override
    public String getThisClassname() {
        return ElementUtils.getQualifiedName(thisElement);
    }

    public void setField(VariableElement field, Map genericMap) {
        this.field = field;
        String declareType = ElementUtils.getFieldDeclareType(field);
        setDeclareType(declareType);
        setActualType(findActualType(genericMap, declareType));
    }

    public void setSetter(ExecutableElement setter, Map genericMap) {
        String declareType = ElementUtils.getSetterDeclareType(setter);
        addSetterMethod(toMethod(declareType, setter, genericMap));
    }

    public void setGetter(ExecutableElement getter, Map genericMap) {
        String declareType = ElementUtils.getGetterDeclareType(getter);
        addGetterMethod(toMethod(declareType, getter, genericMap));
    }

    private BasicMethod toMethod(String declareType, ExecutableElement method, Map generics) {
        return new BasicMethod(method, declareType, findActualType(generics, declareType), true);
    }

    /*
    custom
     */

    @Override
    public boolean hasSetterMethod() { return hasPublicDefaultSetter() || hasLombokSetter(); }

    @Override
    public String getSetterName() {
        return ifHasSetter(() -> {
            return getSetter().getMethodName();
        }, () -> "set" + capitalize(getName()));
    }

    @Override
    public String getSetterActualType() {
        return ifHasSetter(TypeGetter::getActualType);
    }

    @Override
    public String getSetterDeclareType() {
        return ifHasSetter(TypeGetter::getDeclareType);
    }

    @Override
    public String getSetterFinalType() {
        return ifHasSetter(TypeGetter::getComputedType);
    }

    @Override
    public String getWrappedSetterType() {
        TypeMirror typeMirror = null;
        if (isPrimitiveSetter()) {
            if (hasPublicDefaultSetter()) {
                typeMirror = getSetter().getElem().getParameters().get(0).asType();
            }
            if (hasLombokSetter()) {
                typeMirror = getField().asType();
            }
        }
        if (typeMirror == null) {
            return getSetterFinalType();
        }
        if (typeMirror.getKind().isPrimitive()) {
            return StringUtils.toWrappedType(typeMirror.getKind().toString().toLowerCase());
        }
        return typeMirror.toString();
    }

    public TypeMirror getSetterTypeMirror() {
        if (hasPublicDefaultGetter()) {
            return getSetter().getElem().getParameters().get(0).asType();
        }
        if (hasLombokGetter()) {
            return getField().asType();
        }
        return null;
    }

    @Override
    public boolean isPrimitiveSetter() {
        TypeMirror type = getSetterTypeMirror();
        return type != null && type.getKind().isPrimitive();
    }

    /**
     * 是否有 getter
     */
    @Override
    public boolean hasGetterMethod() { return hasPublicDefaultGetter() || hasLombokGetter(); }

    /**
     * getter method name
     */
    @Override
    public String getGetterName() {
        if (hasPublicDefaultGetter()) {
            return getGetter().getMethodName();
        }
        if (hasLombokGetter()) {
            VariableElement var = getField();
            if (var.asType().getKind() == TypeKind.BOOLEAN) {
                return "is" + capitalize(getName());
            }
            return "get" + capitalize(getName());
        }
        return null;
    }

    @Override
    public String getGetterActualType() {
        return ifHasGetter(TypeGetter::getActualType);
    }

    @Override
    public String getGetterDeclareType() {
        return ifHasGetter(TypeGetter::getDeclareType);
    }

    /**
     * getter return type
     */
    @Override
    public String getGetterFinalType() {
        return ifHasGetter(TypeGetter::getComputedType);
    }

    @Override
    public String getWrappedGetterType() {
        TypeMirror typeMirror = null;
        if (isPrimitiveGetter()) {
            typeMirror = getGetterTypeMirror();
        }
        if (typeMirror == null) {
            return getGetterFinalType();
        }
        if (typeMirror.getKind().isPrimitive()) {
            return StringUtils.toWrappedType(typeMirror.getKind().toString().toLowerCase());
        }
        return typeMirror.toString();
    }

    public TypeMirror getGetterTypeMirror() {
        return ifHasGetter(() -> getGetter().getElem().getReturnType(), () -> getField().asType());
    }

    /**
     * 是否是基本数据类型 getter
     */
    @Override
    public boolean isPrimitiveGetter() {
        TypeMirror type = getGetterTypeMirror();
        return type != null && type.getKind().isPrimitive();
    }

    /**
     * 主动声明的 setter 方法
     */
    private boolean hasPublicDefaultSetter() {
        BasicMethod setter = getSetter();
        return setter != null && DetectUtils.isPublic(setter.getElem());
    }

    /**
     * lombok 生成的 setter 方法
     */
    private boolean hasLombokSetter() { return DetectUtils.hasLombokSetter(getField()); }

    /**
     * 主动声明的 public getter 方法
     */
    private boolean hasPublicDefaultGetter() {
        BasicMethod getter = getGetter();
        return getter != null && DetectUtils.isPublic(getter.getElem());
    }

    /**
     * lombok 生成的 getter 方法
     */
    private boolean hasLombokGetter() { return DetectUtils.hasLombokGetter(getField()); }

    private  T ifHasSetter(Supplier dftGetter, Supplier lombokGetter) {
        if (hasPublicDefaultSetter()) { return dftGetter.get(); }
        if (hasLombokSetter()) { return lombokGetter.get(); }
        return null;
    }

    private  T ifHasSetter(Function getter) {
        if (hasPublicDefaultSetter()) { return getter.apply(getSetter()); }
        if (hasLombokSetter()) { return getter.apply(this); }
        return null;
    }

    private  T ifHasGetter(Supplier dftGetter, Supplier lombokGetter) {
        if (hasPublicDefaultGetter()) { return dftGetter.get(); }
        if (hasLombokGetter()) { return lombokGetter.get(); }
        return null;
    }

    private  T ifHasGetter(Function getter) {
        if (hasPublicDefaultGetter()) { return getter.apply(getGetter()); }
        if (hasLombokGetter()) { return getter.apply(this); }
        return null;
    }

    @Override
    public void onCompleted() {
        final String propertyType = getComputedType();
        if (propertyType == null) {
            onMissingField();
        } else {
            onPresentField(propertyType);
        }
    }

    private void onMissingField() {
        List getterArr = ensureGetterArr();
        List setterArr = ensureSetterArr();
        if (getterArr.isEmpty()) {
            if (setterArr.size() == 1) {
                this.setSetter(setterArr.remove(0));
            }
        } else {
            BasicMethod getter = getterArr.remove(0);
            setGetter(getter);
            Iterator setterItr = setterArr.iterator();
            while (setterItr.hasNext()) {
                BasicMethod method = setterItr.next();
                if (Objects.equals(method.getComputedType(), getter.getComputedType())) {
                    this.setSetter(method);
                    setterItr.remove();
                    break;
                }
            }
        }
    }

    private void onPresentField(final String propertyType) {
        Iterator getterItr = ensureGetterArr().iterator();
        while (getterItr.hasNext()) {
            BasicMethod method = getterItr.next();
            if (Objects.equals(method.getComputedType(), propertyType)) {
                this.setGetter(method);
                getterItr.remove();
                break;
            }
        }

        Iterator setterItr = ensureSetterArr().iterator();
        while (setterItr.hasNext()) {
            BasicMethod method = setterItr.next();
            if (Objects.equals(method.getComputedType(), propertyType)) {
                this.setSetter(method);
                setterItr.remove();
                break;
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy