intra-mart Accel Platform プラグイン仕様書 初版 2014-12-01

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を利用する際には、初期化処理を用意する等、スレッドセーフとなるようご注意下さい。