EntityMetamodel.java

package com.github.mygreen.sqlmapper.apt.model;

import java.util.ArrayList;
import java.util.List;

import com.github.mygreen.sqlmapper.apt.AptUtils;
import com.github.mygreen.sqlmapper.core.annotation.Embeddable;
import com.github.mygreen.sqlmapper.core.annotation.Entity;
import com.github.mygreen.sqlmapper.core.annotation.MappedSuperclass;

import lombok.Data;

/**
 * APTによる処理対象のプロパティ情報。
 *
 *
 * @author T.TSUCHIE
 *
 */
@Data
public class EntityMetamodel {

    /**
     * パッケージ名
     */
    private String packageName;

    /**
     * クラス名(パッケージ名除く)
     */
    private String className;

    /**
     * 自身のクラス情報
     */
    private AptType type;

    /**
     * 親クラス(パッケージ名含む)
     */
    private AptType superClassType;

    /**
     * アノテーション{@link Entity}の情報
     */
    private Entity entityAnno;

    /**
     * アノテーション{@link MappedSuperclass}の情報
     */
    private MappedSuperclass mappedSuperclassAnno;

    /**
     * アノテーション{@link Embeddable}の情報
     */
    private Embeddable embeddableAnno;

    /**
     * プロパティ情報
     */
    private List<PropertyMetamodel> properties = new ArrayList<>();

    /**
     * staticな内部クラスのエンティティの場合
     */
    private List<EntityMetamodel> staticInnerEntities = new ArrayList<>();

    /**
     * エンティティのFQNを取得する。
     * @return エンティティのFQN
     */
    public String getFullName() {
        StringBuilder buff = new StringBuilder();

        if(packageName != null) {
            buff.append(packageName)
                .append(AptUtils.getPackageClassNameSeparator(this));
        }

        buff.append(className);

        return buff.toString();
    }

    /**
     * プロパティ情報を追加する。
     * @param property プロパティ情報
     */
    public void add(PropertyMetamodel property) {
        this.properties.add(property);
    }

    /**
     * staticな内部クラスのエンティティ情報を追加する。
     * @param entity エンティティ情報
     */
    public void add(EntityMetamodel entity) {
        if(!entity.getType().isStaticInnerClass()) {
            throw new IllegalArgumentException("entity is not static inner class : " + entity.getFullName());
        }

        this.staticInnerEntities.add(entity);
    }

    /**
     * クラスにアノテーション {@link Entity} が付与されているかどうか。
     * @return {@literal true}のときアノテーション {@link Entity} が付与されている。
     */
    public boolean isEntity() {
        return entityAnno != null;
    }

    /**
     * クラスにアノテーション {@link MappedSuperclass} が付与されているかどうか。
     * @return {@literal true}のときアノテーション {@link MappedSuperclass} が付与されている。
     */
    public boolean isMappedSuperclass() {
        return mappedSuperclassAnno != null;
    }

    /**
     * クラスにアノテーション {@link Embeddable} が付与されているかどうか。
     * @return {@literal true}のときアノテーション {@link Embeddable} が付与されている。
     */
    public boolean isEmbeddable() {
        return embeddableAnno != null;
    }

    /**
     * {@link MappedSuperclass}が付与された親クラスを持つかどうか。
     * @return {@literal true}のときき{@link MappedSuperclass}が付与された親クラス
     */
    public boolean hasSuperClass() {
        return superClassType != null;
    }

}