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

