AptUtils.java

package com.github.mygreen.sqlmapper.apt;

import java.util.List;

import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.Modifier;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Types;

import com.github.mygreen.sqlmapper.apt.model.EntityMetamodel;

/**
 * APT処理のユーティリティクラスです。
 *
 *
 * @author T.TSUCHIE
 *
 */
public class AptUtils {

    /**
     * 要素が非finalなインスタンスフィールド(非staticなフィールド)か判定します。
     * @param element 判定対象の要素
     * @return 非finalなインスタンスフィールド(非staticなフィールド)のとき{@literal true}を返します。
     */
    public static boolean isInstanceField(final Element element) {

        // フィールドかどうか
        if(element.getKind() != ElementKind.FIELD) {
            return false;
        }

        // 非static かどうか
        if(element.getModifiers().contains(Modifier.STATIC)) {
            return false;
        }

        // 非finalかどうか
        if(element.getModifiers().contains(Modifier.FINAL)) {
            return false;
        }

        return true;

    }

    /**
     * クラス名とパッケージ名のセパレータを取得します。
     * @param entityModel エンティティモデル情報
     * @return 内部クラスのとき {@literal "$"} を返し、それ以外の時は {@literal "."} を返します。
     */
    public static String getPackageClassNameSeparator(final EntityMetamodel entityModel) {
        return entityModel.getType().isStaticInnerClass() ? "$" : ".";
    }

    /**
     * 継承しているクラス情報を抽出する。
     * @param type 現在のクラス情報
     * @param typeUtils ユーティリティ。
     * @param superTypes 抽出したクラス情報。
     */
    public static void extractSuperClassTypes(final TypeMirror type, final Types typeUtils, final List<TypeMirror> superTypes) {

        if(type.toString().equals(Object.class.getCanonicalName())) {
            return;
        }

        List<? extends TypeMirror> list = typeUtils.directSupertypes(type);
        for(TypeMirror superType : list) {
            if(!superTypes.contains(superType)) {
                superTypes.add(superType);
            }

            // 再帰的に見ていく
            extractSuperClassTypes(superType, typeUtils, superTypes);
        }


    }

}