callメソッドでは、最初にXPath関数の引数をチェックします。XPath関数の引数が正しくない場合、つまり開発者がXPath関数の記述をまちがえた場合は、例外ValueExceptionをスローします。例外をスローすることで、XVCD 開発者がXPath関数の使い方をまちがえたときときに、エラーダイアログボックスが表示されます。
XPath関数の引数には、次の2とおりのチェックをします。
-
引数の数のチェック
引数の数のチェックは、すべてのXPath関数で共通しています。
-
引数の値のチェック
引数の値のチェック内容は、それぞれのXPath関数ごとに異なります。
引数の数をチェックするために、FunctionUtilityクラスにメソッドを用意してます。FunctionUtilityクラスは、XPath関数を実装するときに役立つ便利なメソッドを集めたクラスです。引数の数をチェックするときは、FunctionUtilityクラスのcheckCountメソッドを使います。checkCountメソッドの仕様は、次のとおりです。なお、IllegalArgumentCountExceptionはValueExceptionクラスから派生した例外クラスです。
/**
* 関数引数の個数をチェックして、不正な場合、例外をスローする。
* @param args 関数引数
* @param expectCount 期待する個数
* @throws IllegalArgumentCountException 引数個数が不正な場合
*/
public static void checkCount( Context context, Arguments args, int expectCount )
throws IllegalArgumentCountException;
/**
* 関数引数の個数をチェックして、不正な場合、例外をスローする。
* @param args 関数引数
* @param expectMinCount 期待する最小個数
* @param expectMaxCount 期待する最大個数
* @throws IllegalArgumentCountException 引数個数が不正な場合
*/
public static void checkCount( Context context, Arguments args,
int expectMinCount, int expectMaxCount )
throws IllegalArgumentCountException;
/**
* 関数引数の個数をチェックして、不正な場合、例外をスローする。
* @param args 関数引数
* @param expectMinCount 期待する最小個数
* @throws IllegalArgumentCountException 引数個数が不正な場合
*/
public static void checkMinCount( Context context, Arguments args, int expectMinCount )
throws IllegalArgumentCountException;
XPath関数の引数の数をチェックしたら、続いて、必要に応じて個々の引数の値をチェックします。引数の値をチェックする必要があるのは、例えば次のような場合です。
- 特定の書式に従った文字列だけを、XPath関数の引数として受け付ける場合
- 引数に指定できる数値に、上限や下限がある場合
XPath関数example:hello-world()とexample:hello()で実際に引数をチェックする例を、次に示します。
/** example:hello-world() */
public class HelloWorldFunction implements Function{
public Value call(Arguments args, Context context) throws ValueException {
// 関数引数の個数チェック
FunctionUtility.checkCount(context, args, 0);
:
}
}
/** example:hello(string) */
public class HelloFunction implements Function {
public Value call(Arguments args, Context context) throws ValueException {
// 関数引数の個数チェック
// example:hello(string) は引数 1 個
FunctionUtility.checkCount(context, args, 1);
:
}
}