3.XPDLを読み解く〜Process編〜

前回の続き。今回はProcessの中身を見ていきます。

フロー定義

JaWEでFurnitureManagement.xpdlファイルを開いたときに最初に出てくる青い四角形がProcessです。これを右クリックして、「Edit」を選択するとこんな画面が出てきます。

矢印と四角形がならんでます。フロー定義ですね〜。
では、表示されているものを1つ1つ見ていきますか。
まず、目立つ色をしているのがStartとEnd。これはフローの開始点と終了点を表してますね。
そしてStartとEndの間に灰色の四角形がずらずらと並んでます。この四角形が、フロー中の1ステップにあたる模様。JaWE(っていうかXPDL?)ではこれをActivityと呼んでます。UMLのActivity図のActivityね。そういやこの図って一見Activity図とほとんど一緒ね。縦横が違うくらい。ま、どっちも図の役割が同じようなもんだから、似て当然か。
さて、Activityの中身へ。「備品登録」Activityを右クリックして「Property」を選択すると、詳細を見ることが出来ます。中身が書いてあるGeneralタブとPostconditionタブだけイメージ貼っておきます。


Generalタブのほうは、IDとか名前とかが載ってます。そして、Postconditionの方には、「利用中」ところから考えて、次に実行するActivity書いてるんだろなー……と考えて、他のActivityを覗くと……、やっぱり。「利用中」Activityの場合は、「期間終了」。「期間終了」Activityの場合は「償却期間終了」「リース終了」の2つが載ってます。この「期間終了」ActivityのPostconditionタブの部分は他とは違って、下のConditionのところに記述があります。これは、分岐の条件を表してるっぽいですね。2つの遷移先と条件を並べてみると、こうなってます。

遷移 条件
期間終了→償却期間終了 #data.isBuying == true
期間終了→リース終了 #data.isLease == true

isBuying、isLeaseというのはメソッドぽい名前。そこでソースを「isBuying」で検索してみると……、FurnitureItemDto.javaがヒット!もちろん?isLeaseメソッドもこのクラスにありました。このFurnitureItemDtoってのは前回Workflow relevant dataのところで出てきたクラス。Workflow relevant dataのところに書いたオブジェクトは、「#data」と書くと参照できるっていうことかな?ま、そのへんはそのうち分かるか……。

この分岐しているものを除けば、他のActivityはみんな名前と遷移先が違うだけ……、かと思ったんですがよく見たら他にも違いを発見。「General」タブで、finish modeがautomaticのものとmanualのもの2種類ありました。分類はこうなってます。

  • automatic
    • 備品登録
    • 期間終了
    • 廃棄処分済み
    • 返却済み
  • manual
    • 利用中
    • 償却期間終了
    • リース終了

これはどういう違いかというと……。推測ですが、automaticのものは、フローがそのActivityに到達したら自動的に次のActivityに遷移してしまうもの、manualのほうは、自動的には遷移せず待ち状態に移るものかな?完全にあてずっぽうで語幹だけでの憶測(;・∀・)。ま、真実はいずれ解き明かされよう。
さて、その他のActivityはみんな一緒なのでスルーかな……、と思ったら。あとは、フローを囲ってる部分をまだ見てなかったので、そっちをみてみる。一番左に「備品管理担当 - rol」と書かれてます。これは前回出てきた、Participantsで定義されていたやつですね。この例だとParticipantsが1つしかないですが、複数ある場合はこの下に追加されていくようです。やっぱりActivity図と一緒。スイムレーンってやつですね。

フロー以外の定義

これでProcessのところに定義されている内容のうち主立ったものは一通り説明終了?一応確認のためにXPDLの中身をざざっとみると……。2つほど抜けがあるのを発見。やれやれ。
まず1つめはこんなの。

<DataFields>
<DataField Id="java.lang.Long" IsArray="FALSE">
<DataType>
<BasicType Type="STRING"/>
</DataType>
<ExtendedAttributes>
<ExtendedAttribute Name="preprocess" Value="FurnitureItemDao.getFurnitureItem(#data)"/>
</ExtendedAttributes>
</DataField>
</DataFields>

JaWE内をうろついてたら、Processの方から「Workflow relevant data」のプロパティを開いたところに載ってるのを発見。このProcess独自に定義されたデータってところ?んー、Packageの方に書いた場合との違いは何なのかしら……。って、これが分かんないのは、そもそもPackageとProcessの関係をちゃんと理解してないからだな。調べておこう……。

で、話を戻して、抜けてたもう一つはこんなの。

<Implementation>
<Tool Id="FurnitureManagement_App1" Type="APPLICATION">
<ExtendedAttributes>
<ExtendedAttribute Name="ognl" Value="InnerContext&#10;InnerContext.UserContext&#10;BuriDataDaoUtil&#10;#callPath&#10;//#data = BuriDataDaoUtil.getDtoFromDataKey(#callPath)"/>
</ExtendedAttributes>
</Tool>
</Implementation>

これはBuriとか書いてあるので、JaWEが自動生成したわけじゃなく、明らかに手で打った情報だと思われる……。でも、どこにもJaWEで各種プロパティ見てみても、該当箇所は出てこないなぁ……。謎。チュートリアルでも一言も触れられてないし……。そのうち分かるのかしら。

これでJaWE使ってXPDLの中身をなめ回した結果は以上。次回からはこれを実際に動かしてみますか〜。

2.XPDLを読み解く〜Package編〜

チュートリアルを丁寧に追っていこうかと思ったのですが、ちょっとこのチュートリアル、残念ながら説明不足な点が多い……。「図のように」と言いつつ図が載ってなかったりするし(汗
というわけでこのチュートリアルをそのまま追っていくだけでは厳しいのでちょいと方針転換。チュートリアルで使われている備品管理フローの例を、独自に読み解いていくことにします。

JaWEでXPDLを開いてみる

まず、Buriプロジェクトのtestソースフォルダ内にある、FurnitureManagement.xpdlをJaWEで開きます。そうすると、このような画面が表示されます。

先ほどのFurnitureManagement.xpdlの実体はXMLです。JaWEの画面の下部にある「XPDL view」をクリックすると、そのXMLを確認できます。

で、JaWEを使うと、このXMLGUIで編集することが出来るっつーわけですな。
それでは、さっきの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の中を見てみるっす。

最近読んだ本

去年読んだのは既に忘れたので(ぉ、今年にはいってから読んだやつだけ。

Joel on Software

Joel on Software

プロフェッショナル広報戦略

プロフェッショナル広報戦略

XPエクストリーム・プログラミング入門―変化を受け入れる

XPエクストリーム・プログラミング入門―変化を受け入れる

JAVA PRESS Vol.46

JAVA PRESS Vol.46

ローマ人の物語 (21) 危機と克服(上) (新潮文庫)

ローマ人の物語 (21) 危機と克服(上) (新潮文庫)

あと、SoftwareDesign2月号も。
そして昨日買って、これから読むのがこれ。
アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ

アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ

1.準備

さて、id:makotanの依頼により、S2Buriの入門記を書くことに。ぼちぼちやってこうと思いまする。

前提環境

  • Eclipse3.1.1(日本語化済み)
  • J2SDK 5.0 Update 6
  • WindowsXP SP2

という感じで行っていきます。

S2Buriダウンロード

まずは本体のダウンロード。

  1. http://s2buri.sandbox.seasar.org/からS2Buriをダウンロード
  2. 解凍したフォルダをBuri2.1にリネームする(リネームしないと、解凍場所によっては以降の作業で嵌ったので……)
  3. Eclipseを起動して、メニューから「ファイル」→「インポート...」→「既存プロジェクトをワークスペースへ」を選択
  4. コンパイルでエラーが出たら、「プロジェクト」→「プロパティ」から「Javaのビルド・パス」の「ライブラリー」タブを選択。「ライブラリーの追加...」から「JREシステム・ライブラリー」を選択。「次へ」をクリックするとJRE選択の画面になるので、ローカルにインストールしてるものから適切なものを選択。プロジェクトのプロパティに戻って「OK」 を選択すればコンパイルが始まります。エラーが消えたら成功。

さて、ここまで来たら、ちゃんと動くのかテストを実行してみるか……、ということで、testソースフォルダからorg.seasar.buri.impl.BuriDefaultEngineTest.javaを実行。TestSuiteが見あたらなかったので適当に選択した(^^;
で、結果はオールグリーン!よしよし。プロジェクトの最上位フォルダに出力されてるburi2.logを見ると、内蔵のDBにアクセスしてる様子を見ることが出来ます。こんな感じ。

2006.01.24,00:44:31,828,[main],DEBUG,トランザクションを開始しました
2006.01.24,00:44:32,328,[main],DEBUG,BEGIN org.seasar.buri.dao.BuriDataPathHistoryDao#getAllBuriDataPathHistory()
2006.01.24,00:44:33,609,[main],DEBUG,物理的なコネクションを取得しました
2006.01.24,00:44:33,640,[main],DEBUG,論理的なコネクションを取得しました
2006.01.24,00:44:34,328,[main],DEBUG,論理的なコネクションを閉じました
2006.01.24,00:44:34,375,[main],DEBUG,SELECT BuriDataPathHistory.dataid, BuriDataPathHistory.pathid, BuriDataPathHistory.historyid, BuriDataPathHistory.insertdate, BuriDataPathHistory.useridnum, BuriDataPathHistory.useridval FROM BuriDataPathHistory
2006.01.24,00:44:34,390,[main],DEBUG,論理的なコネクションを取得しました
2006.01.24,00:44:34,687,[main],DEBUG,論理的なコネクションを閉じました
2006.01.24,00:44:34,687,[main],DEBUG,END org.seasar.buri.dao.BuriDataPathHistoryDao#getAllBuriDataPathHistory() : []
......

JaWEのダウンロード

で、次にワークフローの定義ファイルを編集するGUIエディタ、JaWEをダウンロード。JaWE1.4.2が必要とのこと。
しかし、http://s2buri.sandbox.seasar.org/ に貼ってある http://www.enhydra.org/workflow/jawe/index.html のページには大きくJavaWebStartへのリンクが載ってるのですが、これを押すと2.0のベータ版とかいうのが起動してしまい、これだと日本語が文字化けしまくり……。探したところ、http://forge.objectweb.org/project/showfiles.php?group_id=50 のページから1.4.2をダウンロード可能でした。で、こっちをインストール。

これでひとまず準備完了?
次はチュートリアルに従って作っていくことにしますかね〜。

Google x はてブ(Greasemonkey版)

便利便利。
以前TechNews2Hatenaを作ったときに、同じようなことやろうとしたんだけど、はてなにかける負荷が尋常じゃないし、そのうちAPI拡充する、という話だったので断念してた。
今回のこのスクリプト公開で、はてなはどう対応すんだろ、と思ってたら、ちゃんとAPIを用意するみたいです。
負荷かかるから使うな、っていうのもアレだしね。みんな幸せになれそうで良かった。

っていうか、これなら、はてなの都合など考えずさっさと作ればよかったのか……(ぉ
API公開されたら、TechNews2Hatenaの修正と、さらに他サイトへの対応もやりたいなぁ。個人的に一番ほしいのは、Bloglines対応版。