Play frameworkのいろいろなモジュール番外編 –Play Moduleを作成してみるその2

2011.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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については値の検証などで使用する機会もありそうですね。