携帯向けAgavi拡張の設計

社内では携帯向けAgavi拡張(KtaiAgavi/非公開)を作って利用しているけども、どうも使いにくいので設計を見直してみたい。折角なので公の場で開発しようかと思う。

キャリア判定

KtaiAgaviではキャリア判定をRequest初期化時にUserAgentを元に行っている。けれどこれは幾つか問題がある。

  1. Requestクラスを拡張するため、他のRequestクラスを拡張するライブラリなどと相性が悪い
  2. UserAgentは偽装可能なのでキャリア判定には不適切

後者については、IPアドレスからキャリアを判定するグローバルフィルタを併用することで対応している。しかし、本質としては、IPアドレスからの判定を基本として、端末情報については別途取り扱うべきである。
キャリア判定のタイミングとしてはRouting処理の前が良いが、このタイミングで処理するにはコアクラスの拡張が必須となってしまう。そこで、RoutingCallbackを用いた実装を検討したい。

キャリア情報・端末情報の格納場所

KtaiAgaviでは上記のように拡張したRequestクラスでキャリア判定を行った後、メンバ変数にこれらの情報を格納している。
しかし、agaviでの開発をしているこの実装は不便であることに気がついた。
agaviではRequestやAction,Viewと言ったものはAgaviAttributeHolderクラスを継承しており、実行時データを格納する方法を提供している。そして、多くの場面、たとえばアクションキャッシュのグループ分けなどで、attributeを利用することが想定されている。
したがって、agavi的にはキャリア情報や端末情報についてもRequestのattributeに保存するようにすべきである。

絵文字変換

入力はValidatorとして実装するのが良い。出力についてはFormPopulationFilterとの兼ね合いでグローバルフィルターとして実装せざるを得ない。*1ここはKtaiAgaviと同様になる。

画像変換

KtaiAgaviではModelとして実装しているが、やることは変わらないのでモジュールとして実装するとよさげ。

*1:パース時に絵文字が文字コードエラーを引き起こす