4.Bao基礎編その1

前回から2週間も空いてしまった……orz ごめんなさいごめんなさい。このペースじゃ駄目駄目です。気合入れないと。
ちなみにS2Buri勉強会は私用により参加不可能。無念だ……。


さて、今まではXPDLを見てきましたが、今日はJavaの実行コードを見ていきます。
XPDLで定義したワークフローにアクセスするためのインターフェースとなるのが、Baoです。
Baoとは、リファレンスの説明によれば、"BusinessLogic Access Object"だとか。一説によるとBaoのBはBuriのBだという話も……。
今まで見てきたFurnitureManagement.xpdlを利用するBaoがBuriのtestソースフォルダ中にあるので、中身を見てみましょう。

package org.seasar.buri.bao;

import java.util.List;

import org.seasar.buri.bao.BuriConvert;
import org.seasar.buri.dto.FurnitureItemDto;

public interface FurnitureManagementBao {
    public static String PROCESS = "資産管理.備品管理";

    public static BuriConvert CONVERTER[] = new BuriConvert[]{
        new BuriConvert(Long.class,"FurnitureItemDao.getFurnitureItem(#data)")
    };
    
    public static String getNowUse_ACTIVITY = "利用中";
    public List getNowUse();
    
    public static String findNowUse_ACTIVITY = "利用中";
    public List findNowUse(FurnitureItemDto findDto);
    
    public static String getEndDepreciation_ACTIVITY = "償却期間終了";
    public List getEndDepreciation();
    
    public static String getEndLease_ACTIVITY = "リース終了";
    public List getEndLease();
    
    public void enterItem(FurnitureItemDto dto);

    public void timeorverItem(long itemID);
}

ただのJavaのインターフェースです。
ただし、PROCESSとかCONVERTERとかACTIVITYとか名前がついた定数が書いてあるのが特徴的。この書き方はS2Daoの定数アノテーションに似てますね……。と思ってリファレンス中の説明を読むと、やはり定数アノテーションと書いてありますね。それに、このFurnitureManagementBaoはインターフェースですが、それに対応する実装クラスがソース中のどこにもありません。これもS2Dao同様。

さて、それはさておき、Baoの中を1行1行みていってみますか。
まず最初の行が、PROCESSアノテーション

    public static String PROCESS = "資産管理.備品管理";

これは、このBaoがどのワークフロー(プロセス)を扱うかを指定するアノテーションになります。この場合、「資産管理」パッケージの「備品管理」プロセスを示してます。XPDLの構造では、まずパッケージがあってその中にプロセスがある、という形になってるので、こういう形式で指定することが出来るわけですね。このPROCESSアノテーションは、Bao内に1つ定義しておく必要があるようです。

で次に出てくるのがCONVERTERアノテーションなんですが……。ちょっと説明省略。次のやつを説明してからの方がよいと思われるので(^^;


というわけでCONVERTERは飛ばし。そしてそれ以降の箇所なんですが、ここは基本的にメソッドと、メソッドに付随するアノテーションです。Baoのメソッドは、シグネチャによってメソッドの振る舞いが変わります。これもS2Daoと同様。Convention Over Configurationの一種ですね。詳しいルールは、マニュアルの方に載ってるのでそっち参照。そこにいろいろ書いてあるのですが、一番重要なのが、メソッド名に関して。メソッド名がget/select/find/countで始まる場合、データ取得用のメソッドと見なされます。それ以外ならば、フロー処理を行うメソッドとみなされます。ここで挙げた「データ取得」と「フロー処理」の二つが、Baoが持ってる二大処理、と思ってよさげ?

FurnitureManagementBaoの例でいうと、以下の4つがデータ取得用メソッドです。

  • getNowUse()
  • findNowUse(FurnitureItemDto findDto)
  • getEndDepreciation()
  • getEndLease()

残りの以下2つがフロー処理用メソッド。

  • enterItem(FurnitureItemDto dto)
  • timeorverItem(long itemID)

この各メソッドの役割ですが、これは実際に動作させてみて比較するのがよいかな……、ということで次回へ。