Staplerのさわり

Stapler*1とはHudson内部で使われているURLとオブジェクトを規約を使ってマッピングしてくれるフレームワーク、という認識です。
https://stapler.dev.java.net/
HudsonのビューはJellyで書かれていて、Staplerがその辺をよしなにしてくれているようです。
使い方はここで説明されているように、Stapler用にWeb.xmlの設定といくつかのクラスを用意すればいいようです。


それで、Staplerの説明文とソースを読んでみてわかったとこを以下に箇条書きで書いてみます。

  • リクエストURL処理を受けつもつStaplerクラスはHttpServletクラスを継承していて、serviceメソッドをオーバーライドしている。
  • 初期化作業にはServletContextListenerを継承したクラスを使う。
  • そのクラス内で、ServletContextクラスのsetAttributeメソッドでセットしたクラスがルートオブジェクトになる。*2



あと、気になる点も。

  • Staplerクラスのinvokeメソッド*3で、スレッドローカルからStaplerRequestオブジェクトとStaplerResponseオブジェクトを取り出して、作ったばかりのStaplerRequestオブジェクトとStaplerResponseオブジェクトをスレッドローカルに入れ、処理が終われば先ほど取り出した古いほうのStaplerRequestオブジェクトとStaplerResponseオブジェクトをスレッドローカルに入れる、という作業をしているが、タイミング問題のためにつかっているのかな?



もう少し詳しい話は後ほど。

*1:英語でホッチキスのことhttp://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%83%E3%83%81%E3%82%AD%E3%82%B9

*2:セットするのに"app"がキーになる

*3:serviceメソッド内で呼ばれる引数が4つのほう