Play frameworkのいろいろなモジュール番外編 –Play Moduleを作成してみるその2
PlayPluginのメソッドを試してみる
前回のPlay Moduleを作成してみる1では、シンプルなモジュールを作成してみました。 その時はアプリケーションの開始タイミングでメッセージの出力するだけでしたが、PlayPluginクラスではさまざまなタイミングでの処理を行うことができます。 今回はPlayPluginクラスのメソッドである「bind」と「onEvent」をオーバーライドして、もう少しためしてみましょう。
セットアップ
本記事での動作確認環境は下記の通りです。
- OS : MacOS X 10.7.2
- Java SE: 1.6.0_26
- Play framework : 1.2.3
※Play frameworkはインストールしてパスを通しておいてください。
Play Moduleを新たに作成
モジュールは複数同時に使用することもできるので、前回作成したMyModuleAppとmyModuleはそのまま使用しましょう。 そして新しくmyModule2モジュールを作成します。
% play new-module myModule2
pluginクラスを作成
myModule2/src/play/modules/myModule2ディレクトリにMyModule2Plugin.javaファイルを作成します。
package play.modules.mymodule2; import play.PlayPlugin; public class MyModule2Plugin extends PlayPlugin { public void onApplicationStart() { System.out.println("MyModule2Plugin#onApplicationStart!!"); } }
play.pluginを作成
次にmyModule2/srcディレクトリにplay.pluginsファイルを作成し、下記のように記述します。
100:play.modules.mymodule2.MyModule2Plugin
前回のモジュールは、頭の数字が1000でした。これはモジュールを実行する優先順位を示しています。 今回は100としているので、前回のmyModuleよりも優先的に実行されます。
ビルド
ではここで一度ビルドしましょう。
※もしここでlibディレクトリがないとエラーになったら、libディレクトリを作成してから再度実行してみてください。
% play build-module
MyModuleAppで使用してみる
では、前回作成したMyModuleAppのconf/dependencies.ymlを編集してmymodule2を追加しましょう。 下記のようにmyModuleと同時に使用するように修正します。 ※artifactは各自の環境のパスにしてください。
# Application dependencies require: - play - customModule -> myModule - customModule2 -> myModule2 repositories: - playCustomModules: type: local artifact: "/path/your/module/myModule/" contains: - customModule -> * - playCustomModules2: type: local artifact: "/path/your/module/myModule2/" contains: - customModule2 -> *
dependencies.ymlを編集したら、depsコマンドを実行してから動作確認をしてみます。
% cd /path/your/MyModuleApp % play deps % play run
localhos:9000にアクセスすると、優先度の高いmyModule2のonApplicationStartメソッドのほうが先に実行されているのがわかると思います。
bindとonEventを実装
では、MyModule2Plugin.javaの他のメソッドを実装してみます。 このあたりをみればわかりますが、PlayPluginクラスにはアプリケーションの開始から終了までさまざまなタイミングを取得することができます。 今回はHTTPリクエスト時にパラメータがわたされたときに実行される「bind」と、任意のタイミングで実行できるイベント「onEvent」を試します。
まずはMyModuleAppのほうを修正します。routeに新しいパスを追加し、コントローラーにメソッドを追加します。
#routesに追加 GET /bindTest Application.bindTest
//Appication.javaに追加 public static void bindTest(int num,String name) { Logger.info("num = %d", num); Logger.info("name = %s", name); play.PlayPlugin.postEvent("message!", "context!"); renderHtml("<h2 id="toc-bindtest-called">bindTest called</h2>"); }
play.PlayPlugin.postEventというメソッドは、PlayPluginのonEventを実行するためのメソッドです。 これを実行すると、後で実装するMyModule2PluginのonEventが実行されます。 また、HTTPアクセス時にURLパラメータとしてうけとった値は、名前が一致していればメソッドの引数にバインドされます。
bindとonEventを実装
最後にMyModule2Plugin.javaに2つのメソッドを追加します。
public Object bind(String name, Class clazz,Type type,Annotation[] annotations,Map<String,String[]> params) { System.out.println("MyModule2Plugin#bind"); System.out.println("name=" + name); System.out.println("class=" + clazz); System.out.println("type=" + type); for (Annotation annotation : annotations) { System.out.println("annotation=" + annotation); } System.out.println("Map=" + params); //nameという名前のパラメータがきたら、<<name>>という形式にする if(name.equals("name")) { String[] names = (String[])params.get("name"); for(int i=0; i < names.length;i++){ names[i] = "<<" + names[i] + ">>"; } } return super.bind(name, clazz,type,annotations, params); } public void onEvent(String message, Object context) { System.out.println("MyModule2Plugin#onEvent"); System.out.println("message=" + message); System.out.println("context=" + context); }
bindメソッドでは引数の内容をコンソールに表示し、「name」という名前のパラメータが来たら、値を”<<”と”>>”でくくっています。 onEventではうけとった引数を表示しているだけです。
ビルドと動作確認
ではモジュールをビルドし、動作確認をしてみましょう。
% cd /path/your/module/myModule2 % play build-module % cd /path/your/MyModuleApp % play deps % play run
http://localhost:9000/bindTest?num=10&name=testName とアクセスしてみてください。bindメソッドは2回呼ばれ(numとnameの分)、その後にonEventが呼ばれています。 また、nameの値がMyModule2Pluginによって変更されているのもわかります。
まとめ
今回はPlayPluginのメソッド、bindとonEventを試してみました。 bindについては値の検証などで使用する機会もありそうですね。