重複チェックバリデータを作成する

Wicket で、独自バリデータ作成は、単純に言えば、
AbstractValidator を継承して、onValidate メソッドをオーバライドして
その中で、検証される値を受け取りNGなら AbstractValidator の error メソッド
実行することである。

フォーム入力項目相互のチェック、重複入力のチェックは
独自バリデータが必要であろう。

// 重複チェックに使うMap はPageクラス内で宣言、生成する
Map<String,Object> validatorCheckMap = new HashMap<String,Object>();

// 重複チェック バリデータ
class DuplicateValidator extends AbstractValidator<String>{
   private Map<String,Object> checkMap;
   public DuplicateValidator(Map<String,Object> validatorCheckMap){
      this.checkMap = validatorCheckMap;
   }
   @Override
   protected void onValidate(IValidatable<String> validatable){

      String s = validatable.getValue();
      if (this.checkMap.containsKey(s)){
         Map<String,Object> vmap = new HashMap<String,Object>();
         vmap.put("DupliValue",s);
         error(validatable,"DuplicateInput",vmap);
      }else{
         this.checkMap.put(s,s);
      }
   }
}
// バリデータadd する時に、バリデータのコンストラクタ
// に渡すマップは、これを使って渡す。
// フィードバックが表示された後、次回検証でクリアする必要が
// あるので、フィードバック のonAfterRenderをオーバーライドした中で
// 呼べるようにする。

protected Map<String,Object> getValidatorCheckMap(){
   return this.validatorCheckMap;
}

---------- バリデーターの使用 ---------------
// フィードバック
final FeedbackPanel feedback = new FeedbackPanel("feedback"){
   @Override
   protected void onAfterRender(){
      super.onAfterRender();
      getValidatorCheckMap().clear();
}};
feedback.setOutputMarkupId(true);
add(feedback);

Form<Void> form = new Form<Void>("myform");

final TextField<String> data1 = new TextField<String>("data1",new Model<String>(""));
data1.add(new DuplicateValidator(getValidatorCheckMap()));
form.add(data1);

final  TextField<String>  data2 = new TextField<String>("data2",new Model<String>(""));
data2.add(new DuplicateValidator(getValidatorCheckMap()));
form.add(data2);

final  TextField<String>  data3 = new TextField<String>("data3",new Model<String>(""));
data3.add(new DuplicateValidator(getValidatorCheckMap()));
form.add(data3);


----------- プロパティファイルの中 -------------------
myform.data1 = テキスト1
myform.data1.DuplicateInput = ${label}の値 ${DupliValue} は、他の入力と重複してます!
myform.data2 = テキスト2
myform.data2.DuplicateInput = ${label}の値 ${DupliValue} は、他の入力と重複してます!
myform.data3 = テキスト3
myform.data3.DuplicateInput = ${label}の値 ${DupliValue} は、他の入力と重複してます!