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つのほう