フィルタアドレスの検証ルールを実際に作っていこう。

検証コードの作成には柔軟性があるので、
簡単にクラスを用意することができるが、
Struts を介して利用するためには従うべきルールがある。

Struts では、エラーを ActionMessages で表現する。
Commons Validator には ValidatorResults クラスがあるが、
これは使わず ActionMessages に直接格納することになる。
なので、ActionMessages を引数として受け取る必要がある。

では、ルールの枠組みを作ってみよう。
最初は、常にエラーとなるようなルールとしておき、
ちゃんと呼び出されているかどうかを確認する

まずは、ルールクラスの実装だ。

========== FilterNetworkValidator.java ==========
package jp.loafer.test.validators;

import org.apache.commons.validator.Field;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

public class FilterNetworkValidator {

    public FilterNetworkValidator() {
    }

    public boolean execute(Object bean, Field field,
            ActionMessages messages) {

        String property = field.getProperty();

        // プロパティ値を取得
        String value =
                ValidatorUtils.getValueAsString(bean,
                        property);

        // 値を検証
        if (value == null || value.length() == 0 || validate(value))
            return true;

        // エラーメッセージの用意
        ActionMessage msg =
                new ActionMessage("値が正しくありません", false);

        // プロパティを指定してメッセージを追加
        messages.add(field.getKey(), msg);

        // 失敗
        return false;

    }
   
    private boolean validate(String value) {

        // TODO: 値を検証

        // 失敗
        return false;

    }


}
========== end of FilterNetworkValidator.java ==========

クラス名・メソッド名とも自由裁量なので、
FilterNetworkValidator#execute とする。
初期化するようなものはないのだが、
動作することを確認するため、インスタンスメソッドにした。

execute の引数は、現時点での必要最小限とした。
bean は検証対象の ActionForm (ValidatorForm)、
field は、<field> 要素の設定情報、
そして、messages がエラーメッセージを格納するクラス。

最初に、bean のプロパティを取得しなければならない。
プロパティ名は <field> 要素の property 属性なので、
field.getProperty() で取得できるが文字列である。

通常は、こういう用途に Commons BeanUtils を使うのだが、
Commons Validator には、値を文字列をして取得ための、
便利なユーティリティメソッドが用意されている。

ValidatorUtils#getValueAsString を呼び出すことで、
インスタンスのプロパティを文字列化したものが得られる。

後は、required ルールとの組み合わせを考え、
空文字列の場合は OK とし、true を返す。

それ以外の場合、ルールによる検証の処理が行われるので、
validate というメソッドを用意しておいた。
ここは後で実装するので、今回は無条件に不許可とした。

条件に適合しない場合は、エラーメッセージを用意する。
Struts の場合は、ActionMessage のインスタンスだ。

これを作るためには、<field> 要素の設定を読み取り、
色々と処理を行う必要があるのだが、
とりあえずは、「値が正しくありません」にしておいた。