MessageBuilder.java

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

  2. import java.lang.annotation.Annotation;
  3. import java.util.HashMap;
  4. import java.util.Map;

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

  6. /**
  7.  * エラーメッセージを組み立てたりするためのユーティリティクラス。
  8.  *
  9.  * @since 2.0
  10.  * @author T.TSUCHIE
  11.  *
  12.  */
  13. public class MessageBuilder {
  14.    
  15.     private static final MessageResolver MESSAGE_RESOLVER = new ResourceBundleMessageResolver("com.gh.mygreen.xlsmapper.localization.Messages", false);
  16.     private static final MessageInterpolator MESSAGE_INTERPOLATOR = new MessageInterpolator();
  17.    
  18.     private final String code;
  19.    
  20.     private Map<String, Object> vars = new HashMap<>();
  21.    
  22.     /**
  23.      * メッセージコードを指定してインスタンスを作成します。
  24.      * @param code メッセージコード
  25.      * @throws IllegalArgumentException {@literal code is null or empty.}
  26.      */
  27.     public MessageBuilder(final String code) {
  28.         ArgUtils.notEmpty(code, "code");
  29.         this.code = code;
  30.     }
  31.    
  32.     /**
  33.      * メッセージ変数を追加する。
  34.      * @param key 変数名
  35.      * @param value 値
  36.      * @return 自身のインスタンス
  37.      */
  38.     public MessageBuilder var(final String key, final Object value) {
  39.         vars.put(key, value);
  40.         return this;
  41.     }
  42.    
  43.     /**
  44.      * メッセージ変数として配列を追加する。
  45.      * @param key 変数名
  46.      * @param values 値
  47.      * @return 自身のインスタンス
  48.      */
  49.     public MessageBuilder varWithArrays(final String key, final Object... values) {
  50.         vars.put(key, values);
  51.         return this;
  52.     }
  53.    
  54.     /**
  55.      * メッセージ変数としてアノテーション名を追加する。
  56.      * @param key 変数名
  57.      * @param annoClass アノテーションのクラス名
  58.      * @return 自身のインスタンス
  59.      */
  60.     public MessageBuilder varWithAnno(final String key, final Class<? extends Annotation> annoClass) {
  61.         return var(key, "@" + annoClass.getSimpleName());
  62.     }
  63.    
  64.     /**
  65.      * メッセージ変数としてクラス名を追加する。
  66.      * <p>クラス名は、FQCNの形式</p>
  67.      * @param key 変数名
  68.      * @param clazz クラスタイプ
  69.      * @return 自身のインスタンス
  70.      */
  71.     public MessageBuilder varWithClass(final String key, final Class<?> clazz) {
  72.        
  73.         final String className;
  74.         if(clazz.isArray()) {
  75.             // 配列の場合
  76.             Class<?> elementType = clazz.getComponentType();
  77.             className = elementType.getName() + "[]";
  78.            
  79.         } else {
  80.             className = clazz.getName();
  81.            
  82.         }
  83.        
  84.         return var(key, className);
  85.     }
  86.    
  87.     /**
  88.      * メッセージ変数として列挙型を追加する。
  89.      * @param key 変数名
  90.      * @param enums 列挙型の要素
  91.      * @return 自身のタイプ
  92.      */
  93.     public MessageBuilder varWithEnum(final String key, final Enum<?> enums) {
  94.        
  95.         vars.put(key, enums.getClass().getSimpleName() + "#" + enums.name());
  96.         return this;
  97.        
  98.     }
  99.    
  100.     /**
  101.      * メッセージをフォーマットして値を取得します。
  102.      * <p>変換したメッセージに対しても再帰的に処理しません。</p>
  103.      * @return フォーマットしたメッセージ
  104.      * @throws IllegalArgumentException 指定したメッセージコードが見つからない場合
  105.      */
  106.     public String format() {
  107.        
  108.         return format(false);
  109.     }
  110.    
  111.     /**
  112.      * メッセージをフォーマットして値を取得します。
  113.      * @param recusrsive 変換したメッセージに対しても再帰的に処理するかどうか。
  114.      * @return フォーマットしたメッセージ
  115.      * @throws IllegalArgumentException 指定したメッセージコードが見つからない場合
  116.      */
  117.     public String format(final boolean recusrsive) {
  118.        
  119.         final String message = MESSAGE_RESOLVER.getMessage(code)
  120.                 .orElseThrow(() -> new IllegalStateException(String.format("not found message key=%s", code)));
  121.        
  122.         return MESSAGE_INTERPOLATOR.interpolate(message, vars, recusrsive, MESSAGE_RESOLVER);
  123.     }
  124.    
  125.     public static MessageBuilder create(final String code) {
  126.        
  127.         return new MessageBuilder(code);
  128.        
  129.     }
  130. }