概要
XMLデータ仕様記述は、以下のような構成となります。
各タグの概要を以下に示します。
タグ | 意味 |
---|---|
このXMLがXMLデータ仕様記述であることを表します。 | |
XMLデータ仕様記述の実行単位を表します。 | |
sectionタグで表現される仕様セクションの実行順や実行対象を、コンテントのvalidateタグで指定します。 | |
一連で実行される仕様記述です。仕様セクションとも言います。 |
sectionタグで表される仕様セクション内には、以下のタグでデータ仕様を記述します。各タグの動作はデータ仕様で説明します。
タグ | 意味 |
---|---|
項目の正当性チェックを行います。 | |
項目への値の代入を行います。 | |
条件が成立した場合のみデータ仕様を実行します。 | |
目間チェックのための、条件評価を行います。 | |
デシジョン表形式の項目間チェックを行います。 |
XMLデータ仕様記述は、specification要素の単位で実行されます。
specificationタグのコンテントの全てのsection要素が、記述順に実行されます。
controlタグのコンテントのvalidateタグで指定した順に、section要素が実行されます。
control要素を記述する場合は、仕様セクション実行時に以下の指定ができます。
内部変数名を用いて、仕様セクション名を間接的に指定することができます。
nodeアトリビュートにより、データBeanの下の階層のBeanに対してチェック、代入を行うことができます。
nodeアトリビュートに、"*配列のプロパティ名"と指定することにより、配列の各要素に対して繰り返し仕様セクションを実行することができます。
XMLデータ仕様記述の実行に利用するESpecValidatorクラスのvalidateメソッドには、データBeanを1個指定するメソッドと、2個指定するメソッドが準備されています。
入力元、代入先とも、指定したデータBeanが利用されます。
入力には1個目のデータBeanが利用され、代入先は2個目のデータBeanとなります。データ仕様のタグのtargetアトリビュートが、代入操作を表します。
データ仕様
データ仕様を記述するタグの典型的な例として、termタグの動作を説明します。
<term property="value" op="NE" operand="0" ... 条件アトリビュート value="#true" target="t_value" ... 結果アトリビュート />
この例は、データBeanのプロパティvalueの値が0でない場合に、値trueをデータBeanのプロパティt_valueに設定するという動作をします。
このように、データ仕様を記述するタグは、ある条件の場合に、どういう動作をするという形で記述します。特にタグのアトリビュートで条件や結果を記述する場合、これらのアトリビュートを条件アトリビュート、結果アトリビュートと言います。
各タグの動作は以下のようになります。
タグ | 条件アトリビュート | 結果アトリビュート | 備考 |
---|---|---|---|
○ | ○ | 条件が偽の場合に結果を実行 | |
○ | ○ | 条件が真の場合に結果を実行 | |
○ | - | 条件が真の場合にコンテントのデータ仕様を実行 | |
○ | - | 条件の評価結果を一時的に保持 | |
- | ○ | コンテントのstatusタグで指定された条件が全て真の場合に、結果を実行 |
valueタグは、真偽の判定結果をseqで指定されたシーケンス番号と対応付けて保持します。decisionタグのコンテントのstatusタグのアトリビュートでは、シーケンス番号と真偽値を記述します。
decisionタグのコンテントの全てのstatusタグについて、statusタグで指定したシーケンス番号と真偽値がvalueタグで保持されている真偽値と一致する場合に、decisionタグの条件が成立し、結果アトリビュートで指定した動作が実行されます。
条件アトリビュートは、以下のように動作します。
アトリビュート名 | 動作 | 結果を格納する予約オブジェクト | 省略時の動作 |
---|---|---|---|
property | 指定に従って、Beanのプロパティ値や定数値を取得します。 | (なし) | nullとなります。 |
function | propertyアトリビュートの結果の値を引数として指定のメソッドを呼び出し、復帰値を値とします。 | %function | propertyアトリビュートの結果の値。 |
operand | 指定に従って、Beanのプロパティ値や定数値を取得します。 | (なし) | nullとなります。 |
op | property、functionアトリビュートの結果(%functionで表される値)とoperandアトリビュートの結果との間で指定の演算をします。operandの型は演算前に%functionに合わせて変換されます。演算の結果は%resultに格納されます。 | %result | バージョン6.0では、%functionの値となります。旧バージョンについては“仕様記述バージョン”を参照してください。 |
(条件判定) | opアトリビュートで指定した演算が関係演算の場合は、関係演算の結果によって以降の動作が決定されます。関係演算でない場合は、真として以降の動作が決定されます。 | (なし) | この判定は記述に関係なく実行されます。旧バージョンは“仕様記述バージョン”を参照してください。 |
seq | 連続したデータ仕様の同じタグで同じシーケンス番号を記述した場合は、各タグのいずれかの条件が成立した場合に条件の評価が真となります。結果アトリビュートがある場合には、最後の行のアトリビュートが有効となります。 | (なし) | 独立したシーケンス番号として処理されます。 |
シーケンス番号(seq)は以下のように利用します。
<verify seq="1" property="prop1" op="EQ" operand="#2" /> <verify seq="1" property="prop1" op="EQ" operand="#3" exception="#E001" info="#2又は3が正しい" />
"prop1が2と等しい"、"prop1が3と等しい"が同じシーケンス番号となっていて、いずれかが成立すると真になります。verifyタグの場合はprop1の値が2と3のいずれでもない場合に例外となります。
結果アトリビュートは、以下のように動作します。
アトリビュート名 | 動作 | 結果を格納する予約オブジェクト | 省略時の動作 |
---|---|---|---|
value | 指定に従って、Beanのプロパティ値や定数値を取得します。 | (なし) | 条件部分の処理結果(%result)となります。 |
valueFunction | valueアトリビュートの結果の値を引数として指定のメソッドを呼び出し、復帰値を値とします。 | %valueFunction | valueアトリビュートの結果の値。 |
target | 指定に従って、Beanのプロパティに値を書き込みます。 | (なし) | 値の代入を行いません。 |
result | 指定に従って、Beanのプロパティ値や定数値を取得し、ESpecValidatorクラスのvalidateメソッドの復帰値とします。最後に実行した値が有効です。 | (なし) | 一度もresultアトリビュートが実行されない場合、nullとなります。 |
exception | 例外ESpecResultExceptionを発生し、XMLデータ仕様記述の実行を中断します。指定の値がESpecResultExceptionのgetStatusTextメソッドで参照されます。 | (なし) | 例外を発生しません。 |
error | 例外ESpecResultExceptionをエラー情報として蓄積します。XMLデータ仕様記述の実行は継続します。指定の値がESpecResultExceptionのgetStatusTextメソッドで参照されます。 | (なし) | エラー情報を蓄積しません。 |
info | exception、errorアトリビュートの結果の例外ESpecResultExceptionに、値を付加情報として追加します。ESpecResultExceptionのgetInfoメソッドで参照されます。 | (なし) | 付加情報をnullとします。 |
以下の記述は対応転記を表します。
<term property="prop1*" target="prop2*" />
上記の例では、prop1で表されるBeanとprop2で表されるBeanに対して、同じ名前のプロパティがあれば、prop1側の値をprop2側へ代入します。
termタグのみ有効です。
property、target以外のアトリビュートは記述できません。
"*"のみ記述するとデータBeanそのものが対象となります。
HashMapおよびXMLデータBeanに対しても利用できます。代入先に同名のエントリが存在する必要があります。
対応転記の記述はバージョン6.0でのみ有効です。
アトリビュートの記述
名標は、仕様記述名、仕様セクション名、内部変数名など、名前そのものを表します。
特別な名標として、真偽値("true"、"false")があります。
プロパティ指定は、データBean中の特定のプロパティを指定する名前です。 "/"によって階層構造を表します。データBeanの形式によって、以下のように利用されます。
プロパティの指定aaa/bbb/cccは、データBeanのgetメソッドgetAaa().getBbb().getCcc()で得られる値を表します。また、代入対象として記述した場合は、データBeanに対してgetAaa().getBbb().setCcc(value)の動作となります。
プロパティはXPathとして扱われ、XMLデータBean内の一つの値(エントリ)を指す必要があります。XPath特有の、例えば"aaa[1]/bbb[@type='xxx']/@ccc"といった記述も可能です。
Mapインタフェースのキー名を表し、キーに対応付けられた値(エントリ)を表します。プロパティの指定aaa/bbb/cccは、get("aaa").get("bbb").get("ccc")の動作となります。
定数には以下の種類があります。
"#abc"のように、"#"を先頭に付加した文字列を指定します。カンマを記述する場合は、カンマ2個(",,")を記述します。
"123"のような数字の並びは、long型の定数となります。記述方法の詳細はJavaのリファレンスjava.lang.Long#parseLong(String)を参照してください。
数字の並びに小数点などを含む場合は、double型の定数となります。記述方法の詳細はJavaのリファレンスjava.lang.Double#parseDouble(String)を参照してください。
予約オブジェクトは、特定の定数値や、XMLデータ仕様記述の実行中に自動的に設定される値を表します。以下の予約オブジェクトがあります。
オブジェクト名 | 意味 |
---|---|
%function | 条件アトリビュートで、propertyの値にfunctionで指定されたメソッドを適用したあとの値を示します。 |
%result | 条件アトリビュートで、演算を行った結果の値を示します。 |
%valueFunction | 結果アトリビュートで、valueの値にvalueFunctionで指定されたメソッドを適用したあとの値を示します。 |
%null | null値を表します。 |
%empty | 空文字列を表します。 |
%notExisting | XMLデータBeanやHashMapにおいて、エントリがない(指定のプロパティに対する値が設定されていない)ことを表します。 |
%root | validateメソッドが呼び出された時に指定された入力のデータBeanを表します。 |
%targetRoot | validateメソッドが呼び出された時に指定された出力のデータBeanを表します。 |
内部変数指定は、内部変数名の先頭に"^"を付加して、"^tempValue"のように記述します。
プロパティ指定、定数、予約オブジェクト、内部変数指定のいずれか、またはそれをカンマ(",")で区切って並べたもの(配列形式)をオブジェクト式と言います。配列形式の例として、"#abc,#123,0"は、文字列"abc"、文字列"123"、Long値0のオブジェクト配列となります。
メソッド指定には、ビルトインメソッドの指定、利用者定義メソッドの指定、仕様記述の呼び出し指定があります。
以下のメソッドがあります。
ビルトインメソッド | 意味 |
---|---|
int、long、double | 値を指定の型に変換します。変換できない場合は結果は0となります。値がnullの場合は結果はnullとなります。 |
checkFormat(type) | 値を指定の型に変換できるかどうか判定します。typeにはint、long、doubleのいずれかを指定します。値が変換できない文字を含む場合および、空やnullの場合に偽となります。 |
boolean | 論理値型に変換します。Stringから変換する場合は"true"を真、数値型から変換する場合は0以外を真とします。値がnullの場合は偽となります。 |
String | 値を文字列型に変換します。toStringメソッドに従います。値がnullの場合は結果もnullとなります。 |
stringLength | 文字列長を返します。値が文字列でない場合は、文字列型に変換したあとの文字列長となります。値がnullの場合は0となります。 |
enum(n,m,...) | 値がn,m,...のいずれかに一致する場合に真を返します。n,m,...は配列形式のオブジェクト式です。 |
pattern(re) | 値がreで表す正規表現に一致する場合に真を返します。 |
match | 値が配列形式のオブジェクト式の場合、その全てが同じであれば真となります。配列の先頭要素の型に従って比較されます。 |
errorcount | プロパティの値とは無関係に、errorアトリビュートで蓄積されたエラー情報の数を返します。 |
ビルトインメソッドpatternには、以下の注意事項があります。
正規表現中に補助文字を含めることはできません。
文字列を正規表現とマッチさせる際、文字列中に補助文字が含まれている場合は、その補助文字は1文字としては扱われず、2文字として扱われます。
利用者定義メソッドは以下のいずれかの形で指定します。
指定形式 | 意味 |
---|---|
?package.class.method | static形式の利用者定義メソッドを指定します。任意のクラスのstaticメソッドを記述します。 |
?method | 継承形式の利用者定義メソッドを指定します。ESpecValidatorクラスを継承したクラス内にメソッドを実装します。 |
利用者定義メソッドの引数がObject[]の場合、値を配列形式オブジェクト式としてそのまま渡します。そうでない場合は、オブジェクト式の各要素が利用者定義メソッドの引数の型に合わせて変換されます。
仕様記述名を指定します。プロパティの値の配列形式オブジェクト式が、呼び出し先データ仕様のparamアトリビュートに従って、内部変数として渡されます。復帰値はresultアトリビュートで指定します。
以下の例は、データ仕様checkValueからメソッドとしてデータ仕様checkfuncを呼び出します。checkfuncのparamの記述に従って、prop1の値がaa、"1"がbbにそれぞれ設定され、データ仕様内で"^aa"のように参照できます。resultアトリビュートで指定している"true"が復帰値となります。
<eSpec xmlns="http://interstage.fujitsu.com/schemas/uji/eSpec" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/eSpec http://interstage.fujitsu.com/schemas/uji/espec.xsd"> <specification name="checkValue"> <section> <verify property="prop1,#1" function="checkfunc" op="EQ" operand="#true" ... /> ... </section> </specification> <specification name="checkfunc" param="aa,bb" > <section> <term property="^aa" op="EQ" operand="%null" result="#true" /> ... </section> </specification> </eSpec>
仕様記述名とビルトインメソッド名が同名の場合は、仕様記述が優先されます。
正規表現では以下の記法が使用できます。
設定方法 | 意味 |
---|---|
Aなど | 1文字を表します。 |
[ABC] | 指定中の1文字を表します。 |
[^ABC] | 指定以外の1文字を表します。 |
[A-C] | 範囲中の1文字を表します。 |
(A|B) | AまたはBの1文字を表します。 |
^ | 文字列の先頭を表します。 |
$ | 文字列の終端を表します。 |
. | 任意の1文字を表します。 |
? | 直前の文字グループが省略可能であることを表します。 |
* | 直前の文字グループが0回以上出現可能であることを表します。 |
+ | 直前の文字グループが1回以上出現可能であることを表します。 |
{n} | 直前の文字グループがn回出現することを表します。 |
{n,m} | 直前の文字グループがn回以上m回以下出現することを表します。 |
\記号 | その記号1文字を表します。特別な意味を持つ記号[]?*+{}.-に対して使用します。 |
\\ | \記号1文字を表します。 |
文字コードを指定する場合にはXMLのエンティティ記述(例: ァ)が利用できます。
演算指定には以下が記述できます。
分類 | 記述 | 意味 |
---|---|---|
関係演算 | GT | propertyとfunctionの評価値が、operandの評価値より大きい場合に真となります。 |
GE | propertyとfunctionの評価値が、operandの評価値以上の場合に真となります。 | |
LT | propertyとfunctionの評価値が、operandの評価値より小さい場合に真となります。 | |
LE | propertyとfunctionの評価値が、operandの評価値以下の場合に真となります。 | |
EQ | propertyとfunctionの評価値が、operandの評価値と等しい場合に真となります。 | |
NE | propertyとfunctionの評価値が、operandの評価値と等しくない場合に真となります。 | |
算術演算 | ADD | propertyとfunctionの評価値と、operandの評価値を加えた値を持ちます。 |
SUB | propertyとfunctionの評価値から、operandの評価値を減じた値を持ちます。 | |
MUL | propertyとfunctionの評価値に、operandの評価値を乗じた値を持ちます。 | |
DIV | propertyとfunctionの評価値を、operandの評価値で割った値を持ちます。 | |
REM | propertyとfunctionの評価値を、operandの評価値で割った時の剰余値を持ちます。 |
演算は、propertyとfunctionの評価値の型に合わせて行われます。以下の例は異なる結果となります。
<verify property="#10" function="String" op="GT" operand="#2" ... /> <!-- 文字列比較では2が大きい --> <verify property="#10" function="int" op="GT" operand="#2" ... /> <!-- 数値比較では10が大きい -->
仕様記述バージョン
XMLデータ仕様記述には、バージョン5.0とバージョン6.0があります。バージョンは、versionタグで指定します。
以下にバージョンの違いによる動作の差異を説明します。
以下の差異があります。
バージョン | 動作 | 結果の値 | 条件判定 |
---|---|---|---|
6.0 | opアトリビュート省略時は何もしません。 | %resultの値はproperty、functionアトリビュートの評価値となります。 | 真となります。 |
5.0 | property、functionアトリビュートの評価値をnullと比較します。 | 評価値をnullと比較し、一致していない場合は真、一致する場合は偽を%resultに設定します。 | 比較結果の%resultの値が条件となります。 |
バージョン5.0からバージョン6.0に移行する場合、判定および代入する値を明に記述する必要があります。
verify、term、block、valueの各タグで、opアトリビュートを省略している場合
判定および代入する値を明に記述する
<!-- null判定 --> <verify property="prop1" exception="#ERR01" /> ↓ <verify property="prop1" op="NE" operand="%null" exception="#ERR01" /> <!-- メソッド --> <verify property="prop1" function="pattern([0-9]+)" exception="#ERR01" /> ↓ <verify property="prop1" function="pattern([0-9]+)" op="EQ" operand="#true" exception="#ERR01" /> <!-- 代入 --> <term property="prop1" target="targetProp" /> ↓ <term property="prop1" op="NE" operand="%null" value="#true" target="targetProp" />
対応転記の記述は、バージョン6.0でのみ有効です。