PropertyPath.java

package com.gh.mygreen.xlsmapper.util;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


/**
 * 解析済みのプロパティ式のオブジェクト。
 * 
 * @since 1.0
 * @author T.TSUCHIE
 *
 */
public class PropertyPath implements Serializable {
    
    /** serialVersionUID */
    private static final long serialVersionUID = -4273945900442385415L;
    
    /**
     * 解析元のパス
     */
    private final String path;
    
    /**
     * パスを解析してトークンに分解した結果。
     */
    private final List<Token> tokens;
    
    /**
     * 解析元のパスを指定するコンストラクタ。
     * @param path 解析元のパス
     * @throws IllegalArgumentException path is null or empty.
     */
    public PropertyPath(final String path) {
        ArgUtils.notEmpty(path, "path");
        this.path = path;
        this.tokens = new ArrayList<>();
    }
    
    /**
     * 解析元のパスを取得する。
     * @return
     */
    public String getPath() {
        return path;
    }
    
    /**
     * トークンを追加する。
     * @param token
     */
    public void add(final Token token) {
        this.tokens.add(token);
    }
    
    /**
     * トークンに分割した結果を取得する。
     * @return
     */
    public List<Token> getPathAsToken() {
        return new ArrayList<>(tokens);
    }
    
    /**
     * パスを分割したもの。
     * @since 1.0
     * @author T.TSUCHIE
     *
     */
    public static class Token implements Serializable {
        
        /** serialVersionUID */
        private static final long serialVersionUID = 2281725403723210214L;
        
        /** トークンの文字 */
        private final String token;
        
        /**
         * エスケープ文字を除去したした文字
         */
        private final String value;
        
        public Token(String token) {
            this.token = token;
            this.value = Utils.removeEscapeChar(token, '\\');
        }
        
        /**
         * トークンの値を取得する
         * @return
         */
        public String getToken() {
            return token;
        }
        
        /**
         * エスケープ文字を取得する。
         * @return
         */
        public String getValue() {
            return value;
        }
        
        /**
         * 括弧で囲まれた条件の書式'[キー]'を表すトークン。
         */
        public static class Key extends Token {
            
            /** serialVersionUID */
            private static final long serialVersionUID = -5951809427315756202L;

            public Key(String value) {
                super(value);
            }
            
            /**
             * 括弧を除いた条件の値の取得。
             * @return
             */
            public String getKey() {
                int length = getValue().length();
                return getValue().substring(1, length-1);
            }
            
        }
        
        /**
         * パスの区切り文字"."を表すトークン。
         *
         */
        public static class Separator extends Token {
            
            /** serialVersionUID */
            private static final long serialVersionUID = -9021975741257702192L;
            
            public Separator() {
                super(".");
            }
            
        }
        
        /**
         * プロパティ名を表すトークン。
         *
         */
        public static class Name extends Token {
            
            /** serialVersionUID */
            private static final long serialVersionUID = -1196971215805919815L;
            
            public Name(String value) {
                super(value);
            }
            
        }
    }
    
}