ヘッダーをスキップ
Oracle BPEL Process Manager開発者ガイド
10g(10.1.3.1.0)
B31874-03
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

16 ワークリスト・アプリケーション

Oracle BPEL Worklistアプリケーション(ワークリスト・アプリケーション)は、ユーザーが割り当てられたヒューマン・ワークフロー・タスクを操作できるWebインタフェースです。この章では、Oracle BPEL Process Managerに用意されているサンプル・ワークリスト・アプリケーションと、サンプルを変更して独自のワークリスト・アプリケーションを作成する方法について説明します。

この章の内容は次のとおりです。

16.1 ワークリスト・アプリケーションのユースケース

BPELプロセス内でタスクの操作を必要とするすべてのアクティビティに、ワークリスト・アプリケーションのWebインタフェースを使用できます。マネージャが従業員の休暇申請を承認したり、融資エージェントが融資申込書を確認できます。休暇申請と融資申込書はそれぞれBPELプロセスの一部として発行されたものです。監督者やグループ管理者はワークリスト・アプリケーションを使用し、グループに割り当てられたタスクを分析して適切にルーティングできます。ワークリスト・アプリケーション・ユーザーは、承認または却下などの決定を提供してタスクを完了するのみでなく、ペイロードの更新、文書やコメントの添付、他のユーザーへのタスクのルーティングを行うことも可能です。

次のユースケースでワークリスト・アプリケーションについて説明します。


関連項目:

SOA_Oracle_Home¥bpel¥samples¥demosの次のサンプル
  • VacationRequest

  • DocumentReview

  • ExpenseReportApproval

  • HelpDeskServiceRequest

  • LoanDemoPlus


また、リスティング、更新、承認、ログイン、ログアウトなどの一般的な機能を示すために、ワークフロー・サービスAPIを使用して構築したサンプル・アプリケーションも用意されています。


関連項目:

SOA_Oracle_Home¥bpel¥samples¥の次のサンプル
  • demos¥ExpenseReportApproval

  • demos¥LoanDemoPlus

  • tutorials¥132.UserTasks

  • utils¥AsyncLoanService¥ StarLoanUI


OrderBookingチュートリアルにも、ワークリスト・アプリケーションを使用して注文書を手動で承認する方法が示されています。


関連項目:

『Oracle BPEL Process Manager Order Bookingチュートリアル』

16.2 ワークリスト・アプリケーションの概念の概要

第15章「Oracle BPEL Process Managerワークフロー・サービス」では、BPELワークフロー・サービスの使用により、ユーザーの操作とシステムやサービスの接続関係とを組み合せ、エンドツーエンドのプロセス・フローに割り込ませる方法について説明しました。ワークフロー・サービスにより、BPELプロセスからタスクを参照および管理するためのプログラム・インタフェースが提供されます。表示されるタスクはユーザーのプロファイルに応じて変化し、許可されるアクションはユーザーの権限に応じて変化します。このワークリスト・アプリケーションは、BPELワークフロー・サービスの上部に位置するレイヤーです。

16.2.1 ワークリスト・アプリケーションのユーザー・タイプ

ワークリスト・アプリケーションでは、表16-1に示す様々なタイプのユーザーが認識されます。

表16-1 ワークリスト・アプリケーションのユーザー・タイプ

ユーザーのタイプ アクセス
エンド・ユーザー 自分または所属グループに割り当てられたタスクを操作します。システム・アクションとカスタム・アクション、ルーティング・ルールおよびカスタム・ビューにアクセスできます。
監督者(マネージャ) 自分のエンド・ユーザー・アクセスのみでなく、報告先のタスク、レポートおよびカスタム・ビューを操作します。
プロセス所有者 自分のエンド・ユーザー・アクセスのみでなく、プロセスに属しているが他のユーザーに割り当てられているタスクを操作します。
グループ管理者 自分のエンド・ユーザー・アクセスのみでなく、グループ・ルールと動的割当てを管理します。
ワークフロー管理者 再割当てまたは一時停止を必要とするタスクなど、エラー発生状態になっているタスクを管理します。ワークフロー管理者は、自分のエンド・ユーザー・アクセスのみでなく、アプリケーション・プリファレンスの変更、フレックス・フィールドのマップ、すべてのユーザーまたはグループのルールの管理も行うことができます。

アイデンティティ・サービスで事前定義済のロールの詳細は、「アイデンティティ・サービス」を参照してください。

16.2.2 タスクのコンポーネント

ユーザーに割り当てられる作業項目またはタスクには、次の構成要素が含まれます。

  • タスク属性: これには、タスクのタイトル、番号、ステータス、優先度、有効期限、識別キー、割当て先、およびその他のフレックス・フィールドが含まれます。

  • タスク・フォーム: これは、タスクに関する詳細情報(ペイロード)で構成されます。たとえば、LoanDemoPlusサンプルの融資申請や、HelpDeskServiceRequestサンプルのサポート・チケット詳細などです。

  • タスク・コメント: ワークフローに参加する様々なユーザーによって入力されるコメントです。

  • タスク添付: タスクに関連する他のドキュメントまたは参照URLです。これらの添付は、通常、BPELプロセスによってワークフローに関連付けられるか、ワークフローの任意の参加者によって追加および変更されます。

  • タスク履歴: これは、タスクの承認順序と更新履歴で構成されます。ワークフローの参加者によって実行されたアクションの監査証跡と、ワークフローの様々な時点におけるタスク・ペイロードおよび添付のスナップショットが履歴として保持されます。

ユーザーがタスクに実行できるアクションのタイプは、次のとおりです。

  • タスク詳細の更新: タスク・フォームには、タスクのレビューアによって追加または変更される必要のあるコンテンツを含めることができます。レビューアは、タスクの優先度の変更、コメントの追加またはタスクへの添付ファイルの追加を行うことができます。

  • タスク結果の変更: プロセス・モデリングの一環として、ワークフロー設計者は、タスクの様々なカスタム結果を含めることができます(承認または却下、受領、遅延など)。ユーザーがタスク結果を変更すると、そのタスクは、ワークリストから削除されて次の承認者にルーティングされるか、ワークフロー・パターンに基づいてビジネス・プロセスに戻されます。

  • システム・アクションの実行: ワークフロー・モデリングの一環として指定されたカスタム・アクションに加え、ユーザーは、エスカレートや委任などの他のシステム・アクションを実行できます。これらのアクションは、ユーザーの権限に応じてすべてのタスクに実行可能です。プロセス所有者またはワークフロー管理者は、所有するプロセスに対していつでもこれらの操作を実行できます。システム・アクションの詳細は、「タスク・アクション」を参照してください。

16.3 ワークリスト・アプリケーションの機能

Internet Explorer 6.0またはMozilla Firefox 1.0.4を使用してワークリスト・アプリケーションにアクセスします。

  1. Webブラウザを起動します。

  2. 次のURLに移動します。

    http://hostname:portnumber/integration/worklistapp/Login
    
    
    • hostnameは、Oracle BPEL Process Managerがインストールされているホストの名前です。

    • インストール時に使用したportnumber(通常は9700または8888)は、次のディレクトリにあるbpelsetupinfo.txtに記録されています。

      SOA_Oracle_Home¥install¥
      
      

    「スタート」から「すべてのプログラム」を選択し、「Oracle - Oracle_Home「Oracle BPEL Process Manager」「Worklist Application」の順に選択することもできます。

  3. ユーザー名とパスワードを入力し、「ログイン」をクリックします。

    jsteinおよびwelcome1を使用してサンプル・ワークリスト・アプリケーションにアクセスできます。

    ユーザー名とパスワードは、JAZNに渡されるユーザー・コミュニティに存在している必要があります。この章の例で使用されているデモンストレーション・ユーザー・コミュニティの組織階層の詳細は、『Oracle BPEL Process Manager管理者ガイド』を参照してください。JAZNの詳細は、「アイデンティティ・サービス」を参照してください。

ワークリスト・アプリケーションには、ユーザーの権限および割り当てられているグループやロールに基づいて、ログイン・ユーザーに固有のタスクが表示されます。図16-1に、ユーザーjstein用のワークリスト・アプリケーションを示します。jsteinは、報告先からの休暇申請の承認または却下を担当するマネージャです。

図16-1 ワークリスト・アプリケーション: タスク・リスト(ホーム)ページ

タスク・リスト(ホーム)ページ
図wl_homepg2.gifの説明

すべてのタスク相互作用(タスクのリスティング、タスク詳細の表示、タスクの再割当て、タスクに対するアクションの実行、結果の設定など)は、タスク・リスト(ホーム)ページから開始されます。図16-1のように、jsteinがワークリスト・アプリケーションにログインするとタスク・リスト(ホーム)ページが表示され、自分または所属グループに割り当てられたタスクが示されます。jsteinはマネージャであるため、「スタッフのタスク」タブも表示されます。自分に割り当てられているタスクの場合、jsteinは「アクション」リストからアクションを選択してワークフローに参加します。所属グループに割り当てられているタスクの場合、jsteinはアクションを選択する前にタスクを申告する必要があります。jsteinが所属グループにリリースして戻すまで、他のユーザーはそのタスクを利用できません。

ホーム・ページでは、「検索」フィールドを使用してキーワード検索を実行するか、「カテゴリ」「優先度」および「ステータス」フィールドを使用して検索条件を指定することで、ワークリスト・タスクを取得できます。使用可能なカテゴリ・フィルタは、選択しているタブに応じて異なります。「ユーザー・タスク」タブでのカテゴリ・フィルタは、「個人」「グループ」「個人とグループ」および「前へ」(過去に作業したタスク)です。「スタッフのタスク」タブでのカテゴリ・フィルタは「報告先」のみです。「開始済のタスク」タブでのカテゴリ・フィルタは「作成者」のみです。表16-2(タブ)に示すように、ログイン・ユーザーに付与されているロールによっては、「ユーザー・タスク」「スタッフのタスク」および「開始済のタスク」タブに加えて、他のタブも表示されます。「管理タスク」タブでのカテゴリ・フィルタは、ユーザー(このタブを表示するためのBPMWorkflowAdminロールが付与されているユーザー)がタスクを所有している場合は「所有者」、それ以外の場合は「管理者」です。

表16-2に、図16-1のワークリスト・アプリケーションのタスク・リスト(ホーム)ページの特徴的な機能について説明します。

表16-2 ワークリスト・アプリケーションの「ユーザー・タスク」ページのコンテンツ

図16-1内の位置 ページ要素
左上 タブ: 表示されるタブは、ログイン・ユーザーに付与されているロールに応じて異なります。全員に表示されるのは「ユーザー・タスク」および「開始済のタスク」です。マネージャには「スタッフのタスク」も表示されます。BPMWorkflowAdminロールを付与されているユーザーには、「管理タスク」「ルールの管理」「フレックス・フィールド・マッピング」および「アプリケーションのカスタマイズ」の各タブも表示されます。詳細は、「管理機能の使用」を参照してください。

「ようこそ jstein [jazn.com]」: バナー領域にログイン・ユーザー名が表示されます。ユーザー名をクリックすると情報が表示されます。詳細は、「ユーザーおよびグループ情報」を参照してください。

右上 「レポート」リンク: 「不参加タスク・レポート」、「タスクの優先度レポート」、「タスクのサイクル・タイム・レポート」および「タスクの生産性レポート」を使用できます。詳細は、「レポートの作成」を参照してください。

「プリファレンス」リンク: ログイン・ユーザーのプリファレンス(休暇や他のワークフロー・ルールの設定、カスタム・ビューの管理およびワークリスト表示のカスタマイズなど)を管理します。詳細は、「プリファレンスの設定」を参照してください。

左ペイン 「作業キュー」: 標準、カスタムおよびプロキシ・ビュー。詳細は、「作業キューの使用」を参照してください。
中央ペイン 「グラフの表示(グラフの非表示)」ボタン: 選択したタスク・フィルタに表示されたタスクのステータス別棒グラフの表示と非表示を切り替えます。詳細は、「タスク・ステータスの棒グラフの表示」を参照してください。
中央ペイン、「検索」領域 「検索キーワード」フィールド: タスクのタイトル、コメント、識別キー、および指定のフィルタ条件を満たすタスクのフレックス文字列フィールドを検索するためのキーワードを入力します。

「カテゴリ」: 次の中から選択します。

  • 個人: ログイン・ユーザーに直接割り当てられているタスクが表示されます。

  • グループ: ログイン・ユーザーが属するグループに割り当てられているタスクです。

  • 個人とグループ: ログイン・ユーザーと、ログイン・ユーザーが属するグループに割り当てられているタスクです。

  • 前へ: ログイン・ユーザーが更新したタスクです。

優先度: 「任意」、または「1」から「5」までの値を選択します(1が最高優先度)。

「ステータス」: 次の中から選択します。「任意」「割当て済」「完了」「一時停止中」(後で再開可能)、「取消し済」「期限切れ」「エラー発生」(処理中)、「情報のリクエスト中」

「拡張検索」リンク: さらに検索フィルタが提供されます。詳細は、「拡張検索の使用」を参照してください。

中央ペイン

タスク・リスト領域

デフォルト表示では次の列が表示されます。表示は「プリファレンス」リンクから変更できます。詳細は、「表示プリファレンス」を参照してください。

タスク番号: BPELプロセスの作成時に生成されたタスク番号です。

タイトル: ヒューマン・ワークフロー・タスクの作成時に指定されたタイトルです。消去またはアーカイブされたプロセス・インスタンスに関連するタスクは、表示されません。詳細は、「タスクのタイトル、優先度、結果および所有者の指定」を参照してください。

優先度: ヒューマン・ワークフロー・タスクの作成時に指定された優先度です。詳細は、「ヒューマン・タスク・エディタのセクションの確認」を参照してください。

割当て済ユーザー: ヒューマン・ワークフロー・タスクの作成時に指定された割当てです。詳細は、「タスク参加者の割当て」を参照してください。

割当て済グループ: ヒューマン・ワークフロー・タスクの作成時に指定された割当てです。詳細は、「タスク参加者の割当て」を参照してください。

状態: 次のいずれかです。「割当て済」「完了」「エラー発生」「期限切れ」「情報のリクエスト中」「失効」「一時停止中」「取消し済」。詳細は、「デフォルトのシステム・アクションの上書き」を参照してください。

作成日: Oracle BPEL Process Managerを使用してタスクが作成された日時です。

有効期限: ヒューマン・ワークフローの作成時に指定されたタスク有効期限の日時です。

アクション: ワークフローに対して定義されているグループ・アクション(「申告」)およびカスタム・アクション(「承認」および「却下」など)です。タスクに対して可能な他のアクション(システム・アクションなど)は、特定のタスクの「タスクの詳細」ページに表示されます。詳細は、「拡張検索の使用」を参照してください。


この項の内容は次のとおりです。

16.3.1 「タスクの詳細」ページの使用

「タスクのタイトル」列のタスクをクリックすると、図16-2のように、そのタスクの「タスクの詳細」ページが表示されます。

図16-2 「タスクの詳細」ページ

図wl_taskdet_comb.gifの説明が続きます
図wl_taskdet_comb.gifの説明

この項では、「タスクの詳細」ページの次の要素について説明します。

16.3.1.1 タスク・アクション

図16-3に、「タスク・アクション」リストを示します。リストに表示されるアクションは、タスク設計、タスク状態、およびログイン・ユーザーに割り当てられているロールに応じて変化します(たとえば、タスクが完了している場合、アクションは何もリストされません)。「承認」「却下」などのカスタム・アクション(BPELプロセス内で定義されているアクション)は、最初にリストされます。「エスカレート」「一時停止」などのシステム・アクションは、区切り線の下にリストされます。

図16-3 「タスク・アクション」リスト

タスクに対するアクションの実行
図wl_task_act_list.gifの説明

タスクの操作には「タスク・アクション」リストまたはボタンを使用します。「タスク・アクション」リストには、承認、却下、期限更新および一時停止など、それ以上の入力を必要としないアクションが含まれています。再割当てや情報のリクエストなど、追加入力を必要とするアクションの場合は、ボタンが表示されます。

システム・アクションは、ユーザーの権限に応じてすべてのタスクに実行可能です。表16-3にシステム・アクションを示します。

表16-3 システム・タスク・アクション

アクション 説明
申告 タスクは、グループまたは複数のユーザーに割り当てられている場合、最初に申告される必要があります。「申告」は、グループまたは複数ユーザー割当ての「タスク・アクション」リストで選択可能な唯一のアクションです。タスクが申告されると、すべての適用可能なアクションがリストされます。
エスカレート タスクを完了できない場合、タスクをエスカレートし、「コメント」領域にオプションのコメントを追加できます。タスクは、ユーザーのマネージャに再割当てされます。
プッシュバック このアクションは、ワークフロー内で1レベル上のタスクを前の割当て先に送信する際に使用します。
再割当て マネージャは、タスクを報告先に委任できます。BPMWorkflowReassign権限を持つユーザーは、タスクをすべてのユーザーに委任できます。
リリース タスクがグループまたは複数のユーザーに割り当てられており、タスクを申告したユーザーがそれを完了できない場合、タスクをリリースできます。この場合、他の割当て先ユーザーの誰かがこのタスクを申告し、完了できます。
期限更新 タスクの期限切れが近づいている場合、タスクの期限を更新し、「コメント」領域にオプションのコメントを追加できます。タスクの有効期限は、1週間延長されます。期限更新は、タスク履歴に表示されます。タスク更新の期間は、SOA_Oracle_Home¥bpel¥system¥services¥configにあるファイルpc.propertiesのオプション・パラメータoracle.tip.worklist.samples.taskactin.renew.durationで制御できます。デフォルト値は、P7D(7日)です。
詳細情報を発行および詳細情報のリクエスト この2つのアクションは、他のユーザーから詳細情報の提供をリクエストされた場合、またはタスク作成者や前の割当て先のいずれかに詳細情報をリクエストする場合に使用します。再承認が必要ない場合、タスクは次の承認者か、ビジネス・プロセスの次のステップに割り当てられます。
「一時停止」および「再開」 プロセスに現在関連していないタスクは、一時停止できます。これらのオプションを使用できるのは、BPMWorkflowSuspendロールを付与されているユーザーのみです。その他のユーザーは、タスク・フィルタで前へを選択するか、「一時停止」ステータスのタスクを検索することで、このタスクにアクセスできます。タスクを更新する各種ボタンは、一時停止後は無効になります。
取消 ユーザーがタスクの作成者で、そのタスクを継続しない場合(たとえば、休暇申請を取り消す場合)、タスクを取り消し、「コメント」領域にオプションのコメントを追加できます。この場合、ビジネス・プロセスにより、次の処理内容が決定されます。ホームページで「取消」アクションを使用するには、「作成者」タスク・フィルタを使用します。

いずれかのアクションを選択すると、ビジネス・プロセスの設計状況に応じて、タスクは次のステップにルーティングされます。タスクが完了すると、アクションおよびフォーム要素は、すべて無効になります。

16.3.1.2 リクエスト・ステータス

ユーザーが更新リクエスト(カスタムまたはシステム・アクション)を発行するたびに、リクエストのステータスがヘッダーの左側に表示されます。リクエストに成功すると、図16-4のページ上部のような確認メッセージが表示されます。

図16-4 更新リクエストの成功

図wl_successful.gifの説明が続きます
図wl_successful.gifの説明

リクエストに失敗すると、図16-5のようなエラー・メッセージが表示されます。リンクをクリックするとエラーの詳細情報を表示できます。

図16-5 エラー・メッセージの表示

図wl_request_not_success.gifの説明が続きます
図wl_request_not_success.gifの説明

図16-5のエラーは、許可されていないアクションをユーザーが実行しようとしたときに発生します。この場合、次の状況が考えられます。

  • ユーザーがページをロードしてから実際にアクションを実行するまでの間にタスクの有効期限が切れました。

  • ユーザーがページをロードしてから実際にアクションを実行するまでの間に、別のユーザー(マネージャ、所有者、管理者など)によるタスクの申告と更新が同時に実行されました。

エラーが発生したタスクは、特定のユーザーには割り当てられません。bpeladminユーザーにのみ割り当てられます。bpeladmin以外のユーザーがエラーを参照する場合は、「カテゴリ」リストで「すべて」を選択し、「ステータス」リストで「エラー発生」または「任意」を選択します。

16.3.1.3 ヘッダー・セクション

図16-6にヘッダー・セクションを示します。ヘッダー情報には、タスク番号とタイトル、BPELプロセスの状態、結果および優先度、タスクの作成者、更新者、申告者またはタスクに割り当てられているユーザーに関する情報が含まれます。ここには、タスク作成、最終更新および有効期限に関する日時も表示されます。

図16-6 「タスクの詳細」ページのヘッダー・セクション

図wl_header1.gifの説明が続きます
図wl_header1.gifの説明

16.3.1.4 ペイロード・セクション

図16-7に、休暇申請プロセス・リクエスト・ワークフローのペイロード・セクションを示します。表示されるフィールド(「作成者」「From日付」「To日付」「理由」)には、休暇承認のためのBPELプロセスが自動生成JSPを使用してどのように設計されたかが反映されます。

図16-7 ペイロード・セクション

図wl_payload.gifの説明が続きます
図wl_payload.gifの説明

ワークフロー設計に自動生成JSPを使用する方法の詳細は、「単純タスク表示フォームの自動生成」を参照してください。

16.3.1.5 「コメント」および「添付ファイル」セクション

図16-8に、コメントと添付ファイルの追加または削除に使用するセクションを示します。コメントや添付ファイルを追加または削除するには、タスクを更新する権限を保持している必要があります。

図16-8 コメントまたは添付ファイルの追加

図wl_comments.gifの説明が続きます
図wl_comments.gifの説明

新規に追加されたコメントやコメント記述者のユーザー名は、既存のコメントに追加されます。タスクのライフ・サイクル全体を通じて、コメントの追跡情報が保持されます。添付ファイルを追加する場合は、絶対パス名を使用する方法、ファイルを参照する方法またはURLを入力する方法があります。

16.3.1.6 履歴セクション

図16-9に、休暇承認タスクの短い履歴を示します。

図16-9 「タスクの詳細」ページの履歴セクション

図wl_history.gifの説明が続きます
図wl_history.gifの説明

タスクの短い履歴には、次のタスクにより作成されたバージョンがすべて表示されます。

  • タスクの開始

  • タスクの再開始

  • タスクの結果の更新

  • タスクの完了

  • タスクのエラー処理

  • タスクの期限切れ

  • タスクの取消し

  • エラー割当て先に対するタスクのアラート

次のファイル内でshortHistoryActions要素を変更すると、「短い履歴」リストに次のアクションを追加できます。

SOA_Oracle_Home¥bpel¥system¥services¥config¥wf_config.xml

  • 獲得

  • 非定型ルート

  • タスクのオート・リリース

  • 委任

  • エスカレート

  • タスク情報のリクエスト

  • タスク情報の発行

  • ルーティング・スリップの上書き

  • 結果とルートの更新

  • プッシュバック

  • 再割当て

  • リリース

  • 期限更新

  • 再開

  • 現在の割当てのスキップ

  • 一時停止

  • 更新

完全履歴には、タスクでのバージョン変更がすべて表示されます。

16.3.1.7 ルーティング

承認者の順序が事前に決定されていない場合や、ワークフローが非定型ルーティングを許可するように設計されている場合は、タスクを非定型方式でルーティングできます。この種のタスクの場合は、「タスクの詳細」ページに「ルート」ボタンが表示されます。「ルーティング」ページからルーティングに使用する1人以上のユーザーを検索できます。複数の割当て先を指定する場合は、割当て先リストの対象を単純割当て(ユーザー全員へのグループ割当て)、順次割当て、パラレル割当てのいずれにするかを選択できます。パラレル割当ての場合は、承認に必要な得票率を指定します。

16.3.1.8 詳細情報のリクエスト

「タスクの詳細」ページで「情報のリクエスト」ボタンを使用して詳細情報をリクエストできます。追加情報の提供時に以前の承認者の再承認を必要とする場合のため、「必要な承認」フィールドが表示されます(プロセスが再承認をサポートするよう設計されている場合)。このとき、コメントも追加できます。追加情報がリクエストされると、タスクは、追加情報のリクエスト先であるユーザーに割り当てられます。詳細情報をリクエストされたユーザーは、「詳細情報を発行」を使用してリクエストに対応します。

16.3.1.9 再割当て

「タスクの詳細」ページで「再割当て」ボタンを使用してタスクを再割当てできます。図16-10のように、再割当て(転送)または委任できます。

図16-10 タスクの再割当て

図wl_reassign2.gifの説明が続きます
図wl_reassign2.gifの説明

  • 再割当て(タスクを別のユーザーまたはグループに転送します): タスクは割当て先のワークリストから別のユーザーのワークリストに移動します。元のユーザーではなく新しく割り当てられたユーザーがタスクを操作します。

  • 委任(特定のユーザーがかわりに操作することを許可します): タスクは別のユーザーに委任されますが、元のユーザーのワークリストと委任先ユーザーのワークリストの両方に表示されます。委任先ユーザーは、元の割当て先のかわりにタスクを操作できます。

「検索」ボタンを使用して割当て先を検索し、上矢印と下矢印を使用して割当て先を選択または選択を解除します。ワイルドカード検索がサポートされています。

監督者は、どの報告先にでも必要に応じてタスクを再割当てできます。BPMWorkflowReassignロールを持つユーザーは、組織内のすべてのユーザーにタスクを割り当てることができます。

16.3.1.10 パラレル・タスク

パラレル・タスクは、投票などのシナリオでパラレル・フロー・パターンが指定されている場合に作成されます。このパターンでは、パラレル・タスクに共通の親タスクが存在します。親タスクは、ユーザーがそのタスクの割当て先、所有者または作成者である場合にのみ参照できます。パラレル・タスクそれ自体(サブタスク)は、他のすべてのタスクと同じように、タスクの割り当てられているユーザーであれば誰でも参照できます。親タスクからサブタスクを参照することも可能です。このような使用例では、親タスクの「タスクの詳細」ページに「サブタスクの表示」ボタンが表示されます。対応するパラレル・タスクが「サブタスク」ページに表示されます。投票シナリオでは、割当て先ユーザーの誰かがペイロード、コメントまたは添付を更新した場合に、変更内容を参照できるのは、そのタスクの割当て先のみです。親タスクを参照できるユーザー(パラレル・フロー・パターンの最終レビューアなど)は、サブタスクをドリルダウンして、パラレル・フローの参加者によるサブタスクの更新を参照できます。

16.3.1.11 アクション権限の決定

ユーザーは、現在の割当て先(直接的な割当てまたはグループ・メンバーシップによる割当て)、現在の割当て先のマネージャ、作成者、所有者、以前のアクション実行者のいずれかとしてタスクに関連付けられている場合に、タスクを参照できます。

ユーザーのプロファイルにより、グループ・メンバーシップとロールが決定されます。ロールにより、ユーザーの権限が決定されます。ただし、ユーザーが実行できるアクションの正確なセットは、権限とは別に、タスクの状態、カスタム・アクション、および設計時にタスク・フローに対して定義された制限付きアクションによっても変化します。

ユーザーがタスクに実行できるアクションは、次のアルゴリズムで決定されます。

  1. ユーザーに付与されている権限に基づいて、そのユーザーが実行できるアクションのリストが取得されます。

  2. 現在の状態のタスクに実行できるアクションのリストが取得されます。

  3. 前述のリストに出現するアクションの結合リストが作成されます。

  4. タスクで制限付きアクションとして指定されているアクションが結合リストから除外されます。

結果のアクション・リストが、ユーザーのリスト・ページおよび「タスクの詳細」ページに表示されます。ユーザーが特定のアクション(申告、一時停止、再割当てなど)をリクエストすると、ワークフロー・サービスにより、リクエストされたアクションが前述のアルゴリズムで決定されたリストに含まれているかどうかが確認されます。

前述のアルゴリズムの手順2では、多くのケースが扱われます。タスクの状態が、最終完了(順序フローですべての承認が終了した状態)、期限切れ、取消し、エラーのいずれかである場合、追加の更新アクションは許可されません。これらの状態の場合は、タスク、タスク履歴およびサブタスク(パラレル・フローの親タスク)を参照できます。タスクが一時停止されている場合、実行可能なアクションは、再開または取消しのみです。グループに割り当てられているタスクは、なんらかのアクションを実行する前に、まず申告する必要があります。

アイデンティティ・サービスと、ユーザーに権限を割り当てる方法の詳細は、「アイデンティティ・サービス」を参照してください。

16.3.2 拡張検索の使用

「拡張検索」リンクをクリックすると、図16-11に示すページが表示されます。

図16-11 「拡張検索」ページ

図wl_advsearch.gifの説明が続きます
図wl_advsearch.gifの説明

タスク・タイプで検索する場合は、「ワークフロー・タスク・タイプの選択」ページが表示されます。このページでタスク・タイプを選択し、「拡張検索」ページに戻ります。

図16-12のように、条件を追加して検索をフィルタできます。

図16-12 「拡張検索」への条件の追加

図wl_search1.gifの説明が続きます
図wl_search1.gifの説明

条件には、AND操作(「次のすべて」オプション)またはOR操作(「次のいずれか」オプション)を使用できます。各フィルタでは、属性、演算子および値の組合せを指定します。演算子と値は属性のタイプに結合されており、選択した属性に基づいて変化します。たとえば、「作成者」「更新者」などの認証フィールドの場合は、懐中電灯アイコンが表示されるため、認証ブラウザを使用して名前を検索できます。日付フィールドの場合はカレンダ・アイコンが表示されるため、日付を選択できます。

16.3.3 タスク・ステータスの棒グラフの表示

棒グラフ・アイコンをクリックすると、図16-13のようにタスクの棒グラフが表示されます。

図16-13 グラフが表示されている「ユーザー・タスク」ページ

図wl_barchart.gifの説明が続きます
図wl_barchart.gifの説明

棒グラフは、ステータス別のタスクが各ステータス・カテゴリに該当するタスク数のカウントで示されます。

16.3.4 作業キューの使用

図16-14に示す「作業キュー」ペインはデフォルトで表示されます。(閉じたペインを再び開くには作業キュー・アイコンを使用します。)

図16-14 「作業キュー」ペイン

図wl_work_queues.gifの説明が続きます
図wl_work_queues.gifの説明

「作業キュー」ペインには、次が表示されます。

  • 「受信ボックス」: ユーザーが選択したフィルタに該当する全タスクが表示されます。デフォルトでは、高優先度のタスク、期日の近いタスク、新規タスクなど、すべてのタスクが表示されます。

  • 「ユーザー作業キュー」: 標準作業キューと、特定の検索基準に基づいてユーザーが定義したカスタム作業キューが表示されます。

  • 「プロキシ作業キュー」: ユーザーが他のユーザーにアクセス権限を付与しているキューが表示されます。アクセス権限を受領したユーザーは、アクセス権限を付与したユーザーのタスクをかわりに操作できます。

16.3.5 プリファレンスの設定

「プリファレンス」リンクから次の種類のプリファレンスを使用できます。

16.3.5.1 休暇プリファレンス

休暇プリファレンスを使用して、自分自身をタスク割当ての対象から除外します。図16-15に示すように、休暇日の範囲を指定し、必要に応じてルールを作成します。指定したルールに基づいて、次のようにタスクを自動的に承認するか他のユーザーに再割当てできます。

図16-15 ワークリスト・アプリケーションでの休暇プリファレンスの設定

図wl_rule_vac.gifの説明が続きます
図wl_rule_vac.gifの説明

図16-16に示すように、ルールの作成時にはルールの適用先タスクを指定し、条件を追加し、タスクを別のユーザーやグループに委任または再割当てできます。

図16-16 ワークリスト・アプリケーションでのルールの作成

図wl_vac.gifの説明が続きます
図wl_vac.gifの説明

16.3.5.2 ルール

ルールを使用して、trueの場合にタスクを自動的に操作する条件を指定します。たとえば、前項で説明した休暇ルールや、特定のタイプのタスクを自動的に承認するルールなどがあります。図16-16に示したように、ルールの作成時に次の情報を指定できます。

  • ルール名と説明。

  • ルール適用先のタスク: 未指定の場合、ルールは全タスクに適用されます。

  • ルールを適用するタイミング。

  • ルールに対する条件: これは、ルールで優先度1のタスクのみを操作するように指定したり、特定のユーザーにより作成されたタスクを操作するなど、ルールを詳細に定義するフィルタです。条件のベースとして、標準タスク属性や、特定のタスクにマップされているフレックス・フィールドを使用できます。フレックス・フィールドのマッピングの詳細は、「管理機能の使用」を参照してください。

    図16-17に、ルールに条件を追加する方法を示します。

    図16-17 ルールに対する条件の追加

    図wl_rules_cond.gifの説明が続きます
    図wl_rules_cond.gifの説明

  • アクション

    • 再割当て先: タスクを自分が管理する下位ユーザーまたはグループに再割当てできます。BPMWorkflowReassignロールを付与されている場合は、どのユーザーまたはグループにでもタスクを再割当てできます。

    • 委任先: どのユーザーまたはグループにでも委任できます。

    • 結果の設定先: ワークフロー・タスクが自動結果(タスクの承認または却下など)用に設計されている場合は、その結果を指定できます。ルールは特定のタスク・タイプを対象とする必要があります。ルールの対象がすべてのタスク・タイプの場合、このオプションは表示されません。

    • 「アクションを実行しない」: このアクションを使用すると、より一般的な他のルールの適用を防止できます。たとえば、アクションを実行する必要のない融資申請を除き、担当タスクを休暇中はすべて別のユーザーに再割当てする場合、2つのルールを作成します。第1のルールでは融資申請に対してアクションを実行しないように指定し、第2のルールではすべてのタスクを別のユーザーに再割当てするように指定します。第1のルールにより、融資申請については再割当てが防止されます。

図16-18に、ルール・リスト・ページを示します。ルールは表示されている順序で実行されます。「上に移動」および「下に移動」ボタンを使用すると、ルールの順序を変更できます。ルールがフィルタ条件を満たしている場合は実行され、他のルールは評価されません。ルールを実行するには、そのタスクに割り当てられている唯一のユーザーであることが必要です。タスクが(自分を含めて)複数のユーザーに割り当てられている場合、ルールは実行されません。

図16-18 ワークリスト・プリファレンスでのユーザー・ルールの設定

図wl_rules2.gifの説明が続きます
図wl_rules2.gifの説明

図16-18は次のことも示しています。

  • ルールを作成、削除および編集できます(ルール名をクリックします)。

  • ルールの作成時に現在の日付を含む範囲を指定した場合、そのルールはアクティブです(図16-18「アクティブ」列を参照)。

16.3.5.3 グループ・ルール

グループ・ルールを使用すると、グループのメンバーに対するワークフロー・ルールの適用方法を指定できます。グループ・ルールの例は、次のとおりです。

  • 特定の顧客からのタスクをグループのメンバーに割り当てます。

  • ラウンド・ロビン割当てを使用してタスク割当てをグループのメンバーに確実に均等配分されるようにします。

  • 高優先度のタスクがグループ内で最もビジーでないメンバーに確実にルーティングされるようにします。

グループ・ルールの作成は他のルールの作成と同様で(図16-16「ワークリスト・アプリケーションでのルールの作成」を参照)、異なるのは一部のアクションのみです。グループ・ルールの場合は、次のアクションを指定できます。

  • 再割当ての経由先: どのグループ・メンバーが割当てを取得するかを決定する基準を指定できます。この動的割当て基準には、ラウンド・ロビン割当て、最もビジーでないグループ・メンバーへの割当て、または最も生産性の高いグループ・メンバーへの割当てを含めることができます。また、タスクをグループのユーザーに割り当てるためのカスタム関数も追加できます。詳細は、次を参照してください。

  • 再割当て先: ユーザー・ルールと同様に、タスクを自分が直接管理する下位ユーザーまたはグループに再割当てできます。BPMWorkflowReassignロールを付与されている場合は、どのユーザーまたはグループ(担当する管理階層外)にでもタスクを再割当てできます。

  • 「アクションを実行しない」: ユーザー・ルールと同様に、より一般的なルールの実行を防止する条件を指定してルールを作成できます。

グループのルール・リスト・ページはユーザーのルール・リスト・ページに似ていますが、ログイン・ユーザーが管理しているグループのリストが追加されています。このリストから選択して、ルールの作成対象となるグループを指定できます。

16.3.5.4 カスタム・ビュー

カスタム・ビューを使用すると、タスク・リストの表示をカスタマイズできます。カスタム表示の例は、次のとおりです。

  • タスク・リストを特定の方法で順序付け

  • 特定の条件を満たすタスクのみを表示

  • タスク・リストに特定の属性(列)を表示

ビューへのアクセス権限を他のユーザーに付与することもできます。

図16-19に、「カスタム・ビュー」ページを示します。

図16-19 「カスタム・ビュー」ページ

図wl_custview_list.gifの説明が続きます
図wl_custview_list.gifの説明

次の機能を使用できます。

  • ビューを作成、編集、コピーおよび削除したり、「作業キュー」ペインの「ユーザー・ビュー」セクションに表示するかどうかを選択できます。

  • 「付与されたビュー」リストの各ビューについて、タスク・リスト・ページの「作業キュー」ペインの「委任されたビュー」セクションに表示するかどうかを選択できます。

  • 付与されたビューの詳細を参照できます。自分が付与されたビューの名前を変更することも可能です。

図16-20に、カスタム・ビューの作成ページを示します。

図16-20 カスタム・ビューの作成

図wl_custview.gifの説明が続きます
図wl_custview.gifの説明

カスタム・ビューの作成時に、次の情報を指定できます。

  • 一般: ビュー名を指定する必要があります。

  • : タスク・リストに表示する列を指定できます。ビューの各列には、標準タスク属性や、特定のタスク・タイプにマップされているフレックス・フィールドを使用できます。フレックス・フィールドのマッピングの詳細は、「管理機能の使用」を参照してください。

    デフォルト列は、受信ボックスの各列と同じです。また、タスク・リストにタスク・アクションを表示するように選択したり、1列について昇順または降順を選択することもできます。

  • 「フィルタ」: 表示するタスク・カテゴリ(「個人」「グループ」「個人とグループ」など)を指定できます。条件(タイトルに「融資申請」という語が含まれている場合にのみタスクを表示するなど)を追加することもできます。

  • 「共有」: このビューへのアクセス権限を別のユーザーに付与できます。たとえば、jsteinが「個人とグループ」カテゴリのタスクへのアクセス権限をjcooperに付与すると、jcooperにはjsteinのタスクとグループのタスクが表示されます。ビューを別のユーザーと共有するのは、そのビューに対応する全タスクを他のユーザーに委任する場合に似ています。つまり、共有相手のユーザーが自分のかわりにタスクを操作できます。共有ビューは、ワークリストの「プロキシ作業キュー」セクションで参照可能です(図16-14「「作業キュー」ペイン」を参照)。

16.3.5.5 表示プリファレンス

表示プリファレンスを使用すると、ワークリストでのタスクの表示方法をカスタマイズできます。図16-21のように、次のオプションを使用して表示をカスタマイズできます。

  • ページごとのタスクの最大数

  • ページ高さ(ピクセル単位)

  • タスクのデフォルトの順序

  • 受信ボックス表示で次の列を表示

  • タスク・リストにタスク・アクションを表示

図16-21 ワークリスト・アプリケーションでの表示プリファレンスの設定

図wl_display.gifの説明が続きます
図wl_display.gifの説明

16.3.6 管理機能の使用

管理者とは、BPMWorkflowAdminロールが付与されているユーザーです。管理者には、ワークリスト・アプリケーション・ホームページに次のタブが表示されます。

16.3.6.1 ルールの管理

管理者は、図16-22に示す「ルールの管理」タブを使用して、すべてのユーザーまたはグループに対するルールを参照または編集します。

図16-22 「ルールの管理」タブ

図wl_manage_rules.gifの説明が続きます
図wl_manage_rules.gifの説明

このタブは、管理者がルール関連の問題を解決する必要がある場合に役立ちます。また、管理者は退社したユーザーに対するルールを設定できます。これにより、そのユーザーに割り当てられていた全タスクが自動的に別のユーザーまたはグループに割り当てられます。

16.3.6.2 フレックス・フィールド・マッピング

管理者は、図16-23に示す「フレックス・フィールド・マッピング」タブを使用して、データをペイロードからインライン属性フレックス・フィールドにプロモートします。フレックス・フィールドにプロモートしたデータは検索可能になり、タスク・リスト(ホーム)ページに列として表示できます。

図16-23 「フレックス・フィールド・マッピング」タブ

図wl_flexfields2.gifの説明が続きます
図wl_flexfields2.gifの説明

16.3.6.2.1 ラベルの作成

管理者がフレックス・フィールド・マッピングを作成するには、まずフレックス・フィールド属性のわかりやすい表示名を提供するセマンティック・ラベルを定義します。「ラベルの作成」をクリックし、図16-24に示す「ペイロード・マッピング・ラベルの作成」インタフェースを使用します。

図16-24 ラベルの作成

図wl_creatinglabel.gifの説明が続きます
図wl_creatinglabel.gifの説明

この図のように、ラベルamountをフレックス・フィールド「NumberAttribute1」にマップすると、ペイロード属性もラベルにマップされます。この例では、ラベルamount「数値」属性タイプが関連付けられています。最終結果では、「数値」属性の値が「NumberAttribute1」列に格納され、amountがユーザーのタスク・リストに表示される値の列ラベルとなります。ラベルは、様々なタスク・タイプに再利用できます。ラベルを削除できるのは、どのマッピングにも使用されていない場合のみです。

マップされたペイロード属性は、カスタム・ビューに列として表示でき、カスタム・ビューとワークフロー・ルールの両方でフィルタ条件として使用できます。ペイロード属性の表示名は、マッピングの実行時に選択した属性ラベルです。

16.3.6.2.2 全マッピングの参照

このオプションを選択すると、図16-25のように、全タスク・タイプに対して定義されている全フレックス・フィールド・マッピングが表示されます。

図16-25 マッピングの参照

図wl_browseall.gifの説明が続きます
図wl_browseall.gifの説明

特定のラベルにマップされているペイロード属性をすべて表示するには、ラベル表内で対応する行をクリックします。

16.3.6.2.3 タスク・タイプによるマッピングの編集

このオプションを選択すると、管理者は特定のタスク・タイプのフレックス・フィールド・マッピングを表示または編集できます。

マッピングをタスク・タイプ別に編集する手順は、次のとおりです。

  1. 「タスク・タイプによるマッピングの編集」を選択して懐中電灯アイコンをクリックします。

  2. 図16-26のように、タスク・タイプを選択して「選択」をクリックします。

    図16-26 タスク・タイプの選択

    図wl_selectingtasktype.gifの説明が続きます
    図wl_selectingtasktype.gifの説明

  3. 「タスク・タイプによるマッピングの編集」フィールドにタスク・タイプが表示されている状態で「実行」をクリックします。

    図16-27のように、選択したタスク・タイプに対する現行のマッピングがすべて表示されます。

    図16-27 ラベルの選択

    図wl_selectinglabel.gifの説明が続きます
    図wl_selectinglabel.gifの説明

  4. マッピングのラベルを選択して「選択」をクリックします。

    図16-28に、完成したマッピングを示します。

    図16-28 作成されたフレックス・フィールド・マッピング

    図wl_savedmapping.gifの説明が続きます
    図wl_savedmapping.gifの説明

    新規ラベルを作成する場合は、図16-29のように「ラベルの作成」をクリックしてラベル名を入力します。データ型がペイロード属性のデータ型に基づいて制限されることに注意してください。

    図16-29 ペイロード・マッピング・ラベルの作成

    図wl_flexfields1.gifの説明が続きます
    図wl_flexfields1.gifの説明

  5. 新規マッピングを追加するには、行の追加を(必要な場合は)クリックしてリストからペイロード属性を選択します。

  6. 懐中電灯アイコンをクリックしてラベルを選択します。

16.3.6.2.4 制限

次の制限に注意してください。

  • マップできるのは、単純型のペイロード属性のみです。複合型の中でのマッピング固有の単純型はサポートされていません。

  • フレックス・フィールド(およびラベル)を使用できるのは、タスク・タイプごとに1回のみです。

  • 数値または日付データ型のデータ型変換はサポートされていません。たとえば、文字列型のペイロード属性を数値型のラベルにマップすることはできません。

16.3.6.3 アプリケーションのカスタマイズ

管理者は、図16-30に示す「アプリケーションのカスタマイズ」タブを使用して、ワークリスト・アプリケーションの外観をカスタマイズします。

図16-30 「アプリケーションのカスタマイズ」タブ

図wl_customizing2.gifの説明が続きます
図wl_customizing2.gifの説明

次のパラメータの値を指定できます。

  • ログイン・ページ・レルムのラベル: アイデンティティ・サービスが複数のレルムを使用して構成されている場合は、ワークリスト・アプリケーションのログイン・ページにレルム名のリストが表示されます。LABEL_LOGIN_REALMでは、これらのレルムを表示するラベルの検索に使用するリソース・バンドル・キーを指定します。realm(レルム)という語は、ユーザー・コミュニティにあわせて変更できます。country(国)、company(会社)、division(部)またはdepartment(部門)などの方が適切な場合があります。管理者はリソース・バンドルをカスタマイズし、この文字列のリソース・キーを指定して、このパラメータがリソース・キーを指すように設定できます。

    ログイン・ページ上のイメージのカスタマイズについては、「ログイン・ページのカスタマイズ」を参照してください。

  • ブランド・イメージの場所: これは、ワークリスト・アプリケーションの各ページの左上隅に表示されるイメージです。(デフォルトはOracleロゴです。)管理者はロゴに使用する.gif.pngまたは.jgpファイルを提供できます。このファイルは、ワークリスト・アプリケーションのpublic_htmlディレクトリに置く必要があります。

    ヘッダーについては、「ヘッダー情報のカスタマイズ」を参照してください。

  • アプリケーション・リソース・バンドルのクラス名: リソース・バンドルは、ワークリスト・アプリケーションに表示される文字列を提供します。デフォルトでは、これは次のクラスです。

    oracle.bpel.services.workflow.resource.WorkflowResourceBundle
    
    

    管理者は、WorkflowResourceBundleをコピーして独自作成し、アプリケーションに表示される文字列を変更できます。このパラメータを使用すると、管理者はこのカスタム・リソース・バンドルへのクラスパスを指定できます。

16.3.7 レポートの作成

ワークリスト・アプリケーションでは、「レポート」リンクから次のレポートを使用できます。

レポートを作成する手順は、次のとおりです。

  1. 「レポート」リンクをクリックします。

  2. 必要なレポートの名前をクリックします。

  3. レポートの検索パラメータの定義を入力します。

    入力パラメータについては、以降の各レポート・タイプの項を参照してください。

  4. 「実行」をクリックします。

図16-31のように、レポート結果は(すべてのレポート・タイプで)表書式と棒グラフ書式の両方で表示されます。レポートの実行に使用された入力パラメータは、左下隅の「レポート入力」の下に表示されます(表示するためにスクロールが必要な場合があります)。

図16-31 レポート表示: 表書式、棒グラフ書式および「レポート入力」

図wl_rpt_inputs.gifの説明が続きます
図wl_rpt_inputs.gifの説明

16.3.7.1 不参加タスク・レポート

このレポートには、ユーザーのグループまたは報告先のグループに割り当てられたタスクのうち、まだ申告されていないタスク(不参加タスク)の分析が表示されます。次の入力パラメータを使用してレポートを定義します。

  • 割当て先: 分析されるタスクは、ユーザーへの適用時に選択されたカテゴリ(ユーザーのグループに割り当てられたタスク、報告先のグループに割り当てられたタスク、ユーザーが作成者であるタスクおよびユーザーが所有者であるタスク)に基づきます。

  • 作成日(範囲)

  • 有効期限(範囲)

  • タスクの状態

  • 優先度

「作成日」、「有効期限」、「タスクの状態」(または「ステータス」)および「優先度」の説明は、表16-2を参照してください。

図16-32に、「不参加タスク・レポート」の例を示します。

図16-32 不参加タスク・レポート

図wl_unattend_rpt2.gifの説明が続きます
図wl_unattend_rpt2.gifの説明

このレポートは、Californiaグループに15件、Supervisorグループに7件、LoanAgentGroupに11件の不参加タスクがあることを示しています。このレポートでは、不参加(未申告)タスクはすべてDocumentReviewタスクです。レポートの実行時に複数タイプの不参加タスクが存在する場合は、すべてのタスク・タイプがレポートに含まれ、それぞれのタスク・タイプが色わけされます。

16.3.7.2 タスクの優先度レポート

このレポートでは、ユーザー、報告先またはそのグループに割り当てられたタスクの数が優先度別に分析されます。次の入力パラメータを使用してレポートを定義します。

  • 割当て先: 選択した割当て先に応じて、自分に割り当てられたタスク(「個人」)、自分および所属グループに割り当てられたタスク(「個人とグループ」)または報告先の所属グループに割り当てられたタスクが含まれます。

  • 作成日(範囲)

  • 終了日(範囲): これは、レポートに含まれるタスクの終了日です。

  • 優先度

「作成日」と「優先度」の説明は、表16-2を参照してください。

図16-33に、「タスクの優先度レポート」の例を示します。

図16-33 「タスクの優先度レポート」

図wl_prio_rpt.gifの説明が続きます
図wl_prio_rpt.gifの説明

このレポートは、Californiaグループ、SupervisorグループおよびLoanAgentGroupに標準優先度のタスクがそれぞれ16件あることを示しています。ユーザーrstevenとjcooperのタスクはそれぞれ5件と22件で、いずれも標準優先度です。棒グラフでは、優先度(最高、高、標準、低、最低)が異なる色で区別されます。

16.3.7.3 タスクのサイクル・タイム・レポート

このレポートでは、ユーザーのグループまたは報告先のグループに基づいて、タスクの作成から完了までの所要時間が分析されます。次の入力パラメータを使用してレポートを定義します。

  • 割当て先: 選択した割当て先に応じて、自分のタスクまたは報告先の所属グループに割り当てられたタスクが含まれます。

  • 作成日(範囲)

  • 終了日(範囲): これは、レポートに含まれるタスクの終了日です。

  • 優先度

「作成日」と「優先度」の説明は、表16-2を参照してください。

図16-34に、「タスクのサイクル・タイム・レポート」の例を示します。

図16-34 「タスクのサイクル・タイム・レポート」

図wl_cyctime_rpt.gifの説明が続きます
図wl_cyctime_rpt.gifの説明

このレポートは、DocumentReviewタスクが完了するまでの平均所要時間が1時間6分、VacationApprovalタスクが完了するまでの平均所要時間が1時間28分であることを示しています。棒グラフには、平均サイクル・タイムがミリ秒単位で表示されます。

16.3.7.4 タスクの生産性レポート

このレポートでは、ユーザー、報告先またはグループについて、指定した期間中に割り当てられたタスク数と完了したタスク数が分析されます。次の入力パラメータを使用してレポートを定義します。

  • 割当て先: 選択した割当て先に応じて、自分のタスクまたは報告先の所属グループに割り当てられたタスクが含まれます。

  • 作成日(範囲): デフォルトは1週間です。

  • タスク・タイプ: 懐中電灯アイコンを使用してタスク・タイトルのリストから選択します。図16-35に示すように、「ワークフロー・タスク・タイプの選択」ページにはタスクのバージョンがすべて表示されます。

    図16-35 「ワークフロー・タスク・タイプの選択」

    図wl_seltasktype.gifの説明が続きます
    図wl_seltasktype.gifの説明

図16-36に、「タスクの生産性レポート」の例を示します。

図16-36 「タスクの生産性レポート」

図wl_product_rpt.gifの説明が続きます
図wl_product_rpt.gifの説明

このレポートは、California、LoanAgentGroupおよびSupervisorの各グループに割当て済のタスク数を示しています。ユーザー別では、jcooperに22件のタスクが割り当てられていることがわかります。jcooperには、割当て済タスクのみでなく、完了したタスクも2件あります。また、mtwainとrstevenが完了したタスクがそれぞれ6件と11件であることを示しています。棒グラフでは、2つのタスクの状態(「割当て済」と「完了」)が異なる色で区別されます。

16.3.8 ユーザーおよびグループ情報

「ようこそ jstein [jazn.com]」のように、バナー領域にはログイン・ユーザーの名前が表示されます。ユーザー名をクリックすると、図16-37のように、ユーザーの氏名、電話番号、電子メール・アドレス、マネージャ、報告先、所属グループおよび付与されているロールなどの情報が表示されます。

図16-37 ユーザー情報

図wl_user.gifの説明が続きます
図wl_user.gifの説明

付与されているロールにより、ユーザーがアプリケーションで実行できるアクションが制御されます。マネージャや部下のリンクをクリックすると、管理チェーンを上位および下位に移動してユーザー情報を取得できます。グループをクリックすると、そのグループの「グループ情報」ページが表示されます。「グループ情報」ページには、直接ユーザーと間接ユーザー(現在のグループの子グループに含まれるユーザー)のリストが表示されます。

16.4 ローカル言語でのワークリスト・アプリケーションへのアクセス

アイデンティティ・サービスにより、ユーザーの優先言語およびタイムゾーンが決定されます。この情報は、JAZNファイルベースのコミュニティまたは外部ディレクトリ・サービス(Oracle Internet Directoryなど)から抽出されます。 プリファレンス情報が利用できない場合、ユーザーの優先言語およびタイムゾーンはシステム・デフォルト(次のサンプル・コードのようにen_USおよびAmerica/Los_Angeles)に設定されます。

JAZN XMLファイルのユーザー・コミュニティで構成されたサンプル・ワークリストを使用している場合、次のようにユーザーの優先言語とタイムゾーンをdemo-users-properties.xmlファイル内で設定できます。

<timeZone>America/Los_Angeles</timeZone>
<languagePreference>en_US</languagePreference>

demo-users-properties.xmlファイルは次のディレクトリにあります。

SOA_Oracle_Home¥bpel¥system¥services¥config

ワークリスト・アプリケーションでは、表16-4のロケールがサポートされます。

表16-4 ワークリスト・アプリケーションでサポートされる言語およびJavaロケール

言語 Javaロケール
英語 (en)
英語(アメリカ) (en_US)
ドイツ語 (de)
スペイン語(インターナショナル) (es)
スペイン語(スペイン) (es_ES)
フランス語 (fr)
フランス語(カナダ) (fr_CA)
イタリア語 (it)
日本語 (ja)
韓国語 (ko)
ポルトガル語 (pt)
ポルトガル語(ブラジル) (pt_BR)
中国語(簡体字) (zh_CN)
中国語(繁体字) (zh_TW)

OIDなどのLDAPベースのプロバイダを使用する場合、言語設定はOIDコミュニティで変更します。

ユーザーがブラウザを起動してワークリスト・アプリケーションにログインすると、ワークリストの画面は、ブラウザのロケールとタイムゾーンでレンダリングされます。ワークリスト・アプリケーションのほとんどの文字列は、ワークリスト・アプリケーション・バンドルから取得されます。デフォルトでは、これは次のクラスです。

oracle.bpel.services.workflow.resource.WorkflowResourceBundle

ただし、これは適切なアプリケーション・プリファレンスを設定することでカスタム・リソース・バンドルに変更できます。詳細は、「管理機能の使用」を参照してください。

タスク属性名、フレックス・フィールド属性ラベルおよびDynamic Assignment Function名の文字列は、リソース・プロパティ・ファイルWorkflowLabels.propertiesの構成から取得されます。このファイルは、サービス構成ディレクトリのwfresourceサブディレクトリにあります。このファイルにDynamic Assignment Functionおよび属性ラベルのエントリを追加する方法は、第15章「Oracle BPEL Process Managerワークフロー・サービス」を参照してください。

カスタム・アクションとタスク・タイトルの表示名は、タスク構成ファイルに指定されているメッセージ・バンドルから取得されます。メッセージ・バンドルの指定がない場合、設計時に指定された値が使用されます。カスタム・アクションとタスク・タイトルを優先言語で表示するためにメッセージ・バンドルを指定する方法の詳細は、第15章「Oracle BPEL Process Managerワークフロー・サービス」を参照してください。

16.5 ワークリスト・アプリケーションのカスタマイズ

この章で説明しているサンプル・ワークリスト・アプリケーションには、必要な機能がすべて含まれます。このアプリケーションを土台として、独自の要件に合ったカスタマイズ・ワークリスト・アプリケーションを作成できます。この項では、ワークリスト・アプリケーションのアーキテクチャについて説明し、アプリケーションをカスタマイズするための具体的な詳細情報を提供します。

ワークリスト・アプリケーションは、次のサンプル・ディレクトリに用意されています。

SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp

16.5.1 ワークリスト・アプリケーションのアーキテクチャ

ワークリスト・アプリケーションは、図16-38に示すとおり、標準的なModel-View-Controllerアプローチに準拠しています。

図16-38 ワークリスト・アプリケーションのアーキテクチャ

図bpmdg032.gifの説明が続きます
図bpmdg032.gifの説明

ブラウザからのリクエストは、サーブレットで処理されます。サーブレットはリクエストを検証して適切なワークフロー・サービス・クライアントAPIをコールし、データを問合せまたは更新します。ワークリスト・クライアントAPIでは、基礎となるワークフロー・サービスの起動用に各種のプロトコル(ローカルおよびリモートEJB、直接のJava起動、SOAP)がサポートされます。クライアントは、適切なプロトコルを使用してAPIリクエストをワークフロー・サービスに送信します。APIのコール後、サーブレットは、セッションで次のページをレンダリングするために必要なデータを格納します。JSPはセッションのデータを選択してレンダリングし、セッションからデータを削除します。したがって、サーブレットとJSPの機能はそれぞれ異なります。サーブレットはバックエンドAPIコールの作成を担当し、JSPはデータの書式設定を担当します。

ワークリスト・アプリケーション・サーブレットは次のディレクトリにあります。

SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥src¥worklistapp¥servlets

すべてのサーブレットはworklistapp.servlets.BaseServletクラスを拡張します。このクラスは、認証など、すべてのサーブレットに必要な共通機能を実装しています。

JSPは次のディレクトリにあります。

SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥public_html

ワークフロー・クライアントAPIは、ワークフロー・サービスにより使用可能になるパブリック・インタフェースです。このインタフェースは次のクラスにあります。

oracle.bpel.services.workflow.client.IWorkflowServiceClient

APIインタフェースのインスタンスは、次のクラスでgetWorkflowServiceClientメソッドを起動すると取得できます。

oracle.bpel.services.workflow.client.WorkflowServiceClientFactory

詳細は、第15章「Oracle BPEL Process Managerワークフロー・サービス」を参照してください。

図16-39に、典型的なページ・フロー順序を示します。

図16-39 典型的なページ・フロー順序

図bpmdg031.gifの説明が続きます
図bpmdg031.gifの説明

これは、アプリケーションにログインしてタスクの詳細を参照する場合の順序です。最初に、ユーザーがログインURLを入力すると、ログイン・サーブレットによってページがブラウザに送信されるログインJSPにリダイレクトされます。ユーザーがユーザー名とパスワードを入力すると、ログイン・サーブレットによりタスク問合せサービスのauthenticateメソッドがコールされます。認証に成功すると、TaskListサーブレットURLにリダイレクトされます。ブラウザのリクエストはTaskListサーブレットに渡され、TaskListサーブレットはユーザーが参照するタスクを取得するためにタスク問合せサービスのqueryTasksメソッドをコールします。次に、ブラウザに送信されるTaskList JSPにページがリダイレクトされます。ユーザーがタスク・リンクをクリックすると、リクエストはTaskDetailsサーブレットによって処理されます。これによりタスク問合せサービスのgetTaskDetailsByIdメソッドがコールされ、ページはブラウザに送信されるTaskDetails JSPにリダイレクトされます。その他の機能(ペイロードの更新、添付ファイルの追加、タスクの再割当て、履歴の表示、ユーザー・プリファレンスの更新など)を実行するためのページ・フローも、これとほぼ同じです。

処理内容が(APIコールと処理を受け持つサーブレットとデータの書式設定を受け持つJSPの間で)分割されているため、アプリケーションのカスタマイズは容易です。多くの顧客要件に対応するためのページ・フロー要件も、大部分はサンプル・ワークフロー・アプリケーションのページ・フローと同様です。したがって、場合によっては、JSP(およびHTMLデータの書式設定に使用されるJavaクラスHTMLFormatter.java)を修正するだけで十分対応できます。

表16-5に、ワークリスト・アプリケーションのJSPを示します。

表16-5 ワークリスト・アプリケーションのJSP

JSP サーブレット 注意
AdminPrefs.jsp
Admin アプリケーション・カスタマイズ・プリファレンス
AdvancedSeach.jsp
TaskList タスクリストの拡張問合せ
Branding.jsp
-- 各ページの左上隅に表示されるブランド情報
ColumnSelectIncludes.jsp
-- ユーザーによる列リストの選択を可能にするコントロール(DisplayPrefs.jspおよびViewEdit.jspで使用)
DisplayPrefs.jsp
Preferences ユーザーの表示プリファレンス
Error.jsp
-- 例外が捕捉された場合のすべてのサーブレットのリダイレクト先ページ
FilterForm.jsp
-- ユーザーによる拡張タスク問合せの定義を可能にするコントロール(AdvancedSearch.jspおよびViewEdit.jspで使用)
FilterIncludes.jsp
-- ユーザーによるタスク・フィルタリング基準の定義を可能にするコントロール(FilterForm.jspおよびRuleEdit.jspで使用)
Footer.jsp
-- 各ページの最下部に表示
GetHWTaskHistory.jsp
-- --
Header.jsp
-- 各ページの最上部に表示
HeaderIncludes.jsp
-- ページ・ヘッダーに共通のJavaScriptファンクションを追加するために使用
Home.jsp
Admin 管理者ページのコンテナとして使用
IdentityBrowser.jsp
IdentityBrowserPopup ユーザーによるユーザーとグループの選択を可能にするコントロール
IdentityBrowserPopup.jsp
IdentityBrowserPopup 認証ブラウザ・コントロールを含むポップアップ・ウィンドウ
Login.jsp
Login アプリケーションのログイン・ページ
PayloadMapping.jsp
Admin フレックス・フィールド・ペイロード・マッピング
PayloadMappingBrowser.jsp
PayloadMappingBrowser フレックス・フィールド・ペイロード・マッピング
PayloadMappingBrowserPopup.jsp
PayloadMappingBrowserPopup フレックス・フィールド・ペイロード・マッピング
PayloadMappingEditor.jsp
-- フレックス・フィールド・ペイロード・マッピング
PayloadMappingLabelPopup.jsp
-- フレックス・フィールド・ペイロード・マッピング
PopUpHeader.jsp
-- ポップアップ・ウィンドウに表示されるヘッダー
Preferences.jsp
Preferences ユーザー・プリファレンス・ページのコンテナとして使用
ReportChart.jsp
Reports タスク・レポート
ReportEdit.jsp
Reports タスク・レポート
ReportInput.jsp
Reports タスク・レポート
ReportOutput.jsp
Reports タスク・レポート
Reports.jsp
Reports タスク・レポート・ページのコンテナ・ページ
RequestInfo.jsp
RequestInfo タスク・リクエスト情報のリクエスト
RuleCreate.jsp
Preferences 新規ワークフロー・ルールの作成
RuleEdit
Preferences ワークフロー・ルール詳細の編集
RuleList.jsp
Preferences ワークフロー・ルールのリスト表示
SubTasks.jsp
SubTasks タスクのサブタスクの表示
TaskAssignees.jsp
TaskAssignee タスクの再割当ての処理
TaskDetails.jsp
TaskDetails タスク詳細の表示
TaskHistory.jsp
TaskHistory タスク履歴の表示
TaskList.jsp
TaskList メイン・アプリケーション・ページ(タスク・リストの表示)
TaskRouting.jsp
TaskRouting タスクのルーティング更新の処理
TaskTypeDetails.jsp
TaskType ワークフローのタスク・タイプ詳細の表示
TaskTypeList.jsp
TaskType タスク・タイプ・リストをポップアップ・ウィンドウに表示
UserInfo.jsp
UserInfo ユーザー情報の表示
UserInfoContent.jsp
UserInfo ユーザー情報の表示
Vacation.jsp
Preferences ユーザーの休暇プリファレンス
ViewDetails.jsp
Preferences 委任されたユーザー・タスク・ビューの詳細
ViewEdit.jsp
Preferences 所有されたユーザー・タスク・ビューの詳細の編集
ViewList.jsp
Preferences ユーザー・タスク・ビューのリスト表示

以降の各項では、一般的に使用されるページをカスタマイズする方法について説明します。

16.5.1.1 ログイン・ページのカスタマイズ

ログイン・ページのイメージをカスタマイズできます(デフォルトは人々のイメージです)。Login.jspで、イメージ・タグの太字部分(people.jpg)を独自のイメージで置き換えます。

 <IMG HEIGHT="55" SRC="img/people.jpg">

ログイン・ページをレルム・レベルでカスタマイズする方法については、「アプリケーションのカスタマイズ」を参照してください。

16.5.1.2 ヘッダー情報のカスタマイズ

ヘッダー・セクションは、すべてのページでブレッドクラム・ナビゲーションの上に表示されます。ヘッダーは、Header.jspファイルを変更することでカスタマイズできます。左上隅のアプリケーションのロゴと名前は、ヘッダーにインクルードされているBranding.jspファイルに含まれます。

ブランドのイメージを変更する方法については、「アプリケーションのカスタマイズ」を参照してください。

右上の領域には、タスク取得用のフィルタおよび検索条件を指定するためのHTMLコントロールがあります。フィルタは、アプリケーションに関連する選択肢のみを含むようにカスタマイズできます。

16.5.1.3 「タスクの詳細」ページのカスタマイズ

「タスクの詳細」ページは、タスクの内容を確認する場合や、ペイロードを表示または更新する場合に使用します。詳細ページのレイアウトは、上部のアクションとボタン、ヘッダー・セクション、ペイロード・セクション、およびコメントや添付などのオプション・コンテンツが含まれるフッター・セクションで構成されます。通常、このフォームに表示される情報は、表示対象タスクのタスク定義により定義されます(書式は、ワークフロー・タスク設計者により制御されます)。「タスクの詳細」ページは、TaskDetails.jspファイルを変更することでカスタマイズできます。このファイルをカスタマイズする方法については、「カスタム・タスク表示フォームの生成」を参照してください。

16.5.1.4 ワークリスト・アプリケーションに使用するクライアント-サービス・バインディングの変更

ワークフロー・サービス・クライアント・インタフェースでは、多数のプロトコルを使用してワークフロー・サービスと通信できます。通信の詳細はすべてクライアント実装によりカプセル化され、クライアント・インタフェースのユーザーが詳細を知る必要はありません。

ワークリスト・アプリケーションはデフォルトでワークフロー・サービスと同じコンテナでデプロイされ、アプリケーションではJavaクライアントを使用します。

ワークリスト・アプリケーションで使用するクライアントのタイプを変更するには、BaseServlet.java内のinitメソッドを次のように変更します。

public void init(ServletConfig config) throws ServletException
{
  super.init(config);
  try
  {
   wfSvcClient
     = WorkflowServiceClientFactory.getWorkflowServiceClient(
                            WorkflowServiceClientFactory.JAVA_CLIENT);
  }
  catch (Exception e)
  {
    wlSvcError = getStackTraceString(e);
   }
}

また、WorkflowServiceClientFactory.JAVA_CLIENTも次のいずれかに変更します。

  • WorkflowServiceClientFactory.SOAP_CLIENT: SOAPベースのWebサービス・インタフェースを使用する場合

  • WorkflowServiceClientFactory.LOCAL_CLIENT: ローカルEJBインタフェースを使用する場合

  • WorkflowServiceClientFactory.REMOTE_CLIENT: リモートEJBインタフェースを使用する場合

さらに、選択したクライアント・タイプにあわせてwf_client_config.xmlファイルが正しく設定されていることを確認します。

16.5.1.5 カスタム・ワークリスト・アプリケーションのデプロイ

サンプル・ワークリスト・アプリケーションのトップレベル・ディレクトリには、antスクリプトbuild.xmlが含まれており、ワークリスト・アプリケーションのビルドとデプロイに使用できます。 このantスクリプトでは、同じディレクトリに存在するプロパティ・ファイルorabpel.propertiesが使用されます。 この項では、サンプル・ワークリスト・アプリケーションのソース・ファイル構成に含まれる一部の不正ファイルの修正についても説明します。

この項の内容は次のとおりです。

16.5.1.5.1 タスク1: アプリケーション構成の変更

現在、サンプルweb.xmlおよびworklist-taglib.tldファイルはデプロイ済ワークリスト・アプリケーションのファイルと同期化されておらず、上書きする必要があります。

  1. 次のディレクトリからweb.xmlファイルをコピーします。

    SOA_Oracle_Home¥j2ee¥OC4J_instance_name¥applications¥hw_services¥worklistapp¥WEB-INF¥
    
    

    コピー先ディレクトリは次のとおりです。

    SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥config¥
    
    
  2. 次のディレクトリからworklist-taglib.tldファイルをコピーします。

    SOA_Oracle_Home¥j2ee¥OC4J_instance_name¥applications¥hw_services¥worklistapp¥WEB-INF¥
    
    

    コピー先ディレクトリは次のとおりです。

    SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥public_html¥WEB-INF¥
    
    
  3. 次のファイル内のEJB Server URLが、「タスク2: ビルド・ファイルの変更」の手順5oc4j.ormi.urlプロパティに指定する値と同じであることを確認します。

    SOA_Oracle_Home¥bpel¥system¥services¥config¥wf_client_config.xml
    
16.5.1.5.2 タスク2: ビルド・ファイルの変更

SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥build.xmlファイルを処理のために更新する必要があります。

  1. クラスパスを指定するpath要素を更新して次の値を追加します。

    <path id="classpath">
     <pathelement location="${orabpel.home}/system/services/lib/
       bpm-services.jar"/>
        <pathelement location="${orabpel.home}/lib/bpm-infra.jar" />
        <pathelement location="${orabpel.home}/lib/orabpel.jar" />
        <pathelement location="${orabpel.home}/lib/bicmn.jar" />
        <pathelement location="${orabpel.home}/lib/bipres.jar" />
        <pathelement location="${j2ee.home}/../../lib/xml.jar" />
        <pathelement location="${j2ee.home}/../../lib/xmlparserv2.jar" />
        <pathelement location="${j2ee.home}/jazncore.jar" />
        <pathelement location="${custom.classpath}" />
      </path>
    
    
  2. デプロイ・ターゲットdeploy.oc4jを更新して次の値を追加します。

    <target name="deploy.oc4j" depends="validate.properties,worklist.ear">
        <!-- Deploy  application ear -->
        <java jar="${j2ee.home}/admin_client.jar" dir="${j2ee.home}" fork="true">
             <arg line="${oc4j.ormi.url} ${oc4j.admin.username}
                ${oc4j.admin.password} -deploy -file
                ${worklist.classes.dir}/customworklist.ear -deploymentName
                customapp -parent orabpel" />
        </java>
        <java jar="${j2ee.home}/admin_client.jar" dir="${j2ee.home}"  fork="true">
             <arg line="${oc4j.ormi.url} ${oc4j.admin.username}
                ${oc4j.admin.password}
                -bindAllWebApps -appName customapp" />
        </java>
    </target>
    
    
  3. ターゲットworklistapp.earを更新して次の値を追加します。

    <target name="worklist.ear" depends="worklist.war">
      <ear compress="true" earfile="${worklist.classes.dir}/customworklist.ear"
         appxml="${worklist.config.dir}/application.xml">
        <fileset dir="${worklist.classes.dir}">
           <include name="**/*.war"/>
           <exclude name="**/*.ear"/>
        </fileset>
        <fileset dir="${worklist.config.dir}">
           <include name="**/META-INF/orion-application.xml"/>
        </fileset>
      </ear>
    </target>
    
    
  4. SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥orabpel.propertiesファイルを開きます。

  5. OC4J関連のプロパティを次のように変更します。

    #Standalone OC4J related properties
    #oc4j.ormi.url=deployer:oc4j:hostname:ormiport
    oc4j.ormi.url=deployer:oc4j:opmn://host_name:OPMN_request_port/home
    oc4j.admin.username=oc4jadmin
    #oc4j.admin.password=password
    oc4j.admin.password=welcome1
    
16.5.1.5.3 タスク3: ファイル変更の確認

アプリケーションをビルドしてデプロイする前に、「タスク1: アプリケーション構成の変更」および「タスク2: ビルド・ファイルの変更」に従って適切に変更を完了していることを確認します。

  1. SOA_Oracle_Home¥bpel¥samples¥hw¥worklistappディレクトリ内で次のファイルを適切に更新したことを確認します。

    • config¥web.xml

    • build.xml

    • orabpel.properties

  2. SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥public_html¥WEB-INF¥worklist-taglib.tldファイルを適切に更新したことを確認します。

16.5.1.5.4 タスク4: アプリケーションのビルドとデプロイ

  1. orabpel.properties内のすべてのプロパティが、環境を反映するように更新されていることを確認します。

  2. コマンドラインで、カスタマイズしたワークリスト・アプリケーションをビルドしてデプロイします。

    ant deploy.oc4j
    
    
  3. カスタマイズしたワークリスト・アプリケーションに次のURLでアクセスします。

    http://host:port/integration/customapp/
    
    
  4. ワークリスト・アプリケーションにログインします。

    タスク・リスト・ページが表示されます。


関連項目:

この時点でワークリスト・アプリケーションをJavaシングル・サインオン(JSSO)対応にして保護する場合は、「ワークリスト・アプリケーションのシングル・サインオン対応化」を参照してください。

16.5.1.6 プリファレンスを使用したワークリスト・アプリケーションのカスタマイズ

ワークリスト・アプリケーションでは様々な方法でルック・アンド・フィールをカスタマイズできます。JSPコードの編集やアプリケーション・サーブレットの変更は必要ありません。

各ワークリスト・ユーザーは、各自の受信ボックスに表示される列、ワークリスト・ページのサイズおよび1回に表示するタスク数をカスタマイズできます。詳細は、「プリファレンスの設定」を参照してください。

ワークリスト管理者は、すべてのユーザーに対するワークリスト・アプリケーションの外観に影響する多数のプリファレンス(ブランド・イメージなど)も変更できます。管理者は異なるリソース・バンドルを指定したり、ログイン画面に表示されるレルム・リストのラベルを変更できます。詳細は、「管理機能の使用」を参照してください。

16.5.1.7 WorkflowLabels.propertiesを使用したタスク属性の表示名の構成

次のファイル(および関連する変換)を更新すると、アプリケーションで様々なタスク属性に使用する名前を変更できます。

SOA_Oracle_Home/bpel/system/services/config/wfresource/WorflowLabels.properties

これにより、タスク・メタデータ・サービス・メソッドgetTaskAttributesおよびgetTaskAttributesForTaskDefinitionから返されるラベルが変更されることに注意してください。これらのメソッドを使用するサービス・クライアントがすべて影響を受けます。

16.5.2 異なるユーザーを対象とする情報およびアクションへのアクセスの制御

ワークフロー・サービスでは、JAZNファイルベースのコミュニティまたはLDAPコミュニティ(Oracle Internet Directoryなど)をサポートするアイデンティティ・サービスが使用されます。ロール・アクション(権限)の静的セットは定義済で、ロールに割り当てられています。ユーザーは、各自に割り当てられたロールを通じて権限を取得します。現在定義されている最も重要なロール・アクションは、次のとおりです。

  • CLAIM

  • WITHDRAW

  • ESCALATE

  • RENEW

  • RELEASE

  • REQUEST_INFO

  • SUBMIT_INFO

  • CUSTOM

  • ADMIN

  • REASSIGN

  • SUSPEND

  • RESUME

  • VIEW_TASK_HISTORY

ロール・アクションは、グローバルに適用されます。つまり、プロセス・レベルやインスタンス・レベルではなく、アプリケーション・レベルで適用されます。

ワークリスト・アプリケーションをカスタマイズして、特定のページで表示される情報や実行されるアクションを異なるユーザー・セットごとに変更できます。最初に、新規ロールを作成してそれらを必要なユーザーに割り当てます。次に、JSPでアイデンティティ・サービスを使用して、ユーザーが付与されたロールを保持しているかどうかをチェックし、使用するコード・パスを決定します。

たとえば、jazn-data.xml内でBPMProcessingManagerという新規ロールを作成できます。このファイルは次のディレクトリにあります。

SOA_Oracle_Home¥bpel¥system¥appserver¥oc4j¥j2ee¥home¥config

次のコード例に示すとおり、必要なユーザーにこのロールを割り当てる必要があります。

...
  <role>
    <name>BPMProcessingManager</name>
    <members>
      <member>
        <type>user</type>
        <name>jstein</name>
      </member>
    </members>
  </role>
...

OIDなどのLDAPベースのサービスを使用する場合は、これらのロールを作成してそのサービスのユーザーに付与する必要があります。

JSPコードは、アイデンティティ・サービスを使用して次のようにカスタマイズできます。

import="oracle.tip.pc.services.common.ServiceFactory"
import="oracle.tip.pc.services.identity.*"

boolean canEditTaskHeaderPriority = false;
// get info from identity service
try
{
  BPMAuthorizationService authorizationService =
       ServiceFactory.getAuthorizationServiceInstance(realm);
  // lookup user based on worklist context user
  BPMUser bpmUser = authorizationService.lookupUser(user);

  // check for BPMProcessManager role
  if (bpmUser.isInRole("BPMProcessingManager "))
     canEditTaskHeaderPriority = true;
 }
 catch (Exception e)
 {
  out.println("Could not get information from identity service");

 }
 // use the canEditTaskHeaderPriority flag to control HTML behavior
 if (canEditTaskHeaderPriority)
   // display the priority information & edit controls
 else
   // just display the priority information

16.5.3 ワークリスト・アプリケーションのシングル・サインオン対応化

リリース10.1.3.1のワークリスト・アプリケーションでは、デフォルトで固有のログイン・ページを介してカスタム認証メカニズムを使用します。 ワークリスト・アプリケーションはOC4Jコンテナ・セキュリティ下では実行されず、Javaシングル・サインオン(JSSO)対応ではありません。 ワークリスト・アプリケーションのソース・ファイルは、SOA_Oracle_Home¥bpel¥samples¥hw¥worklistappディレクトリにあります。 この項では、ワークリスト・アプリケーションをJSSOで保護する方法について説明します。

この項の内容は次のとおりです。


注意:

この項のタスクを実行する前に、「カスタム・ワークリスト・アプリケーションのデプロイ」でワークリスト・アプリケーションのデプロイ・タスクを完了していることを確認してください。

16.5.3.1 タスク1: サーブレット・コードの変更

  1. SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥src¥worklistapp¥servlets¥BaseServlet.javaファイルを開きます。

  2. validateSession()メソッド内で218行目から始まる次のコード・フラグメントを削除します。

    else
    {
     // forward request to login page, if user session is null
     //(not if session store or wfCtx is null, as login servlet will set them)
     if ( userSession == null )
     {
      RequestDispatcher rd = getServletContext().getRequestDispatcher(
                                             WorklistappConstants.PAGE_LOGIN_JSP);
      if (rd != null)
      {
       rd.forward(request,response);
       return false;
      }
     }
    }
    
    
  3. 同じディレクトリ内でLogin.javaファイルを開きます。

  4. handleRequest()メソッドのtry{}ブロックの最後までのコードを次のコードで置き換えます。

    String user = getParameter(request,WorklistappConstants.PARAM_LOGIN_USER);
    String password = getParameter(request,WorklistappConstants.PARAM_LOGIN_
      PASSWORD);String realm = getParameter(request,WorklistappConstants.PARAM_LOGIN_REALM);
    String redirectURL = getParameter(request,WorklistappConstants.PARAM_REDIRECT_
      URL);HttpSession userSession = request.getSession(true);
    SessionStore sessStore = new SessionStore(userSession);
    String remoteUser = request.getRemoteUser();
    
    if ((user == null) && (password == null) && (remoteUser == null))
    {
     pageRedirect(request, response, WorklistappConstants.PAGE_LOGIN_JSP);
     return;
    }
    
    try
    {
     IWorkflowContext wfCtx = null;
    
     if ( user != null )
     {
      //Authenticate the supplied credentials
      wfCtx = wfSvcClient.getTaskQueryService().authenticate(user, password, realm,
         null);
     }
     else
     {
      //Create context using remoteUser in request (pre-authenticated request)
      wfCtx = wfSvcClient.getTaskQueryService().createContext(request);
     }
    
      initSessionAttributes(sessStore, wfCtx);
      initRequestStatus(sessStore);
    
      if (redirectURL != null)
       response.sendRedirect(redirectURL);
      else
       response.sendRedirect(WorklistappConstants.SERVLET_TASK_LIST);
    }
    
    
  5. 同じディレクトリ内でLogout.javaファイルを開きます。

  6. 次のプライベート・メソッドを追加します。

     //When logging out, we need to know if oc4j SSO util class
     //exists in classpath
     private static boolean oc4jSSOExists = false;
     static
     {
      //Try and load the class
      try
     {
      Class.forName("oracle.security.jazn.sso.util.JSSOUtil");
    
      //Class was found
      oc4jSSOExists = true;
     } catch (ClassNotFoundException e)
     {
      oc4jSSOExists = false;
     }
    }
    
    
  7. handleRequest()メソッドのtry{}ブロック内のコードを次のコードで置き換えます。

    // destroy context not needed anymore
    wfSvcClient.getTaskQueryService().destroyWorkflowContext(wfCtx);
    //If we're running in oc4j, ensure SSO knows we've logged out...
    if ( oc4jSSOExists )
    {
     oracle.security.jazn.sso.util.JSSOUtil.logout(response,
        request.getContextPath()+"/"+WorklistappConstants.SERVLET_LOGIN);
    }
    //Invalidate the session
    if (userSession != null)
    {
    userSession.invalidate();
    }
    //If we're not running in oc4j, handle the redirect to the login page ourselves
    if ( !oc4jSSOExists )
    {
    response.sendRedirect(WorklistappConstants.SERVLET_LOGIN);
    }
    

16.5.3.2 タスク2: アプリケーション構成の変更

  1. SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥configディレクトリに移動します。

  2. META-INFというディレクトリを作成します。

  3. META-INFディレクトリに移動して、orion-application.xmlというファイルを作成します。

  4. orion-application.xmlに次の構文を追加してデプロイメント可能にします。

    <?xml version='1.0' encoding='windows-1252' ?>
    <orion-application>
      <jazn provider="XML">
        <jazn-web-app auth-method="CUSTOM_AUTH"/>
      </jazn>
      <security-role-mapping name="PUBLIC">
        <group name="{{PUBLIC}}" />
      </security-role-mapping>
    </orion-application>
    
    

    現在、サンプルweb.xmlファイルはデプロイ済ワークリスト・アプリケーションのファイルと同期化されておらず、上書きする必要があります。

  5. configディレクトリにあるweb.xmlに次のコードを追加します。

    <login-config>
      <auth-method>BASIC</auth-method>
    </login-config>
    
    <security-role>
      <role-name>{{PUBLIC}}</role-name>
    </security-role>
    
    <security-constraint>
      <web-resource-collection>
        <web-resource-name>worklistpages</web-resource-name>
        <url-pattern>/*</url-pattern>
      </web-resource-collection>
      <auth-constraint>
        <role-name>{{PUBLIC}}</role-name>
      </auth-constraint>
    </security-constraint>
    
    
  6. 複数レルムを使用している場合は、SOA_Oracle_Home¥bpel¥system¥services¥config¥wf_client_config.xmlファイルの次の要素がレルムに関する正しいエントリを含んでいる必要があります。

    <portal>
          <realmMapping>jazn.com</realmMapping>
    </portal>
    

16.5.3.3 タスク3: ファイル変更の確認

アプリケーションをビルドしてデプロイする前に、「タスク1: サーブレット・コードの変更」および「タスク2: アプリケーション構成の変更」の説明に従って適切に変更を完了していることを確認します。

  1. SOA_Oracle_Home¥bpel¥samples¥hw¥worklistappディレクトリ内で次のファイルを適切に更新したことを確認します。

    • src¥worklistapp¥servlets¥BaseServlet.java

    • src¥worklistapp¥servlets¥Login.java

    • src¥worklistapp¥servlets¥Logout.java

  2. SOA_Oracle_Home¥bpel¥system¥services¥config¥wf_client_config.xmlファイルを適切に更新したことを確認します。

  3. SOA_Oracle_Home¥bpel¥samples¥hw¥worklistapp¥config¥META-INF¥orion-application.xmlファイルを適切に作成したことを確認します。

16.5.3.4 タスク4: アプリケーションのビルドとデプロイ

  1. orabpel.properties内のすべてのプロパティが、環境を反映するように更新されていることを確認します。

  2. コマンドラインで、カスタマイズしたワークリスト・アプリケーションをビルドしてデプロイします。

    ant deploy.oc4j
    
    
  3. カスタマイズしたワークリスト・アプリケーションに次のURLでアクセスします。

    http://host:port/integration/customapp/
    
    

    SSOログイン・ページにプロンプトが表示されます。

  4. ワークリスト・アプリケーションにログインします。

    認証後にタスク・リスト・ページが表示されます。

  5. ワークリスト・アプリケーションからログアウトします。

    SSOログイン・ページが再表示されます。

16.6 ワークフロー・サービスのクライアントの作成

ワークフロー・サービスにより公開されるAPIを使用して、ワークフロー・サービスのクライアントを作成できます。APIにより、クライアントはローカルとリモートのEJB、SOAPおよびHTTPを使用してワークフロー・サービスと通信できるようになります。

サンプル・ワークリスト・アプリケーションをベースに使用して独自のアプリケーションをビルドできます。

サンプル・ワークリスト・アプリケーションをビルドする際の典型的なコール順序を次に示します。

  1. WorkflowServiceClientFactoryからIWorklistServiceClientへのハンドルを取得します。

  2. IWorklistServiceClientからITaskQueryServiceへのハンドルを取得します。

  3. ユーザー名とパスワードをITaskQueryServiceの認証メソッドに渡してユーザー認証を行います。IWorkflowContextへのハンドルを取得します。

  4. ITaskQueryServiceを使用してタスク・リストを問い合せます。

  5. IWorklistServiceClientからITaskServiceへのハンドルを取得します。

  6. 返されたタスク・リストを反復し、ITaskServiceを使用してタスクに対するアクションを実行します。

例16-1に、ワークフロー・サービスのクライアントの作成方法を示します。jsteinに割り当てられている全タスクのリストが問合せされます。結果が設定されていないタスクが承認されます。

例16-1 ワークフロー・サービスのクライアントの作成: 結果を承認済に設定

try {
 //Create JAVA WorflowServiceClient
 IWorkflowServiceClient  wfSvcClient =

WorkflowServiceClientFactory.getWorkflowServiceClient(WorkflowServiceClientFactory.JAVA_CLIENT);

 //Get the task query service
 ITaskQueryService querySvc = wfSvcClient.getTaskQueryService();

 //Login as jstein
 IWorkflowContext ctx = querySvc.authenticate("jstein",
            "welcome1",
             null, //Use default realm
             null);//Not logging in on behalf of another user
 //Set up list of columns to query
 List queryColumns = new ArrayList();
 queryColumns.add("TASKID");
 queryColumns.add("TASKNUMBER");
 queryColumns.add("TITLE");
 queryColumns.add("OUTCOME");
  //Create a predicate to query tasks that have a null outcome
 String outcome = null;
 Predicate predicate = new Predicate(TableConstants.WFTASK_OUTCOME_COLUMN,
                        Predicate.OP_EQ,
                        outcome);
                        //Create an ordering to order tasks by task number
 Ordering ordering = new Ordering(TableConstants.WFTASK_TASKNUMBER_COLUMN
                     ,true  //Ascending order
                     ,false //Nulls last
                     );
                          //Query a list of tasks assigned to jstein
 List tasks = querySvc.queryTasks(ctx,
          queryColumns,
          null, //Do not query additional info
          ITaskQueryService.ASSIGNMENT_FILTER_MY,
          null, //No keywords
          predicate, //Only tasks with no outome set
          ordering, //Order by ascending task number
          0,    //Do not page the query result
          0);
 //Get the task service
 ITaskService taskSvc = wfSvcClient.getTaskService();
 //Loop over the tasks, outputting task information, and approving tasks
 for(int i = 0 ; i < tasks.size() ; i ++)
  {
  Task task = (Task)tasks.get(i);
  int taskNumber = task.getSystemAttributes().getTaskNumber();
  String title = task.getTitle();
  String taskId = task.getSystemAttributes().getTaskId();
  //Set the outcome
  taskSvc.updateTaskOutcome(ctx,taskId,"APPROVED");
     System.out.println("Task #"+taskNumber+" ("+title+") is APPROVED");
  }

 }
 catch (Exception e)
 {
 //Handle any exceptions raised here...
 System.out.println("Caught workflow exception: "+e.getMessage());
 }
}

関連項目:

  • 次のサンプル。ワークリスト・アプリケーション用のカスタムUIを記述する方法を示しています。

    SOA_Oracle_home¥bpel¥samples¥utils¥AsyncLoanService¥StarLoanUI
    SOA_Oracle_home¥bpel¥samples¥demos¥HelpDeskServiceRequest¥HelpDeskUI
    SOA_Oracle_home¥bpel¥samples¥demos¥ExpenseRequestApproval¥
    ExpenseRequestUI
    
    
  • ワークフロー・サービスAPIを説明するJavadocは、SOA_Oracle_Home¥bpel¥docs¥workflow¥index.htmlを参照してください。


16.6.1 クライアント作成に使用するパッケージとクラス

クライアントの作成には、次のパッケージおよびクラスを使用します。

  • oracle.bpel.services.workflow.metadata.config.model

    このパッケージ内のクラスには、タスク定義ファイル内のワークフロー構成用のオブジェクト・モデルが含まれています。ObjectFactoryクラスを使用してオブジェクトを作成できます。

  • oracle.bpel.services.workflow.metadata.routingslip.model

    このパッケージ内のクラスには、ルーティング・スリップ用のオブジェクト・モデルが含まれています。ObjectFactoryクラスを使用してオブジェクトを作成できます。

  • oracle.bpel.services.workflow.metadata.taskdisplay.model

    このパッケージ内のクラスには、タスク表示用のオブジェクト・モデルが含まれています。ObjectFactoryクラスを使用してオブジェクトを作成できます。

  • oracle.bpel.services.workflow.metadata.taskdefinition.model

    このパッケージ内のクラスには、タスク定義ファイル用のオブジェクト・モデルが含まれています。ObjectFactoryクラスを使用してオブジェクトを作成できます。

  • oracle.bpel.services.workflow.client.IWorkflowServiceClient

    ワークフロー・サービス・クライアントのインタフェースです。

  • oracle.bpel.services.workflow.client.WorkflowServiceClientFactory

    ワークフロー・サービスのクライアント作成用ファクトリです。

  • oracle.bpel.services.workflow.metadata.ITaskMetadataService

    タスク・メタデータ・サービスのインタフェースです。

  • oracle.bpel.services.workflow.task.ITaskService

    タスク・サービスのインタフェースです。

  • oracle.bpel.services.workflow.task.IRoutingSlipCallback

    タスク処理中にコールバックを受信するコールバック・クラスのインタフェースです。

  • oracle.bpel.services.workflow.task.IAssignmentService

    割当てサービスのインタフェースです。

16.6.2 ワークフロー・サービス・クライアント

ワークリスト・アプリケーションは、ワークフロー・サービス・クライアントを介して様々なワークフロー・サービスにアクセスします。ワークフロー・サービス・クライアントのコードは、様々なローカル・プロトコルとリモート・プロトコルを使用したワークフロー・サービスとの通信に必要なロジックをすべてカプセル化したものです。ワークリスト・アプリケーションにワークフロー・サービス・クライアントのインスタンスがあれば、クライアントとワークフロー・サービスとの通信方法を考慮する必要はありません。

クライアントを使用するメリットは、次のとおりです。

  • SOAP/HTTPやEJBなどの基礎となる接続メカニズムの複雑さが隠されます。

  • 使用する起動メカニズムの変更(SOAP/HTTPからリモートEJBへの変更など)が容易になります。

  • SOAP/HTTPまたはJava WSIF起動メカニズム用のXML入力/出力のかわりに、サービス入力/出力用のJava APIを使用したプログラミングが容易になります。

IWorkflowServiceClientインタフェースのインスタンス作成には、次のクラスが使用されます。

oracle.bpel.services.workflow.client.WorkflowServiceClientFactory

WorkflowServiceClientFactoryには単一メソッドgetWorkflowServiceClientがあり、このメソッドは単一パラメータとしてクライアント・タイプをとります。クライアント・タイプは次のいずれかです。

  • WorkflowServiceClientFactory.JAVA_CLIENT: クライアントはJavaを使用してワークフロー・サービスを直接起動します。

  • WorkflowServiceClientFactory.LOCAL_CLIENT: クライアントはローカルEJBインタフェースを使用してワークフロー・サービスを起動します。

  • WorkflowServiceClientFactory.REMOTE_CLIENT: クライアントはリモートEJBインタフェースを使用してリモートのワークフロー・サービスを起動します。

  • WorkflowServiceClientFactory.SOAP_CLIENT: クライアントはSOAPを使用して、リモートのワークフロー・サービスへのWebサービス・インタフェースを起動します。

ファクトリを介して、すべてのワークフロー・サービスのクライアント・ライブラリを取得できます。表16-6に、各サービスに使用可能なクライアントを示します。

表16-6 ワークフロー・サービスに使用可能なクライアント

サービス名 SOAP Webサービスのサポート リモートEJBのサポート ローカルEJBのサポート プレーンJava APIのサポート
タスク・サービス はい はい はい
タスク問合せサービス はい はい はい はい
タスク・メタデータ・サービス はい はい はい はい
タスク・レポート・サービス


はい
ユーザー・メタデータ・サービス はい はい はい はい
ランタイム構成サービス はい はい はい はい
アイデンティティ・サービス



  • BPM認証サービス
はい

はい
  • BPM認可サービス
はい

はい

クライアント・クラスは、サービスのエンドポイントにwf_client_config.xml構成ファイルを使用します。このファイルは次のディレクトリにあります。

SOA_Oracle_Home/bpel/system/services/config

クライアントのクラスパスでは、このファイルをクラスパスに直接指定する必要があります。つまり、このファイルが格納されているディレクトリをクラスパスに含めます。wf_client_config.xmlファイルの内容は、次のとおりです。

  • EJB構成用のセクション

 <ejb>
  <serverURL>ormi://localhost/hw_services</serverURL> <!-- for stand alone -->
  <!--serverURL>opmn:ormi://localhost:home/hw_services</serverURL-->
  <!-- for
  opmn managed instance -->
  <user>oc4jadmin</user>
  <password>welcome1</password>
      <initialContextFactory>oracle.j2ee.rmi.RMIInitialContextFactory</initialContextFactory>
 </ejb>

  • 各サービスのSOAPエンドポイント用のセクション

<taskService>
<soapEndPoint>http://localhost:9700/integration/services/TaskService/
  TaskServicePort</soapEndPoint>
</taskService>

16.6.2.1 IWorkflowServiceClientインタフェース

IWorkflowServiceClientインタフェースは、各種ワークフロー・サービス・インタフェースへのハンドルを取得できるように、表16-7に示すメソッドを提供します。

表16-7 IWorkflowServiceClientのメソッド

メソッド インタフェース
getTaskService
oracle.bpel.services.workflow.task.ITaskService
getTaskQueryService
oracle.bpel.services.workflow.query.ITaskQueryService
getTaskReportService
oracle.bpel.services.workflow.report.ITaskReportService
getTaskMetadataService
oracle.bpel.services.workflow.metadata.ITaskMetadataService
getUserMetadataService
oracle.bpel.services.workflow.user.IUserMetadataService
getRuntimeConfigService
oracle.bpel.services.workflow.runtimeconfig.IRuntimeConfigService
getAuthenticationService
oracle.tip.pc.services.identity.BPMAuthenticationService
getAuthorizationService
oracle.tip.pc.services.identity.BPMAuthorizationService

16.6.3 Javaクライアントのクラスパス

Javaクライアントのクラスパスには、次のJARファイルが必要です。

  • $BPEL_HOME/bpel/lib/bpm-infra.jar

  • $BPEL_HOME/bpel/lib/orabpel-common.jar

  • $BPEL_HOME/bpel/lib/orabpel-thirdparty.jar

  • $BPEL_HOME/bpel/lib/orabpel.jar

  • $BPEL_HOME/bpel/system/appserver/oc4j/j2ee/home/jazncore.jar

  • $BPEL_HOME/bpel/system/appserver/oc4j/j2ee/home/oc4jclient.jar

  • $BPEL_HOME/bpel/system/appserver/oc4j/lib/xml.jar

  • $BPEL_HOME/bpel/system/appserver/oc4j/lib/xmlparserv2.jar

  • $BPEL_HOME/bpel/system/appserver/oc4j/webservices/lib/orasaaj.jar

  • $BPEL_HOME/bpel/system/appserver/oc4j/webservices/lib/soap.jar

  • $BPEL_HOME/bpel/system/services/config

  • $BPEL_HOME/bpel/system/services/lib/bpm-services.jar

  • $BPEL_HOME/bpel/system/services/schema

  • wsclient_extended.zip


注意:

wsclient_extended.jarファイルは、次のURLでOracle Technology Networkから別途ダウンロードできます。
http://download.oracle.com/otn/java/oc4j/1013/
wsclient_extended.zip

次のURLで『Oracle Application Server Web Services開発者ガイド』の「Webサービス・クライアントAPIおよびJAR」、「wsclient_extended.jarを使用したクラスパスの簡素化」を参照してください。

http://www.oracle.com/technology/documentation

16.6.4 WebアプリケーションでのEJB参照

Webアプリケーションでワークフロー・サービスのローカルEJBを使用する場合、クライアント・アプリケーションでは次のようにする必要があります。

  • アプリケーションをhw_servicesアプリケーションの子アプリケーションにします。

  • クライアント・アプリケーションのweb.xmlファイル内でEJBローカル参照を定義します。例16-2および例16-3に、各サービスのローカル参照を示します。

例16-2 タスク・サービス

<ejb-local-ref id="EjbRef_TaskServiceBean_Message">
  <ejb-ref-name>ejb/local/TaskServiceBean</ejb-ref-name>
  <ejb-ref-type>Session</ejb-ref-type>
  <local-home>oracle.bpel.services.workflow.task.ejb.TaskServiceLocalHome</local-home>
  <local>oracle.bpel.services.workflow.task.ejb.TaskServiceLocal</local>
  <ejb-link>TaskServiceBean</ejb-link>
</ejb-local-ref>

例16-3 タスク・メタデータ・サービス

<ejb-local-ref id="EjbRef_TaskMetadataServiceBean_Message">
  <ejb-ref-name>ejb/local/TaskMetadataServiceBean</ejb-ref-name>
  <ejb-ref-type>Session</ejb-ref-type>
  <local-home>oracle.bpel.services.workflow.metadata.ejb.TaskMetadataServiceLocalHome</local-home>
  <local>oracle.bpel.services.workflow.metadata.ejb.TaskMetadataServiceLocal</local>
  <ejb-link>TaskMetadataServiceBean</ejb-link>
</ejb-local-ref>

注意:

ローカルEJBを使用できるのは子アプリケーションのみです。このため、スタンドアロンJavaクライアントによるリモートEJBまたはSOAPクライアントの使用は制限されます。

タスク問合せサービス、タスク・レポート・サービス、ユーザー・メタデータ・サービスおよびランタイム構成サービスの詳細は、第15章「Oracle BPEL Process Managerワークフロー・サービス」を参照してください。

16.6.5 タスクの開始

タスクをプログラム的に開始できます。その場合は、次のタスク属性が設定されている必要があります。

  • taskDefinitionURI

  • title

  • payload

  • priority

次のタスク属性はオプションですが、通常はクライアントにより設定されます。

  • creator

  • ownerUser: 空の場合はbpeladminにデフォルト設定

  • processInfo

  • identificationKey: TaskQueryServiceからの識別キーに基づいてタスクを問合せ可能

16.6.5.1 タスクの作成

タスクのオブジェクト・モデルは次のパッケージで使用できます。

oracle.bpel.services.workflow.task.model

このモデル内でオブジェクトを作成するには、ObjectFactoryクラスを使用します。

16.6.5.2 タスクのペイロード要素の作成

タスク・ペイロードには、複数のペイロード・メッセージ属性を含めることができます。ペイロードはタスクが定義されるまで詳細に定義されないため、タスクのJavaオブジェクト・モデルにはクライアント・ペイロード用の強い型指定のオブジェクトが含まれません。タスク・ペイロードはAnyType Javaオブジェクトで表されます。AnyType Javaオブジェクトは、ネームスペース内のpayloadをルートとして持つXML要素を使用して作成されます。

http://xmlns.oracle.com/bpel/workflow/task

ペイロードのXML要素には、他のすべてのXML要素が含まれます。各XML要素では、メッセージ属性を定義します。

例16-4に、タスク・ペイロードの設定方法を示します。

例16-4 タスク・ペイロードの設定

import oracle.bpel.services.workflow.task.model.AnyType;
import oracle.bpel.services.workflow.task.model.ObjectFactory;
import oracle.bpel.services.workflow.task.model.Task;
..........

Document document = //createXMLDocument
Element payloadElem = document.createElementNS("http://xmlns.oracle.com/bpel/workflow/
  task", "payload");
Element orderElem = document.createElementNS("http://xmlns.oracle.com/pcbpel/test/order", "order");
Element child = document.createElementNS("http://xmlns.oracle.com/pcbpel/test/order", "id");
  child.appendChild(document.createTextNode("1234567"));
  orderElem.appendChild(child);
  payloadElem.appendChild(orderElem);
  document.appendChild(payloadElem);

  task.setPayloadAsElement(payloadElem);

注意:

AnyType.getContent()要素は、変更不可のXML要素リストを返します。このリストには他のメッセージ属性を追加できません。

16.6.5.3 プログラムによるタスクの開始

例16-5に、休暇申請タスクをプログラム的に開始する方法を示します。

例16-5 プログラムによる休暇申請タスクの開始

  // create task object
  ObjectFactory objectFactory = new ObjectFactory();
  Task task = objectFactory.createTask();

  // set title
  task.setTitle("Vacation request for jcooper");

  // set creator
  task.setCreator("jcooper");

  // set task definition URI
  task.setTaskDefinitionURI("http://localhost:9700/orabpel/default/VacationRequest/1.0/
    VacationApproval/VacationApproval.task");

  // create and set payload
  Document document = XMLUtil.createDocument();
  Element payloadElem = document.createElementNS(TASK_NS, "payload");
  Element vacationRequestElem = document.createElementNS(VACATION_REQUEST_NS,
    "VacationRequestProcessRequest");

  Element creatorChild = document.createElementNS(VACATION_REQUEST_NS, "creator");
  creatorChild.appendChild(document.createTextNode("jcooper"));
  vacationRequestElem.appendChild(creatorChild);

  Element fromDateChild = document.createElementNS(VACATION_REQUEST_NS, "fromDate");
  fromDateChild.appendChild(document.createTextNode("2006-08-05T12:00:00"));
  vacationRequestElem.appendChild(fromDateChild);

  Element toDateChild = document.createElementNS(VACATION_REQUEST_NS, "toDate");
  toDateChild.appendChild(document.createTextNode("2006-08-08T12:00:00"));
  vacationRequestElem.appendChild(toDateChild);

  Element reasonChild = document.createElementNS(VACATION_REQUEST_NS, "reason");
  reasonChild.appendChild(document.createTextNode("Hunting"));
  vacationRequestElem.appendChild(reasonChild);

  payloadElem.appendChild(vacationRequestElem);
  document.appendChild(payloadElem);

  task.setPayloadAsElement(payloadElem);

  IWorkflowServiceClient workflowServiceClient =
    WorkflowServiceClientFactory.getWorkflowServiceClient
    (WorkflowServiceClientFactory.SOAP_CLIENT);
  ITaskService taskService = workflowServiceClient.getTaskService();
  IInitiateTaskResponse iInitiateTaskResponse = taskService.initiateTask(task);
  Task retTask = iInitiateTaskResponse.getTask();
  System.out.println("Initiated: " + retTask.getSystemAttributes().getTaskNumber() + " - " +
    retTask.getSystemAttributes().getTaskId());
  return retTask;

詳細は、「休暇申請の例」を参照してください。

16.6.6 HelpDeskUIサンプルを使用したワークリスト・アプリケーションの記述

この項の例では、HelpDeskServiceRequestデモの一部であるヘルプ・デスク・インタフェースの変更方法を示します。このデモは次のディレクトリにあります。

SOA_Oracle_home¥bpel¥samples¥demos¥HelpDeskServiceRequest¥HelpDeskUI

ワークリスト・アプリケーションを記述する手順は、次のとおりです。

  1. ユーザー認証を行ってワークフロー・コンテキストを作成します。

    // get workflow service client
      IWorkflowServiceClient wfSvcClient =
        WorkflowServiceClientFactory.getWorkflowServiceClient
        (WorkflowServiceClientFactory.JAVA_CLIENT);
    
    //get the workflow context
    IWorkflowContext wfCtx =
    wfSvcClient.getTaskQueryService().authenticate(userId, pwd,
    oracle.tip.pc.services.identity.config.ISConfiguration.getDefaultRealmName(),
    null);
    
    

    これは、「ワークフロー・サービスのクライアントの作成」の手順3です。

    HelpDeskServiceRequestのlogin.jspファイルでは、前述のAPIを使用してユーザー認証が行われ、ワークフロー・コンテキストが作成されます。ユーザーが認証されると、statusPage.jspファイルによりログイン・ユーザーに割当て済のタスクが表示されます。例16-6に、login.jspファイルからのサンプル・コードを示します。

    例16-6 Login.jsp

    <%@ page import="javax.servlet.http.HttpSession"
             import="oracle.bpel.services.workflow.client.IWorkflowServiceClient"
             import="oracle.bpel.services.workflow.client.WorkflowServiceClientFactory"
             import="java.util.Set"
             import="java.util.Iterator"
             import="oracle.bpel.services.workflow.verification.IWorkflowContext"
             import="oracle.tip.pc.services.identity.config.ISConfiguration"%>
    <%@ page contentType="text/html;charset=windows-1252"%>
    
    <html>
    <head>
    <title>Help desk request login page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
    
    <body bgcolor="#F0F0F0" text="#000000" style="font: 12px verdana; line-height:18px">
    <center>
    <div style="width:640px;padding:15px;border-width: 10px; border-color: #87b4d9; border-style:
     solid;
    background-color:white; text-align:left">
    
        <!-- Page Header, Application banner, logo + user status -->
        <jsp:include page="banner.jsp"/>
    
        <!-- Initiate Meta Information -->
    
        <div style="background-color:#F0F0F0; border-top:10px solid white;border-bottom:
          10px solid white;padding:10px;text-align:center" >
        <b>Welcome to the HelpDesk application</b>
        </div>
    
        <%
         String redirectPrefix =  "/HelpDeskUI/";
          // Ask the browser not to cache the page
          response.setHeader("Pragma", "no-cache");
          response.setHeader("Cache-Control", "no-cache");
    
          HttpSession httpSession = request.getSession(false);
          if (httpSession != null) {
    
            IWorkflowContext ctx = (IWorkflowContext) httpSession.getAttribute("workflowContext");
            if (ctx != null) {
              response.sendRedirect(redirectPrefix + "statusPage.jsp");
            }
            else
            {
              String authFailedStr = request.getParameter("authFailed");
              boolean authFailed = false;
              if ("true".equals(authFailedStr))
              {
                authFailed = true;
              }
              else
              {
                authFailed = false;
              }
    
              if (!authFailed)
              {
                //Get page parameters:
                String userId="";
                if(request.getParameter("userId") != null)
                {
                  userId = request.getParameter("userId");
                }
                String pwd="";
                if(request.getParameter("pwd") != null)
                {
                  pwd = request.getParameter("pwd");
                }
    
                if(userId != null && (!("".equals(userId.trim())))
                   && pwd != null && (!("".equals(pwd.trim()))))
                {
                  try {
                    HttpSession userSession = request.getSession(true);
    
                    IWorkflowServiceClient wfSvcClient =
                            WorkflowServiceClientFactory.getWorkflowServiceClient
                                    (WorkflowServiceClientFactory.JAVA_CLIENT);
                    IWorkflowContext wfCtx =
                                wfSvcClient.getTaskQueryService().authenticate(userId, pwd,
                   oracle.tip.pc.services.identity.config.ISConfiguration.getDefaultRealmName(), null);
                    httpSession.setAttribute("workflowContext", wfCtx);
                    response.sendRedirect(redirectPrefix + "statusPage.jsp");
                  }
                  catch (Exception e)
                  {
                    String worklistServiceError = e.getMessage();
                    response.sendRedirect(redirectPrefix + "login.jsp?authFailed=true");
                    out.println("error is " + worklistServiceError);
                  }
                }
              } else
              {
                out.println("Authentication failed");
              }
            }
          }
        %>
    
        <form action='<%= request.getRequestURI() %>' method="post">
          <div style="width:100%">
          <table cellspacing="2" cellpadding="3" border="0" width="30%" align="center">
            <tr>
              <td>Username
              </td>
              <td>
                <input type="text" name="userId"/>
              </td>
            </tr>
            <tr>
              <td>Password
              </td>
              <td>
                <input type="password" name="pwd"/>
              </td>
            </tr>
            <tr>
              <td>
                <input type="submit" value="Submit"/>
              </td>
            </tr>
          </table>
        </form>
        </div>
    </div>
    </center>
      </body>
    </html>
    
    
  2. TaskQueryServiceからのqueryTask APIを使用してタスクを問い合せます。

    //add list of attributes to be queried from the task
    List displayColumns = new ArrayList();
         displayColumns.add("TASKNUMBER");
         displayColumns.add("TITLE");
         displayColumns.add("PRIORITY");
         displayColumns.add("STATE");
         displayColumns.add("UPDATEDDATE");
         displayColumns.add("UPDATEDBY");
         displayColumns.add("CREATOR");
         displayColumns.add("OUTCOME");
         displayColumns.add("CREATEDDATE");
         displayColumns.add("ASSIGNEEUSERS");
         displayColumns.add("ASSIGNEEGROUPS");
         // get the list of tasks
         List tasks =  wfSvcClient.getTaskQueryService().queryTasks
                            (wfCtx,
                            displayColumns,
                            null,
                            ITaskQueryService. ASSIGNMENT_FILTER_MY_AND_GROUP,
                            null,
                            null,
                            null,
                            0,
                            0);
        // create listing page by using above tasks
        //add href links to title to display details of the task by passing taskId
          as input parameter
       Use getTaskDetailsById(IWorkflowContext wftx, String taskId);
    
    

    これは、「ワークフロー・サービスのクライアントの作成」の手順4です。

    HelpDeskServiceRequestのstatusPage.jspファイルを使用して、ヘルプ・デスク・リクエストのステータスが表示されます。例16-7に、statusPage.jspのコード例を示します。

    例16-7 statusPage.jsp

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <%@ page import="oracle.tip.pc.services.identity.BPMAuthorizationService,
                     oracle.bpel.services.workflow.verification.IWorkflowContext,
                     oracle.tip.pc.services.common.ServiceFactory,
                     oracle.bpel.services.workflow.client.IWorkflowServiceClient,
                     oracle.bpel.services.workflow.client.WorkflowServiceClientFactory,
                     oracle.bpel.services.workflow.query.ITaskQueryService,
                     oracle.bpel.services.workflow.task.model.Task,
                     oracle.bpel.services.workflow.task.model.IdentityType,
                     oracle.tip.pc.services.identity.BPMUser,
                     java.util.List,
                     java.util.Calendar,
                     java.text.SimpleDateFormat,
                     java.util.ArrayList"%>
    <%@ page contentType="text/html;charset=UTF-8"%>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>RequestPage</title>
        <style TYPE="text/css">
          Body, Form, Table, Textarea, Select, Input, Option
          {
            
            font-size : 9pt;
          }
          table.banner
          {
            background-color: #eaeff5;
          }
          tr.userInfo
          {
            background-color: #eaeff5;
          }
          tr.problemInfo
          {
            background-color: #87b4d9;
          }
        </style>
      </head>
      <body bgcolor="White">
      <%
         HttpSession httpSession = request.getSession(false);
         httpSession.setAttribute("pageType","STATUSPAGE");
      %>
      <table bordercolor="#eaeff5" border="4" width="100%">
        <tr><td> <jsp:include page="banner.jsp"/> </td></tr>
      </table>
      <%
          BPMUser bpmUser = null;
          String redirectPrefix =  request.getContextPath() + "/";
          IWorkflowContext ctx = null;
          if (httpSession != null) {
    
            ctx = (IWorkflowContext) httpSession.getAttribute("workflowContext");
            if (ctx != null) {
                bpmUser = getAuthorizationService(ctx.getIdentityContext()).
                                 lookupUser(ctx.getUser());
            }
            else
            {
               response.sendRedirect(redirectPrefix + "login.jsp");
               return;
            }
          }
          else
          {
             response.sendRedirect(redirectPrefix + "login.jsp");
             return;
          }
          if(bpmUser == null)
          {
            response.sendRedirect(redirectPrefix + "login.jsp");
             return;
          }
          String status = (String)httpSession.getAttribute("requeststatus");
          if(status != null && !status.equals(""))
          {
        %>
           <p></p>
           <div style="text-align:left;color:red" >
             <%= status %>
           </div>
        <%
          }
          httpSession.setAttribute("requeststatus",null);
          IWorkflowServiceClient  wfSvcClient =
                            WorkflowServiceClientFactory.getWorkflowServiceClient(
                                     WorkflowServiceClientFactory.JAVA_CLIENT);
          List displayColumns = new ArrayList();
          displayColumns.add("TASKNUMBER");
          displayColumns.add("TITLE");
          displayColumns.add("PRIORITY");
          displayColumns.add("STATE");
          displayColumns.add("UPDATEDDATE");
          displayColumns.add("UPDATEDBY");
          displayColumns.add("CREATOR");
          displayColumns.add("OUTCOME");
          displayColumns.add("CREATEDDATE");
          displayColumns.add("ASSIGNEEUSERS");
          displayColumns.add("ASSIGNEEGROUPS");
          List tasks =  wfSvcClient.getTaskQueryService().queryTasks
                            (ctx,
                            displayColumns,
                            null,
                            ITaskQueryService.ASSIGNMENT_FILTER_CREATOR,
                            null,
                            null,
                            null,
                            0,
                            0);
      %>
      <p></p>
      <div style="text-align:left;color:green" >
       <b>
        Previous help desk request
       </b>
      </div>
      <p></p>
      <div style="text-align:center" >
      <table cellspacing="2" cellpadding="2" border="3" width="100%">
         <TR class="problemInfo">
             <TH>TaskNumber</TH>
             <TH>Title</TH>
             <TH>Priority</TH>
             <TH>CreatedDate</TH>
             <TH>Assignee(s)</TH>
             <TH>UpdatedDate</TH>
             <TH>UpdatedBy</TH>
             <TH>State</TH>
             <TH>Status</TH>
         </TR>
         <%
           SimpleDateFormat dflong = new SimpleDateFormat( "MM/dd/yy hh:mm a" );
           for(int i = 0 ; i < tasks.size() ; i ++)
           {
              Task task = (Task)tasks.get(i);
              int taskNumber = task.getSystemAttributes().getTaskNumber();
              String title = task.getTitle();
              int priority = task.getPriority();
              String assignee = getAssigneeString(task);
              Calendar createdDate = task.getSystemAttributes().getCreatedDate();
              Calendar updateDate =  task.getSystemAttributes().getUpdatedDate();
              String updatedBy = task.getSystemAttributes().getUpdatedBy().getId();
              String state = task.getSystemAttributes().getState();
              String outcome = task.getSystemAttributes().getOutcome();
              if(outcome == null) outcome = "";
              String titleLink = "http://" + request.getServerName() +
                                 ":" + request.getServerPort() +
                                  "/integration/worklistapp/TaskDetails?taskId=" +
                                  task.getSystemAttributes().getTaskId();
          %>
            <tr class="userInfo">
               <td><%=taskNumber%></td>
               <td><a href="<%=titleLink%>" target="_blank"><%=title%></a></td>
               <td><%=priority%></td>
               <td><%=dflong.format(createdDate.getTime())%></td>
               <td><%=assignee%></td>
               <td><%=dflong.format(updateDate.getTime())%></td>
               <td><%=updatedBy%></td>
               <td><%=state%></td>
               <td><%=outcome%></td>
            <tr>
         <%
           }
         %>
      </table>
      </div>
      <%!
          private BPMAuthorizationService getAuthorizationService(String identityContext)
          {
           BPMAuthorizationService authorizationService = ServiceFactory.getAuthorizationServiceInstance();
           if (identityContext != null)
             authorizationService = ServiceFactory.getAuthorizationServiceInstance(identityContext);
    
           return authorizationService;
          }
          private String getAssigneeString(Task task) throws Exception
          {
             List assignees = task.getSystemAttributes().getAssigneeUsers();
             StringBuffer buffer = null;
             for(int i = 0 ; i < assignees.size() ; i++)
             {
               IdentityType type = (IdentityType)assignees.get(i);
               String name = type.getId();
               if(buffer == null)
               {
                  buffer = new StringBuffer();
               }
               else
               {
                 buffer.append(",");
               }
               buffer.append(name).append("(U)");
             }
             assignees = task.getSystemAttributes().getAssigneeGroups();
             for(int i = 0 ; i < assignees.size() ; i++)
             {
               IdentityType type = (IdentityType)assignees.get(i);
               String name = type.getId();
               if(buffer == null)
               {
                  buffer = new StringBuffer();
               }
               else
               {
                 buffer.append(",");
               }
               buffer.append(name).append("(G)");
             }
             if(buffer == null)
             {
                return "";
             }
             else
             {
               return buffer.toString();
             }
          }
      %>
     </body>
    </html>
    

16.7 まとめ

この章では、サンプルのOracle BPEL Worklistアプリケーションを使用して、ユーザー・タスクにアクセスし、タスク詳細を表示し、タスクにアクションを実行する方法について説明しました。また、カスタム・ビューの作成と共有、ユーザー・ルールとグループ・ルールの管理、タスク表示設定のカスタマイズ、管理タスク(フレックス・フィールド・マッピングやアプリケーションのカスタマイズなど)の実行方法についても説明しました。ワークリスト・アプリケーションをカスタマイズする方法(様々な言語設定など)と、ワークフロー・サービスAPIを使用して独自のワークリスト・アプリケーションを作成する方法についても説明しました。