この章の内容は、次のとおりです。
ワークフローの統合ポイント、接続の構成、セキュリティおよびフォルトのレポートの追加情報は、『Oracle WebCenter Content: Imagingの管理』のワークフローとの統合に関する項を参照してください。
ImagingとBPEL間の考えられる統合ポイントの1つは、Imagingに格納されているドキュメントのメタデータを使用して新しいプロセス・インスタンスを作成するための、ワークフロー・エージェントからBPELへのサービス・コールです。逆にBPELプロセスがImagingにWebサービス・コールを行うことも可能です。こうしたコールにより、最新のドキュメント・メタデータや追加メタデータを取得したり、ドキュメント・メタデータを更新してプロセス・インスタンスの実行中に行われた変更を同期化できます。
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>