2012年3月14日水曜日

Slim3 Source Code Reading #12

今日は、Slim3 Source Code Reading #12でした。

今回の内容はRouterを読み進めました。ソースファイルは以下の4ファイルです。

  • Router.java
  • RouterFactory.java
  • RouterImpl.java
  • Routing.java

少し前に、私が仕事で開発しているGAE/JのアプリケーションでRouterを導入したので
ソースコードを事前に読んでいました。
(Googleで検索せずにFrontController.javaを読み進めて実装方法を解析したのは、ソースコードリーディングをした影響でしょうか。)
また、@sinmetalさんと2人だったので、ざっと読んだ感じになりました。

最初にRouter.javaですが、Routerクラスはインターフェイスで、
静的ファイルの判定と、リクエストURLを変換した後のURL文字列を返すメソッドの2つがあります。

次に、RouterFactory.javaですが、これはFrontControllerからRouterを呼び出すために
インスタンスを生成するクラスです。
getRouter()は定義したRouterか、デフォルトのRouterを取得します。
ここで取得したRouterのインスタンスはservletContextに格納され、2回目以降は、キャッシュされたインスタンスが取得されます。
初回は、Routerのインスタンスを生成しますが、そのメソッドがcreateRouterメソッドです。
この中身を見れば分かるのですが、自前のRouterはRootPackage.controllerPackage.AppRouterクラス固定となっています。
配置する場所も、名前も間違っていると反映されないことになります。

RouterImplクラスは、Slim3を使う上ではデフォルトのRoutingの処理が書かれています。
仕組みは、ListにRoutingのルールを追加しておいて、Listの中に対象のURLがあるかどうかを判定するようになっています。URLがあれば、変換後のURL文字列を返します。
静的ファイルの判定(isStaticメソッド)は以下の様になっています。

  • /_ah/で始まらない。(管理画面などのURL)
  • 最後が拡張子ではない(.jpgなどで終わらない)か、拡張子が"s3"で始まらない

拡張子が"s3"で始まるファイルは静的ファイルではないと判定するようです。
そんなファイルがあるかな?と考えてみましたが、その時は思いつきませんでした。
クラスにはS3で始まるクラスもあるようですが、”拡張子”がs3で始まるファイル…。

最後にRoutingクラスですが、このクラスは、変換前のURL文字列と変換後のURL文字列を持ちます。
ざっと説明すると、"/hoge/fuga/{param}"を"/hoge/fuga?param={param}"のように
変換するという処理を行います。
fromの{}で囲まれた部分を、toの{}で囲まれた部分に配置するという感じです。

複数の{}を指定する事も可能です。

"*"を指定することも可能なのですが、今回はこの"*"の扱いにはまりました。
読書会での結論は"*"を使うと、それ以降は全てひとつのパラメータに格納され、
URLがエンコードされるようになるということでした。
また、{}の中に"*"を使うことはできません。

最後に、前回のMockXXX.javaもそうだったのですが、Router関連も
先頭にコメントがあって、CopyRightはSeasar Foundationになっていました。
Apache Licenceが適用されるようです。
(単純にSeasarからコピーしたということなのでしょうか?)

今回でひとまず、Slim3 Source Code Readingは最終回となりました。
振り返り、まとめの記事は後で、別途残そうと思いますが、
約3カ月、全12回の長い活動になりました。
最初から最後まで読み進めた結果、ある程度はSlim3でGAE/Jの
アプリケーションが作れるようになったような気がします。

今後、GAE/JのSDKのバージョンアップに合わせて
Slim3のバージョンアップも行われると思いますので、
新しくなった時に、また個人的にか、イベントとしてやるかは、
わかりませんが、再度読み進めてみたいと思います。