FieldErrorBuilder.java

  1. package com.gh.mygreen.xlsmapper.validation;

  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Optional;

  5. import com.gh.mygreen.xlsmapper.util.CellPosition;

  6. /**
  7.  * {@link FieldError}のインスタンスを組み立てるビルダ。
  8.  *
  9.  * @version 2.0
  10.  * @author T.TSUCHIE
  11.  *
  12.  */
  13. public class FieldErrorBuilder {
  14.    
  15.     private final String objectName;
  16.    
  17.     private final String field;
  18.    
  19.     private final String[] codes;
  20.    
  21.     private Object rejectedValue;
  22.    
  23.     private boolean conversionFailure;
  24.    
  25.     private Map<String, Object> variables = new HashMap<>();
  26.    
  27.     private String defaultMessage;
  28.    
  29.     private String sheetName;
  30.    
  31.     private String label;
  32.    
  33.     private CellPosition address;
  34.    
  35.     /**
  36.      * ビルダのインスタンスを作成します
  37.      * @param objectName オブジェクト名
  38.      * @param field フィールド名。ネストしている場合は、親のパスを付与した形式(e.g. person.name)で指定します。
  39.      * @param codes メッセージコード。複数指定可能で、先頭にあるものほど優先度が高い。
  40.      */
  41.     public FieldErrorBuilder(final String objectName, final String field, final String[] codes) {
  42.         this.objectName = objectName;
  43.         this.field = field;
  44.         this.codes = codes;
  45.     }
  46.    
  47.     /**
  48.      * エラートとなったフィールドの値を設定します。
  49.      * @param rejectedValue エラー元の値
  50.      * @return 自身のインスタンス
  51.      */
  52.     public FieldErrorBuilder rejectedValue(final Object rejectedValue) {
  53.         this.rejectedValue = rejectedValue;
  54.         return this;
  55.     }
  56.    
  57.     /**
  58.      * 型変換エラーかどうかを設定します。
  59.      * @param conversionFailure trueの場合、型変換エラー
  60.      * @return 自身のインスタンス
  61.      */
  62.     public FieldErrorBuilder conversionFailure(final boolean conversionFailure) {
  63.         this.conversionFailure = conversionFailure;
  64.         return this;
  65.     }
  66.    
  67.     /**
  68.      * メッセージ中の変数を追加します。
  69.      * @param variables 変数のマップ
  70.      * @return 自身のインスタンス
  71.      */
  72.     public FieldErrorBuilder variables(final Map<String, Object> variables) {
  73.         this.variables.putAll(variables);
  74.         return this;
  75.     }
  76.    
  77.     /**
  78.      * メッセージ中の変数を追加します。
  79.      * @param key 変数のキー名
  80.      * @param value 変数の値
  81.      * @return 自身のインスタンス
  82.      */
  83.     public FieldErrorBuilder variables(final String key, final Object value) {
  84.         this.variables.put(key, value);
  85.         return this;
  86.     }
  87.    
  88.     /**
  89.      * デフォルトメッセージを設定します。
  90.      * <p>指定したコードに対するメッセージが見つからない場合に、適用されるメッセージ。</p>
  91.      * @param defaultMessage デフォルトメッセージ
  92.      * @return 自身のインスタンス
  93.      */
  94.     public FieldErrorBuilder defaultMessage(final String defaultMessage) {
  95.         this.defaultMessage = defaultMessage;
  96.         return this;
  97.     }
  98.    
  99.     /**
  100.      * シート名を設定します。
  101.      * @param sheetName シート名
  102.      * @return 自身のインスタンス
  103.      */
  104.     public FieldErrorBuilder sheetName(final String sheetName) {
  105.         this.sheetName = sheetName;
  106.         return this;
  107.     }
  108.    
  109.     /**
  110.      * ラベルを設定します。
  111.      * <p>テーブル名やカラム名が設定します。</p>
  112.      * @param label ラベル
  113.      * @return 自身のインスタンス
  114.      */
  115.     public FieldErrorBuilder label(final String label) {
  116.         this.label = label;
  117.         return this;
  118.     }
  119.    
  120.     /**
  121.      * ラベルを設定します。
  122.      * <p>テーブル名やカラム名が設定します。</p>
  123.      * <p>値が存在する場合のみ設定されます。</p>
  124.      * @param label ラベル
  125.      * @return 自身のインスタンス
  126.      */
  127.     public FieldErrorBuilder label(final Optional<String> label) {
  128.         label.ifPresent(l -> label(l));
  129.         return this;
  130.     }
  131.    
  132.     /**
  133.      * セルのアドレス情報を設定します。
  134.      * @param address アドレス情報
  135.      * @return 自身のインスタンス
  136.      */
  137.     public FieldErrorBuilder address(final CellPosition address) {
  138.         this.address = address;
  139.         return this;
  140.     }
  141.    
  142.     /**
  143.      * セルのアドレス情報を設定します。
  144.      * <p>値が存在する場合のみ設定されます。</p>
  145.      * @param address アドレス情報
  146.      * @return 自身のインスタンス
  147.      */
  148.     public FieldErrorBuilder address(final Optional<CellPosition> address) {
  149.         address.ifPresent(a -> address(a));
  150.         return this;
  151.     }
  152.    
  153.     /**
  154.      * {@link FieldError}のインスタンスを組み立てる。
  155.      * @return {@link FieldError}のインスタンス
  156.      */
  157.     public FieldError build() {
  158.        
  159.         final FieldError error = new FieldError(objectName, field, conversionFailure, codes, variables);
  160.         error.setDefaultMessage(defaultMessage);
  161.         error.setSheetName(sheetName);
  162.         error.setLabel(label);
  163.         error.setRejectedValue(rejectedValue);
  164.         error.setAddress(address);
  165.        
  166.         return error;
  167.     }
  168.    
  169. }