package com.github.mygreen.supercsv.validation; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.Optional; import com.github.mygreen.supercsv.localization.MessageInterpolator; import com.github.mygreen.supercsv.localization.MessageResolver; /** * オブジェクトに対するエラーメッセージ。 * * @version 2.0 * @author T.TSUCHIE * */ public class CsvError implements Serializable { /** serialVersionUID */ private static final long serialVersionUID = -1561852232153053944L; /** * オブジェクト名 */ private final String objectName; /** * メッセージコード * <p>複数指定可能で、フォーマットする際に一致するメッセージのリソースが見つかるまで</p> */ private final String[] codes; /** * メッセージ中の変数。 */ private final Map<String, Object> variables; /** * デフォルトメッセージ。 * <p>指定したコードに対するメッセージが見つからない場合に、適用されるメッセージ。 */ private final String defaultMessage; public CsvError(final String objectName, final String[] codes, final Map<String, Object> variables, final String defaultMessaage) { this.objectName = objectName; this.codes = codes; this.variables = variables; this.defaultMessage = defaultMessaage; } /** * メッセージにフォーマットする。 * @param messageResolver * @param messageInterpolator * @return フォーマットされたメッセージ。 */ public String format(final MessageResolver messageResolver, final MessageInterpolator messageInterpolator) { for(String code : getCodes()) { Optional<String> message = messageResolver.getMessage(code); if(message.isPresent()) { return messageInterpolator.interpolate(message.get(), getVariables(), true, messageResolver); } } // デフォルトメッセージはBeanValidationのとき変数を追加している場合があるため、再度フォーマットする。 return messageInterpolator.interpolate(getDefaultMessage(), getVariables(), true, messageResolver); } /** * オブジェクト名の取得。 * @return Beanクラス名のパッケージ名を除いた値。 */ public String getObjectName() { return objectName; } /** * メッセージコードの候補を取得する。 * @return メッセージコードの候補。 */ public String[] getCodes() { return codes; } /** * メッセージ変数を取得する。 * @return メッセージをフォーマットする際に、その中で利用可能な変数。 */ public Map<String, Object> getVariables() { return variables; } /** * デフォルトメッセージを取得する。 * @return メッセージコードで指定したメッセージリソースが見つからない場合に適用されるメッセージ。 */ public String getDefaultMessage() { return defaultMessage; } public static final class Builder { private final String objectName; private final String[] codes; private Map<String, Object> variables = new HashMap<>(); private String defaultMessage; public Builder(final String objectName, final String[] codes) { this.objectName = objectName; this.codes = codes; } public Builder variables(final Map<String, Object> variables) { this.variables.putAll(variables); return this; } public Builder variables(final String key, final Object value) { this.variables.put(key, value); return this; } public Builder defaultMessage(final String defaultMessage) { this.defaultMessage = defaultMessage; return this; } public CsvError build() { return new CsvError(objectName, codes, variables, defaultMessage); } } }