ファイヤープロジェクト
Restletのアーキテクチャと設定ファイル
2008-11-29T22:50+09:00   matsu
何となく動かせるようになったので,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
を指定する. この要素には子要素として順に以下を指定する.
  1. client(0個以上)
  2. server(0個以上)
  3. parameter(0個以上)
  4. defaultHost(1個)
  5. host(0個以上)
  6. internalRouter(0個か1個)
  7. logService(0個か1個)
  8. statusService(0個か1個)
ということで,今回はserver要素一つと,必須のdefaultHost要素のみを設定した. server要素では,プロトコルとしてHTTP,ポートは8182を指定した.
<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)
を実装する.
matsu(C)
Since 2002
Mail to matsu