BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > BPM トピック > BPM プラグイン プログラミング ガイド > プラグイン セッション EJB の定義 |
BPM プラグイン プログラミング ガイド
|
プラグイン セッション EJB の定義
この章では、プラグイン セッション EJB を定義する方法について説明します。この章の内容は以下のとおりです。
概要
プラグイン セッション EJB を定義するには、次の表に説明する 3 つの事前定義されたインタフェースを実装する必要があります。
次の節では、プラグイン セッション EJB を定義する際に実装する必要のある各インタフェースとメソッドについて説明します。プラグイン サンプルからの抜粋も示します。
セッション EJB インタフェース
定義により、セッション EJB は、javax.ejb.SessionBean とそのメソッドを実装する必要があります。
注意: SessionBean インタフェース メソッドの内容は、空であることも、単純にメッセージをログに返すこともありますが、必ず実装します。
次の表に、実装する必要のあるセッション EJB メソッドを示します。
各メソッドの詳細については、javax.ejb.SessionBean Javadoc を参照してください。 プラグイン サンプルから抜粋した次のコード リストは、javax.ejb.SessionBean インタフェースとそのメソッドを実装する方法を示しています。この抜粋は、SAMPLES_HOME/integration/samples/bpm_api/plugin/src/com/bea/wlpi/tour/po/plugin ディレクトリの SamplePluginBean.java ファイルから取り出したものです。重要なコード行は、太字で示します。 コード リスト 3-1 セッション EJB インタフェースの実装 プラグイン サンプルの詳細については、BPM プラグイン サンプルを参照してください。
package com.bea.wlpi.tour.po.plugin;
import com.bea.wlpi.common.VersionInfo;
import com.bea.wlpi.common.plugin.*;
import com.bea.wlpi.common.plugin.PluginData;
import com.bea.wlpi.server.plugin.InstanceNotification;
import com.bea.wlpi.server.plugin.Plugin;
import com.bea.wlpi.server.plugin.PluginManagerCfg;
import com.bea.wlpi.server.plugin.PluginManagerCfgHome;
import com.bea.wlpi.server.plugin.TaskNotification;
import com.bea.wlpi.server.plugin.TemplateDefinitionNotification;
import com.bea.wlpi.server.plugin.TemplateNotification;
import java.lang.reflect.Constructor;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Locale;
import java.net.URL;
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import java.io.*
/**
* @homeInterface com.bea.wlpi.server.plugin.PluginHome
* @remoteInterface com.bea.testplugin.SamplePlugin
* @statemode Stateless
*/
public class SamplePluginBean implements SessionBean {
private SessionContext ctx;
private final static String PLUGIN_MANAGER_CFG_HOME =
"java:comp/env/ejb/PluginManagerCfg";
private static byte[] ICON_BYTE_ARRAY;
// javax.ejb.SessionBean を実装
public void ejbActivate() {
} // javax.ejb.SessionBean を実装
public void ejbRemove() {
}
// javax.ejb.SessionBean を実装
public void ejbPassivate() {
}
// javax.ejb.SessionBean を実装
public void setSessionContext(SessionContext ctx) {
this.ctx = ctx;
}
.
.
.
プラグイン ホーム インタフェース
ホーム インタフェースは、ユーザのために BPM プラグイン フレームワークにより定義されます。com.bea.wlpi.server.plugin.PluginHome インタフェースは、javax.ejb.EJBHome インタフェースを拡張し、すべてのプラグインのホーム インタフェースを定義します。
次の表で、PluginHome ホーム インタフェースにより定義されるメソッドについて説明します。
ホーム インタフェースの詳細については、com.bea.wlpi.server.plugin.PluginHome Javadoc を参照してください。 プラグイン サンプルから抜粋した次のコード リストは、ホーム インタフェースで宣言される 1 つの create() メソッドのための ejbCreate() メソッドを実装し、Studio インタフェース ビューのためのカスタム プラグイン アイコンを定義する方法を示しています。この抜粋は、SAMPLES_HOME/integration/samples/bpm_api/plugin/src/com/bea/wlpi/tour/po/plugin ディレクトリの SamplePluginBean.java ファイルから取り出したものです。 コード リスト 3-2 ホーム インタフェース メソッドの実装 プラグイン サンプルの詳細については、BPM プラグイン サンプルを参照してください。
// javax.ejb.SessionBean を実装
public void ejbCreate() throws CreateException {
try {
ICON_BYTE_ARRAY = InfoObject.imageStreamToByteArray(
getClass().getResourceAsStream("Sample.gif"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
プラグイン リモート インタフェース
リモート インタフェースは、BPM プラグイン フレームワークにより定義されます。com.bea.wlpi.server.plugin.Plugin インタフェースは、javax.ejb.EJBObject インタフェースを拡張し、すべてのプラグインのリモート インタフェースを定義します。
プラグイン セッション EJB を定義する場合、Plugin リモート インタフェースとそのメソッドを実装する必要があります。
Plugin リモート インタフェースは、次のカテゴリのメソッドを定義します。
次の節では、実装する必要のある Plugin リモート インタフェースをカテゴリ別に説明します。
注意: リモート インタフェース メソッドの内容は、空のままにすること、あるいは単にログに対するメッセージを戻すことができますが、必ず実装します。
ライフサイクル管理メソッド
次の表に、実装する必要のあるリモート インタフェースにより定義されるライフサイクル管理メソッドを示します。BPM プラグイン ライフサイクルの詳細については、ライフサイクル タスクの管理を参照してください。
リモート インタフェース ライフサイクルを管理するメソッドの詳細については、com.bea.wlpi.server.plugin.Plugin Javadoc を参照してください。 通知メソッド 次の表に、実装する必要のあるリモート インタフェースにより定義される通知メソッドを定義します。 注意: 通知を受信するには、プラグインが通知リスナとして登録されている必要があります。詳細については、プラグイン通知の使い方を参照してください。
リモート インタフェース通知メソッドの詳細については、com.bea.wlpi.server.plugin.Plugin Javadoc を参照してください。 プラグイン情報メソッド 次の表に、実装する必要のあるリモート インタフェースにより定義されるプラグイン情報メソッドを示します。
リモート インタフェース プラグイン情報メソッドの詳細については、com.bea.wlpi.server.plugin.Plugin Javadoc を参照してください。 オブジェクト作成メソッド 次の表に、実装する必要のあるリモート インタフェースにより定義されるオブジェクト作成メソッドを定義します。
リモート インタフェース オブジェクト作成メソッドの詳細については、com.bea.wlpi.server.plugin.Plugin Javadoc を参照してください。 リモート インタフェースの実装例 プラグイン サンプルから抜粋した次のコード リストは、リモート インタフェースとそのメソッドを実装する方法を示しています。この抜粋は、SAMPLES_HOME/integration/samples/bpm_api/plugin/src/com/bea/wlpi/tour/po/plugin ディレクトリの SamplePluginBean.java ファイルから取り出したものです。重要なコード行は、太字で示します。 コード リスト 3-3 リモート インタフェースの実装 プラグイン サンプルの詳細については、BPM プラグイン サンプルを参照してください。
// プラグインの実装
/**
* プラグインをロードする。プラグインは、この時点で、
* 各種システム イベントへの関心を登録する必要がある
* @param pluginData プラグイン コンフィグレーション データ
* @see PluginManager#addTemplateListener
* @see PluginManager#addTemplateDefinitionListener
* @see PluginManager#addInstanceListener
* @see PluginManager#addTaskListener
* @throws PluginException
*/
public void load(PluginObject pluginData) throws PluginException {
log("load called");
// このブロックによる通知のサブスクライブを有効にする
/*
PluginManagerCfg pm = null;
try {
pm = getPluginManagerCfg();
Plugin plugin = (Plugin)ctx.getEJBObject();
pm.addInstanceListener(plugin, PluginConstants.EVENT_NOTIFICATION_ALL);
pm.addTaskListener(plugin, PluginConstants.EVENT_NOTIFICATION_ALL);
pm.addTemplateDefinitionListener(plugin, PluginConstants.EVENT_NOTIFICATION_ALL);
pm.addTemplateListener(plugin, PluginConstants.EVENT_NOTIFICATION_ALL);
} catch (Exception e) {
e.printStackTrace();
throw new PluginException(SamplePluginConstants.PLUGIN_NAME, "Unable to get PluginManager");
} finally {
try {
if (pm != null)
pm.remove();
} catch (Exception e) {
}
}
*/
log("loaded");
}
/**
* プラグインをアンロードする。プラグイン フレームワークは、イベント通知を
* サブスクライブしていた場合、プラグインを登録解除する
*/
public void unload() {
log("unload called");
}
public PluginDependency[] getDependencies() {
log("getDependencies called");
return null;
}
public String getName() {
return SamplePluginConstants.PLUGIN_NAME;
}
public VersionInfo getVersion() {
return SamplePluginConstants.PLUGIN_VERSION;
}
/**
* プラグインに関する詳細情報を返す
* @param lc 表示文字列をローカライズするロケール
* @return プラグインに関する詳細情報
*/
public PluginInfo getPluginInfo(Locale lc) {
log("getPluginInfo called");
return createPluginInfo(lc);
}
public void setConfiguration(PluginObject config) throws PluginException {
}
/**
* プラグイン機能の詳しい説明を返す。新しいサブカテゴリとアクションを
* 追加するには、プラグインは、渡された<code>info</code> パラメータを
* 介して渡されるカテゴリ ID を使用して、親カテゴリ、および
* 新しいカテゴリ ID として {@link ActionCategoryInfo#ID_PLUGIN} を識別する必要がある
* PluginManager は、この呼び出しにより返される CategoryInfo 配列を
* 現在の構造(<code>info</code> パラメータにより渡される)と結合し、
* {@link ActionCategoryInfo#ID_PLUGIN} への参照を、新たに割り当てられた
* ユニークなカテゴリ ID に置き換える。この事前定義されたカテゴリは、次の ID を持つ
* {@link ActionCategoryInfo#ID_TASK}, {@link ActionCategoryInfo#ID_WORKFLOW},
* {@link ActionCategoryInfo#ID_INTEGRATION}, {@link ActionCategoryInfo#ID_MISCELLANEOUS},
* {@link ActionCategoryInfo#ID_EXCEPTION}. * @param lc 表示文字列をローカライズするロケール
* @param info 既存のアクション カテゴリ ツリー。事前定義された
* カテゴリとアクション、およびプラグイン定義されたカテゴリとアクション
* (以前にロードされたプラグインにより)の両方を含む
* @return ツリーに挿入する新しいカテゴリとアクション
*/
public PluginCapabilitiesInfo getPluginCapabilitiesInfo(Locale lc,
CategoryInfo[] info) {
PluginInfo pi;
FieldInfo orderFieldInfo;
FieldInfo confirmFieldInfo;
FieldInfo[] fieldInfo;
FunctionInfo fi;
FunctionInfo[] functionInfo;
StartInfo si;
StartInfo[] startInfo;
EventInfo ei;
EventInfo[] eventInfo;
SampleBundle bundle = new SampleBundle(lc);
log("getPluginCapabilities called");
pi = createPluginInfo(lc);
orderFieldInfo =
new FieldInfo(SamplePluginConstants.PLUGIN_NAME, 3,
bundle.getString("orderFieldName"),
bundle.getString("orderFieldDesc"),
SamplePluginConstants.ORDER_FIELD_CLASSES, false);
confirmFieldInfo =
new FieldInfo(SamplePluginConstants.PLUGIN_NAME, 4,
bundle.getString("confirmFieldName"),
bundle.getString("confirmFieldDesc"),
SamplePluginConstants.CONFIRM_FIELD_CLASSES, false);
fieldInfo = new FieldInfo[]{ orderFieldInfo, confirmFieldInfo };
ei = new EventInfo(SamplePluginConstants.PLUGIN_NAME, 6,
bundle.getString("confirmOrderName"),
bundle.getString("confirmOrderDesc"), ICON_BYTE_ARRAY,
SamplePluginConstants.EVENT_CLASSES,
confirmFieldInfo);
eventInfo = new EventInfo[]{ ei };
fi = new FunctionInfo(SamplePluginConstants.PLUGIN_NAME, 7,
bundle.getString("calcTotalName"),
bundle.getString("calcTotalDesc"),
bundle.getString("calcTotalHint"),
SamplePluginConstants.FUNCTION_CLASSES, 3, 3);
functionInfo = new FunctionInfo[]{ fi };
si = new StartInfo(SamplePluginConstants.PLUGIN_NAME, 5,
bundle.getString("startOrderName"), bundle.getString("startOrderDesc"), ICON_BYTE_ARRAY,
SamplePluginConstants.START_CLASSES, orderFieldInfo);
startInfo = new StartInfo[]{ si };
PluginCapabilitiesInfo pci = new PluginCapabilitiesInfo(pi,
getCategoryInfo(bundle), eventInfo,
fieldInfo, functionInfo, startInfo,
null, null, null, null, null);
return pci;
}
/**
* プラグイン定義クラスを返す。呼び出し側は、プラグイン提供の
* メタデータ オブジェクトの 1 つを呼び出すことによりクラス名を検索する
* @param className インスタンス化する Java クラスの完全修飾名
* @return 指定された名前を持つクラス
* @throws ClassNotFoundException プラグインがクラスをロードできなかった場合
* @see ActionInfo
* @see EventInfo
* @see FunctionInfo
* @see FieldInfo
* @see PluginInfo
* @see StartInfo
* @see DoneInfo
* @see VariableTypeInfo
* @see TemplatePropertiesInfo
* @see TemplateDefinitionPropertiesInfo
* @throws PluginException
*/
public Class classForName(String className)
throws ClassNotFoundException, PluginException {
log("classForName called");
return Class.forName(className);
}
/**
* プラグイン定義されたオブジェクトを返す。呼び出し側は、プラグイン提供のメタデータ オブジェクトの
* メタデータ オブジェクトの 1 つを呼び出すことによりクラス名を検索する
* @param lc 表示文字列をローカライズするロケール
* @param className インスタンス化する Java クラスの完全修飾名
* @return
* @see ActionInfo
* @see EventInfo
* @see FunctionInfo
* @see FieldInfo
* @see PluginInfo * @see StartInfo
* @see DoneInfo
* @see VariableTypeInfo
* @see TemplateInfo
* @see TemplateDefinitionInfo
* @throws ClassNotFoundException
* @throws PluginException
*/
public Object getObject(Locale lc, String className)
throws ClassNotFoundException, PluginException {
log("getObject called with class name " + className);
try {
Class cls = Class.forName(className);
Object obj;
try {
// Locale オブジェクトを取得する ctor があるかどうかを確認する
Class[] paramType = new Class[]{ lc.getClass() };
Constructor ctor = cls.getConstructor(paramType);
Object[] param = new Object[]{ lc };
obj = ctor.newInstance(param);
return (obj);
} catch (Exception e) {
}
// ctor がロケールを取得しない場合、引数なしの ctor を呼び出す
return Class.forName(className).newInstance();
} catch (InstantiationException ie) {
throw new PluginException(SamplePluginConstants.PLUGIN_NAME,
"Unable to instantiate class: " + ie);
} catch (IllegalAccessException iae) {
throw new PluginException(SamplePluginConstants.PLUGIN_NAME,
"Unable to instantiate class: " + iae);
}
}
/**
* テンプレートでの変更をプラグインに通知する
* @param e 変更を示すイベント オブジェクト
*/
public void templateChanged(TemplateNotification e) {
log("templateChanged called");
}
/** * テンプレート定義での変更をプラグインに通知する
* @param e 変更を示すイベント オブジェクト
*/
public void templateDefinitionChanged(TemplateDefinitionNotification e) {
log("templateDefinitionChanged called");
}
/**
* ワークフロー インスタンスでの変更をプラグインに通知する
* @param e 変更を示すイベント オブジェクト
*/
public void instanceChanged(InstanceNotification e) {
log("instanceChanged called");
}
/**
* タスク インスタンスでの変更をプラグインに通知する
* @param e 変更を示すイベント オブジェクト
*/
public void taskChanged(TaskNotification e) {
log("taskChanged called");
} private PluginInfo createPluginInfo(Locale lc) {
HelpSetInfo helpSet;
PluginInfo pi;
SampleBundle bundle = new SampleBundle(lc);
String name = bundle.getString("pluginName");
String desc = bundle.getString("pluginDesc");
String helpName = bundle.getString("helpName");
String helpDesc = bundle.getString("helpDesc");
helpSet = new HelpSetInfo(SamplePluginConstants.PLUGIN_NAME, helpName,
helpDesc,
new String[]{ "htmlhelp/Sample", "index" },
HelpSetInfo.HELP_HTML);
pi = new PluginInfo(SamplePluginConstants.PLUGIN_NAME, name, desc, lc,
SamplePluginConstants.VENDOR_NAME,
SamplePluginConstants.VENDOR_URL,
SamplePluginConstants.PLUGIN_VERSION,
SamplePluginConstants.PLUGIN_FRAMEWORK_VERSION,
null, null, helpSet);
return pi;
}
// これらのオブジェクトは毎回作成し直す必要がある
// その理由は、結果の所有権を放棄するので、プラグイン フレームワークにより
// 各項目にシステム ID が割り当てられるからである
// 再割り当てにより、IllegalStateException が生成される
private CategoryInfo[] getCategoryInfo(SampleBundle bundle) {
ActionInfo checkInventoryAction =
new ActionInfo(SamplePluginConstants.PLUGIN_NAME, 1,
bundle.getString("checkInventoryName"),
bundle.getString("checkInventoryDesc"), ICON_BYTE_ARRAY,
ActionCategoryInfo.ID_NEW,
ActionInfo.ACTION_STATE_ALL,
SamplePluginConstants.CHECKINV_CLASSES);
ActionInfo sendConfirmAction =
new ActionInfo(SamplePluginConstants.PLUGIN_NAME, 2,
bundle.getString("sendConfirmName"),
bundle.getString("sendConfirmDesc"), ICON_BYTE_ARRAY,
ActionCategoryInfo.ID_NEW,
ActionInfo.ACTION_STATE_ALL,
SamplePluginConstants.SENDCONF_CLASSES);
ActionCategoryInfo[] actions =
new ActionCategoryInfo[]{ checkInventoryAction, sendConfirmAction };
CategoryInfo[] catInfo =
new CategoryInfo[]{ new CategoryInfo(SamplePluginConstants.PLUGIN_NAME,
0, bundle.getString("catName"),
bundle.getString("catDesc"),
ActionCategoryInfo.ID_NEW,
actions) };
return catInfo;
}
private void log(String msg) {
System.out.println("SamplePlugin: " + msg);
}
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |