PluginDescriptor¶
PluginDescriptor は、PluginManager から取得されるプラグインの定義情報を保持しています。PluginDescriptor では以下の機能が提供されます。
- プラグインの各属性情報
- プラグイン内の子ノード情報(DOM 形式)
- プラグイン内のタグ属性および値からのインスタンスの生成
プラグイン情報からのインスタンスの生成¶
プラグイン内のタグ属性および値からクラスまたは サーバサイドJavaScript のインスタンスを生成することができます。
スクリプト開発モデル¶
plugin.xml を以下のように記述します。通常、プラグインタグ(この説明では<test_plugin>)の子ノード(ハイライトされた部分)は拡張ポイントによって決定し定義します。定義内容は、xml 形式であれば、その他の制限はありません。<plugin> <extension point="jp.co.intra_mart.sample.script"> <test_plugin id="plugin1" name="sample"> <test object="test/sample" data="hello"> <init-param param-name="hoge" param-value ="value"/> <init-param param-name="setting" param-value ="1"/> </test > </test_plugin> </extension> </plugin>インスタンス化するjsファイルを作成します。スクリプト開発モデル ソースコード配置ディレクトリに配置してください。function getHello() { return "Hello World"; }スクリプト開発モデル のファンクションコンテナファイル(js)で、プラグインを取得して、js ファイル(test/sample.js)をインスタンス化し、そのインスタンスのメソッド(getHello)を実行します。// PluginManager の生成 var mgr = new PluginManager(); // 拡張ポイント(jp.co.intra_mart.sample.script)の plugin を取得します。 // 以下の処理では、1つのプラグインが取得されます。(上記の plugin.xml のプラグイン<test_plugin>) var plugin = mgr.getPluginDescriptor("jp.co.intra_mart.sample.script"); // 取得したプラグインの<test_plugin>の子ノード<test>の object 属性に記述されている // javascript のファイルをインスタンス化します。 // 取得する場所の指定は、"test/object" のように<test_plugin>(ルート)からのパス形式で指定します。 // このパス(ここでは属性値)に設定されている値"test/sample"すなわち test/sample.js をインスタンス化します。 var obj = plugin.createInstance("test/object"); // インスタンス化したオブジェクトのメソッドを実行します。 var hello = obj.getHello();JavaScript ファイルがインスタンス化される時に、plugin.xml の設定情報を取得することができます。JavaScript ファイルに initParam および initXml メソッドを追記することで、インスタンス化された後でメソッドが自動的に呼び出されます。function getHello() { return "Hello World"; } // このファイルがインスタンス化された時に指定されたタグ(ここでは<test>となります)の子ノードに記述されている // <init-param>タグの情報がオブジェクト形式で引数に渡されます。 // <init-param>の param-name 属性の値がプロパティ名、param-value 属性の値がそのプロパティの値となります。 function initParam(args) { var hoge = args.hoge; // "value"が取得できます。 var setting = args.setting; // "1"が取得できます。 } // このファイルがインスタンス化された時に指定されたタグ(ここでは<test>となります)を // ルートとした DOMNode が引数に渡されます。 function initXml(dom) { var data = dom.getArribute("data"); // "hello"が取得できます。 }注意
取得したDOMNodeは、スレッドセーフではありません。その為、複数のスレッドから同じDOMNodeに対しアクセスするようなコードを記述されている場合正常に動作しなくなる可能性があります。DOMNodeを利用する際には、初期化処理を用意する等、スレッドセーフとなるようご注意下さい。
JavaEE開発モデル¶
plugin.xml を以下のように記述します。通常、プラグインタグ(この説明では<test_plugin>)の子ノード(ハイライトされた部分)は拡張ポイントによって決定し定義します。定義内容は、xml 形式であれば、その他の制限はありません。<plugin> <extension point="jp.co.intra_mart.sample.java" > <test_plugin id="plugin1" name="sample"> <test class="test.Sample" data="hello"> <init-param param-name="hoge" param-value ="value"/> <init-param param-name="setting" param-value ="1"/> </test > </test_plugin> </extension> </plugin>インスタンス化するクラスを作成します。作成したクラスはクラスパス上に配置してください。なお、必ずデフォルトコンストラクタが必要です。package test; public class Sample { // デフォルトコンストラクタ public Sample() {} public String getHello() { return "Hello World"; } }JavaEE開発モデル のあるクラスで、プラグインを取得し、クラス(test.Sample)をインスタンス化し、そのインスタンスのメソッド(getHello)を実行します。// PluginManager の生成 PluginManager mgr = new PluginManager(); // 拡張ポイント(jp.co.intra_mart.sample.java)の plugin を取得します。 // 以下の処理では、1つのプラグインが取得されます。(上記の plugin.xml のプラグイン<test_plugin>) PluginDescriptor plugin = mgr.getPluginDescriptor("jp.co.intra_mart.sample.java"); // 取得したプラグインの<test_plugin>の子ノード<test>の class 属性に記述されている // クラスをインスタンス化します。 // 取得する場所の指定は、"test/class"のように<test_plugin>(ルート)からのパス形式で指定します。 // このパス(ここでは属性値)に設定されている値"test.Sample"すなわち test.Sample クラスをインスタンス化します。 test.Sample obj = (test.Sample)plugin.createInstance("test/class"); // インスタンス化したクラスのメソッドを実行します。 String hello = obj.getHello();クラスがインスタンス化される時に、plugin.xml の設定情報を取得することができます。インスタンス化されるクラスに以下のインタフェースを実装することで、インスタンス化された後、メソッドが自動的に呼び出されます。
- jp.co.intra_mart.foundation.security.PropertyInitParamable インタフェース
- jp.co.intra_mart.foundation.security.XmlInitParamable インタフェース
必要なインタフェースどちらかまたは両方を指定できます。package test; public class Sample implements PropertyInitParamable,XmlInitParamable { // デフォルトコンストラクタ public Sample() {} public String getHello() { return "Hello World"; } // PropertyInitParamable インタフェースのメソッド // このクラスがインスタンス化された時、このメソッドが自動的に呼び出されます。 // このクラスがインスタンス化された時に指定されたタグ(ここでは<test>となります)の子ノードに記述されている // <init-param>タグの情報が Map<String,String>形式で引数に渡されます。 // <init-param>の param-name 属性の値が Map の key,param-value 属性の値がその key の値となります。 public void init(Map<String,String> args) { String hoge = args.get("hoge"); // "value"が取得できます。 String setting = args.get("setting"); // "1"が取得できます。 } // XmlInitParamable インタフェースのメソッド // このクラスがインスタンス化された時、このメソッドが自動的に呼び出されます。 // このファイルがインスタンス化された時に指定されたタグ(ここでは<test>となります)を // ルートとした Node(DOM)が引数に渡されます。 public void init(Node node) { String data = new XmlNode(node).getString("data"); // "hello"が取得できます。 } }注意
#getNodeで取得したNodeは、スレッドセーフではありません。その為、複数のスレッドから同じNodeに対しアクセスするようなコードを記述されている場合正常に動作しなくなる可能性があります。#getNodeを利用する際には、初期化処理を用意する等、スレッドセーフとなるようご注意下さい。