MessageBuilder.java
- package com.github.mygreen.supercsv.localization;
- import java.lang.annotation.Annotation;
- import java.util.HashMap;
- import java.util.Map;
- import com.github.mygreen.supercsv.util.ArgUtils;
- /**
- * エラーメッセージを組み立てたりするためのユーティリティクラス。
- *
- * @since 2.0
- * @author T.TSUCHIE
- *
- */
- public class MessageBuilder {
-
- private static final MessageResolver MESSAGE_RESOLVER = new ResourceBundleMessageResolver("com.github.mygreen.supercsv.localization.Messages", false);
- private static final MessageInterpolator MESSAGE_INTERPOLATOR = new MessageInterpolator();
-
- private final String code;
-
- private Map<String, Object> vars = new HashMap<>();
-
- /**
- * メッセージコードを指定してインスタンスを作成します。
- * @param code メッセージコード
- * @throws NullPointerException code is null.
- * @throws IllegalArgumentException code is empty.
- */
- public MessageBuilder(final String code) {
- ArgUtils.notEmpty(code, "code");
- this.code = code;
- }
-
- /**
- * メッセージ変数を追加する。
- * @param key 変数名
- * @param value 値
- * @return 自身のインスタンス
- */
- public MessageBuilder var(final String key, final Object value) {
- vars.put(key, value);
- return this;
- }
-
- /**
- * メッセージ変数としてアノテーション名を追加する。
- * @param key 変数名
- * @param annoClass アノテーションのクラス名
- * @return 自身のインスタンス
- */
- public MessageBuilder varWithAnno(final String key, final Class<? extends Annotation> annoClass) {
- return var(key, "@" + annoClass.getSimpleName());
- }
-
- /**
- * メッセージ変数として、クラス名を追加する。
- * <p>クラス名は、FQCNの形式</p>
- * @param key 変数名
- * @param clazz クラスタイプ
- * @return 自身のインスタンス
- */
- public MessageBuilder varWithClass(final String key, final Class<?> clazz) {
-
- final String className;
- if(clazz.isArray()) {
- // 配列の場合
- Class<?> elementType = clazz.getComponentType();
- className = elementType.getName() + "[]";
-
- } else {
- className = clazz.getName();
-
- }
-
- return var(key, className);
- }
-
- /**
- * メッセージをフォーマットして値を取得します。
- * <p>変換したメッセージに対しても再帰的に処理しません。</p>
- * @return フォーマットしたメッセージ
- * @throws IllegalArgumentException 指定したメッセージコードが見つからない場合
- */
- public String format() {
-
- return format(false);
- }
-
- /**
- * メッセージをフォーマットして値を取得します。
- * @param recusrsive 変換したメッセージに対しても再帰的に処理するかどうか。
- * @return フォーマットしたメッセージ
- * @throws IllegalArgumentException 指定したメッセージコードが見つからない場合
- */
- public String format(final boolean recusrsive) {
-
- final String message = MESSAGE_RESOLVER.getMessage(code)
- .orElseThrow(() -> new IllegalStateException(String.format("not found message key=%s", code)));
-
- return MESSAGE_INTERPOLATOR.interpolate(message, vars, recusrsive, MESSAGE_RESOLVER);
- }
-
- /**
- * メッセージの組み立てを開始します。
- *
- * @param code メッセージコード。
- * @return メッセージを組み立てるためのクラス。
- */
- public static MessageBuilder create(final String code) {
-
- return new MessageBuilder(code);
-
- }
- }