コンパイルの操作
XMLデータ仕様記述コンパイラは、XMLデータ仕様記述のXMLからJavaソースを生成します。XMLデータ仕様記述コンパイラは、com.fujitsu.uji.xscript.compiler.ESpecCompilerクラスで提供されています。XMLデータ仕様記述コンパイラは、以下のコマンドで実行します。
java com.fujitsu.uji.xscript.compiler.ESpecCompiler XMLデータ仕様記述ファイル名 生成Javaクラス名 [-p パッケージ名] [-comment:none] [-s 生成Javaクラスの基底クラス名] [-e 生成Javaソースの文字エンコーディング]
実際の指定例
java com.fujitsu.uji.xscript.compiler.ESpecCompiler carrent.xml Carrentc -p carrent
ESpecCompiler
実行クラスをこのとおり指定します。
XMLデータ仕様記述ファイル名
コンパイル対象のXMLデータ仕様記述のXMLファイルを指定します。
生成Javaクラス名
コンパイル結果のJavaクラス名です。パッケージは含めません。
パッケージ名
コンパイル結果のJavaクラスのパッケージ名です。省略するとパッケージなしになります。
-comment:none
コンパイル結果のJavaソースにコメントを出力したくない場合に指定します。省略するとJavaソースにコメントを出力します。
生成Javaクラスの基底クラス名
継承形式の利用者定義メソッドを利用する場合に、ESpecValidatorクラスを継承して利用者定義メソッドを実装したクラスを指定します。省略すると、ESpecValidatorクラスから直接継承します。
生成Javaソースの文字エンコーディング
生成するJavaソースの文字エンコーディングです。省略するとShift_JISになります。
コンパイル実行前に、以下のモジュールをCLASSPATHに設定する必要があります。
uji.jar(Apcoordinatorインストールフォルダのlib)
ujiespec.jar(Apcoordinatorインストールフォルダのlib)
XMLプロセッサの提供するJARファイル(Fujitsu XML プロセッサなどSAX 2.0準拠のもの)
コンパイル結果のソースファイルは、カレントフォルダに出力されます。ファイルのインポートを行いプロジェクトにソースファイルを追加します。
XMLデータ仕様記述コンパイラを利用する場合には、以下の制約があります。
仕様名、セクション名などの名標は、Javaの命名規約に従う必要があります。
仕様名、セクション名などの名標に、補助文字は使用できません。
Javaのメソッドサイズの制限に注意してください。XMLデータ仕様記述コンパイラは仕様セクション単位で1メソッドとするため、セクションが大きすぎると、XMLデータ仕様記述コンパイラは正常に終了しても、Javaのコンパイルエラー、実行エラーとなります。1仕様セクション中のタグの数は、100個以内が推奨です。
ポイント
Apcoordinator開発環境をインストールしたフォルダの、binフォルダの中に、ujiespec.batがあります。バッチファイルを作成する場合には参考にしてください。
コンパイルしたXMLデータ仕様記述の呼び出し
コンパイルしたXMLデータ仕様記述を利用する場合は、ESpecValidatorのgetInstanceメソッドで、パッケージ名、クラス名を指定します。
import com.fujitsu.uji.DispatchContext; import com.fujitsu.uji.xscript.ESpecValidator; import com.fujitsu.uji.xscript.ESpecResultException; import com.fujitsu.uji.xscript.ESpecException; .... public void processOrder(DispatchContext context, OrderBean bean) throws java.lang.Exception { ESpecValidator validator = //ESpecValidator.getInstance(getClass().getClassLoader()); インタプリタ用 ESpecValidator.getInstance(getClass().getClassLoader(), "mypackage.CheckPrice"); validator.setInfLoader(context.getApplicationProfile().getInfLoader()); try { validator.setXml("checkPrice.xml"); validator.validate("checkValue", bean); } catch(ESpecResultException e) { ... } catch(Exception e) { throw e; } ... }
getInstance
引数に、"パッケージ名.クラス名"を指定する文字列を追加します。例ではgetInstanceメソッドの復帰値がmypackage.CheckPriceクラスのインスタンスとなります。
コンパイル後のクラスでは、setInfLoaderやsetXmlなどのXML関連のメソッドは何も処理をしません。常にコンパイルしたクラスを利用する場合は、これらのメソッドを呼ぶ必要はありません。
コンパイル後のクラスでは、"uji+データ仕様名"のメソッドを生成しています。上記の例で、validator.validate("checkValue", bean)というコードは、((CheckPrice)validator).ujiCheckValue(bean, bean)というコードに書き換えることができます。この場合はデータBeanを2つ指定(targetBeanを指定)する形式になり、targetBeanがない場合は両方に同じデータBeanを指定する必要があります。