[BPM] Handling HumanTask attachments in Oracle BPM 11g PS4FP+ (I)

原文はこちら。
https://blogs.oracle.com/bpmtech/entry/handling_humantask_attachments_in_oracle

HumanTaskに添付を付ける機能はOracle HWF(Human Workflow)に10gのころから存在していますが、11gでは、たくさんの改善が施されていますので、このエントリではその内容をまとめたいと思います。
Oracle BPM 11g 11.1.1.5.1 (PS4 Feature Pack もしくは PS4FP) では次の2台機能が追加されました。
  • TaskスコープもしくはProcessスコープで添付ファイルを関連づけることが可能
    • "Task" の添付ファイルは、タスクのスコープ(ライフタイム)内でのみ閲覧可能です。つまり、冒頭にHuman Taskにアサインしたメンバーが添付ファイルを操作(追加、レビュー、削除)します。しかし、タスクが完了した後、その後のHumanTaskではそれらの添付にアクセスすることはできません。これは添付ファイルが無くなったことを意味しているのではありません。Human Taskが完了すると、添付ファイルを取り出して、Content Serverにチェックインしたり、新しいHuman Taskや別のHuman Taskに注入したりできます。

[注意] 再度開始したHuman Taskは、履歴と(必要に応じて)ペイロードと共にコメントや添付ファイルを継承します。詳細は以下のリンクを参照してください。

Oracle® Fusion Middleware Developer's Guide for Oracle SOA Suite 11g Release 1 (11.1.1.6.0)
28.17.4.6 Including the Task History of Other Human Tasks
http://docs.oracle.com/cd/E23943_01/dev.1111/e10224/bp_hwfmodel.htm#BABDCFEJ (英語)

    • "Process" の添付ファイルはプロセスのスコープ内で閲覧可能です。つまり同じプロセスにある後続のHuman Taskで添付ファイルにアクセスできます。
  • Oracle WebCenter Content (以前はOracle UCMとして知られていました)を、HWFデータベースの代わりに添付ファイルのバックエンドとして利用できるようになりました。この機能はあらゆるコンテンツサーバドキュメントライフサイクル機能をHuman Workflowの添付ファイル(バージョン管理、ロールベースアクセス制御、メタデータ管理など)に付加します。現時点では、Oracle WebCenter Contentのみがサポートされていますが、BPMスコープ内でのドキュメント管理に利用する場合に限り、  Oracle BPM SuiteにはOracle WebCenter Contentの制限付きライセンスを含んでいます。
ここで上記機能を利用するコード例をご紹介しましょう。

アップロードした添付ファイルを取り出す(WebCenter Contentを使わない場合)
Human Taskが完了してから、WebCenter Contentを使わない場合の添付ファイル(10gの時代からある標準的なもので、現状ではHWFデータベースに格納します)を取り出すことができます。まず、添付ファイルがHuman Taskにアップロードされていることを確認する必要がありますが、2種類の方法で確認できます。
  • XPath関数を使う方法

  • execData/attachment[]構造体を確認します。以下は例です。

1つ以上の添付ファイルがHuman Taskにアップロードされたことを確認したら、添付ファイルを取得しましょう。この例では、添付ファイル名とファイルのペイロードを取得しようとしています。

[注意] Oracle HWFは2種類の添付ファイル(デスクトップドキュメントとWeb URL)をアップロードできます。この例ではデスクトップドキュメントに特化しています。アップロードしたWeb URLを取り出す場合は、execData/attachment[]構造体から直接取得することができます。

添付コンテンツ(ペイロード)をgetTaskAttachmentContents() XPath関数で取得できます。

この例では、Human Taskにアップロードされたドキュメントの数だけ取得し、File Adapterを使ってサーバに書き出す方法をご紹介します。

サンプルプロセスの抜粋は以下の通りです。

"HumanTask1" Human Taskを使うダミーのUserTaskの後に、添付ファイルを取り出す組み込みサブプロセスが続きます(少なくとも一つの添付ファイルがアップロードされていると想定しています)。

添付ファイルを取り出した後、それぞれをFile Adapterサービスを使ってサーバにファイルを書き戻します。

詳細
  • 添付ファイル(の名前とペイロードの両方)を保持するXMLスキーマ構造体を定義しました。

  • この要素(attachmentCollection)に基づいてBusinessObjectを作成し、このBusinessObject型の変数(変数名はattachmentBPM)を作成することができます。
  • また、HumanTask出力のexecData構造体のコピーを保持する必要があります。したがって、TaskExecutionData型の変数を作成する必要があります。





  • HumanTaskの出力execDataを先ほど定義した変数にコピーします。






  • それでは、組み込みサブプロセスにて、添付ファイルのペイロードを取り出しましょう。まず、XSLT変換を使って各要素名を attachmentBPM 変数に渡し、ペイロードに空の値を設定しておきます。


  • XSLTの for-each ノードを使って必要なだけのターゲット構造体を作成していること、 payload 変数には Empty というテキストを設定していることに着目して下さい。このようなことをしている理由は、<payload></payload> タグを作成するためです。XML変数に後ほどペイロードをマッピングする際に必要なのです。

    [注意] ここではUCMドキュメント以外の添付ファイルを取り出すことを想定していますが、現実には取り扱っている添付ファイルの種類を確認したいという要件もあります。 execData/attachment[]/storageType にはUCMタイプの添付であれば "UCM" という値が入っています。 UCM以外であれば、"TASK"が、Web URLであれば "URL" が入っています。こうした値は列挙値 "Ext.Com.Oracle.Xmlns.Bpel.Workflow.Task.StorageTypeEnum" に含まれています。





  • 既に attachmentsBPM 構造体を渡し、添付ファイル各々の名前が含まれているので、次は反復処理してペイロードを取得する段階です。そこで attachmentsBPM/attachment[] 要素を繰り返し処理する MultiInstance タイプの新しい組み込みサブプロセスを使用することにします。


  • 繰り返し毎にScriptアクティビティを使って対応する payload 要素とXPath関数 getTaskAttachmentContents() の結果をマッピングします。ターゲットの配列要素が事前定義済み変数 loopCounter でどのようにインデックス付けされているかに着目し、配列の反復処理中に適切な要素に入力していることを確認する必要があります。

    使用しているXPath関数は以下のようです。
    hwf:getTaskAttachmentContents(bpmn:getDataObject('UserTask1LocalExecData')/ns1:systemAttributes/ns1:taskId,
    bpmn:getDataObject('attachmentsBPM')/ns:attachment[bpmn:getActivityInstanceAttribute('SUBPROCESS3067107484296','loopCounter')]/ns:fileName)

    ここで、入力パラメータは以下の通りです。
    taskId :いま完了したHumanTaskのTaskID
    添付ファイル名 :配列のインデックス (loopCounter 事前定義済み変数) からペイロードを取り出す

    [注意] execData/attachment[]構造体を組み込みサブプロセスで反復処理、つまりXSLTとfor-eachノードを使わない理由は、getTaskAttachmentContents()XPath関数が、現在XSLTマッピングでは使用できないためです。そのため、将来のリリースで修正/強化されるまで、すべてこの例では、回避策として考慮する必要があります。





  • この組み込みサブプロセスが終了すると、 attachmentsBPM 変数の全ての添付ファイル(名前とペイロード)を取得します。これがこのサンプルのゴールの一つですが、全てが正常に動作することをテストするため、このサンプルで全ての添付ファイルをファイルに書き出します。そのために、最後の組み込みサブプロセスで attachmentsBPM/attachment[] の各要素を同時に反復処理するようにしています。







  • 反復処理の中で、サービスアクティビティを使い、File Adapterのwriteサービスを呼び出しています。ここで、2個の重要なパラメータを設定しています。一つはペイロードそのものです。File Adapterはバイナリデータをbase64フォーマット(文字列)で期待しています。単純にマッピングすると、Stringがbase64バイナリの有効なターゲットとして認識されないため、XPath関数を使ってマッピングする必要があります。


  • 2個目は、ターゲットの filename をService Propertiesダイアログボックスで指定します。

    再度、組み込みサブプロセスの反復処理にて、インデックス変数 loopCounter を使って適切な要素を取得していることに着目して下さい。
    UCMの添付ファイル処理は別のエントリで取り上げます。エントリをUpした後に、サンプルプロジェクトをjava.netにUpする予定にしています。

    Oracle BPM 11gサンプルコード
    http://java.net/projects/oraclesoasuite11g/pages/BPM

    0 件のコメント:

    コメントを投稿