S2Axis 開発記 準備その3 Axis のアーキテクチャ & JWSHandler 再訪

昨日書いたように,JWS の実装を参考に,リクエストに応じて S2 コンテナから取得したコンポーネントWebサービスとして公開するという方向で考えています.
この方法だと,特別な手続きなしでコンポーネントを Web サービス化できるわけですが,一方でセキュリティホールになりかねないという懸念も出てきそうです.なので,やっぱり何らかの方法で公開するコンポーネントを制限できるように考えないとダメかも.


それはさておき,JWS の実装を学習したいわけですが,その前に Axis そのものの学習を.
Axis の実装に関しては,「Axis Architecture Guide」に詳しい解説があります.
それによると,Axis というのは「Message を処理するだけのもの」だそうです.
Message にはリクエストメッセージとレスポンスメッセージがあります.サーバ側だと,リクエストメッセージを受け取って,レスポンスメッセージを返すわけですね.
リクエストメッセージやレスポンスメッセージ,それに様々な情報の入れ物が MessageContext です.
そして「Message を処理するもの」が Handler です.さらに,Handler の集合が Chain.
Handler/Chain は,リクエストメッセージを処理するものとレスポンスメッセージを処理するものに分けられるようです.
Axis というのは,多数の Handler が次々と呼び出されて,リクエストメッセージが解釈されて,レスポンスメッセージが生成されて... というものみたいです.


Handler/Chain は,3つのレイヤに分けられるようです.

  • Transport
  • Global
  • Service

それぞれがどういうものか,詳しくは説明されていないのですが,何となく名前で想像が付く... かな?
下っ端の Service はまさに特定のサービスを呼び出すためのもの.Global は多数のサービスに共通の処理を行うためのもの.たぶん.
Transport も Global も,リクエストおよびレスポンスの Chain を持ちます.
Service も同じようにリクエストおよびレスポンスの Chain を持ちますが,さらに Provider と呼ばれるものも持ちます.Provider もまた Handler ということですが,通常はこれが本当にサービスを提供するオブジェクトを呼び出す役目を持っているようです.
ということで,まとめると Handler/Chain は次の順番で呼び出されるということになります (サーバ側).

  • Transport Request Chain
    • Global Request Chain
      • Service Request Chain
      • Service Provider
      • Service Response Chain
    • Global Response Chain
  • Transport Response Chain

ふぅ.


さて,ここで JWSHandler なんですが,こいつはおそらく Global のリクエストを処理する Chain に組み込まれる Handler と思われます.ですから,特定のサービスを処理する Chain に先だってメッセージを処理することが出来るわけです.たぶん.
JWSHandler はまず,MessageContext からリクエストの「パス」を調べます.いわゆる URI ですね.そして,それが拡張子 .jws だったら (拡張子は Axis の設定で変更可能みたいです) ,該当の JWS ファイルを探し,コンパイルします (もちろんキャッシュしますがそれはひとまず横へ).コンパイルされたクラスはサービスを提供する実体 (Target) です.
そして JWSHandler は,その Target を呼び出すための Service を作成します.それは SOAPService というクラスです.こいつは Service なので Provider を持ちます.それが RPCProvider です.
この SOAPServiceMessageContext に設定すると,JWSHandler の後に SOAPService のリクエスト Handler が,そして RPCService が呼び出されます.RPCService は Target のサービス (JWS ファイルがコンパイルされたもの) を呼び出します.RPCService はその結果からレスポンスメッセージを作成し,MessageContext に設定するのでしょう.そしてレスポンス Handler が呼び出され...
と,こんな感じで動いているようです.


なんとなく,S2Axis として何をすればいいかが見えてきますね.
まずは Global な Handler を作らなくてはなりません.これを仮に S2Handler とでもしましょうか.
S2Handler は,リクエストのパスを調べて,それが S2 コンポーネントの呼び出しであれば SOAPService を作成し,RPCProvider を設定します.この RPCService が呼び出すのは S2 コンテナから取得した DI 済みのコンポーネントです.このあたりは,S2Struts なんかがやっていることとそっくりかも?
...
といったところでちょっと課題.
JWSHandler の場合,RPCProvider にはクラスを設定しています.そのインスタンスを作成するのは RPCService の役割みたいです.しかし S2Handler の場合はインスタンスを設定しなければなりません.出来るのでしょうか? 要調査.
それから,S2Handler を作ったとして,どうやって組み込むのか知らなかったり.残念!!!!
後はなんだろう? あまり課題はないかも?


課題じゃないけど決めなきゃいけないことはありますね.
例えばパス (URI) から S2 のコンポーネントマッピングするルールとか.
どんな制約があるのかとか調べていませんが,安易に考えるなら
ContextRoot/S2AxisRoot/NameSpace/ComponentName
みたいな感じでしょうか.S2AxisRoot は Axis の設定で変更可能に出来るはず.JWS の拡張子のように.デフォルトは s2axis とか.
そうだ,同じく Axis の設定で,Web サービスとして公開するコンポーネント名前空間を制限できるというのはどうでしょう? 例えば名前空間 wsコンポーネントだけ公開するとしておくと,それ以外のコンポーネントにアクセスしようとしても無駄無駄無駄無駄無駄無駄無駄無駄無駄ぁぁぁぁぁ.みたいな.
それとも,コンポーネントを公開する/しないは dicon ファイルで設定できた方がいいでしょうか?
ご意見あればぜひコメントください.m(__)m