Restletのアーキテクチャと設定ファイル
何となく動かせるようになったので,Restletのアーキテクチャについて,基本から調査してみる.
Restletにおいては,コンポーネント(org.restlet.Component)が重要な単位となる.
コンポーネントには,複数の仮想ホストやRESTアプリケーション,そして外部との通信を行うコネクタが含まれており,コンポーネント同士は通信できる.
通信プロトコルはHTTPやSMTPなどいろいろ選択できるらしい.
また,通信の際,各コンポーネントはクライアントにもサーバにもなれる.
org.restlet.ComponentのJavaDocには,Roy T. Fielding(※)の言葉として,以下が紹介されている.
コンポーネントはソフトウエア処理と内部状態の抽象的なユニットである. そのユニットはインタフェースを通じてデータの変換を行う.RestletではCompositeパターンが使用されており,Componentは,クラス名が示す通り,コンポーネントの役割を演じる. とにかくRestletではComponentクラスに重要な部品を格納し,Component#start()で起動する. ということで,の構成を調査することが,Restletの根幹を一通り調査することにつながりそうである.
※ Roy T. Fielding : World Wide Webの祖で,RESTを提唱した人.
Apache Software Foundationの共同創設者の一人らしい.
コンポーネントの設定(サーバのURLや接続プロトコル,リソースなど)は,プログラムやXML設定ファイルで可能.
XML設定ファイルには,Restlet独自のものとWADLがある.
WADLについては,別途記述することとして,ここではRestlet独自の設定ファイルについて記述してみる.
この設定ファイル仕様は,配布物のソースのorg.restlet.Component.javaと同じディレクトリにあるComponent.xsdに記述してある.
Restlet独自設定ファイルということで,Componentへのあらゆる設定が可能な雰囲気.
これをざっと概観していく.
とりあえず先のHelloResourceを設定ファイルで(HelloApplicationなしで)起動してみる.
まず設定.
これがおそらく最も素朴な設定.
org.restlet.Componentにmain関数があるので,引数にこの設定ファイルを指定して起動.
すると,HelloApplicationの場合と同様の動きとなる.
設定ファイルでは,まずルート要素として
componentを指定する. この要素には子要素として順に以下を指定する.
- client(0個以上)
- server(0個以上)
- parameter(0個以上)
- defaultHost(1個)
- host(0個以上)
- internalRouter(0個か1個)
- logService(0個か1個)
- statusService(0個か1個)
<server protocols="HTTP" port="8182"/>次はdefaultHost要素である. 型としては次のhostと同じVirtualHostTypeであるが,host要素は0個以上であるのに対し,defaultHostは1つのみ,必須である. VirtualHostTypeは次節で記述するRouterTypeの拡張である. RouterTypeでは,子要素として1個以上のattach要素を持つ. attach要素では,URIパターンとリソースクラスの対応等を設定する. ここでは,URIパターン"/"に対して,HelloResourceを割り当てた.
<defaultHost>
<attach uriPattern="/"
targetClass="hellorestlet.HelloResource" />
</defaultHost>
この頁の以降の記述は,ドキュメントやソースコードを見て,「こうだろ」と思って書いてみたが,実際やってみたところ,何かがおかしいようで,確認が取れていない.
Routerは,受け付けたリクエストをルーティングする.
Routeには最終的にリソースが紐付けられており,そのリソースのrepresentationメソッドの結果が,リクエストに対する結果となる.
Router回りもCompositeパターンとなっており,ルータにはルーティング先としてRestletクラスをアタッチする.
Restletクラスの子には,Application, Component, Connector, Filter, Finder, Redirector, Router, WrapperRestletなどがあり,つまり,主要なものは全部Restletであり,ルーティング先となる.
ルーティングの際のルールは,要求URLとアタッチ時に指定したパターンのマッチングで行われる.
ルーティングモード(マッチング結果の評価方法)には以下があり,attach要素のmatchingMode属性などで指定する.
- Best(設定値は1)(デフォルト)
- スコアの最も高いものが選ばれる. スコアは,アタッチ時に指定されたパスを正規表現と解釈して,java.util.regex.Matcherを使用してリクエストURLとマッチングをかけた結果である. マッチングには,完全マッチと,前方一致の2パターンあり,attach要素のmatchingMode属性で指定する(1が完全マッチ,2が前方一致). 完全マッチの場合,スコアは0か1,前方一致の場合はスコアは適合文字列/要求URL文字列(つまり0〜1)となる.
- First(設定値は2)
- スコアがRouterTypeな要素(internalRouterやdefaultHostなど)の属性requiredScoreの値以上に最初に達するものが選ばれる.
- Last(設定値は3)
- スコアがRouterTypeな要素の属性requiredScoreの値以上に最後に達するものが選ばれる.
- Round robin(設定値は4)
- 最後に使用したルートから順にスコアを検査し,最初にRouterTypeな要素の属性requiredScoreの値以上に達したものを使用. Firstが毎回リストの最初からチェックするのに対して,Round robinはリストの続きからチェックをする. 余談だが,内部的には(ソースでは)NEXTと表現されている.
- Random(設定値は5)
- Firstはリストの最初から,Round robinは最後に使用したルートから順にチェックしたのに対し,Randomは開始位置をランダムに選ぶ. その後はRound robinと同じ動きとなる.
- Custom(設定値は6)
- デフォルトでは選ばれない.
独自にorg.restlet.Routerクラスを実装し,
protected Route getCustom(Request request, Response response)
を実装する.

