All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.fw.web.message.ErrorMessages Maven / Gradle / Ivy

package nablarch.fw.web.message;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import nablarch.core.message.ApplicationException;
import nablarch.core.message.Message;
import nablarch.core.validation.ValidationResultMessage;

/**
 * エラーメッセージを保持するクラス。
 *
 * @author Hisaaki Sioiri
 */
public class ErrorMessages {

    /** 空のインスタンス */
    private static final ErrorMessages EMPTY_INSTANCE = new ErrorMessages();

    /** 全てのメッセージのリスト */
    private final List allMessages = new ArrayList();

    /** グローバルなメッセージのリスト */
    private final List globalMessages = new ArrayList();

    /** プロパティ名に紐づくメッセージを保持するオブジェクト **/
    private final PropertyMessages propertyMessages = new PropertyMessages();

    /**
     * {@link ApplicationException}からオブジェクトを構築する。
     *
     * @param applicationException エラーメッセージを持つアプリケーション例外
     */
    public ErrorMessages(final ApplicationException applicationException) {
        for (final Message message : applicationException.getMessages()) {
            final String messageText = message.formatMessage();

            // 全てのメッセージ
            allMessages.add(messageText);

            if (message instanceof ValidationResultMessage) {
                // プロパティに紐づくメッセージ
                propertyMessages.addMessage(((ValidationResultMessage) message).getPropertyName(), messageText);
            } else {
                // プロパティに紐付かないグローバルなメッセージ
                globalMessages.add(messageText);
            }
        }
    }

    /**
     * 空の{@link ErrorMessages}を構築するコンストラクタ。
     */
    private ErrorMessages() {
        //nop
    }

    /**
     * 空の{@link ErrorMessages}インスタンスを返す。
     * {@link nablarch.fw.web.handler.HttpErrorHandler HttpErrorHandler}から使用されることを想定。
     * 
     * @return 空のインスタンス
     */
    public static ErrorMessages empty() {
        return EMPTY_INSTANCE;
    }

    /**
     * プロパティ名に対応したメッセージを返す。
     * 

* プロパティ名に対応したメッセージが複数存在した場合には、最後に追加されたものを返す。 * プロパティ名に対応したメッセージが存在しない場合は、{@code null}を返す。 * * @param propertyName プロパティ名 * @return プロパティ名に対応したメッセージ(存在しない場合は{@code null}) */ public String getMessage(final String propertyName) { verifyPropertyName(propertyName); return propertyMessages.getMessage(propertyName); } /** * 指定されたプロパティ名に対応したエラーがあるかを返す。 * * @param propertyName プロパティ名 * @return プロパティ名に対応したエラーがある場合は{@code true} */ public boolean hasError(final String propertyName) { verifyPropertyName(propertyName); return propertyMessages.contains(propertyName); } /** * プロパティ名の検証を行う。 *

* プロパティ名が{@code null}の場合は、{@link IllegalArgumentException}を送出する。 * * @param propertyName プロパティ名 */ private void verifyPropertyName(final String propertyName) { if (propertyName == null) { throw new IllegalArgumentException("propertyName is null."); } } /** * プロパティに対応したメッセージをすべて返す。 * * @return プロパティ対応したメッセージのリスト */ public List getPropertyMessages() { return Collections.unmodifiableList(propertyMessages.messages); } /** * グローバルなメッセージ(プロパティに紐付かないメッセージ)をすべて返す。 * * @return グローバルなメッセージのリスト */ public List getGlobalMessages() { return Collections.unmodifiableList(globalMessages); } /** * 全てのメッセージを返す。 * * @return 全てのメッセージのリスト */ public List getAllMessages() { return Collections.unmodifiableList(allMessages); } /** * プロパティに紐づくメッセージを保持するクラス。 */ private static class PropertyMessages { /** メッセージのリスト */ private final List messages = new ArrayList(); /** プロパティ名とメッセージ */ private final Map messageIndex = new HashMap(); /** * プロパティ名に対応したメッセージを追加する。 * * @param propertyName プロパティ名 * @param messageText メッセージテキスト */ private void addMessage(final String propertyName, final String messageText) { messages.add(messageText); messageIndex.put(propertyName, messages.size() - 1); } /** * プロパティ名に対応したメッセージを返す。 * * @param propertyName プロパティ名 * @return プロパティ名に対応したメッセージ */ private String getMessage(final String propertyName) { final Integer index = messageIndex.get(propertyName); return index != null ? messages.get(index) : null; } /** * プロパティ名に対応したメッセージを含むかどうかを判定する。 * * @param propertyName プロパティ名 * @return 指定されたプロパティ名を含む場合{@code true} */ private boolean contains(final String propertyName) { return messageIndex.containsKey(propertyName); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy