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サービスをコールしても、その手順はいつも同じです。
9.3 BPELプロセスからのImagingメタデータの更新
前述のとおり、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>