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