MessageBuilder.java

  1. package com.github.mygreen.supercsv.localization;

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

  5. import com.github.mygreen.supercsv.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.github.mygreen.supercsv.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 NullPointerException code is null.
  26.      * @throws IllegalArgumentException code is empty.
  27.      */
  28.     public MessageBuilder(final String code) {
  29.         ArgUtils.notEmpty(code, "code");
  30.         this.code = code;
  31.     }
  32.    
  33.     /**
  34.      * メッセージ変数を追加する。
  35.      * @param key 変数名
  36.      * @param value 値
  37.      * @return 自身のインスタンス
  38.      */
  39.     public MessageBuilder var(final String key, final Object value) {
  40.         vars.put(key, value);
  41.         return this;
  42.     }
  43.    
  44.     /**
  45.      * メッセージ変数としてアノテーション名を追加する。
  46.      * @param key 変数名
  47.      * @param annoClass アノテーションのクラス名
  48.      * @return 自身のインスタンス
  49.      */
  50.     public MessageBuilder varWithAnno(final String key, final Class<? extends Annotation> annoClass) {
  51.         return var(key, "@" + annoClass.getSimpleName());
  52.     }
  53.    
  54.     /**
  55.      * メッセージ変数として、クラス名を追加する。
  56.      * <p>クラス名は、FQCNの形式</p>
  57.      * @param key 変数名
  58.      * @param clazz クラスタイプ
  59.      * @return 自身のインスタンス
  60.      */
  61.     public MessageBuilder varWithClass(final String key, final Class<?> clazz) {
  62.        
  63.         final String className;
  64.         if(clazz.isArray()) {
  65.             // 配列の場合
  66.             Class<?> elementType = clazz.getComponentType();
  67.             className = elementType.getName() + "[]";
  68.            
  69.         } else {
  70.             className = clazz.getName();
  71.            
  72.         }
  73.        
  74.         return var(key, className);
  75.     }
  76.    
  77.     /**
  78.      * メッセージをフォーマットして値を取得します。
  79.      * <p>変換したメッセージに対しても再帰的に処理しません。</p>
  80.      * @return フォーマットしたメッセージ
  81.      * @throws IllegalArgumentException 指定したメッセージコードが見つからない場合
  82.      */
  83.     public String format() {
  84.        
  85.         return format(false);
  86.     }
  87.    
  88.     /**
  89.      * メッセージをフォーマットして値を取得します。
  90.      * @param recusrsive 変換したメッセージに対しても再帰的に処理するかどうか。
  91.      * @return フォーマットしたメッセージ
  92.      * @throws IllegalArgumentException 指定したメッセージコードが見つからない場合
  93.      */
  94.     public String format(final boolean recusrsive) {
  95.        
  96.         final String message = MESSAGE_RESOLVER.getMessage(code)
  97.                 .orElseThrow(() -> new IllegalStateException(String.format("not found message key=%s", code)));
  98.        
  99.         return MESSAGE_INTERPOLATOR.interpolate(message, vars, recusrsive, MESSAGE_RESOLVER);
  100.     }
  101.    
  102.     /**
  103.      * メッセージの組み立てを開始します。
  104.      *
  105.      * @param code メッセージコード。
  106.      * @return メッセージを組み立てるためのクラス。
  107.      */
  108.     public static MessageBuilder create(final String code) {
  109.        
  110.         return new MessageBuilder(code);
  111.        
  112.     }
  113. }