プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebCenter Content: Imagingの開発
11gリリース1 (11.1.1)
B72422-04
  ドキュメント・ライブラリへ移動
ライブラリ
目次へ移動
目次

前
 
次
 

9 ImagingとBPELの統合

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

9.1 ImagingとBPELの統合について

ワークフローの統合ポイント、接続の構成、セキュリティおよびフォルトのレポートの詳細は、『Oracle WebCenter Content: Imagingの管理』を参照してください。

9.2 BPELプロセスからのImaging Webサービスの起動

ImagingとBPEL間の考えられる統合ポイントの1つは、Imagingに格納されているドキュメントのメタデータを使用して新しいプロセス・インスタンスを作成するための、ワークフロー・エージェントからBPELへのサービス・コールです。逆にBPELプロセスがImagingにWebサービス・コールを行うことも可能です。こうしたコールにより、最新のドキュメント・メタデータや追加メタデータを取得したり、ドキュメント・メタデータを更新してプロセス・インスタンスの実行中に行われた変更を同期化できます。

BPELからどのImaging Webサービスをコールしても、その手順はいつも同じです。

  1. 設計のコンポジット・ダイアグラムで、「コンポーネント・パレット」から「Webサービス」サービス・アダプタを選択し、「外部参照」スイムレーンにドラッグします。

  2. サービスの名前とWSDL URLを入力します。Imaging WebサービスWSDLSは次の形式を取ります。

    http://<host>:<port>/imaging/ws/<service>?wsdl

    ここで、<service>は、可能性のあるImaging Webサービス・エンド・ポイントの1つ(ApplicationService、DocumentServiceなど)です。

  3. コンポジット・ダイアグラムで、BPELプロセスを、新しく作成した外部参照にリンクします。

  4. BPELプロセス・ダイアグラムを開きます。このダイアグラムの「パートナ・リンク」スイムレーンに、コンポジットに追加された外部参照が表示されます。

  5. このダイアグラムにInvokeアクティビティを追加し、Webサービス・パートナ・リンクにリンクします。

  6. 「起動」ダイアログで、目的の操作を選択し、「入力」および「出力」変数の横にある+ボタンをクリックして、Invokeアクティビティをリンクします。

  7. 「OK」をクリックします。ダイアログ・ボックスが閉じられます。

  8. BPELプロセス・ダイアグラムのInvokeアクティビティの前にTransformアクティビティを追加します。

  9. Transformアクティビティのプロパティで、プロセスから適切なソース変数を選択し、ターゲット変数として、ステップ5で作成したInvokeアクティビティの入力変数を選択します。

  10. 「マッパー・ファイル」の横にある+をクリックして、プロセス・データをWebサービスの入力ペイロードへトランスフォーメーション・マッピングする方法を定義します。

  11. Imaging Webサービスの起動から出力が返されることを想定している場合は、Invokeの後にTransformまたはAssignアクティビティを使用して、Invoke出力変数からプロセス変数にデータを転送します。

9.3 BPELプロセスからのImaging Webサービスの更新

前述のとおり、BPELインスタンス変数からImaging Webサービス入力変数への変換定義は、関連する具体的なスキーマに左右される複合的なトピックです。しかし、ドキュメント・メタデータの更新はBPELからImagingへの相互作用で一般的によく見られるケースであるため、例9-1に、ドキュメント・フィールドの値の変更に使用されるDocumentService.updateDocument操作で変換がどのように定義されるか、その一例を示します。

例9-1 DocumentService.updateDocumentの起動例

この例では、注文書ドキュメントがImagingに索引付けされ、承認プロセスにBPELプロセス・インスタンスが作成されます。承認プロセスの実行中、このインスタンスは承認または拒否されます。プロセスの最後に、承認ステータスと、このステータスを設定したユーザーの名前を使って、Imagingを更新する必要があります。この例で想定している構成は次のとおりです。

「アプリケーション定義」には次のフィールドが含まれます。

  • PurchaseOrder: id=1, type string

  • ApprovedBy: id=2, type string

  • ApprovedStatus: id=3, type string

BPELプロセス変数は、次のように定義されます。

<element name="process">
  <complexType>
    <sequence>
      <element name="docId" type="string"/>
      <element name="docURL" type="string"/>
      <element name="poNumber" type="string"/>
      <element name="approvedBy" type="string"/>
      <element name="approvedStatus" type="string"/>
    </sequence>
  </complexType>
</element>

外部パートナ・リンクは、ドキュメント・サービスWSDLを使用して、次のように定義されます。

http://host:port/imaging/ws/DocumentService?wsdl.

updateDocument操作のペイロード・タイプは次のように定義されます。

<xs:complexType name="updateDocument">
  <xs:sequence>
    <xs:element name="documentId" type="xs:string" minOccurs="0"/>
    <xs:element name="uploadToken" type="xs:string" minOccurs="0"/>
    <xs:element name="fieldValues" type="tns:FieldValue" 
          minOccurs="0" maxOccurs="unbounded"/>
    <xs:element name="updateAnnotations" type="xs:boolean"/>
  </xs:sequence>
</xs:complexType>

ドキュメント・フィールドの値を変更するために、重要な要素はドキュメント化された要素とfieldValues要素です。FieldValueの型および型参照は次のように定義されます。

<xs:complexType name="FieldValue">
  <xs:complexContent>
    <xs:extension base="tns:baseId">
      <xs:sequence>
        <xs:element name="value" type="tns:TypedValue" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="id" type="xs:long" use="required"/>
    </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="TypedValue">
  <xs:simpleContent>
  <xs:extension base="xs:string">
    <xs:attribute name="type" type="tns:FieldType"/>
  </xs:extension>
  </xs:simpleContent>
</xs:complexType>
<xs:simpleType name="FieldType">
   <xs:restriction base="xs:string">
     <xs:enumeration value="TEXT"/>
     <xs:enumeration value="NUMBER"/>
     <xs:enumeration value="DECIMAL"/>
     <xs:enumeration value="DATE"/>
   </xs:restriction>
 </xs:simpleType>

FieldValueのXSDは一見、複雑ですが、次のFieldValueのXMLインスタンス例を見ると、実は非常にシンプルであることがわかります。

<fieldValues name=”ApprovedStatus”, id=”3”>
   <value type=”TEXT”>
        APPROVED
   </value>
</fieldValues>

fieldValuesノードのnameとid属性は、変更されるドキュメント・フィールド値の名前とIDです。実際は、フィールドを識別するには、どちらか1つを指定すれば十分です。value要素はドキュメント・フィールドの新しい値を提供し、type属性(TEXT、NUMBER、DECIMAL、またはDATE)は提供されるデータのImagingタイプを示します。

updateDocumentタイプXSDは、fieldValuesがバインドされていないmaxOccurs属性を持つことを示します。実際、このサービスは、変更されているドキュメント・フィールド値1つにつき、要素のインスタンスは1つであると想定しています。変更中ではないフィールド値を提供する必要はありません。

最後に、BPELプロセスでのXSL変換は、updateDocumentでBPELインスタンス変数からdocumentIdへdocId要素を割当て、BPELプロセス変数のApprovedByおよびApprovedStatusの値を2つのFieldValue要素に変換する必要があります。この変換は、次のように定義されます。

<xsl:template match="/">
  <tns:updateDocument>
    <documentId>
      <xsl:value-of select="/client:process/client:docId"/>
    </documentId>
    <xsl:for-each select="/client:process/client:approvedBy">
      <fieldValues>
        <xsl:attribute name="name">
          <xsl:text>ApprovedBy</xsl:text>
        </xsl:attribute>
        <value>
          <xsl:attribute name="type">
            <xsl:text>TEXT</xsl:text>
          </xsl:attribute>
          <xsl:value-of select="/client:process/client:approvedStatus"/>
        </value>
      </fieldValues>
    </xsl:for-each>
    <xsl:for-each select="/client:process/client:approvedStatus">
      <fieldValues>
        <xsl:attribute name="name">
          <xsl:text>ApprovedBy</xsl:text>
        </xsl:attribute>
        <value>
          <xsl:attribute name="type">
            <xsl:text>TEXT</xsl:text>
          </xsl:attribute>
          <xsl:value-of select="/client:process/client:approvedStatus"/>
        </value>
      </fieldValues>
    </xsl:for-each>
  </tns:updateDocument>
</xsl:template>