ObjectErrorBuilder.java

package com.gh.mygreen.xlsmapper.validation;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * {@link ObjectError}のインスタンスを組み立てるビルダ。
 *
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public class ObjectErrorBuilder {
    
    private final String objectName;
    
    private final String[] codes;
    
    private Map<String, Object> variables = new HashMap<>();
    
    private String defaultMessage;
    
    private String sheetName;
    
    private String label;
    
    /**
     * ビルダのインスタンスを作成します
     * @param objectName オブジェクト名
     * @param codes メッセージコード。複数指定可能で、先頭にあるものほど優先度が高い。
     */
    public ObjectErrorBuilder(final String objectName, final String[] codes) {
        this.objectName = objectName;
        this.codes = codes;
    }
    
    /**
     * メッセージ中の変数を追加します。
     * @param variables 変数のマップ
     * @return 自身のインスタンス
     */
    public ObjectErrorBuilder variables(final Map<String, Object> variables) {
        this.variables.putAll(variables);
        return this;
    }
    
    /**
     * メッセージ中の変数を追加します。
     * @param key 変数のキー名
     * @param value 変数の値
     * @return 自身のインスタンス
     */
    public ObjectErrorBuilder variables(final String key, final Object value) {
        this.variables.put(key, value);
        return this;
    }
    
    /**
     * デフォルトメッセージを設定します。
     * <p>指定したコードに対するメッセージが見つからない場合に、適用されるメッセージ。</p>
     * @param defaultMessage デフォルトメッセージ
     * @return 自身のインスタンス
     */
    public ObjectErrorBuilder defaultMessage(final String defaultMessage) {
        this.defaultMessage = defaultMessage;
        return this;
    }
    
    /**
     * シート名を設定します。
     * @param sheetName シート名
     * @return 自身のインスタンス
     */
    public ObjectErrorBuilder sheetName(final String sheetName) {
        this.sheetName = sheetName;
        return this;
    }
    
    /**
     * ラベルを設定します。
     * <p>テーブル名やカラム名が設定します。</p>
     * @param label ラベル
     * @return 自身のインスタンス
     */
    public ObjectErrorBuilder label(final String label) {
        this.label = label;
        return this;
    }
    
    /**
     * ラベルを設定します。
     * <p>テーブル名やカラム名が設定します。</p>
     * <p>値が存在する場合のみ設定されます。</p>
     * @param label ラベル
     * @return 自身のインスタンス
     */
    public ObjectErrorBuilder label(final Optional<String> label) {
        label.ifPresent(l -> label(l));
        return this;
    }
    
    /**
     * {@link ObjectError}のインスタンスを組み立てます。
     * @return {@link ObjectError}のインスタンス
     */
    public ObjectError build() {
        
        final ObjectError error = new ObjectError(objectName, codes, variables);
        error.setDefaultMessage(defaultMessage);
        error.setSheetName(sheetName);
        error.setLabel(label);
        
        return error;
    }
    
}