2.XPDLを読み解く〜Package編〜
チュートリアルを丁寧に追っていこうかと思ったのですが、ちょっとこのチュートリアル、残念ながら説明不足な点が多い……。「図のように」と言いつつ図が載ってなかったりするし(汗
というわけでこのチュートリアルをそのまま追っていくだけでは厳しいのでちょいと方針転換。チュートリアルで使われている備品管理フローの例を、独自に読み解いていくことにします。
JaWEでXPDLを開いてみる
まず、Buriプロジェクトのtestソースフォルダ内にある、FurnitureManagement.xpdlをJaWEで開きます。そうすると、このような画面が表示されます。
先ほどのFurnitureManagement.xpdlの実体はXMLです。JaWEの画面の下部にある「XPDL view」をクリックすると、そのXMLを確認できます。
で、JaWEを使うと、このXMLをGUIで編集することが出来るっつーわけですな。
それでは、さっきのXMLがJaWE上でどう表されているか見ていきますか……。
まず、最初に出てきた画面で表示されている、青い四角。これはProcessと呼ばれています。1つのProcessは1つのフロー定義をあらわすもの、みたい。では、そのProcessの中身を早速……、と言いたいところですが、その前に、Process以外にどんなものが定義されているか見てみますかぁ〜。メニューの「Package」以下を見ると、Processを含め色々な要素があることがわかります。
この中で定義されたものがあるのは……、まずParticipants。これから見ていきましょう。
Participants
まぁ、名前からさっするに、フローに関係する人の定義ですね。メニューからParticipantsを選択してみると、FurnitureManagement_Par1とFreeTextExpressionParticipantの2つが定義されてますが、FreeText〜の方は最初っから定義されているもののようです。無視していいかな?で、もう一つのFurniture〜の方の詳細を見ると、こんな感じ。
「備品管理担当」という名前で、タイプはRoleとなってます。タイプとして選択できるのは、Role以外にはResource set、Resource、Organization unit、Human、Systemがあります。名前から何となく分かるような分からないような……。とりあえず、さきほどParticipantsのことを「フローに関係する人」と言いましたが、「人」とは限らないようですね。「フローに影響を及ぼすもの」と言えばいいのか?
Applications
では次。メニューのPackageからApplicationsを選択。
これを見ると、定義は1つ。OgnlInvokerという名前のApplicationが登録されてます。これだけでは何のことかさっぱり……。JaWEのヘルプをざっと見たところ、こう載ってました。
Workflow application declaration is a list of all applications or tools required and invoked by the workflow processes.
ここには、プロセス中で動作するアプリケーションの定義を書くようです。だからOgnlInvokerってのがプロセス中で動作すると。まぁ肝心のOgnlInvokerが一体何をしてくれるのかはさっぱり分かりませんが、そのうちわかるに違いない。絶対。多分。きっと……。というわけで深く考えずに次!
Workflow relevant data
Packageの中で残ったのはあと1つ。Workflow relevant data。直訳するとワークフローに関係するデータ。その中身はこんな感じ。
IDがorg.seasar.buri.dto.FurnitureItemDto。これはクラス名でしょうなぁ。あと、Extended attributesとして、こんなのが定義されてます。
NAME | VALUE |
---|---|
pkey | furnitureID,furnitureID != 0 |
insert | FurnitureItemDao.insert(#data) |
update | FurnitureItemDao.update(#data) |
select | FurnitureItemDao.getFurnitureItem(#data.furnitureID) |
selectMany_NO | FurnitureItemDao.getFurnitureItemByIds(#data) |
filterMany | FurnitureItemDao.getByIdAndDto(#id,#findDto) |
だいたい、このデータに対する操作を表してるのかな。FurnitureItemDaoというのはクラス名で、insert,update,getFurnitureItemとかがメソッドだろうなぁ、と推測。
では、クラスっぽいのが見つかったので、プロジェクト内から探してみますか……と、すぐに発見。
まず、DTOの方。
package org.seasar.buri.dto; import java.util.Date; public class FurnitureItemDto { public static final String TABLE = "FurnitureItem"; public static final String FurnitureID_ID = "sequence, sequenceName=FurnitureID"; private long FurnitureID; private String Type; private String Name; private Date Acquisition; private long acquisitionType; private int versionNo; public Date getAcquisition() { return Acquisition; } public void setAcquisition(Date acquisition) { Acquisition = acquisition; } ......(getter/setterが続く) }
ただのPOJOですね……。TABLE、FurnitureID_IDという定数が定義されてますが、これはS2Daoで使う定数アノテーションですね。それを除けばいたって何の変哲も無いPOJO。
そしてDaoの方はこれ。
package org.seasar.buri.dao; import java.util.List; import org.seasar.buri.dto.FurnitureItemDto; public interface FurnitureItemDao { public Class BEAN = FurnitureItemDto.class; public List getAllFurnitureItem(); public String getFurnitureItem_ARGS = "FurnitureID"; public FurnitureItemDto getFurnitureItem(String furnitureID); public String getByIdAndDto_ARGS = "testIDs,dto"; public String getByIdAndDto_QUERY = "FurnitureID in /*testIds*/(1) /*IF dto.Type != null*/and Type = /*dto.Type*/'hoge' /*END*/ /*IF dto.Name != null*/and Name = /*dto.Name*/'hoge' /*END*/ /*IF dto.acquisitionType != 0*/and acquisitionType = /*dto.acquisitionType*/1 /*END*/"; public List getByIdAndDto(List testIds,FurnitureItemDto dto); public void insert(FurnitureItemDto dto); public void update(FurnitureItemDto dto); public void delete(FurnitureItemDto dto); }
こっちも、S2Dao知ってる人ならお馴染みの、定数アノテーションがずらり。まんまS2Daoのインターフェースですな。先ほどのExtended attributesに出てきたメソッド名とおぼいきものが定義されてますね。どーにかこーにかすると、Buriの中でこれらのDaoのメソッドを呼び出してくれるのかなぁ。その「どーにかこーにか」はまだ分からんけど(;´∀`)
次回は
さて、これで、Process以外は全部見たかな。次はいよいよワークフロー定義が書かれたProcessの中を見てみるっす。