PathMeta.java

package com.github.mygreen.sqlmapper.metamodel;

import java.util.Optional;

import lombok.Getter;
import lombok.NonNull;

/**
 * パス情報を表現するクラス。
 *
 *
 * @author T.TSUCHIE
 *
 */
public class PathMeta {

    /**
     * 親情報
     */
    private Optional<Path<?>> parent = Optional.empty();

    /**
     * 要素の値
     */
    @Getter
    private String element;

    /**
     * パスのタイプ
     */
    @Getter
    private PathType type;

    public PathMeta(@NonNull Path<?> parent, @NonNull String element, @NonNull PathType type) {
        this.parent = Optional.of(parent);
        this.element = element;
        this.type = type;
    }

    public PathMeta(@NonNull String element, @NonNull PathType type) {
        this.element = element;
        this.type = type;
    }

    /**
     * 親情報を取得します。
     * @return 親を持たない場合は{@literal null} を返します。
     */
    public Path<?> getParent() {
        return parent.orElse(null);
    }

    /**
     * 親情報を取得します。
     * @return 親情報。
     */
    public Optional<Path<?>> getParentAsOptional() {
        return parent;
    }

    /**
     * ルートのパスを親をだ取り検索します。
     * @return 自身がルート({@link PathType#ROOT})の場合は{@literal null}を返します。
     */
    public Path<?> findRootPath() {
        if(type == PathType.ROOT) {
            return null;
        }
        PathMeta pathMeta = this;
        Path<?> parent = null;
        do{
            parent = pathMeta.getParent();
            if(parent == null) {
                // ありえないが、nullチェックをする。
                break;
            }
            pathMeta = parent.getPathMeta();
        } while(parent.getPathMeta().getType() != PathType.ROOT);

        return parent;
    }
}