validateWhen


ユーザガイド*1によると、validationで"requiredif"ではなく"validwhen"が推奨されるようだ。


使い方は簡単で、このように"=="で条件を書くことができる。

<field property="emailAddress" depends="validwhen">
      <arg0 key="userinfo.emailAddress.label"/>
        <var>
          <var-name>test</var-name>
          <var-value>((sendNewsletter == null) or (*this* != null))</var-value>
        </var>
      </field>


注意しなければならないのは、この条件を満たす時はチェックOKということで、決してNGの条件を書くわけではない。


"Aがnullではないならば、このフィールドもnullではない"ことのチェック

 ○:((A == null) or (*this* != null))
 ×:((A != null) and (*this* != null))


あー、情報処理試験でいつも飛ばしておく論理式だな、こりゃ。


しばし悩んだのがこのエラー。

line 1:50: expecting RPAREN, found 'and' at antlr.Parser.match(Parser.java:213)


原因は、こういうことらしい。

A few quick notes on the grammer.

  • All comparisons must be enclosed in parens.
  • Only two items may be joined with <code>and</code> or <code>or</code>
  • If both items to be compared are convertable to ints, a numeric comparison is done, otherwise a string comparison is done.

(((A == null) and (B == null) and (C == null)) or (*this* != null))

という記述はまかりならんということか。
正しい記述。

((((A == null) and (B == null)) and (C == null)) or (*this* != null))


・・・メンドクサ!