BPELでのデータ操作の起点はassignアクティビティです。assignアクティビティはXPath標準に基づいています。図7-10に示すように、assignアクティビティは、XML変数間でデータをコピーしたり、式の値を計算して変数に格納する際に使用します。
アクティビティでのコピー要素は、割当てのソースおよびターゲット(コピー元とコピー先)を指定します。ソースとターゲットには互換性のあるタイプを指定する必要があります。
XPath問合せ、式および関数を使用して、次のようにデータを操作できます。
XPath問合せ: XPath問合せは、ソースまたはターゲットの変数パートでフィールドを選択します。fromまたはto句には、値がXPath問合せ文字列である問合せ属性を指定できます。 次に例を示します。
<from variable="input" part="payload"
query="/p:CreditFlowRequest/p:ssn">
XPathバージョン1.0では、厳密に単一のノードを選択できるように、問合せ属性の値には絶対パスを指定する必要があります。
XPath式: XPath式(from句のexpression属性に指定)を使用して、変数に格納する値を示します。 次に例を示します。
<from expression="100"/>
式には一般的な式(つまり、任意のXPath値のタイプに評価されるXPath式)を指定できます。
XPath式内では、次のタイプの関数をコールできます。
XPathコア関数
BPEL拡張関数(bpws:)
BPEL XPath拡張関数(ora:)
カスタム関数
これらの関数の詳細は、『Oracle BPEL Process Manager開発者ガイド』を参照してください。
BPELのassignアクティビティやXPathコア関数では、複雑なデータ操作の実行が困難な可能性があります。ただし、XSLTやJavaを使用して、あるいはWebサービスとして、複雑なデータ操作やトランスフォーメーションを実行できます。XSLTの場合、Oracle BPEL Process Managerには、これらのトランスフォーメーションを実行するXPath関数が組み込まれています。トランスフォーメーションについては、次の項およびマニュアルを参照してください。
図7-10に示すように、assignアクティビティでコピー操作を使用して、どのデータをどの変数にコピーするかを指定します。SOA Order Bookingアプリケーションでは、BPELプロセスが「InitializeRequest」assignアクティビティ(「CreditService」スコープ内)を使用して、creditcardtype変数の値をccType変数にコピーし、creditcardnumber変数の値をccNum変数の値にコピーします。変数名ccTypeとccNumは、「CreditValidatingService」パートナ・リンクのWSDLに指定されます。
assignアクティビティを使用して変数をコピーする手順は、次のとおりです。
「Assign」アクティビティを「Scope」アクティビティ内部にドラッグ・アンド・ドロップします。
「Assign」アイコンをダブルクリックします。
「Assign」ダイアログの「一般」タブを使用して、「Assign」アクティビティの名前を入力します。
「適用」をクリックします。
「コピー操作」タブをクリックします。
「作成」リストから「コピー操作」を選択します。
図7-8に示すように、「コピー操作の作成」ダイアログを使用して、特定の変数の内容を別の変数にコピーします。この「Assign」アクティビティは、クライアントの発注を入力として取得し、価格の見積りについてRapid Manufacturer Webサービスに連絡します。
「From」側の「変数」で、クライアントの入力変数名(BPELプロセスWSDLファイルに定義されている)が見つかるまでツリーを開きます。
「To」側の「変数」で、Webサービスが使用する入力変数名(WebサービスWSDLのメッセージ・タイプ定義に定義されている)が見つかるまでツリーを開きます。
「コピー操作の作成」ウィンドウと「Assign」ウィンドウを閉じます。
ファイルを保存します。
例7-4に、SOA Order Bookingアプリケーションの「InitializeRequest」assignアクティビティのソース・コードを示します。
例7-4 「InitializeRequest」assignアクティビティのソース・コード
<scope name="CreditService">
<variables>
<variable name="validateRequest"
messageType="ns6:CreditCardValidationRequestMessage"/>
<variable name="validateResponse"
messageType="ns6:CreditCardValidationResponseMessage"/>
</variables>
<sequence name="Sequence_5">
<assign name="InitializeRequest">
<copy>
<from variable="customerServiceResponse"
query="/ns3:findCustomerByIdResponse/ns3:return/ns3:creditcardtype"
part="parameters"/>
<to variable="validateRequest" part="CreditCard"
query="/ns21:CreditCard/ccType"/>
</copy>
<copy>
<from variable="customerServiceResponse"
query="/ns3:findCustomerByIdResponse/ns3:return/ns3:creditcardnumber"
part="parameters"/>
<to variable="validateRequest" part="CreditCard"
query="/ns21:CreditCard/ccNum"/>
</copy>
</assign