FieldErrorBuilder.java
package com.gh.mygreen.xlsmapper.validation;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import com.gh.mygreen.xlsmapper.util.CellPosition;
/**
* {@link FieldError}のインスタンスを組み立てるビルダ。
*
* @version 2.0
* @author T.TSUCHIE
*
*/
public class FieldErrorBuilder {
private final String objectName;
private final String field;
private final String[] codes;
private Object rejectedValue;
private boolean conversionFailure;
private Map<String, Object> variables = new HashMap<>();
private String defaultMessage;
private String sheetName;
private String label;
private CellPosition address;
/**
* ビルダのインスタンスを作成します
* @param objectName オブジェクト名
* @param field フィールド名。ネストしている場合は、親のパスを付与した形式(e.g. person.name)で指定します。
* @param codes メッセージコード。複数指定可能で、先頭にあるものほど優先度が高い。
*/
public FieldErrorBuilder(final String objectName, final String field, final String[] codes) {
this.objectName = objectName;
this.field = field;
this.codes = codes;
}
/**
* エラートとなったフィールドの値を設定します。
* @param rejectedValue エラー元の値
* @return 自身のインスタンス
*/
public FieldErrorBuilder rejectedValue(final Object rejectedValue) {
this.rejectedValue = rejectedValue;
return this;
}
/**
* 型変換エラーかどうかを設定します。
* @param conversionFailure trueの場合、型変換エラー
* @return 自身のインスタンス
*/
public FieldErrorBuilder conversionFailure(final boolean conversionFailure) {
this.conversionFailure = conversionFailure;
return this;
}
/**
* メッセージ中の変数を追加します。
* @param variables 変数のマップ
* @return 自身のインスタンス
*/
public FieldErrorBuilder variables(final Map<String, Object> variables) {
this.variables.putAll(variables);
return this;
}
/**
* メッセージ中の変数を追加します。
* @param key 変数のキー名
* @param value 変数の値
* @return 自身のインスタンス
*/
public FieldErrorBuilder variables(final String key, final Object value) {
this.variables.put(key, value);
return this;
}
/**
* デフォルトメッセージを設定します。
* <p>指定したコードに対するメッセージが見つからない場合に、適用されるメッセージ。</p>
* @param defaultMessage デフォルトメッセージ
* @return 自身のインスタンス
*/
public FieldErrorBuilder defaultMessage(final String defaultMessage) {
this.defaultMessage = defaultMessage;
return this;
}
/**
* シート名を設定します。
* @param sheetName シート名
* @return 自身のインスタンス
*/
public FieldErrorBuilder sheetName(final String sheetName) {
this.sheetName = sheetName;
return this;
}
/**
* ラベルを設定します。
* <p>テーブル名やカラム名が設定します。</p>
* @param label ラベル
* @return 自身のインスタンス
*/
public FieldErrorBuilder label(final String label) {
this.label = label;
return this;
}
/**
* ラベルを設定します。
* <p>テーブル名やカラム名が設定します。</p>
* <p>値が存在する場合のみ設定されます。</p>
* @param label ラベル
* @return 自身のインスタンス
*/
public FieldErrorBuilder label(final Optional<String> label) {
label.ifPresent(l -> label(l));
return this;
}
/**
* セルのアドレス情報を設定します。
* @param address アドレス情報
* @return 自身のインスタンス
*/
public FieldErrorBuilder address(final CellPosition address) {
this.address = address;
return this;
}
/**
* セルのアドレス情報を設定します。
* <p>値が存在する場合のみ設定されます。</p>
* @param address アドレス情報
* @return 自身のインスタンス
*/
public FieldErrorBuilder address(final Optional<CellPosition> address) {
address.ifPresent(a -> address(a));
return this;
}
/**
* {@link FieldError}のインスタンスを組み立てる。
* @return {@link FieldError}のインスタンス
*/
public FieldError build() {
final FieldError error = new FieldError(objectName, field, conversionFailure, codes, variables);
error.setDefaultMessage(defaultMessage);
error.setSheetName(sheetName);
error.setLabel(label);
error.setRejectedValue(rejectedValue);
error.setAddress(address);
return error;
}
}