ページの先頭行へ戻る
 Apcoordinator定義ファイルリファレンス
FUJITSU Software

4.1 XMLデータ仕様記述について

概要

XMLデータ仕様記述の構成

XMLデータ仕様記述は、以下のような構成となります。

各タグの概要を以下に示します。

タグ

意味

eSpec

このXMLがXMLデータ仕様記述であることを表します。

config

XMLデータ仕様記述の情報を記述します。
コンテントには、versionタグ、debugタグを記述します。

specification

XMLデータ仕様記述の実行単位を表します。
ESpecValidatorクラスのvalidateメソッドで実行される範囲です。

control

sectionタグで表現される仕様セクションの実行順や実行対象を、コンテントのvalidateタグで指定します。

section

一連で実行される仕様記述です。仕様セクションとも言います。

sectionタグで表される仕様セクション内には、以下のタグでデータ仕様を記述します。各タグの動作はデータ仕様で説明します。

タグ

意味

verify

項目の正当性チェックを行います。

term

項目への値の代入を行います。

block

条件が成立した場合のみデータ仕様を実行します。

value

目間チェックのための、条件評価を行います。

decision

デシジョン表形式の項目間チェックを行います。
コンテントのstatusタグで条件を表します。

仕様セクションの実行順

XMLデータ仕様記述は、specification要素の単位で実行されます。

control要素を記述しない場合

specificationタグのコンテントの全てのsection要素が、記述順に実行されます。

control要素を記述した場合

controlタグのコンテントのvalidateタグで指定した順に、section要素が実行されます。

control要素を記述する場合は、仕様セクション実行時に以下の指定ができます。

仕様セクション名の間接指定

内部変数名を用いて、仕様セクション名を間接的に指定することができます。

データBeanの一部に対して仕様セクションを実行

nodeアトリビュートにより、データBeanの下の階層のBeanに対してチェック、代入を行うことができます。

配列に対して仕様セクションを実行

nodeアトリビュートに、"*配列のプロパティ名"と指定することにより、配列の各要素に対して繰り返し仕様セクションを実行することができます。

処理対象のデータBean

XMLデータ仕様記述の実行に利用するESpecValidatorクラスのvalidateメソッドには、データBeanを1個指定するメソッドと、2個指定するメソッドが準備されています。

データBeanを1個指定した場合

入力元、代入先とも、指定したデータBeanが利用されます。

データBeanを2個指定した場合

入力には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に設定するという動作をします。

このように、データ仕様を記述するタグは、ある条件の場合に、どういう動作をするという形で記述します。特にタグのアトリビュートで条件や結果を記述する場合、これらのアトリビュートを条件アトリビュート、結果アトリビュートと言います。

各タグの動作は以下のようになります。

タグ

条件アトリビュート

結果アトリビュート

備考

verify

条件が偽の場合に結果を実行

term

条件が真の場合に結果を実行

block

条件が真の場合にコンテントのデータ仕様を実行

value

条件の評価結果を一時的に保持

decision

コンテントのstatusタグで指定された条件が全て真の場合に、結果を実行

decisionの判定

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

連続したデータ仕様の同じタグで同じシーケンス番号を記述した場合は、各タグのいずれかの条件が成立した場合に条件の評価が真となります。結果アトリビュートがある場合には、最後の行のアトリビュートが有効となります。

(なし)

独立したシーケンス番号として処理されます。
blockタグでは記述できません。valueタグでは省略できません。

シーケンス番号(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のプロパティに値を書き込みます。
HashMapおよびXMLデータ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の形式によって、以下のように利用されます。

一般のデータBean

プロパティの指定aaa/bbb/cccは、データBeanのgetメソッドgetAaa().getBbb().getCcc()で得られる値を表します。また、代入対象として記述した場合は、データBeanに対してgetAaa().getBbb().setCcc(value)の動作となります。

XMLデータBean

プロパティはXPathとして扱われ、XMLデータBean内の一つの値(エントリ)を指す必要があります。XPath特有の、例えば"aaa[1]/bbb[@type='xxx']/@ccc"といった記述も可能です。

HashMap

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となります。
補助文字の数え方を初期化パラメタuji.espec.awareOfSupplementaryCharで設定できます。初期化パラメタの詳細は、“Apcoordinatorユーザーズガイド”を参照してください。

enum(n,m,...)

値がn,m,...のいずれかに一致する場合に真を返します。n,m,...は配列形式のオブジェクト式です。
enum(#a,#b,#c)は、値が"a"、"b"、"c"いずれかの場合に真となります。

pattern(re)

値がreで表す正規表現に一致する場合に真を返します。
pattern([0-9]+)は、値が数字のみの文字列の場合に真となります。

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のエンティティ記述(例: &#x30A1;)が利用できます。

演算指定

演算指定には以下が記述できます。

分類

記述

意味

関係演算

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タグで指定します。

以下にバージョンの違いによる動作の差異を説明します。

opアトリビュート省略時の動作

以下の差異があります。

バージョン

動作

結果の値

条件判定

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でのみ有効です。