CsvError.java

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);
        }
        
    }
    
}