playframework1はモジュールによって機能拡張できる仕組みになっているが、これはフレームワーク内についても同様。
フレームワークの主な機能は、play.PlayPluginクラスを継承してプラグイン機構を利用する形で、実装されている。
内包されているプラグイン一覧
framework/src/play.plugins
0:play.CorePlugin
100:play.data.parsing.TempFilePlugin
200:play.data.validation.ValidationPlugin
300:play.db.DBPlugin
400:play.db.jpa.JPAPlugin
450:play.db.Evolutions
500:play.i18n.MessagesPlugin
600:play.libs.WS
700:play.jobs.JobsPlugin
100000:play.plugins.ConfigurablePluginDisablingPlugin
これらに倣えば、同じレベルの機能をモジュールを使って機能拡張できるということになる。
フレームワーク内に切り込むようなプラグインを作成する時は、この優先度を意識して設定する必要がありそうだ。
興味深い。
優先順について
フレームワークは、クラスパス上に置かれた、play.pluginsファイルを片っ端から読み込まれ、優先順にロードされる。
(優先順を示す数値は、少ないほど優先度が高い)
イベントの実行も、優先順に従う。
唯一、アプリケーション終了のイベントだけは、逆順で実行される。
play.data.parsing.TempFilePlugin
一時ファイルの作成を助けるプラグイン。FileUploadをサポートするのが目的。
スレッドローカルで安全な一時フォルダを作成し(play.data.parsing.TempFilePlugin.createTempFolder()
)、不要になったら速やかに削除する。
後始末についてはあまり考えなくて良いが、作成したフォルダと配下のファイルは、レスポンスを返す直前に削除されるのでrenderBinaryなどで返すことができない。
play.data.validation.ValidationPlugin
リクエストパラメータに対する検証処理、および結果のクリアなどの裏処理を担当する。
play.db.DBPlugin
DB接続設定をもとに、DB接続オブジェクトを生成する。
また、H2を使用するときは、H2サーバの起動/停止も行なう。
DB接続設定に困ったときや、省略時の扱いなどが知りたくなったときに、ソースを見ると非常に参考になる。
play.db.jpa.JPAPlugin
jpa関連の機能をサポート。
jpa関連の設定読み込み&反映、modelクラスの拡張、modelファイルの認識、エンティティマネージャの取り回しなど。
play.db.Evolutions
(あとで)
play.i18n.MessagesPlugin
メッセージ定義ファイルの読み込み。
play.libs.WS
SimpleHTTPクライアントを使うための準備、後始末。
ユーザ定義ジョブを認識し、スケジュール管理下に置き、スケジュール実行を開始する。
開始時に、@OnApplicationStart
アノテーションが付与されたジョブを実行する。
終了時に、@OnApplicationStop
アノテーションが付与されたジョブを実行する。
play.plugins.ConfigurablePluginDisablingPlugin
優先度の極端に低いこのプラグインが気になったので調べてみたところ、プラグインを無効化するプラグインのようである。
使い方は、application.conf に、"plugins.disable"で始まる設定を記述し、無効化したいプラグインクラスの正式名称を記述する。
コメントを抜粋しておく。
/**
* Plugin that reads list of plugins to disable from application.conf
*
*
* To disable plugins, specify it like this in application.conf:
*
* plugins.disable=full-plugin-class-name
* plugins.disable.0=full-plugin-class-name
* plugins.disable.1=full-plugin-class-name
* plugins.disable.whatever=full-plugin-class-name
*
*/
public class ConfigurablePluginDisablingPlugin extends PlayPlugin {
無効化したいプラグインを複数、記述できるようだ。
いったんロードしたプラグインを、設定ファイルに従って無効化していく方式になっている点に注意。
また、モジュールについては、プラグイン以外の資材は無効化されないようなので、この点も注意。