BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > BPM トピック > BPM クライアント アプリケーション プログラミング > 実行時タスクの管理 |
BPM クライアント アプリケーション プログラミング
|
実行時タスクの管理
ワークフローを開始すると、手動によるワークフローの開始に記述のように、ワークフローを開くときにインスタンスに関連するタスクの管理が可能になります。この章では、実行時タスクの管理方法について説明します。内容は以下のとおりです。
実行時タスク管理の Worklist の使用方法については、『WebLogic Integration Worklist ユーザーズ ガイド』の「タスクを使った作業」を参照してください。
タスクの取得
タスクを取得するには、次の com.bea.wlpi.server.worklist.Worklist メソッドを使用します。
public com.bea.wlpi.common.TaskInfo getTask(
java.lang.String taskName,
java.lang.String instanceId,
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
getTasks() メソッドのパラメータを次の表に示します。パラメータには値を指定する必要があります。
このメソッドは、com.bea.wlpi.common.TaskInfo オブジェクトを戻します。タスクについての情報にアクセスするには、TaskInfo オブジェクトに記載の TaskInfo オブジェクト メソッドを使用します。
たとえば、次のコードでは、特定のワークフロー インスタンスの Task1 というタスクが取得されます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
TaskInfo task = worklist.getTask(“Task1”,instanceID);
getTasks() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
すべてのタスクの取得
特定の参加コンポーネント(ユーザまたはロール)やオーガニゼーションに関連するタスクのリストを取得する場合、以下のいずれかの com.bea.wlpi.server.worklist.Worklist メソッドを使用します。
public java.util.List getTasks(
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
public java.util.List getTasks(
java.lang.String orgId,
java.lang.String assigneeId,
boolean isRole
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
第 1 のメソッドでは、Worklist EJB を参照する EJBObject を作成したアクティブなオーガニゼーションに所属するユーザに関連したタスクが取得されます。第 2 のメソッドでは、特定のオーガニゼーションや assignee (ロールまたはユーザ) に関連したタスクが取得されます。
getTasks() メソッドのパラメータを次の表に示します。パラメータには値を指定する必要があります。
各メソッドは、com.bea.wlpi.common.TaskInfo オブジェクトのリストを返します。各タスクについての情報にアクセスするには、TaskInfo オブジェクトに記載の TaskInfo オブジェクト メソッドを使用します。
たとえば、次のコードでは、アクティブなオーガニゼーションに所属する現在のユーザのためのタスクが取得されます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
List taskList = worklist.getTasks();
次のコードでは、オーガニゼーション ORG1 の ROLE1 というロールのタスクのリストが取得されます(パラメータ isRole は、true)。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
List taskList = worklist.getTasks(“ORG1”, “ROLE1”, true);
getTasks() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
タスク数の取得
現在のユーザのために割り当てられているタスク数および期日超過しているタスクの数を取得するには、次の com.bea.wlpi.server.worklist.Worklist メソッドを使用します。
public int[ ] getTaskCounts(
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
このメソッドは、2 つの要素からなる配列を返します。最初の要素は、ユーザに割り当てられたタスクの数を示します。次の要素は、その中で期日超過しているタスクの数を示します。
たとえば、次のコードでは、現在のユーザに割り当てられたタスクおよび期日超過したタスクの数が取得され、配列 taskCounts[ ] にその数が保持されます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
int taskCounts[ ] = worklist.getTaskCounts();
割り当てられたタスク数と期日超過しているタスク数は、それぞれ taskCounts[0] と taskCounts[1] に保持されています。
getTaskCounts() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
タスクの実行
タスクを実行するには、以下のいずれかの com.bea.wlpi.server.worklist.Worklist メソッドを使用します。
public java.lang.String taskExecute(
java.lang.String taskName,
java.lang.String instanceId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
public java.lang.String taskExecute(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
taskExecute() メソッドのパラメータを次の表に示します。パラメータには値を指定する必要があります。
このメソッドの結果として、特定のタスクのための Executed イベントに関連付けられたすべてのアクションが連続して実行されます。タスクの Executed イベントに関する定義については、テンプレート定義 DTDを参照してください。 このメソッドは、クライアント要求 DTDに記載のとおり、Client Request DTD の ClientReq.dtd に準拠する XML ドキュメントを返します。この XML ドキュメントは、実行中のインスタンスの情報を含み、たとえば、SAX (Simple API for XML) パーサーのような XML 構文解釈ツールを使用してドキュメント解析によるアクセスが可能です。SAX パーサーの実装サンプルについては、実行時タスクの管理例を参照してください。 たとえば、次のコードでは、特定のタスクが実行され、文字列 clientReq に結果の XML が割り当てられます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。 テンプレート定義、ワークフロー インスタンス、およびタスク ID は、com.bea.wlpi.common.TaskInfo オブジェクト、task と関連するメソッドを使用して取得されます。task オブジェクトは、すべてのタスクの取得に記載のメソッドを使用して取得されます。 com.bea.wlpi.common.TaskInfo メソッドの詳細については、TaskInfo オブジェクトを参照してください。 taskExecute() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
String clientReq = worklist.taskExecute(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId()
);
クライアント要求に対する応答
ワークフローを定義するとき、 統合アクションを作成することで、実行中のインスタンス(プロセス エンジンを介して)とクライアント プログラム間の通信チャネルを確立できます。これらの典型的な XML をクライアントに送信アクションは、標準あるいはカスタム DTD に準拠した XML ドキュメントを介して、要求をクライアントに送ります。たとえば、クライアントへ要求を送るアクションは、ダイアログ ボックスを介して実装できます。
クライアントからの応答が要求されます。最初のアクションとして、一般的に、応答から要求される値を抽出するために XPath 関数を使用します。XPath については次のサイトを参照してください。
ワークフロー内の 統合アクションの定義については、テンプレート定義 DTDを参照してください。
Send XML to Client アクション(ActionSendXMLToClient)によって要求への応答を生成するには、以下の com.bea.wlpi.server.worklist.Worklist メソッドのいずれかを使用します。
メソッド 1
public java.lang.String response(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String nodeId,
java.lang.Object data
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
メソッド 2
public java.lang.String response(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String nodeId,
java.lang.Object data,
java.lang.Object transactionId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
メソッド 3
public java.lang.String response(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String nodeId,
java.lang.String xml
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
response() メソッドのパラメータを次の表に示します。パラメータには値を指定する必要があります。
response() メソッドは、コールバック変数をセットし、順次すべてのアクションを実行します。コールバック変数とアクションの定義については、テンプレート定義 DTDを参照してください。
このメソッドは、クライアント要求 DTDに記載のとおり、Client Request DTD の ClientReq.dtd に準拠する XML ドキュメントを返します。この XML ドキュメントは、実行中のインスタンスの情報を含み、たとえば、SAX (Simple API for XML) パーサーのような XML 構文解釈ツールを使用してドキュメント解析によるアクセスが可能です。SAX パーサーの実装サンプルについては、実行時タスクの管理例を参照してください。
たとえば、次のコードでは、サーバに応答が送られ、戻り値が clientReq 変数に保存されます。
String clientReq = worklist.response( templateDefinitionId,
instanceId, actionId, response.toString() );
サンプルの詳細については、クライアント要求に対して応答するを参照してください。response() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
タスクの割り当て
タスクに割り当てられているユーザまたはロールを変更する、またはタスクの割り当てを解除するには、以下の com.bea.wlpi.server.worklist.Worklist メソッドを使用します。
メソッド 1
public java.lang.String taskAssign(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId,
java.lang.String assigneeId,
boolean isRole,
boolean bLoadBalance
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
メソッド 2
public java.lang.String taskAssign(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId,
java.lang.String assigneeId,
boolean isRole,
boolean bLoadBalance,
java.lang.Object transactionId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
メソッド 3
public java.lang.String taskUnassign(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId
) throws RemoteException, WorkflowException
taskAssign() および taskUnassign() メソッドのパラメータを次の表に示します。パラメータには値を指定する必要があります。
割り当て先を選択する時は、以下を考慮します。
これらのメソッドは、クライアント要求 DTDに記載のとおり、Client Request DTD の ClientReq.dtd に準拠する XML ドキュメントを戻します。この XML ドキュメントは、実行中のインスタンスの情報を含み、たとえば、SAX (Simple API for XML) パーサーのような XML 構文解釈ツールを使用してドキュメント解析によるアクセスが可能です。SAX パーサーの実装サンプルについては、実行時タスクの管理例を参照してください。
たとえば、次のコードでは、ユーザ joe にタスクが割り当てられ、clientReq 文字列に結果の XML が割り当てられます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
String clientReq = worklist.taskAssign(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId(),
“joe”,
false,
false
);
次のコードでは、同じタスクの割り当てが取り消されます。
String clientReq = worklist.taskUnassign(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId(),
“joe”,
false,
false
);
テンプレート定義、ワークフロー インスタンス、およびタスク ID は、com.bea.wlpi.common.TaskInfo オブジェクト、task と関連するメソッドを使用して取得されます。task オブジェクトは、すべてのタスクの取得に記載のメソッドを使用して取得されます。
com.bea.wlpi.common.TaskInfo メソッドの詳細については、 TaskInfo オブジェクト または、Javadoc の com.bea.wlpi.common.TaskInfo を参照してください。
taskAssign() および taskUnassign() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
タスクへの完了または未完了マークの付与
タスクに完了(done)または未完了(undone)としてマークするには、以下の com.bea.wlpi.server.worklist.Worklist メソッドを使用します。
メソッド 1
public java.lang.String taskMarkDone(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
メソッド 2
public java.lang.String taskMarkDone(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId,
java.lang.Object transactionId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
メソッド 3
public java.lang.String taskUnmarkDone(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
taskMarkDone() および taskMarkUndone() メソッドのパラメータを次の表に示します。パラメータには値を指定する必要があります。
taskMarkDone() メソッドは、現在の日付および時間にタスク Completed 値を設定します。さらに、指定されたタスクの Marked Done イベントと関連する、すべてのアクションの連続実行を行います。ただし、taskMarkDone() メソッドは完了マークの付けられたタスクには影響しません。タスクの Marked Done イベントに関する定義については、テンプレート定義 DTDを参照してください。
taskUnmarkDone() メソッドは Completed 日付を消去します。このメソッドは、指定したタスクの Activated イベントに関連したアクションを実行しません。
このメソッドは、クライアント要求 DTDに記載のとおり、Client Request DTD の ClientReq.dtd に準拠する XML ドキュメントを返します。この XML ドキュメントは、実行中のインスタンスの情報を含み、たとえば、SAX (Simple API for XML) パーサーのような XML 構文解釈ツールを使用してドキュメント解析によるアクセスが可能です。SAX パーサーの実装サンプルについては、実行時タスクの管理例を参照してください。
たとえば、次のコードでは指定されたタスクに完了マークが付けられ、Completed 値が現在の日付および時間に設定されています。また、指定されたタスクの Marked Done イベントと関連するアクションが実行され、clientReq 文字列に結果の XML が割り当てられます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
String clientReq = worklist.taskMarkDone(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId()
);
次のコードでは、同じタスクに未完了のマークがつけられ、完了日付が初期化され、clientReq 文字列に結果の XML が割り当てられます。
String clientReq = worklist.taskMarkUndone(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId()
);
テンプレート定義、ワークフロー インスタンス、およびタスク ID は、com.bea.wlpi.common.TaskInfo オブジェクト、task と関連するメソッドを使用して取得されます。task オブジェクトは、すべてのタスクの取得に記載のメソッドを使用して取得されます。
com.bea.wlpi.common.TaskInfo メソッドの詳細については、TaskInfo オブジェクトまたは、Javadoc の com.bea.wlpi.common.TaskInfo を参照してください。
taskMarkDone() および taskMarkUndone() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
タスク プロパティの設定
タスク プロパティを設定するには、次の com.bea.wlpi.server.worklist.Worklist メソッドを使用します。
public java.lang.String taskSetProperties(
java.lang.String templateDefinitionId,
java.lang.String instanceId,
java.lang.String taskId,
int priority,
boolean doneWithoutDoit,
boolean doitIfDone,
boolean unmarkDone,
boolean modifiable,
boolean reassignable
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException
taskSetProperties() メソッドのパラメータを次の表に示します。パラメータには値を指定する必要があります
このメソッドは、クライアント要求 DTDに記載のとおり、Client Request DTD の ClientReq.dtd に準拠する XML ドキュメントを返します。この XML ドキュメントは、実行中のインスタンスの情報を含み、たとえば、SAX (Simple API for XML) パーサーのような XML 構文解釈ツールを使用してドキュメント解析によるアクセスが可能です。SAX パーサーの実装サンプルについては、実行時タスクの管理例を参照してください。
たとえば、次のコードでは、デフォルトのタスクの優先順位が中(1)に設定され、他のパラメータが有効(true に設定)化され、clientReq 変数に結果の XML ドキュメントが保存されます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
String clientReq = worklist.taskSetProperties(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId(),
1,
true,
true,
true,
true,
true
);
テンプレート定義、ワークフロー インスタンス、およびタスク ID は、com.bea.wlpi.common.TaskInfo オブジェクト、task と関連するメソッドを使用して取得されます。task オブジェクトは、すべてのタスクの取得に記載のメソッドを使用して取得されます。
com.bea.wlpi.common.TaskInfo メソッドの詳細については、TaskInfo オブジェクトまたは、Javadoc の com.bea.wlpi.common.TaskInfo を参照してください。
taskSetProperties() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。
インスタンス変数の更新
ワークフロー インスタンス変数の更新については、実行時の変数のモニタリングを参照してください。
例外ハンドラの呼び出し
例外ハンドラの呼び出しについては、ワークフロー例外ハンドラの呼び出しを参照してください。
実行時タスクの管理例
以下の節では、コマンドラインと JSP Worklist の例から抜粋して、Xerces SAX パーサーの実装を含む実行時タスクの管理方法を示します。
コマンドライン Worklist サンプル
この節では、コマンドライン Worklist サンプルから抜粋して、実行時タスクの管理方法を示します。
注意: コマンドライン Worklist サンプルの詳細については、コマンドライン Worklist サンプルを参照してください。
この例では、ユーザは以下のアクションのいずれかの指定を要求されます。
適用可能なコードのアクションは、以下のように提供されます。また注意が必要な行は太字で示されます。このコード例では、worklist は Worklist EJB への EJBObject 参照を表します。
このサンプルでは、ユーザと通信するための入力ストリームが定義されており、ユーザは以下のアクションのいずれかを指定するよう求められます。
/* ユーザとの通信のための入力ストリームを作成する */
stdIn = new BufferedReader( new InputStreamReader( System.in ) );
/* ツール タイトルを表示する */
System.out.print( "¥n--- Command Line Worklist v1.2 ---" );
/* メイン メニューを表示してユーザと交信する */
while( true ) {
/* メニューを表示する */
System.out.println( "¥n--- Main Menu ---" );
System.out.println( "¥nEnter choice:" );
System.out.println( "1) Organizations" );
System.out.println( "2) Workflows" );
System.out.println( "3) Tasks" );
System.out.println( "Q) Quit" );
System.out.print( ">> " );
.
.
.
mngTasks() メソッドは、ユーザと交信して必要な情報を取り出しながらユーザを管理する方法を示しています。
public static void mngTasks( ) {
boolean isForCurrentUser;
boolean isRole, isUserInRole;
boolean isDoneWithoutDoit, isDoitIfDone, isUnmarkDone, isModifiable,
isReassignment;
int priority;
String answer;
String assigneeId, instanceId, orgId, taskId, templateDefId;
/* ユーザとの通信のための入力ストリームを作成する */
BufferedReader stdIn = new BufferedReader(
new InputStreamReader( System.in ) );
try {
/* メイン メニューを表示してユーザと交信する */
while( true ) {
/* メニューを表示する */
System.out.println( "¥n¥n--- Tasks ---" );
System.out.println( "¥nEnter choice:" );
System.out.println( "1) Get Tasks Count" );
System.out.println( "2) List Tasks" );
System.out.println( "3) Assign a Task" );
System.out.println( "4) Execute a Task" );
System.out.println( "5) Mark a Task as Done" );
System.out.println( "6) Set Task Properties" );
System.out.println( "7) Unassign a Task" );
System.out.println( "8) Unmark a Task as Done" );
System.out.println( "B) Back to previous menu" );
System.out.println( "Q) Quit" );
System.out.print( ">> " );
/* ユーザの選択を取得する */
String line = stdIn.readLine( );
/* ユーザが選択を行わないで〔Enter〕を押したか ? */
if( line.equals( "" ) )
continue;
/* ユーザが複数の文字を入力したか ? */
else if( line.length( ) > 1 ) {
System.out.println( "*** Invalid choice" );
continue;
}
/* 大文字および文字へのコンバート*/
char choice = line.toUpperCase( ).charAt( 0 );
/* ユーザの選択を処理する */
switch( choice ) {
.
.
.
タスク数を取得する
タスクのルートの取得方法を示します。
/* タスク数を取得する */
case '1' :
/* WLPI 公開 API メソッド */
/* 注意 : 発生した例外を取り込むコードを
* 追加するとよい */
/* 配列より現在のユーザのタスク数を取り出す */
/* 配列要素 0 = 割り当てられたタスクの総数 */
/* 配列要素 1 = 期日超過しているタスク数 */
int taskCounts[ ] = worklist.getTaskCounts();
/* 割り当て済みのタスクがあるか ? */
if( taskCounts[0] == 0 )
System.out.println( "¥nNo task assigned" );
else {
System.out.println( "¥nTasks count:" );
if( taskCounts[0] == 1 )
System.out.println( "- 1 task assigned" );
else
System.out.println( "- " + taskCounts[0] + " tasks assigned" );
/* 期日超過しているタスクはあるか ? */
if( taskCounts[1] == 0 )
System.out.println( "- No overdue task" );
else if( taskCounts[1] == 1 )
System.out.println( "- 1 overdue task" );
else
System.out.println( "- " + taskCounts[1] + " overdue tasks" );
}
break;
.
.
.
すべてのタスクを取得する
すべてのタスクのリストを取得する方法を示します。
/* すべてのタスクをリスト アップする */
case '2' :
/* 現在のユーザのタスクをリストするか ? */
if( ( answer = askQuestion(
"¥nList Tasks for the current user (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isForCurrentUser = ( answer.equals( "y" ) || answer.equals( "Y" ) );
List taskList;
if( isForCurrentUser )
/* WLPI 公開 API メソッド */
/* 注意 : 発生した例外を取り込むコードを
* 追加するとよい */
/* アクティブなユーザとアクティブな
* オーガニゼーションのタスク リストを取得する */
taskList = worklist.getTasks( );
else {
/* オーガニゼーション ID を取得する */
if( ( orgId = askQuestion(
"¥nEnter Organization ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* Asignee ID を取得する */
if( ( assigneeId = askQuestion(
"Enter Assignee ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* Assignee がロールであるか ? */
if( ( answer = askQuestion(
"Is the Assignee a Role (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isRole = ( answer.equals( "y" ) || answer.equals( "Y" ) );
/* WLPI 公開 API メソッド */
/* 注意 : 発生した例外を取り込むコードを
* 追加するとよい */
/* 指定したユーザとオーガニゼーションのタスク リストを取得する */
taskList = worklist.getTasks( orgId, assigneeId, isRole );
}
/* 割り当て済みのタスクがあるか ? */
if( taskList.size( ) == 0 )
System.out.println( "¥nNo task assigned" );
else
System.out.print( "¥nAssigned Tasks:" );
/* リストを処理して、タスクを表示する */
for( int i = 0; i < taskList.size( ); i++ ) {
/* リストから要素を取り出す */
TaskInfo taskInfo = ( TaskInfo )taskList.get( i );
/* WLPI 公開 API メソッド */
/* 使用可能な属性のサブセットを取り出して表示する */
System.out.println( "¥n- Name: " + taskInfo.getName( ) );
System.out.println( " Template Definition ID: " +
taskInfo.getTemplateDefinitionId( ) );
System.out.println( " Workflow Instance ID: " +
taskInfo.getInstanceId( ) );
System.out.println( " Task ID: " + taskInfo.getTaskId( ) );
System.out.print( " Status: " + taskInfo.getStatus( ) );
/* タスク状態を取り出して表示する */
if( taskInfo.getStatus( ) == taskInfo.STATUS_PENDING )
System.out.println( " (Pending)" );
else if( taskInfo.getStatus( ) == taskInfo.STATUS_COMPLETE )
System.out.println( " (Complete)" );
else if( taskInfo.getStatus( ) == taskInfo.STATUS_OVERDUE )
System.out.println( " (Overdue)" );
else if( taskInfo.getStatus( ) == taskInfo.STATUS_INACTIVE )
System.out.println( " (Inactive)" );
else
System.out.println( " (Unknown)" );
}
break;
.
.
.
タスクを割り当てる
タスクの割り当て方法を示します。
/* タスクを割り当てる */
case '3' :
/* テンプレート定義 ID を取得する */
if( ( templateDefId = askQuestion(
"¥nEnter Template Definition ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* ワークフロー インスタンス ID を取得する */
if( ( instanceId = askQuestion(
"Enter Workflow Instance ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスク ID を取得する */
if( ( taskId = askQuestion( "Enter Task ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* Assignee ID を取得する */
if( ( assigneeId = askQuestion( "Enter Assignee ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* Assignee がロールであるか ? */
if( ( answer = askQuestion( "Assign to a role (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isRole = ( answer.equals( "y" ) || answer.equals( "Y" ) );
/* Assignee がロールの場合、ユーザにこのロールを割り当てるか? */
if( isRole ) {
if( ( answer = askQuestion(
"Assign to a user in this role (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isUserInRole = ( answer.equals( "y" ) || answer.equals( "Y" ) );
}
else
isUserInRole = false;
/* タスクを割り当てる */
try {
/* WLPI 公開 API メソッド */
String clientReq = worklist.taskAssign(
templateDefId, instanceId, taskId, assigneeId,
isRole, isUserInRole );
/* 正常終了(例外の発生なし) */
System.out.println( "- Success" );
/* クライアントの要求(もしあれば)を処理するために、
* サーバからの応答を解析する */
parser.handleRequest( clientReq );
}
catch( Exception e ) {
System.out.println( "*** Failed to assign the task" );
System.err.println( e );
}
break;
.
.
.
タスクを実行する
タスクの実行方法を示します。
/* タスクを実行する */
case '4' :
/* テンプレート定義 ID を取得する */
if( ( templateDefId = askQuestion(
"¥nEnter Template Definition ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* ワークフロー インスタンス ID を取得する */
if( ( instanceId = askQuestion(
"Enter Workflow Instance ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスク ID を取得する */
if( ( taskId = askQuestion( "Enter Task ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスクを実行する */
try {
/* WLPI 公開 API メソッド */
String clientReq = worklist.taskExecute(
templateDefId, instanceId, taskId );
/* 正常終了(例外の発生なし) */
System.out.println( "- Success" );
/* クライアントの要求(もしあれば)を処理するために、
* サーバからの応答を解析 */
parser.handleRequest( clientReq );
}
catch( Exception e ) {
System.out.println( "*** Failed to execute the task" );
System.err.println( e );
}
break;
.
.
.
タスクに完了マークを付ける
タスクに完了マークを付ける方法を示します。
/* タスクに完了マークを付ける */
case '5' :
/* テンプレート定義 ID を取得する */
if( ( templateDefId = askQuestion(
"¥nEnter Template Definition ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* ワークフロー インスタンス ID を取得する */
if( ( instanceId = askQuestion(
"Enter Workflow Instance ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスク ID を取得する */
if( ( taskId = askQuestion( "Enter Task ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスクに完了マークを付ける */
try {
/* WLPI 公開 API メソッド */
String clientReq = worklist.taskMarkDone(
templateDefId, instanceId, taskId );
/* 正常終了(例外の発生なし) */
System.out.println( "- Success" );
/* クライアントの要求(もしあれば)を処理するために、
* サーバからの応答を解析 */
parser.handleRequest( clientReq );
}
catch( Exception e ) {
System.out.println( "*** Failed to mark the task as done" );
System.err.println( e );
}
break;
.
.
.
タスク プロパティを設定する
タスク プロパティの設定方法を示します。
/* タスク プロパティを設定する */
case '6' :
/* テンプレート定義 ID を取得する */
if( ( templateDefId = askQuestion(
"¥nEnter Template Definition ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* ワークフロー インスタンス ID を取得する */
if( ( instanceId = askQuestion(
"Enter Workflow Instance ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスク ID を取得する */
if( ( taskId = askQuestion( "Enter Task ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスク優先順位を取得する */
if( ( answer = askQuestion(
"Enter the Priority (0=low, 1, 2=high)" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を解析する */
priority = Integer.parseInt( answer );
/* 「実行せずに完了マークを付ける」プロパティを取得する */
if( ( answer = askQuestion(
"Can it be marked done without executing (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isDoneWithoutDoit = ( answer.equals( "y" ) || answer.equals( "Y" ) );
/* 「完了マークが付いていたら、再実行する」プロパティを取得する */
if( ( answer = askQuestion(
"Can it be re-executed if marked done (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isDoitIfDone = ( answer.equals( "y" ) || answer.equals( "Y" ) );
/* 「完了マークが付いていたらマークしない」プロパティを取得する */
if( ( answer = askQuestion(
"Can it be unmarked if marked done (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isUnmarkDone = ( answer.equals( "y" ) || answer.equals( "Y" ) );
// System.out.print( "Can the properties be modified
// at runtime (y/n) >> " );
/* 応答を取得する */
// answer = stdIn.readLine( );
/* ユーザによる操作の取り消しがあるか ? */
// if( answer.equals( "" ) )
// {
// System.out.println( "*** Cancelled" );
// break;
// }
/* 応答を評価する */
// boolean isModifiable = (
// answer.equals( "y" ) || answer.equals( "Y" ) );
isModifiable = true;
/* 「再割り当て」プロパティを取得する */
if( ( answer = askQuestion(
"Can it be reassigned (y/n)?" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* 応答を評価する */
isReassignment = ( answer.equals( "y" ) || answer.equals( "Y" ) );
/* タスク プロパティを設定する */
try {
/* WLPI 公開 API メソッド */
String clientReq = worklist.taskSetProperties( templateDefId,
instanceId, taskId, priority, isDoneWithoutDoit, isDoitIfDone,
isUnmarkDone, isModifiable, isReassignment );
/* 正常終了(例外の発生なし) */
System.out.println( "- Success" );
/* クライアントの要求(もしあれば)を処理するために、
* サーバからの応答を解析 */
parser.handleRequest( clientReq );
}
catch( Exception e ) {
System.out.println( "*** Failed to set the task properties" );
System.err.println( e );
}
break;
.
.
.
タスクの割り当てを解除する
タスクの割り当てを解除する方法を示します。
/* タスクの割り当てを解除する */
case '7' :
/* テンプレート定義 ID を取得する */
if( ( templateDefId = askQuestion(
"¥nEnter Template Definition ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* ワークフロー インスタンス ID を取得する */
if( ( instanceId = askQuestion(
"Enter Workflow Instance ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスク ID を取得する */
if( ( taskId = askQuestion( "Enter Task ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスクの割り当てを解除する */
try {
/* WLPI 公開 API メソッド */
worklist.taskUnassign( templateDefId, instanceId, taskId );
/* 正常終了(例外の発生なし) */
System.out.println( "- Success" );
}
catch( Exception e ) {
System.out.println( "*** Failed to unassign the task" );
System.err.println( e );
}
break;
.
.
.
タスクに未完了マークを付ける
タスクに未完了マークを付ける方法を示します。
/* タスクの完了マークを外す */
case '8' :
/* テンプレート定義 ID を取得する */
if( ( templateDefId = askQuestion(
"¥nEnter Template Definition ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* ワークフロー インスタンス ID を取得する */
if( ( instanceId = askQuestion(
"Enter Workflow Instance ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスク ID を取得する */
if( ( taskId = askQuestion( "Enter Task ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}
/* タスクの完了マークを外す */
try {
/* WLPI 公開 API メソッド */
String clientReq = worklist.taskUnmarkDone(
templateDefId, instanceId, taskId );
/* 正常終了(例外の発生なし) */
System.out.println( "- Success" );
/* クライアントの要求(もしあれば)を処理するために、
* サーバからの応答を解析 */
parser.handleRequest( clientReq );
}
catch( Exception e ) {
System.out.println( "*** Failed to unmark the task as done" );
System.err.println( e );
}
break;
/* 前のメニューに戻る */
case 'B' :
return;
/* ツールを終了 */
case 'Q' :
/* サーバから切断 */
disconnect( );
System.exit( 1 );
default:
System.out.println( "*** Invalid choice" );
}
}
}
/* 「Unhandled」例外 */
catch( Exception e ) {
System.err.println( e );
}
return;
}
コマンドライン SAX パーサー サンプル
この節では、コマンドライン SAX パーサーから、抜粋して、SAX パーサーの設定方法と set-variables クライアント要求への応答の方法を示します。
注意: コマンドライン SAX パーサーのコード例の詳細については、コマンドライン SAX パーサ サンプルを参照してください。
message-box クライアント要求への応答方法の例は、クライアント要求を解析するを参照してください。
SAX パーサーは、クライアント要求を解析するため、コマンドライン Worklist により使用されます。この節での抜粋例は、以下のとおりです。
注意が必要な行は太字で示されます。
クライアント要求を解析する
次のコード抜粋では、カスタム実行時管理クライアントにおける Xerces SAX パーサーの使用方法を示します。handleRequest() メソッドは、BPM サーバから受信したクライアント要求を解析するために、Xerces SAX パーサーを使用します。request 文字列は、クライアント要求 DTDに記載のクライアント要求 DTD に適合した XML ドキュメントです。
private static final String DEFAULT_PARSER =
"weblogic.apache.xerces.parsers.SAXParser";
public void handleRequest( String request ) {
if( request == null )
return;
/* ハンドラのインスタンスを取得する */
ContentHandler contentHandler = new CLContentHandler();
ErrorHandler errorHandler = new CLErrorHandler();
try {
/* パーサーをインスタンス化する */
XMLReader parser = XMLReaderFactory.createXMLReader(
DEFAULT_PARSER );
/* コンテンツ ハンドラを登録する */
parser.setContentHandler( contentHandler );
/* エラー ハンドラを登録する */
parser.setErrorHandler( errorHandler );
/* 文字列ストリームを作成する */
Reader inReader = new StringReader( request );
/* SAX パーサーのストリームをカプセル化する */
InputSource inputSource = new InputSource( inReader );
/* 要求を解析する */
parser.parse( inputSource );
}
catch( Exception e ) {
System.err.println( e );
}
}
}
クライアント要求に対して応答する
以下のメソッドは、set-variable クライアント要求を取得するために、ユーザとやり取りを行います。これは、ActionSendXMLToClient イベントよりトリガされ、set-variable クライアント要求に応答します。
次のメソッドは、set-variable クライアント要求を取得します。
public void setVariables( List listVarInfo ) {
String varValue;
/* プロンプトを表示し値を取り出すためのリストを
* 処理する */
for( int i = 0; i < listVarInfo.size( ); i++ ) {
/* リストから要素を取り出す */
VariableInfo varInfo = ( VariableInfo )listVarInfo.get( i );
/* 変数値をユーザに要求する */
if( ( varValue = askQuestion(
"- " + varInfo.getVarPrompt() ) ) != null ) {
/* ユーザによる値の入力; その場合、保持された値を上書きする */
varInfo.setVarValue( varValue );
listVarInfo.set( i, ( VariableInfo )varInfo );
}
}
return;
}
.
.
.
次のメソッドは、set-variable クライアント要求に応答します。
private static String sendSetVariablesResponse(
String templateDefinitionId, String instanceId,
String actionId, List listVarInfo ) {
String clientReq = null;
/* XML クライアント応答を保存する変数を作成し
* ドキュメントのプロローグを追加する */
StringBuffer response = new StringBuffer(
"<?xml version=¥"1.0¥"?>¥r¥n" );
/* XML ドキュメントのルートを追加する */
response.append( "<set-variables>¥r¥n" );
/* 変数を取り出すためのリストを処理する
* NAME と値 */
for( int i = 0; i < listVarInfo.size( ); i++ ) {
/* VARIABLE (要素) と NAME (属性) を追加する */
response.append( " <variable name=¥"" );
/* リストから要素を取り出す */
VariableInfo varInfo = ( VariableInfo )listVarInfo.get( i );
/* NAME 属性の値を追加する */
response.append( varInfo.getVarName() + "¥">" );
/* VARIABLE 要素の値を追加する */
response.append( XMLToString( varInfo.getVarValue() ) );
/* エンド タグを追加する */
response.append( "</variable>¥r¥n" );
}
/* XML ドキュメントにルート エンド タグを追加する */
response.append( "</set-variables>" );
try {
/* WLPI 公開 API メソッド */
/* set-variables クライアント要求にクライアントの
* 応答を送る */
clientReq = clWorklist.getWorklist().response(
templateDefinitionId, instanceId, actionId,
response.toString() );
/* 正常終了(例外の発生なし) */
System.out.println( "¥nResponse sent to server" );
}
catch( Exception e ) {
System.out.println( "¥nFailed sending response to server" );
System.err.println( e );
}
return( clientReq );
}
.
.
.
JSP Worklist サンプル
この節では、JSP Worklist サンプルから抜粋して、実行時タスクの管理方法を示します。
注意: JSP Worklist サンプルの詳細については、JSP Worklist サンプルを参照してください。
抜粋例は、以下の機能を示します。
次のコード例では、注意が必要なコードを含むすべての行は太字で示されます。worklist は、Worklist EJB に対する EJBObject 参照を表します。
タスクを取得する
JSP Worklist (worklist.jsp) から抜粋して、タスクリストの取得方法とタスク情報を取得するための com.bea.wlpi.common.TaskInfo メソッドの使用方法を示します。
タスクリストを取得するためには、JSP Worklist へのプライマリ インタフェースの図に示すように、Display Options を設定します。
try {
List v = worklist.getTasks(currentOrg, currentRole, isRole);
session.putValue("tasklist", v);
// Get item count
int numItems = 0;
for (int i = 0, n = v.size(); i < n; i++) {
TaskInfo task = (TaskInfo)v.get(i);
if (task.getStarted() != null) {
if (task.getCompleted() != null) {
if (!done)
continue;
}
else {
if (!pending)
continue;
}
}
else if (!inactive)
continue;
numItems++;
}
}
.
.
.
com.bea.wlpi.common.TaskInfo メソッドの詳細については、TaskInfo オブジェクト または、Javadoc の com.bea.wlpi.common.TaskInfo を参照してください。
タスクを実行する
タスクの実行方法を JSP Worklist (worklist.jsp) から抜粋して示します。
ユーザは、JSP Worklist へのプライマリ インタフェースの図に示すように、Perform Task タスクのリンクの検索や実行すべきタスクの検索をすることで、タスクを実行できます。
try {
List vTaskList = (List)session.getValue("tasklist");
TaskInfo task = (TaskInfo)vTaskList.get(Integer.parseInt(cmd));
session.putValue("action", ACTION_DOIT);
if (action.equals(ACTION_DOIT)) {
System.out.println(worklist.taskExecute(task.getTemplateDefinitionId(),
task.getInstanceId(), task.getTaskId()));
responseParser.parse( worklist.taskExecute(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId() )
);
if (responseParser.isQuery()) {
pageContext.forward("query.jsp");
return;
}
if (responseParser.isMessage()) {
pageContext.forward("message.jsp");
return;
}
}
.
.
.
テンプレート定義、ワークフロー インスタンス、およびタスク ID は、com.bea.wlpi.common.TaskInfo オブジェクト、task と関連するメソッドを使用して取得されます。結果の XML ドキュメント(クライアント要求 DTDに記述のように、クライアント要求 DTD に準拠した)は、taskExecute() メソッドから返されます。また、レスポンス パーサーである ResponseParser に渡され解析されます。レスポンス パーサーの詳細については、クライアント要求を解析するを参照してください。
com.bea.wlpi.common.TaskInfo メソッドの詳細については、TaskInfo オブジェクトまたは、Javadoc の com.bea.wlpi.common.TaskInfo を参照してください。
クライアント要求を解析する
次の JSP SAX パーサー(ResponseParser)からの抜粋は、SAX パーサーの設定方法と message-box クライアント要求への応答方法を示しています。set-variables クライアント要求への応答方法に関するサンプルは、コマンドライン SAX パーサーのクライアント要求を解析するを参照してください。
package jsp_servlet._worklist;
import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import com.sun.xml.parser.Parser;
import org.xml.sax.*;
public class ResponseParser implements DocumentHandler {
.
.
.
public boolean isMessage() {
return message;
}
.
.
.
public String getMessageOption() {
return ((String)messageBox.getOption());
}
public String getMessageStyle() {
return ((String)messageBox.getStyle());
} .
.
.
public String generateMessageResponse(HttpServletRequest request) {
StringBuffer response = new StringBuffer();
response.append(
"<?xml version=¥"1.0¥"?>¥r¥n<message-box
option=¥""+request.getParameter("option")+"¥"/>");
System.out.println((String) response.toString());
return((String) response.toString());
}
.
.
.
public void parse(String xml) {
try {
parser = new Parser();
parser.setDocumentHandler(this);
parser.parse(new InputSource(new ByteArrayInputStream(
xml.getBytes())));
} catch (SAXParseException spe) {
} catch (Exception e) {
}
}
.
.
.
クライアント要求に対して応答する
この節では、JSP Worklist から抜粋したクライアント要求に対する応答方法を示す 2 つのコード例を紹介します。
第 1 の抜粋は、worklist.jsp ファイルより選択されています。responseParser は、XML ドキュメントを解析します。set-variables 要求に出会うと、コンテキストはファイル query.jsp に渡されます。message-box 要求に出会うと、コンテキストはファイル message.jsp に渡されます。レスポンス パーサーの詳細については、クライアント要求を解析するを参照してください。
if (action.equals(ACTION_DOIT)) {
responseParser.parse( worklist.taskExecute(
task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId() )
);
if (responseParser.isQuery()) {
pageContext.forward("query.jsp");
return;
}
if (responseParser.isMessage()) {
pageContext.forward("message.jsp");
return;
}
}
.
.
.
第 2 の抜粋では、response() メソッド呼び出しが示され、message.jsp ファイルの内容が示されます。このメソッドでは、XML パーサー(responseParser)を利用して、XML (その際、テンプレート定義、インスタンス ID およびワークフロー オブジェクト ID が取得される) および要求に基づいた応答が生成されます。レスポンス パーサーの詳細については、クライアント要求を解析するを参照してください。
<%@ page import="
javax.ejb.*,
java.rmi.RemoteException,
java.util.*,
java.text.*,
com.bea.wlpi.common.*
com.bea.wlpi.server.worklist.*
"%>
<jsp:usebean id="responseParser" class="jsp_servlet._worklist.ResponseParser" scope="session"/>
<%
Worklist worklist = null;
TaskInfo task = null;
String error = null;
String resp = null;
String messageOption = null;
worklist = (Worklist)session.getValue("worklist");
if (worklist != null) {
Hashtable h = new Hashtable();
h.put(javax.naming.Context.SECURITY_PRINCIPAL, session.getValue("name"));
h.put(javax.naming.Context.SECURITY_CREDENTIALS,
session.getValue("password"));
new javax.naming.InitialContext(h);
if (request.getParameter("option") != null) {
try {
System.out.println(responseParser.generateMessageResponse(request));
System.out.println(responseParser.getTemplateDefinitionId());
System.out.println(responseParser.getInstanceId());
System.out.println(responseParser.getActionId());
resp = worklist.response(
responseParser.getTemplateDefinitionId(),
responseParser.getInstanceId(),
responseParser.getActionId(),
responseParser.generateMessageResponse(request)
);
pageContext.forward("worklist.jsp");
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
%>
<html>
<head>
<title>Message</title>
</head>
<body bgcolor=#ffffff>
<font face="Arial" size="4">
<form action="message.jsp" method="POST">
<table dir="ltr" border="0" cellpadding="1" cellspacing="1">
<tr>
<td><img src="logo.gif"></td>
<td><font color="red" size="7">
<strong><em>Weblogic</em></strong></font>
<font color="black" size="7">
<strong><em>Process Integrator</em></strong></font>
</td>
</tr>
<tr>
<td bgcolor="navy" valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2">
<tr>
<td><font color="yellow">
<strong>Go ...</strong></font></td>
</tr>
<tr>
<td><a href="worklist.jsp">
<font color="white">Worklist</font></a></td>
</tr>
<tr>
<td><a href="startworkflow.jsp">
<font color="white">Start Workflow</font></a></td>
</tr>
<tr>
<td><a href="logoff.jsp">
<font color="white">Logoff</font></a></td>
</tr>
</table>
</td>
<td valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2" valign="top">
<%
if (error != null) {
%>
<tr>
<td><font color="red size="4" face="Arial"><%=error%></td>
</tr>
<%
}
%>
<tr>
<td><font color="navy" size="4" face="Arial">
<%=responseParser.getHeader()%></font></td>
</tr>
<tr>
<td>
<table border="0" cellpadding="2" cellspacing="2">
<tr>
<td></td>
<%
messageOption = responseParser.getMessageOption();
if (messageOption.equals("ok")) {
%>
<td width="10%">
<input type="submit" name="option" value="ok"></td>
<td width="90%"> </td>
<%
}
%>
<%
if (messageOption.equals("ok_cancel")) {
%>
<td width="10%">
<input type="submit" name="option" value="ok"></td>
<td width="10%">
<input type="submit" name="option" value="cancel"></td>
<td width="80%"> </td>
<%
}
%>
<%
if (messageOption.equals("yes_no")) {
%>
<td width="10%">
<input type="submit" name="option" value="yes"></td>
<td width="10%">
<input type="submit" name="option" value="no"></td>
<td width="80%"> </td>
<%
}
%>
<%
if (messageOption.equals("yes_no_cancel")) {
%>
<td width="10%">
<input type="submit" name="option" value="yes"></td>
<td width="10%">
<input type="submit" name="option" value="no"></td>
<td width="10%">
<input type="submit" name="option" value="cancel"></td>
<td width="70%"> </td>
<%
}
%>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</font>
</body>
</html>
タスクを割り当てる
この節では、JSP Worklist から抜粋した、異なる参加者(ユーザまたはロール)へのタスクを割り当てる方法を示す 4 つのコード例を紹介します。
ユーザは、JSP Worklist へのプライマリ インタフェースの図に示すように Reassign リンクを検索し、異なる参加者へのタスクの割り当てを変更できます。また、再割り当てをすべきタスクを検索したり、ユーザ、ロールまたはタスクの再割り当てを要求されたときのロール内のユーザを特定することによっても、タスクの割り当てを変更できます。
次のコード例では、worklist.jsp ファイルを参照する Reassign リンクの SetAction パラメータが 4 にセットされ、チェックマークをビジュアルな手がかりとして、次のアクションの左側に追加されます。
<tr>
<td><%=action.equals("4") ? "<img src=¥"check.gif¥">" : ""%></td>
<td><a href="worklist.jsp?SetAction=4">
<font color="white">Reassign</font></a></td>
</tr>
次に示すように、SetAction 値は action 変数から抽出され保存されます。
if (worklist != null) {
String cmd = request.getParameter("SetFilter");
if (cmd != null) {
.
.
.
}
else if (request.getParameter("SetAction") != null)
{
action = request.getParameter("SetAction");
session.putValue("action", action);
}
.
.
.
action 変数の値に基づき、コンテキストは、次のように reassign.jsp ファイルに送られます。
static final String ACTION_DOIT = "0";
static final String ACTION_MARKDONE = "1";
static final String ACTION_UNMARKDONE = "2";
static final String ACTION_TASKPROPERTIES = "3";
static final String ACTION_REASSIGN = "4";
.
.
.
try {
List vTaskList = (List)session.getValue("tasklist");
TaskInfo task = (TaskInfo)vTaskList.get(Integer.parseInt(cmd));
session.putValue("action", ACTION_DOIT);
if (action.equals(ACTION_DOIT)) {
.
.
.
}
else if (action.equals(ACTION_REASSIGN)) {
session.removeValue(“error”);
pageContext.forward(“reassign.jsp?task= “+cmd);
return;
}
.
.
.
次のコード例は、reassign.jsp ファイルの内容から抜き出した、タスクの再割り当てを行うための taskAssign() メソッドの使用方法を示しています。テンプレート定義、ワークフロー インスタンス、およびタスク ID は、com.bea.wlpi.common.TaskInfo オブジェクト、task と関連するメソッドを使用して取得されます。task オブジェクトは、すべてのタスクの取得に記載のメソッドを使用して取得されます。
<%@ page import="
javax.ejb.*,
java.rmi.RemoteException,
java.util.*,
java.text.*,
com.bea.wlpi.common.*
com.bea.wlpi.server.worklist.*
com.bea.wlpi.server.principal.*
javax.naming.*
"%>
<%!
static final String TYPE_USER = "0";
static final String TYPE_USERINROLE = "1";
static final String TYPE_ROLE = "2";
%>
<%
Worklist worklist = null;
TaskInfo task = null;
String error = null;
String assignType = TYPE_USER;
worklist = (Worklist)session.getValue("worklist");
if (worklist != null) {
Hashtable h = new Hashtable();
h.put(javax.naming.Context.SECURITY_PRINCIPAL, session.getValue("name"));
h.put(javax.naming.Context.SECURITY_CREDENTIALS,
session.getValue("password"));
new javax.naming.InitialContext(h);
String cmd = request.getParameter("task");
if (cmd != null) {
try {
List vTaskList = (List)session.getValue("tasklist");
task = (TaskInfo)vTaskList.get(Integer.parseInt(cmd));
session.putValue("task", task);
} catch (Exception e) {
}
}
else
task = (TaskInfo)session.getValue("task");
}
if (request.getParameter("Set") != null)
assignType = request.getParameter("Type");
if (request.getParameter("Reassign") != null) {
// Set properties
try {
assignType = request.getParameter("Type");
boolean bRole = false;
boolean bUserInRole = false;
if (!assignType.equals(TYPE_USER)) {
bRole = true;
if (assignType.equals(TYPE_USERINROLE))
bUserInRole = true;
}
worklist.taskAssign(task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId(),
request.getParameter("Assignee"),
bRole,
bUserInRole
);
session.removeValue("task");
session.removeValue("error");
pageContext.forward("worklist.jsp");
return;
} catch (Exception e) {
error = e.getMessage();
}
}
if (task != null) {
%>
<html>
<head>
<title>Reassign Task</title>
</head>
<body bgcolor=#ffffff>
<font face="Arial" size="4">
<form action="reassign.jsp" method="POST">
<table dir="ltr" border="0" cellpadding="1" cellspacing="1">
<tr>
<td><img src="logo.gif"></td>
<td><font color="red" size="7"><strong><em>Weblogic</em></strong></font>
<font color="black" size="7"><strong><em>
Process Integrator</em></strong></font></td>
</tr>
<tr>
<td bgcolor="navy" valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2" >
<tr>
<td><font color="yellow">
<strong>Go ...</strong></font></td>
</tr>
<tr>
<td><a href="worklist.jsp">
<font color="white">Worklist</font></a></td>
</tr>
<tr>
<td><a href="startworkflow.jsp">
<font color="white">Start Workflow</font></a></td>
</tr>
<tr>
<td><a href="logoff.jsp">
<font color="white">Logoff</font></a></td>
</tr>
</table>
</td>
<td valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2" valign="top">
<%
if (error != null) {
%>
<tr>
<td><font color="red size="4" face="Arial"><%=error%></td>
</tr>
<% }
%>
<tr>
<td><font color="navy" size="5" face="Arial">Reassign Task:
<strong><%=task.getName()%></strong></font></td>
</tr>
<tr>
<td>
<table border="0" cellpadding="2" cellspacing="2">
<tr>
<td><p align="right">Type:</p></td>
<td>
<select name="Type" size="1">
<option <%=assignType.equals(TYPE_USER) ? "selected" : ""%> value="0">
User
</option>
<option <%=assignType.equals(TYPE_USERINROLE) ? "selected" : ""%> value="1">
User in Role|
</option>
<option <%=assignType.equals(TYPE_ROLE) ? "selected" : ""%> value="2">
Role
</option>
</select>
<input type="submit" name="Set" value="Set "></td>
</tr>
<tr>
<td valign="top"><p align="right">Assign To:</p></td>
<td><select name="Assignee" size="10">
<%
if (assignType.equals(TYPE_USER)) {
List vUsers = (List)session.getValue("users");
if (vUsers == null)
try {
Context ctx = (Context)session.getValue("ctx");
WLPIPrincipalHome pHome =
(WLPIPrincipalHome)ctx.lookup("com.bea.wlpi.WLPIPrincipal");
WLPIPrincipal principal = (WLPIPrincipal)pHome.create();
vUsers = principal.getUsersInOrganization("ORG1", false);
session.putValue("users", vUsers);
principal.remove();
} catch (Exception e) {
}
for (int i = 0, n = vUsers.size(); i < n; i++) {
String name = ((UserInfo)vUsers.get(i)).getUserId();
out.print("<option value=¥"" + name + "¥">" + name + "</option>");
}
}
else {
List vRoles = (List)session.getValue("roles");
if (vRoles == null)
try {
Context ctx = (Context)session.getValue("ctx");
WLPIPrincipalHome pHome =
(WLPIPrincipalHome)ctx.lookup("com.bea.wlpi.WLPIPrincipal");
WLPIPrincipal principal = (WLPIPrincipal)pHome.create();
vRoles = principal.getRolesInOrganization("ORG1", false);
session.putValue("roles", vRoles);
principal.remove();
} catch (Exception e) {}
for (int i = 0, n = vRoles.size(); i < n; i++) {
String name = ((RoleInfo)vRoles.get(i)).getRoleId();
out.print("<option value=¥"" + name + "¥">" + name + "</option>");
}
}
%>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="Reassign" value="Reassign ">
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<%
}
%>
</font>
</body>
</html>
タスクに完了または未完了マークを付ける
次のコード例は、JSP Worklist からの抜粋で、タスクへの完了マークまたは未完了マークを付ける方法を示します。
ユーザは、JSP Worklist へのプライマリ インタフェースの図に示すように Mark Done または Mark Undone リンクを検索することで、タスクに完了、未完了のマークを付けることができます。
次のコード例では、worklist.jsp ファイルを参照する Mark Done および Mark Undone リンクの SetAction パラメータが 1 および 2 にセットされ、チェックマークをビジュアルな手がかりとして、次のアクションの左側に追加されます。
<tr>
<td><%=action.equals("1") ? "<img src=¥"check.gif¥">" : ""%></td>
<td><a href="worklist.jsp?SetAction=1"><font color="white">
Mark Done</font></a>
</td>
</tr>
<tr>
<td><%=action.equals("2") ? "<img src=¥"check.gif¥">" : ""%></td>
<td><a href="worklist.jsp?SetAction=2"><font color="white">
Unmark Done</font></a>
</td>
</tr>
次に示すように、SetAction 値は action 変数から抽出され保存されます。
if (worklist != null) {
String cmd = request.getParameter("SetFilter");
if (cmd != null) {
.
.
.
else if (request.getParameter("SetAction") != null) {
action = request.getParameter("SetAction");
session.putValue("action", action);
}
次の worklist.jsp ファイルから取り出したコードは、それぞれのタスクに完了または未完了マークを付けるために、taskMarkDone() および taskUnmarkDone() を使用する方法を示します。
try {
List vTaskList = (List)session.getValue("tasklist");
TaskInfo task = (TaskInfo)vTaskList.get(Integer.parseInt(cmd));
session.putValue("action", ACTION_DOIT);
if (action.equals(ACTION_DOIT)) {
.
.
.
}
else if (action.equals(ACTION_MARKDONE))
worklist.taskMarkDone(task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId());
else if (action.equals(ACTION_UNMARKDONE))
worklist.taskUnmarkDone(task.getTemplateDefinitionId(),
task.getInstanceId(),
task.getTaskId());
.
.
.
タスク プロパティを設定する
この節では、JSP Worklist から抜粋した、タスク プロパティの設定を示す多くのコード例を紹介します。
ユーザは、JSP Worklist へのプライマリ インタフェースの図に示すように、Task Properties リンクあるいはタスクの検索または必要なときに要求されるプロパティを指定することでタスクプロパティの設定を行うことができます。
次のコード例では、worklist.jsp ファイルを参照する Task Properties リンクの SetAction パラメータを 3 にセットし、チェックマークをビジュアルな手がかりとして、次のアクションの左側に追加します。
<tr>
<td><%=action.equals("4") ? "<img src=¥"check.gif¥">" : ""%></td>
<td><a href="worklist.jsp?SetAction=3"><font color="white">
Task Properties</font></a></td>
</tr>
次に示すように SetAction 値は action 変数から抽出され保存されます。
if (worklist != null) {
String cmd = request.getParameter("SetFilter");
if (cmd != null) {
.
.
.
else if (request.getParameter("SetAction") != null) {
action = request.getParameter("SetAction");
session.putValue("action", action);
}
.
.
.
action 変数の値に基づき、コンテキストは、次の例のように taskproperties.jsp ファイルに送られます。
static final String ACTION_DOIT = "0";
static final String ACTION_MARKDONE = "1";
static final String ACTION_UNMARKDONE = "2";
static final String ACTION_TASKPROPERTIES = "3";
static final String ACTION_REASSIGN = "4";
.
.
.
try {
List vTaskList = (List)session.getValue("tasklist");
TaskInfo task = (TaskInfo)vTaskList.get(Integer.parseInt(cmd));
session.putValue("action", ACTION_DOIT);
if (action.equals(ACTION_DOIT)) {
.
.
.
else if (action.equals(ACTION_TASKPROPERTIES)) {
session.removeValue(“error”);
pageContext.forward(“taskproperties.jsp?task= “+cmd);;
最後に、タスク プロパティが設定されます。taskproperties.jsp ファイルから抜粋された次のコード例は、タスクのプロパティを設定するために taskSetProperties() メソッドを使用する方法を示します。
<%@ page import="
javax.ejb.*,
java.rmi.RemoteException,
java.util.*,
java.text.*,
com.bea.wlpi.common.*
com.bea.wlpi.server.worklist.*
"%>
<%!
DateFormat df = new SimpleDateFormat("MMM d, yyyy h:mm a");
%>
<%
Worklist worklist = null;
TaskInfo task = null;
String error = null;
worklist = (Worklist)session.getValue("worklist");
if (worklist != null) {
Hashtable h = new Hashtable();
h.put(javax.naming.Context.SECURITY_PRINCIPAL, session.getValue("name"));
h.put(javax.naming.Context.SECURITY_CREDENTIALS, session.getValue("password"));
new javax.naming.InitialContext(h);
String cmd = request.getParameter("task");
if (cmd != null) {
try {
List vTaskList = (List)session.getValue("tasklist");
task = (TaskInfo)vTaskList.get(Integer.parseInt(cmd));
} catch (Exception e) {
}
}
}
if (request.getParameter("Set") != null) {
// Set properties
task = (TaskInfo)session.getValue("task");
try {
worklist.taskSetProperties( task.getTemplateDefinitionId(),
task.getInstanceId(), task.getTaskId(),
Integer.parseInt(request.getParameter("Priority")),
request.getParameter("P0") != null,
request.getParameter("P1") != null,
request.getParameter("P2") != null,
request.getParameter("P3") != null,
request.getParameter("P4") != null);
session.removeValue("task");
session.removeValue("error");
pageContext.forward("worklist.jsp");
return;
} catch (Exception e) {
error = e.getMessage();
}
}
if (task != null) {
session.putValue("task", task);
%>
<html>
<head>
<title>Task Properties</title>
</head>
<body bgcolor=#ffffff>
<font face="Arial" size="4">
<form action="taskproperties.jsp" method="POST">
<table dir="ltr" border="0" cellpadding="1" cellspacing="1">
<tr>
<td><img src="logo.gif"></td>
<td>
<font color="red" size="7">
<strong><em>Weblogic</em></strong></font>
<font color="black" size="7">
<strong><em>Process Integrator</em></strong></font>
</td>
</tr>
<tr>
<td bgcolor="navy" valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2" >
<tr>
<td><font color="yellow">
<strong>Go ...</strong></font>
</td>
</tr>
<tr>
<td><a href="worklist.jsp">
<font color="white">Worklist</font></a>
</td>
</tr>
<tr>
<td><a href="startworkflow.jsp">
<font color="white">Start Workflow</font></a>
</td>
</tr>
<tr>
<td><a href="logoff.jsp">
<font color="white">Logoff</font></a></td>
</tr>
</table>
</td>
<td valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2" valign="top">
<%
if (error != null) {
%>
<tr>
<td><font color="red size="4" face="Arial"><%=error%></td>
</tr>
<% }
%>
<tr>
<td><font color="navy" size="5" face="Arial">
Task Properties for:
<strong><%=task.getName()%></strong></font>
</td>
</tr>
<tr>
<td>
<table border="0" cellpadding="2" cellspacing="2">
<tr>
<td><p align="right">Workflow:</p></td>
<td><%=task.getWorkflow()%> <%=task.getWorkflowId()%></td>
</tr>
<tr>
<td><p align="right">Comment:</p></td>
<td><%=task.getComment()%></td>
</tr>
<tr>
<td><p align="right">Started:</p></td>
<td><%=task.getStarted() == null ? "" : df.format(task.getStarted())%>
</td>
</tr>
<tr>
<td><p align="right">Completed:</p></td>
<td><%=task.getCompleted() == null ? "" : df.format(task.getCompleted())%>
</td>
</tr>
<tr>
<td><p align="right">Due:</p></td>
<td><%=task.getDue() == null ? "" : df.format(task.getDue())%></td>
</tr>
<tr>
<td><p align="right">Priority:</p></td>
<td><select name="Priority" size="1">
<option
<%=task.getPriority()==0 ? "selected" : ""%> value="0">Low
</option>
<option
<%=task.getPriority()==1 ? "selected" : ""%> value="1">Medium
</option>
<option
<%=task.getPriority()==2 ? "selected" : ""%> value="2">High
</option>
</select>
</td>
</tr>
<tr>
<td valign="top"><p align="right">Permissions:</p></td>
<td>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<input type="checkbox" name="P0"
<%=task.getDoneWithoutDoit() ? "checked" : ""%> value="ON">
Mark done without executing
</td>
</tr>
<tr>
<td>
<input type="checkbox" name="P1"
<%=task.getDoitIfDone() ? "checked" : ""%> value="ON">
Re-execute if marked done
</td>
</tr>
<tr>
<td><input type="checkbox" name="P2"
<%=task.getUnmarkDone() ? "checked" : ""%> value="ON">
Unmark if marked done
</td>
</tr>
<tr>
<td><input type="checkbox" name="P3"
<%=task.getModifiable() ? "checked" : ""%> value="ON">
Allow modification
</td>
</tr>
<tr>
<td><input type="checkbox" name="P4"
<%=task.getReassignment() ? "checked" : ""%> value="ON">
Allow reassignment
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="Set" value="Set Properties "></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<%
}
%>
</font>
</body>
</html>
テンプレート定義、インスタンス ID、タスク ID および現在のタスクのプロパティは、com.bea.wlpi.common.TaskInfo オブジェクト、task と関連するメソッドを使用して取得されます。task オブジェクトは、すべてのタスクの取得に記載のメソッドを使用して取得されます。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |