読者です 読者をやめる 読者になる 読者になる

ぶり2.3を適当に読む(3)

昨日の続き。

BuriActivityPathFilter

どこかで指定されているアクティビティ名群に含まれるものだけを残すようにフィルタリングしている。

そのアクティビティ名群はどこから持ってくるか。
systemContext.getActNames()がnullまたは空じゃなければこれを使う。
↑からとれなければ、systemContext.getCallPath().getActivityName().get(0)。

では、SystemContextのactNamesはいつ設定されるのか
以下は、Baoメソッドからのメソッド呼び出しスタック↓。

BaoInvokerImpl#invoke(BaoInvokeMetadata, MethodInvocation)
  アノテーションで指定されたアクティビティ名(複数可)のListを取得して、
  BuriProcessorInfoインスタンスを生成して、
  BuriProcessorInfo#setActNames(List) で設定
  processor.toNextStatus(path,data,userData,info) でBuriProcessorを実行する

↓ BuriProcessor=SimpleBuriProcessorImplの場合

SimpleBuriProcessorImpl#toNextStatusOne(String, Object, BuriProcessorInfo)
  BuriProcessorInfoから取得したアクティビティ名ListをSystemContextに設定
  engine.execute(systemContext,info.getResultExp()) でBuriEngineを実行する

↓BuriEngine=BuriSimpleEngineImplでもBuriStandardEngineImplでも、executeはWakanagoEngineImplの実装を利用

WakanagoEngineImpl#execute(BuriSystemContext, String)
  各種セレクタを使って実行すべきアクティビティを1つに特定して実行する。

というわけで、Baoのアノテーションで指定していたアクティビティ群(カンマ区切りで複数指定可能)を使ってフィルタリングするセレクタ実装であるということがわかる。

callPathって何よ?ってことについては、また今度。

気になった点

SimpleBuriProcessorImplとBuriSimpleEngineImpl。
Simpleの位置。

アクティビティの実行処理

上述のメソッド呼び出しの続き。

WakanagoEngineImpl#execute(BuriSystemContext, String)
  各種セレクタを使って実行すべきアクティビティを1つに特定して実行する。
↓
AbstBuriExecProcess#execActivity(String actId,String mode,BuriSystemContext sysContext,BranchWalker walker)
  指定されたアクティビティと、BuriProcessに対して仕掛けられたAOPインタセプタを併せて実行する。
↓
AbstBuriExecProcess#runThisMethodName(MethodInvokeInfo invokeInfo)
↓
AbstBuriExecProcess#createBuriMethodInvocation(MethodInvokeInfo invokeInfo)
  AOPインタセプタListを渡してBuriMethodInvocationインスタンスを生成する。
  BuriMethodInvocation#proceed()を実行することでcallMethodと呼んでいるBuriMethodInvocation独自フィールドに設定したメソッドが実行される。
  dummyMethodはスーパクラス実装をごまかすためのその名の通りダミー情報っぽい。
  AOPなのでS2MethodInvocationを継承したけど、実行部分は自前でつくったのでスーパクラスの不要な仕組みを回避しなきゃいけなかったということかと。
  実行対象のオブジェクトはAbstBuriExecProcessの実行時サブクラス。
  呼び出すメソッド名は、「アクティビティID + モード」。
  モードというのは"_start"や"_restart"のような、固定の接尾辞。
  モードはアクティビティのFinishModeがmanualかどうかなどで決定される。

で、このBuriMethodInvocationの実行対象メソッドが、AbstBuriExecProcessには実装も宣言もされていない。

まだきちんと読んでないけどざっと見たところ、XPDLの内容を元に自動生成されているAbstBuriExecProcessのサブクラスの方に、対応するメソッドがひと揃い用意されているようだ。
なかなかおもしろい仕掛け。

Next ToDo

「パス」という概念について

callPathって何?
realPath?
複数アクティビティが指定されている場合の文字列パス表現?