ファイヤープロジェクト
Restletの主要なクラスをじっくり見てみる(その1 RestletとFilter)
2008-11-30T03:15+09:00   matsu
フレームワークとしてのRestletでは,Restletクラスを継承して,いろいろな機能をもったRestletクラスが提供されている.それをガチャガチャと組み合わせて,RESTシステムを構築する.ということで,どんな機能を持ったRestletがあるのかを調査してみた.
今回は,サーバとしてサンプルを動かして行く. ただ,この頁の方針は,Restletクラスからはじめて,徐々にいろな機能を持ったものを紹介していくというものである. この方針のもとでは,Serverクラスは,Restletの子孫クラスであり,いろいろな機能を持っていることが,最初はノイズとなる. したがって,最初はServerクラスをサンプルの足回りとしての足回りという位置付けで,あまり存在を意識したくない. ということで,サンプルの動作確認をするための,Serverクラスの最も単純な形を確認しておく. 以下が,Serverクラスを稼働させるもっとも簡単なものである.
何もRestletを登録していないので,どんなパスで要求しても404 Not Foundとなる.
... Helloした時に,「これがもっとも単純なRestletだ」というようなことをと書いた気がするが,実はもっと単純なものがある. Helloの時には,仮想ホストやルーティング(URLに対するリソース選択)の仕組みが組み込まれた,実際のシステムを構築する上で,最低限必要であろうものを一通り揃えたうえでの,「最も単純」なものを紹介した. 今回は,プログラム的にそれっぽく動作可能であるという意味での,「最も単純」なRestletを紹介する. これによって,そもそもクラスとしてのRestletやその子孫のクラスは,どうのようなシーケンスで動作するのか,ということを確認することができる. Restletが動作する上で,起点となるメソッドは,
public void handle(Request request, Response response)
である. Restletオブジェクトはhandleメソッド内にて,自身に関連付けられた別のRestletオブジェクトのhandleを呼び出す. そうした連鎖のどこかの時点で,responseにステータスやRepresentationを設定し,処理を終了すると,結果がクライアントに返される. 以下サンプル.
サーバにはSimpleRestletオブジェクトが登録され,如何なるパスの要求を受けても,このSimpleRestletオブジェクトのhandleメソッドが呼び出される. SimpleRestlet#handleでは,responseオブジェクトにステータスコードとRepresentationを設定して返している. HelloResourceの際には,それを登録しているRestletがHelloResource#representationを使用してこの仕事をしていたということである.
Filterクラスは,「次のRestletオブジェクト」を持つRestletである. そのhandleメソッドでは,「次のRestletオブジェクト」のhandleを呼び出す前後に処理を行い,状況によっては「次のRestletオブジェクト」のhandleを呼び出さずにクライアントに結果を返したりする. Filter#handleメソッドはfinal指定で,以下の流れになっている.
  1. beforeHandleメソッドの呼び出し.
  2. beforeHandleメソッドの結果がFilter.CONTINUEなら,doHandle呼び出し. doHandle内では普通「次のRestletオブジェクト」のhandleを呼び出す.
  3. beforeHandleメソッドの結果がFilter.SKIPか,doHandleメソッドの結果がFilter.CONTINUEならdoAfter呼び出し
以下サンプル.
リクエストのパスが/SKIP,/STOP,/stop,それ以外によって,処理シーケンスが変わることを確認できる.
FilterオブジェクトはRestletオブジェクトを持ち,自身のhandleメソッド内でRestletオブジェクトのhandleを呼び出す. Restletオブジェクトは,
public void setNext(Class targetClass)
public void setNext(Restlet next)
のいずれかで設定し,
public Restlet getNext()
で取得できる. また,設定されているか否かは,
public boolean hasNext()
で確認できる.
matsu(C)
Since 2002
Mail to matsu