package com.gh.mygreen.xlsmapper; 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); } } } }