この章では、BPELプロセス・サービス・コンポーネントでのXMLデータの操作方法について説明します。 この章では様々な例を提供します。変数、シーケンスおよび配列の使用方法とXPath式の使用方法、数学的計算などのタスクの実行方法に関するトピックが含まれています。サポートされる仕様についても説明しています。
項目は次のとおりです。
注意: この章の大部分の例では、関連するメッセージ・タイプを定義するWSDLファイルは、RPC形式ではなくドキュメント・リテラル形式であると想定しています。RPC形式のWSDL定義の場合、XPath問合せ文字列の構成方法に違いがあります。RPCのWSDLファイルで定義されたタイプを使用する場合は、第6.21項「ドキュメント形式とRPC形式のWSDLの違いの理解」を参照してください。 |
Oracle BPEL Process Managerのサンプルについては、次のURLにアクセスしてください。
https://soasamples.samplecode.oracle.com
この項では、BPELプロセスでのXMLデータの使用について概要を説明します。
BPELプロセス・サービス・コンポーネントでは、ほとんどのデータはXMLフォーマットです。データには、BPELプロセス・サービス・コンポーネントとの間で受け渡されるメッセージ、外部サービスとの間で交換されるメッセージ、プロセスで使用されるローカル変数などがあります。通常は次のいずれかのXMLスキーマを使用して、これらのメッセージおよび変数のタイプを定義します。
フローのWeb Services Description Language (WSDL)ファイル
起動されるサービスのWSDLファイル
そのWSDLファイルで参照されるXSDファイル
したがって、BPELのほとんどの変数はXMLデータであり、BPELプロセス・サービス・コンポーネントはそのコードの大部分を使用して、これらのXML変数を操作します。通常は、様々なサービスに必要な表現間でのデータ・トランスフォーメーション、データのローカル操作(複数のサービス呼出しからの結果の結合など)などが行われます。
BPELでは、サービス・データ・オブジェクト(SDO)変数もサポートしています。この変数は、XML形式ではなく、メモリー構造形式です。
BPELのデータ操作は、XPath標準に基づくassignアクティビティが開始点になります。このタイプの操作では多くの場合、XPath問合せ、式および関数が使用されます。
通常は、より複雑なデータ・トランスフォーメーションまたは操作を行うためのXQuery、XSLTまたはJavaを使用する高度な方法も使用できます。
この項では、BPELでXMLデータを操作する方法の概要を説明します。様々な組合せで使用される主要なビルディング・ブロックの概要を示し、例を挙げて説明します。後続の各項では、これらのビルディング・ブロックを適用して特定のタスクを実行する方法について説明します。
XML変数間でデータをコピーする場合、または式の値を計算して変数に格納するには、assignアクティビティを使用します。アクティビティ内のcopy要素は、互換性のあるタイプの割当てのソースとターゲット(コピー先とコピー元の内容)を指定します。
例6-1に、「Business Process Execution Language for Web Services Specification」に記載されているBPELバージョン1.1の正式な構文を示します。
例6-1 BPEL 1.1のassignアクティビティ
<assign standard-attributes> standard-elements <copy> from-spec to-spec </copy> </assign>
例6-2に、「Web Services Business Process Execution Language Specification Version 2.0」に記載されているBPELバージョン2.0の正式な構文を示します。keepSrcElementName
属性は、コピー操作中に(to-spec
の選択に従って)宛先の要素名が、(from-spec
の選択に従って)ソースの要素名で置換されるかどうかを指定します。keepSrcElementName
をno
(デフォルト値)に設定すると、元の宛先要素の名前(つまり、ネームスペース名とローカル名のプロパティ)が、作成される要素の名前として使用されます。keepSrcElementName
をyes
に設定すると、ソース要素名が、作成される宛先要素の名前として使用されます。
<assign validate="yes|no"? standard-attributes> standard-elements ( <copy keepSrcElementName="yes|no"? ignoreMissingFromData="yes|no"?> from-spec to-spec </copy> . . . . . . </assign>
この構文は、両方の仕様で詳細に説明されています。通常、from-spec
およびto-spec
には、例6-3に示すように、変数または変数パートを指定します。
例6-3 from-spec属性とto-spec属性
<assign> <copy> <from variable="c1" part="address"/> <to variable="c3"/> </copy> </assign>
Oracle JDeveloperを使用する場合は、「From」セクションと「To」セクションを備えた「コピー・ルール」ダイアログでassignアクティビティの詳細を指定します。これにより、前述のBPELソース・コードの構文が反映されます。
XPath標準は、assignアクティビティで主要な役割を果たします。概要として簡単な例を示します。その他のコンテキストでの例と説明は、後続の各項で示します。
XPath問合せ
XPath問合せは、ソースまたはターゲットの変数パート内のフィールドを選択します。from
句またはto
句には、値がXPath問合せ文字列であるquery属性を含めることができます。例6-4に例を示します。
query属性の値には、ノードを1つのみ選択するロケーション・パスを指定する必要があります。query
属性およびXPath標準の構文の詳細は、それぞれ「Business Process Execution Language for Web Services Specification」 (第14.3項)、「Web Services Business Process Execution Language Specification Version 2.0」 (第8.4項)および「XML Path Language (XPath) Specification」を参照してください。
XPath式
XPath式(from
句のexpression
属性で指定)を使用して、変数に格納する値を指定します。次に例を示します。
<from expression="100"/>
式には一般的な式(つまり、任意のXPath値のタイプに評価されるXPath式)を指定できます。同様に、式属性の値がコピー操作内のfrom
句で使用される場合、式属性の値は必ず1つのノードまたは1つのオブジェクトのみを返す必要があります。XPath式の詳細は、「XML Path Language (XPath) Specification」の第9.1.4項を参照してください。
XPath式内では、次の種類の関数をコールできます。
コアXPath関数
XPathでは、文字列操作関数(concat
など)や数値関数(sum
など)を含む多数の組込み関数がサポートされています。
<from expression="concat('string one', 'string two')"/>
XPath標準に組み込まれた関数の完全なリストは、「XML Path Language (XPath) Specification」の第4項を参照してください。
BPEL XPath拡張関数
BPELはいくつかの拡張関数をコアXPath関数に追加し、これによりXPath式がプロセスからの情報にアクセスできます。
BPEL 1.1の場合、拡張関数は標準BPELネームスペースhttp://schemas.xmlsoap.org/ws/2003/03/business-process/
で定義され、接頭辞bpws
:によって指定されます。
<from expression= "bpws:getVariableData('input', 'payload', '/p:value') + 1"/>
詳細は、「Business Process Execution Language for Web Services Specification」の第9.1項および第14.1項を参照してください。getVariableData
の詳細は、B.2.60.2項「getVariableData」を参照してください。
BPEL 2.0の場合も、拡張関数は標準BPELネームスペースhttp://schemas.xmlsoap.org/ws/2003/03/business-process/
で定義されます。ただし、接頭辞はbpel
:になります。
<from>bpel:getVariableProperty('input', 'propertyName')</from>
詳細は、「Web Services Business Process Execution Language Specification Version 2.0」の第8.3項を参照してください。getVariableProperty
の詳細は、B.2.60.4項「getVariableProperty (For BPEL 2.0)」を参照してください。
Oracle BPEL XPath拡張関数
Oracleには、新しい関数を追加するためにBPELおよびXPath標準に組み込まれた機能を使用する、その他のXPath関数が用意されています。
これらの関数は、ネームスペースhttp://schemas.oracle.com/xpath/extension
で定義され、接頭辞ora:
によって指定されます。
カスタム関数
Oracle BPEL Process Managerの関数は、bpel-xpath-functions-config.xml
に定義され、orabpel.jar
ファイルに格納されます。詳細は、B.7項「ユーザー定義XPath拡張関数の作成」および『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』を参照してください。
高度なデータ操作をBPELのassignアクティビティやコアXPath関数で実行するのは困難な場合があります。しかし、複雑なデータ操作やデータ・トランスフォーメーションは、XSLT、Java、またはassignアクティビティのbpelx
操作(第6.14項「bpelx拡張要素を使用したXMLデータの操作」を参照)を使用したり、Webサービスとして実行することができます。XSLTのトランスフォーメーションについては、これらを実行するXPath関数がOracle BPEL Process Managerに用意されています。
XPathおよびXQueryトランスフォメーション・コードの例の詳細は、第37章「XSLTマッパーを使用したトランスフォーメーションの作成」を参照してください。
注意: assignアクティビティ経由で大きいスキーマが渡されると、assignの編集ダイアログのターゲットまたはソース・ペイロード・ノードを右クリックして「すべての子ノードを開く」を選択した場合に、Oracle JDeveloperが停止したり、メモリー不足になる可能性があります。回避策として、ペイロード要素は手動で開いてください。 |
エンティティ変数を使用して、基礎となるデータ・プロバイダ・サービスがBPELデータ操作を実行するように指定できます。データ・プロバイダ・サービスはデータ・ストア内でデータ操作をバックグラウンドで実行しますが、Oracle SOA Suiteが提供する他のデータ・ストア関連の機能(たとえば、データベース・アダプタ)を使用しません。これにより、Oracle SOA Suiteの実行時パフォーマンスが向上し、コンパイルおよび実行時に、基礎となるデータ・プロバイダ・サービスのネイティブ機能が組み込まれます。
エンティティ変数は、SDOベースのデータを使用してOracle Application Development Framework(ADF)Business Componentデータ・プロバイダ・サービスと一緒に使用できます。
11g,以前のリリースでは、BPELビジネス・プロセス内で交換された変数およびメッセージは、XML構造に組み込まれる分離されたペイロード(Webサービスから返されるデータのスナップショット)でした。ある場合では、ユーザーにはこの構成要素タイプが必要でした。別の場合では、この構成要素は難題でした。
エンティティ変数は、次のような以前のリリースの難題に対応しています。
拡張データ変換
基礎となるデータがXML形式でない場合は、データ変換(デリミタ付きテキストからXMLへの変換など)が必要でした。基礎となるデータのサイズが大きい場合、処理はパフォーマンスに影響を与える場合がありました。
失効したスナップショット・データ
(WSDLメッセージを含めて)BPEL内の変数は分離されたペイロードでした。これが必要な場合もありました。別の場合では、Oracle BPEL Process Managerの外部にある他のアプリケーションによって変数が最新データに変更されて表示されることが必要でした。つまり、分離されたデータ・モデルでは、すべてのニーズを満たさない失効したデータ・セットが提供されていました。また、スナップショットによってデータが重複するため、データ・サイズが大きい場合はパフォーマンスに影響を与えていました。
ネイティブ・データ動作の損失
一部のデータ変換の実装には、XMLスキーマの範囲外のデータ構造の適用またはビジネス・データ・ロジックが必要でした。たとえば、開始日は終了日より前である必要があります。変数が分離されたペイロードの場合は、関連するWebサービスの起動中にのみ検証が実行されました。特定の操作後(ただしWebサービスの起動前)に、特別なビジネス・データ・ロジックを必要に応じて実行することが推奨される場合がありました。
リリース11g,でこれらの難題に対応するには、変数宣言時にエンティティ変数を作成します。エンティティ変数は、バックグラウンドで様々なデータ・プロバイダ・サービス・テクノロジにアクセスし、プラグインするためのデータ・ハンドルとして機能します。コンパイルおよび実行時に、Oracle BPEL Process Managerは基礎となるデータ・プロバイダ・サービスにデータ操作を委任します。
表6-1では、以前のリリース(例としてデータベース・アダプタを使用)と、エンティティ変数を使用するリリース11gで、データ変換がどのように実行されるかを説明します。
表6-1 以前および現在のリリースでのデータ操作機能
10.1.xリリース | エンティティ変数を使用する場合の11g リリース |
---|---|
データを明示的にロードして保存するようなデータ操作は、Oracle BPEL Process Managerのデータベース・アダプタにより実行されていました。すべてのデータ(たとえば、注文書)はデータベースのデハイドレーション・ストアに保存されていました。 |
データをロードして保存するようなデータ操作は、データ・プロバイダ・サービス(Oracle ADF Business Componentアプリケーション)により自動的に実行され、サービスを起動するコードを記述する必要はありません。 Oracle BPEL Process Managerは、注文書データを指し示すキー(たとえば、注文書ID(POID))を格納します。Oracle BPEL Process Managerは、データへのアクセスがリクエストされたときにこのキーをフェッチします(bind entityアクティビティが実行します)。キーを使用してデータをバインドするように明示的にリクエストする必要があります。データ・プロバイダ・サービスは、すべてのデータ変更をデハイドレーション・ストア・データベースとは異なるデータベースに格納します。これによりデータは重複しません。 |
変数内のデータはドキュメント・オブジェクト・モデル(DOM)形式でした。 |
変数内のデータはSDO形式であり、DOMより簡単に変換処理できます。特に、データ・プロバイダ・サービスがSDO形式に対応している場合は簡単です。 |
注意: 現在は、BPELプロセス・サービス・コンポーネントのみがSDO形式の変数を使用できます。コンポジット・アプリケーションに、SDOベースのJavaバインディング・コンポーネント参照と接続されたOracle Mediatorサービス・コンポーネントがある場合、変数のデータ形式のデフォルトはDOMとなります。さらに、表6-1で説明したリリース10.1.xの機能は、リリース11gでもサポートされています。 |
WebLogic Fusion Order Demoアプリケーションには、エンティティ変数の使用例が記載されています。
この項では、Oracle JDeveloperでエンティティ変数とバインディング・キーを作成する方法について説明します。
Oracle BPEL Process Managerの10.1.xリリースでは、すべての変数データはDOM形式でした。リリース11gでは、SDO形式の変数データもサポートされています。BPELプロセス・サービス・コンポーネントのDOMおよびSDO変数は、暗黙的に必要な形式に変換されます。たとえば、DOMベースの変数を使用するOracle BPELサービス・コンポーネントは、これらの変数を必要に応じてassignアクティビティでSDOベースの変数に自動的に変換し、逆の場合も同様に変換します。いずれのタイプの形式もXSDスキーマ・ファイルで定義されています。ユーザー操作は不要です。
エンティティ変数は、SDO形式のデータもサポートしています。ただし、DOM変数やSDO変数とは異なり、SDOベースのデータを持つエンティティ変数を使用すると、データ(たとえば、注文書)に一意のキー値をバインドできます。そのキーのみが、デハイドレーション・ストアに格納されます。変換が必要なデータは、Oracle ADF Business Componentアプリケーションのサービスと一緒に格納されます。キーはサービス内に格納されるデータを指し示します。データが必要な場合はデータ・プロバイダ・サービスからフェッチされ、メモリーに配置されます。プロセスは、bind entityアクティビティとデハイドレーション・ストアの2つの場所で発生します。たとえば、Oracle BPEL Process Managerがリハイドレートする場合は、エンティティ変数のキーのみが格納され、ウェイクアップ時には、暗黙的なバインドが行われて現在のデータが取得されます。
SDOバインディング・コンポーネント・サービスは、図6-1に示すように、コンポジット・アプリケーションへのエントリ・ポイントを外部に提供します。
SOAコンポジット・エディタおよびOracle BPELデザイナを使用して次のタスクを実行します。
SDOバインディング・コンポーネント・サービスとBPELプロセス・サービス・コンポーネントをコンポジット・アプリケーションに定義します。
SDOサービスとBPELプロセス・サービス・コンポーネントを接続(ワイヤ)します。
BPELプロセス・サービス・コンポーネントの詳細を定義します。
SOAコンポジット・エディタの使用方法の詳細は、第2章「Oracle SOA Suiteを使用したSOAコンポジット・アプリケーションの開発」を参照してください。
図6-2に示すように、SDOバインディング・コンポーネント参照を使用すると、コンポジット・アプリケーションからOracle ADF Business Componentアプリケーションの外部のパートナにメッセージを送信できます。
Oracle ADF Business Componentアプリケーションが外部へのパートナ・リンクの場合、SOAコンポジット・エディタには、アウトバウンド通信を作成するためにコンポジット・アプリケーションにドラッグするSDOバインディング・コンポーネント参照はありません。かわりに、コンポジット・アプリケーションおよびOracle ADF Business Componentアプリケーションの間に次の通信が発生します。
Oracle ADF Business Componentアプリケーションはデプロイされ、自動的にサービス・インフラストラクチャのSDOサービスとして登録されます。
Oracle JDeveloperを使用してADF-BCサービスとしてこのアプリケーションを参照および検索し、パートナ・リンク接続を作成します。
Oracle ADF Business Componentアプリケーション・サービスが検出された場合、composite.xml
ファイルは、参照の詳細(binding.adf
プロパティ)で自動的に更新されます。
ここでは、Oracle ADF Business Componentアプリケーションのために、エンティティ変数を作成し、パートナ・リンクを選択します。次の例は、WebLogic Fusion Order Demoアプリケーションで、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すために、bind entityアクティビティを使用して、OrderProcessor BPELプロセス・サービス・コンポーネントが注文IDを受け取る方法を示しています。
エンティテイ変数を作成し、パートナ・リンクを選択する手順は、次のとおりです。
Oracle JDeveloperで、BPELプロセス・サービス・コンポーネントの「構造」ウィンドウに移動します。
「変数」フォルダを右クリックし、「すべての子ノードを開く」を選択します。
2番目の「変数」フォルダで、右クリックして「変数の作成」を選択します。
「変数の作成」ダイアログが表示されます。
「名前」フィールドに、名前を入力します。
「エンティティ変数」チェック・ボックスを選択し、「パートナ・リンク」フィールドの右側の「検索」アイコンを選択します。
「パートナ・リンク・チューザ」ダイアログに、使用可能なサービス(「ADF-BCサービス」というSDOサービスを含む)のリストが表示されます。
Oracle ADF Business Componentアプリケーションのためのサービスを参照し、選択します。
「OK」をクリックし、「パートナ・リンク・チューザ」ダイアログと「変数の作成」ダイアログを閉じます。
ダイアログは図6-3のようになります。
ここでは、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すキーを作成します。
バインディング・キーを作成する手順は、次のとおりです。
BPEL 1.1プロジェクトの「コンポーネント・パレット」で、「Oracle Extensions」を展開します。
bind entityアクティビティを、BPELプロセス・サービス・コンポーネントにドラッグします。
「Bind Entity」ダイアログが表示されます。
「名前」フィールドに、名前を入力します。
「エンティティ変数」フィールドの右側の「検索」アイコンをクリックします。
「変数チューザ」ダイアログが表示されます。
第6.2.1.3項「エンティティ変数の作成とパートナ・リンクの選択」で作成したエンティティ変数を選択し、「OK」をクリックします。
「一意キー」セクションで、「追加」アイコンをクリックします。
「キーの指定」ダイアログが表示されます。このダイアログを使用して、Oracle ADF Business Componentデータ・プロバイダ・サービスから注文IDを取得するためのキーを作成します。
表6-2に記載されている詳細を入力し、バインディング・キーを定義します。
表6-2 「キーの指定」ダイアログのフィールドと値
フィールド | 値 |
---|---|
キー・ローカル・パート |
キーのローカル・パートを入力します。 |
キー・ネームスペースURI |
キーに対するネームスペースURIを入力します。 |
キー値 |
キー値式を入力します。この式はキーのタイプと一致する必要があります。次に、POIDキーに対する式値キーの例を示します。
エンティティ変数に対するPOIDキーは、通常、別のメッセージから取得されます。POIDキーのタイプが整数で、式の結果が |
図6-4に、完成した「キーの指定」ダイアログを示します。
「OK」をクリックして「キーの指定」ダイアログを閉じます。
図6-5に示すように、「一意キー」の表に名前/値ペアが表示されます。これで、設計は完了します。
「OK」をクリックして「Bind Entity」ダイアログを閉じます。
実行時にbind entityアクティビティが実行されると、エンティティ変数を使用する準備が整います。
SDOの使用方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。このガイドには、アプリケーション・モジュールをWebサービスとして公開する方法や、表示データ・オブジェクトの行をSDOとして公開する方法が記載されています。アプリケーション・モジュールは、ビジネス・ロジックを関連する一連のビジネス機能としてカプセル化するADFフレームワーク・コンポーネントです。
スタンドアロンSDOベースの変数は、通常のBPEL XML-DOMベースの変数と類似しています。主な違いは、基礎となるデータ形式がDOMベースではなくSDOベースであることです。したがって、SDOベースの変数は、Java APIアクセス、簡単に使用できる最新のAPI、変更内容の要約など、様々なSDO機能を使用できます。ただし、SDOを使用する場合は、XML-DOMベースの変数を使用する場合にはない複数の制限も適用されます。最も顕著な制限は、SDOがXPath式の小さいサブセットのみをサポートしていることです。
SDOベースの変数を宣言するための構文は、BPEL変数を宣言する構文と類似しています。例6-5に詳細を示します。
例6-5 SDOベースの変数の宣言
<variable name="deptVar_s" element="hrtypes:dept" /> <variable name="deptVar_v" element="hrtypes:dept" bpelx:sdoCapable="false" />
自動検出を無効にする場合は、bpelx:sdoCapable="true|false"
スイッチを使用します。たとえば、例6-5の変数deptVar_v
は通常のDOMベースの変数です。例6-6にスキーマの例を示します。
例6-6 XSDのサンプル
<xsd:element name="dept" type="Dept"/> <xsd:complexType name="Dept" sdoJava:instanceClass="sdo.sample.service.types.Dept"> <xsd:annotation> <xsd:appinfo source="Key" xmlns="http://xmlns.oracle.com/bc4j/service/metadata/"> <key> <attribute>Deptno</attribute> </key> <fetchMode>minimal</fetchMode> </xsd:appinfo> </xsd:annotation> <xsd:sequence> <xsd:element name="Deptno" type="xsd:integer" minOccurs="0"/> <xsd:element name="Dname" type="xsd:string" minOccurs="0" nillable="true"/> <xsd:element name="Loc" type="xsd:string" minOccurs="0" nillable="true"/> <xsd:element name="Emp" type="Emp" minOccurs="0" maxOccurs="unbounded" nillable="true"/> </xsd:sequence> </xsd:complexType>
Oracle BPEL Process Managerでは、DOMとSDOの2つのデータ形式をサポートしています。同じビジネス・プロセス内で、さらに同じ式の中で、DOMベースの変数とSDOベースの変数の使用を切り替えることができます。Oracle BPEL Process Managerのデータ・フレームワークは、DOM形式とSDO形式を自動的に変換します。
Oracle BPEL Process Managerでは、エンティティ変数のXPathリライト機能を使用することで、基本的なSDO仕様ではサポートされない複数のXPath機能(変数の参照、関数コールなど)を使用できます。一方で、SDOベースの変数を使用するXPathには、別の制限があります(and
、or
およびnot
がサポートされないなど)。
例6-7に、XMLからSDOに変換する簡単な例を示します。
例6-7 XMLからSDOへの変換
<assign> <copy> <from> <ns0:dept xmlns:ns0="http://sdo.sample.service/types/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ns0:Deptno>10</ns0:Deptno> <ns0:Dname>ACCOUNTING</ns0:Dname> <ns0:Loc>NEW YORK</ns0:Loc> <ns0:Emp> <ns0:Empno>7782</ns0:Empno> <ns0:Ename>CLARK</ns0:Ename> <ns0:Job>MANAGER</ns0:Job> <ns0:Mgr>7839</ns0:Mgr> <ns0:Hiredate>1981-06-09</ns0:Hiredate> <ns0:Sal>2450</ns0:Sal> <ns0:Deptno>10</ns0:Deptno> </ns0:Emp> <ns0:Emp> <ns0:Empno>7839</ns0:Empno> <ns0:Ename>KING</ns0:Ename> <ns0:Job>PRESIDENT</ns0:Job> <ns0:Hiredate>1981-11-17</ns0:Hiredate> <ns0:Sal>5000</ns0:Sal> <ns0:Deptno>10</ns0:Deptno> </ns0:Emp> <ns0:Emp> <ns0:Empno>7934</ns0:Empno> <ns0:Ename>MILLER</ns0:Ename> <ns0:Job>CLERK</ns0:Job> <ns0:Mgr>7782</ns0:Mgr> <ns0:Hiredate>1982-01-23</ns0:Hiredate> <ns0:Sal>1300</ns0:Sal> <ns0:Deptno>10</ns0:Deptno> </ns0:Emp> </ns0:dept> </from> <to variable="deptVar_s" /> </copy> </assign>
例6-8に、SDO変数のXPath式からDOM変数にコピーする例を示します。
例6-8 SDO変数のXPath式からDOM変数へのコピー
<assign> <!-- copy from an XPath expression of an SDO variable to DOM variable --> <copy> <from expression="$deptVar_s/hrtypes:Emp[2]" /> <to variable="empVar_v" /> </copy> <!-- copy from an XPath expression of an DOM variable to SDO variable --> <copy> <from expression="$deptVar_v/hrtypes:Emp[2]" /> <to variable="empVar_s" /> </copy> <!-- insert a DOM based data into an SDO variable --> <bpelx:insertAfter> <bpelx:from variable="empVar_v" /> <bpelx:to variable="deptVar_s" query="hrtypes:Emp" /> </bpelx:insertAfter> <!-- insert a SDO based data into an SDO variable at particular location, no XML conversion is needed --> <bpelx:insertBefore> <bpelx:from expression="$deptVar_s/hrtypes:Emp[hrtypes:Sal = 1300]" /> <bpelx:to variable="deptVar_s" query="hrtypes:Emp[6]" /> </bpelx:insertBefore> </assign>
例6-9に、SDOデータの一部を削除する例を示します。
BPELでは、リテラルXMLを変数に割り当てる方法が役立つことがよくあります。たとえば、動的データを変数に対するXMLデータ・コンテンツ内の特定のフィールドにコピーする前に、変数を初期化する場合などです。また、XMLデータ値をプロセスにハード・コーディングするときのテストにも役立ちます。
変数間のコピーでは、1つの変数(またはパート)から互換性のあるタイプの別の変数に直接コピーします。どちらの変数でも特定のフィールドを指定する必要はありません。つまり、XPath問合せを指定する必要はありません。
例6-11は、2つの割当ての実行を示しています。最初に同じタイプの2つの変数の間でコピーを実行し、次に変数パートをそのパートと同じタイプの別の変数の変数パートにコピーします。
例6-11 変数間のコピー
<assign> <copy> <from variable="c1"/> <to variable="c2"/> </copy> <copy> <from variable="c1" part = "address"/> <to variable="c3"/> </copy> </assign>
例6-12に示すように、BPELファイルは変数を定義します。
例6-12 変数定義
<variable name="c1" messageType="x:person"/> <variable name="c2" messageType="x:person"/> <variable name="c3" element="y:address"/>
例6-13に示すように、WSDLファイルはperson
メッセージ・タイプを定義します。
例6-13 メッセージ・タイプ定義
<message name="person" xmlns:x="http://tempuri.org/bpws/example"> <part name="full-name" type="xsd:string"/> <part name="address" element="x:address"/> </message>
このコード例の詳細は、「Business Process Execution Language for Web Services Specification」の第9.3.2項を参照してください。BPEL 2.0の場合は、「Web Services Business Process Execution Language Specification Version 2.0」の第8.4.4項の類似した例を参照してください。
詳細は、A.2.2項「assignアクティビティ」を参照してください。
インラインfrom-spec
を使用することで、必要に応じて変数を初期化できます。このタイプの変数を作成するには、BPEL 2.0プロジェクトの「変数の作成」ダイアログで「初期化」タブをクリックします。
インライン変数の初期化は、概念的には、変数宣言に表示される順序でそれぞれが初期化された、一連の仮想assignアクティビティを含む1つの仮想sequenceアクティビティとして設計されます。各仮想assignアクティビティには、from-spec
が変数の初期化で指定されている1つの仮想コピー操作が含まれます。to-spec
は、作成される変数を指します。例6-14に詳細を示します。
例6-14 インラインfrom-specを使用した変数の初期化
<variables> <variable name="tmp" element="tns:output"> <from> <literal> <output xmlns="http://samples.otn.com/bpel2.0/ch8.1"> <value>1000</value> </output> </literal> </from> </variable> </variables>
詳細は、「Web Services Business Process Execution Language Specification Version 2.0」の第8.1項を参照してください。
ほとんどのWSDLファイルやXSDファイルに定義のタイプが存在する場合は、要素およびメッセージ・タイプに基づいて変数パート内のコピー元またはコピー先フィールドのレベルに移動する必要があります。そこで、XMLスキーマの複合型を順に使用します。このアクションを実行するには、assignアクティビティのfrom
句またはto
句にXPath問合せを指定します。
例6-15では、ssn
フィールドはCreditFlow
プロセスの入力メッセージから信用格付けサービスの入力メッセージのssn
フィールドにコピーされます。
例6-15 レベルをコピーするフィールド
<assign> <copy> <from variable="input" part="payload" query="/tns:CreditFlowRequest/tns:ssn"/> <to variable="crInput" part="payload" query="/tns:ssn"/> </copy> </assign>
例6-16は、この割当てに必要なメッセージ・タイプベースの変数をBPELファイルに定義する方法を示しています。
例6-16 BPELファイル定義 - BPEL 1.1のメッセージ・タイプベースの変数
<variable name="input" messageType="tns:CreditFlowRequestMessage"/> <variable name="crInput" messageType="services:CreditRatingServiceRequestMessage"/>
crInput
変数は、信用格付けサービスへの入力メッセージとして使用されます。そのメッセージ・タイプCreditFlowRequestMessage
は、例6-17に示すように、CreditFlowService.wsdl
ファイルで定義されます。
例6-17 CreditFlowRequestMessage定義
<message name="CreditFlowRequestMessage"> <part name="payload" element="tns:CreditFlowRequest"/> </message>
CreditFlowRequest
は、ssn
という名前のフィールドで定義されます。メッセージ・タイプCreditRatingServiceRequestMessage
は、例6-18に示すように、CreditRatingService.wsdl
ファイルで定義されます。
例6-18 CreditRatingServiceRequestMessage定義
<message name="CreditRatingServiceRequestMessage"> <part name="payload" element="tns:ssn"/> </message>
例6-19に、例6-15の割当てに含まれるメッセージ・タイプベース変数をBPELファイルに定義する方法のBPEL 2.0の構文を示します。/tns:CreditFlowRequest
は不要であることに注意してください。
例6-19 BPELファイル定義 - BPEL 2.0のメッセージ・タイプベースの変数
<copy> <from>$input.payload/tns:ssn</from> <to>$crInput.payload</to> </copy>
BPELプロセスでは、要素ベースの変数も使用できます。例6-20は、BPEL 1.1で要素ベースの変数を使用する方法を示しています。autoloan
フィールドは融資申請プロセスの入力メッセージからWebサービスの入力メッセージのcustomer
フィールドにコピーされます。
例6-20 BPEL 1.1のレベルをコピーするフィールド
<assign> <copy> <from variable="input" part="payload" query="/tns:invalidLoanApplication/autoloan: application/autoloan:customer"/> <to variable="customer"/> </copy> </assign>
例6-21に、BPEL 2.0で要素ベースの変数を使用する方法を示します。
<assign> <copy> <from>$input.payload/autoloan:application/autoloan:customer</from> <to>$customer</to> </copy> </assign>
例6-22は、割当てに必要な要素ベースの変数をBPELファイルに定義する方法を示しています。
第6.8.1項「XPath標準による数学的計算の使用方法」の数値を増分する数式のような簡単な数式を使用できます。
例6-24では、BPEL XPath関数getVariableData
により、増分した値が取得されます。getVariableData
への引数は、from
句のvariable、partおよびquery属性と同じです(オプションの最後の2つの引数を含む)。
例6-24 XPath関数getVariableDataによる値の取得
<assign> <copy> <from expression="bpws:getVariableData('input', 'payload', '/p:value') + 1"/> <to variable="output" part="payload" query="/p:result"/> </copy> </assign>
また、例6-25に示すように、BPEL 1.1で$variable
構文を使用することもできます。
例6-25 BPEL 1.1での$variable構文の使用
<assign> <copy> <from expression="$input.payload + 1"/> <to variable="output" part="payload" query="/p:result"/> </copy> </assign>
例6-26に、BPEL 2.0で$variable
構文を使用する方法を示します。
文字列リテラルをBPEL内の変数に割り当てることができます。
例6-27のコードは、文字列リテラル'GE'
から評価されるBPEL 1.1式を、指定された変数パート内のsymbolフィールドにコピーしています。(二重引用符および一重引用符を使用していることに注意してください)。
例6-27 BPEL 1.1での式のコピー
<assign> <!-- copy from string expression to the variable --> <copy> <from expression="'GE'"/> <to variable="output" part="payload" query="/p:result/p:symbol"/> </copy> </assign>
例6-28に、BPEL 2.0でこの式を実行する方法を示します。
1つの文字列変数(または変数パート、フィールド)の値を別の文字列変数にコピーするのではなく、いくつかの文字列を連結するなどの文字列操作を最初に実行できます。
連結はconcat
という名前のコアXPath関数で実行されます。また、連結に必要な変数値は、BPEL XPath関数getVariableData
によって取得されます。例6-29では、getVariableData
は、input
変数のpayload
パートからname
フィールドの値をフェッチします。次に、文字リテラル'Hello '
が、この値の先頭に連結されます。
例6-29 XPath関数getVariableDataによるデータのフェッチ
<assign> <!-- copy from XPath expression to the variable --> <copy> <from expression="concat('Hello ', bpws:getVariableData('input', 'payload', '/p:name'))"/> <to variable="output" part="payload" query="/p:result/p:message"/> </copy> </assign>
XPathで使用できるその他の文字列操作関数は、「XML Path Language (XPath) Specification」の第4.2項にリストされています。
XPathブール関数を使用してブール値を割り当てることができます。
例6-30は、BPEL 1.1でブール値を割り当てる例を示しています。from
句のXPath式は、XPathブール関数true
のコールであり、指定されたapprovedフィールドがtrue
に設定されます。関数false
も使用できます。
例6-30 BPEL 1.1でのブール値の割当て
<assign> <!-- copy from boolean expression function to the variable --> <copy> <from expression="true()"/> <to variable="output" part="payload" query="/result/approved"/> </copy> </assign>
例6-31に、BPEL 2.0でのブール値の割当ての例を示します。
例6-31 BPEL 2.0でのブール値の割当て
<assign> <copy> <from>true()</from> <to>$output.payload/approved</to> </copy> </assign>
XPath仕様では、ブール定数値を返すメソッドとして"true()"
および"false()"
関数を使用するように推奨しています。
かわりに"boolean(true)"
または"boolean(false)"
を使用すると、ブール関数内のtrue
またはfalse
はtrue
またはfalse
定数ではなく相対要素ステップと解釈されます。現行のXPathコンテキスト・ノードでtrue
という子ノードの選択が試行されます。ほとんどの場合、true
ノードは存在しません。したがって、空の結果ノードセットが返され、それがXPath 1.0のboolean()
関数によりfalseの結果に変換されます。この結果は混同される可能性があります。
Oracle BPEL XPath関数のgetCurrentDate
、getCurrentTime
またはgetCurrentDateTime
を使用して、日付または時刻フィールドの現在値を割り当てることができます。さらに、日時の値が標準XSD形式の場合は、Oracle BPEL XPath関数formatDate
をコールして、出力用により適切な文字に変換できます。
関連情報については、「Business Process Execution Language for Web Services Specification」の第9.1.2項、および「Web Services Business Process Execution Language Specification Version 2.0」の第8.3.2項を参照してください。
例6-32は、BPEL 1.1で関数getCurrentDate
を使用する例を示しています。
例6-32 BPEL 1.1での日付または時刻の割当て
<!-- execute the XPath extension function getCurrentDate() --> <assign> <copy> <from expression="xpath20:getCurrentDate()"/> <to variable="output" part="payload" query="/invoice/invoiceDate"/> </copy> </assign>
例6-33は、BPEL 2.0で関数getCurrentDate
を使用する例を示しています。
<assign> <copy> <from>xpath20:getCurrentDate()</from> <to>$output.payload/invoiceDate</to> </copy> </assign>
例6-34では、XSD形式で指定された日時の値をformatDate
関数が文字列'Jun 10, 2005'
に変換し、文字列フィールドformattedDate
に割り当てています。
例6-34 BPEL 1.1のformatDate関数
<!-- execute the XPath extension function formatDate() --> <assign> <copy> <from expression="ora:formatDate('2005-06-10T15:56:00', 'MMM dd, yyyy')"/> <to variable="output" part="payload" query="/invoice/formattedDate"/> </copy> </assign>
例6-35に、BPEL 2.0でのformatDate
関数の動作を示します。
XML属性として定義されている要素は相互にコピーできます。XPath問合せ構文では、@
記号は子要素のかわりに属性を参照します。
例6-36のコードは、このXMLデータからcustId
属性をフェッチしてコピーしています。
例6-36 custId属性のフェッチ操作とコピー操作
<invalidLoanApplication xmlns="http://samples.otn.com"> <application xmlns = "http://samples.otn.com/XPath/autoloan"> <customer custId = "111" > <name> Mike Olive </name> ... </customer> ... </application> </invalidLoanApplication>
例6-37のBPEL 1.1のコードは、customerフィールドのcustId
属性を選択し、変数custId
に割り当てています。
例6-37 BPEL 1.1でのcustId属性の選択操作と割当て操作
<assign> <!-- get the custId attribute and assign to variable custId --> <copy> <from variable="input" part="payload" query="/tns:invalidLoanApplication/autoloan:application /autoloan:customer/@custId"/> <to variable="custId"/> </copy> </assign>
例6-38は、customerフィールドのcustId
属性を選択し、変数custId
に割り当てるためのBPEL 2.0の対応する構文を示しています。
例6-38 BPEL 2.0でのcustId属性の選択操作と割当て操作
<assign> <copy> <from>$input.payload/autoloan:application/autoloan:customer/@custId</from> <to>$custId</to> </copy> </assign>
この例のネームスペース接頭辞は必須ではありません。例6-39に示すように、WSDLファイルには、custId
が属性として定義される型を持つように顧客を定義します。
assignアクティビティではXMLデータに対して様々な操作を実行できます。この項で説明されているbpelx
拡張要素タイプにはこの機能が用意されています。Oracle BPELデザイナでは、「割当て」ダイアログの「コピー・ルール」タブの下部にbpelx
拡張要素タイプを追加できます。コピー・ルールを作成した後、作成したルールを選択し、BPEL 1.1のドロップダウン・リストまたはBPEL 2.0のコンテキスト・メニューからbpelx
拡張要素タイプを選択します。これにより、コピー・ルールが選択した拡張要素タイプに変更されます。
BPEL 1.1では、図6-6に示すように、ドロップダウン・リストから拡張要素タイプを選択します。
BPEL 2.0では、図6-7に示すように、コピー・ルールを右クリックし、ルール・タイプの変更を選択して拡張要素タイプを選択することで、拡張要素タイプを選択します。
詳細は、このダイアログのオンライン・ヘルプおよびA.2.2項「assignアクティビティ」を参照してください。
assignアクティビティでbpelx:append
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツに追加できます。この拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択した後、ドロップダウン・リストから「追加」を選択します。
注意: bpelx:append 拡張要素では、SDO変数の使用はサポートされていません。エラーが発生します。 |
例6-40に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:append
の例を示します。
例6-40 BPEL 1.1のbpelx:append拡張要素
<bpel:assign> <bpelx:append> <bpelx:from ... /> <bpelx:to ... /> </bpelx:append> </bpel:assign>
bpelx:append
内のfrom-spec
問合せでは、0(ゼロ)個以上のノードが取得されます。ノード・リストは、to-spec
問合せで指定したターゲット・ノードに子ノードとして追加されます。
to-spec
問合せでは、単一L-Value要素ノードを1つ取得する必要があります。それ以外の場合は、bpel:selectionFailure
フォルトが生成されます。to-spec
問合せではパートナ・リンクを参照できません。
例6-41では、1つのBOMの複数のb:part
を連結BOMのb:
parts
に追加することで、複数の部品表を1つの部品表に連結しています。
例6-42に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:append
構文の例を示します。BPEL 2.0では、この機能は第6.14.1.1項「BPEL 1.1のbpelx:append」で説明されている機能と同じですが、構文が多少異なります。
注意: bpelx:insertBefore 拡張要素ではSDO変数を使用できますが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。 |
assignアクティビティでbpelx:insertBefore
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの前に挿入できます。この拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択した後、ドロップダウン・リストからInsertBeforeを選択します。
例6-43に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:insertBefore
の例を示します。
例6-43 BPEL 1.1のbpelx:insertBefore拡張要素
<bpel:assign> <bpelx:insertBefore> <bpelx:from ... /> <bpelx:to ... /> </bpelx:insertBefore> </bpel:assign>
bpelx:insertBefore
内のfrom-spec
問合せでは、0(ゼロ)個以上のノードが取得されます。ノード・リストは、to-spec
問合せで指定したターゲット・ノードに子ノードとして追加されます。
insertBefore
操作のto-spec
問合せは、1つ以上の単一L-Valueノードを指し示します。複数のノードが返された場合は、最初のノードが参照ノードとして使用されます。参照ノードは要素ノードである必要があります。参照ノードの親も要素ノードである必要があります。それ以外の場合は、bpel:selectionFailure
フォルトが生成されます。from-spec
問合せの選択により生成されたノード・リストは、参照ノードの前に挿入されます。to-spec
問合せではパートナ・リンクを参照できません。
例6-44は、<insertBefore>
の実行前の構文を示しています。addrVar
の値は次のとおりです。
例6-45は、実行後の構文を示しています。
例6-45 実行後の構文
<bpel:assign>
<bpelx:insertBefore>
<bpelx:from>
<a:city>Redwood Shore></a:city>
</bpelx:from>
<bpelx:to "addrVar" query="/a:usAddress/a:state" />
</bpelx:insertBefore>
</bpel:assign>
例6-46は、addrVar
の値を示しています。
例6-47に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:insertBefore
構文の例を示します。BPEL 2.0では、この機能は第6.14.2.1項「BPEL 1.1のbpelx:insertBefore」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:insertBefore
拡張要素をラップします。
注意: bpelx:insertAfter 拡張要素ではSDO変数を使用できすが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。 |
assignアクティビティでbpelx:insertAfter
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの後に挿入できます。この拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択した後、ドロップダウン・リストからInsertAfterを選択します。
例6-48に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:InsertAfter
の例を示します。
例6-48 BPEL 1.1のbpelx:InsertAfter拡張要素
<bpel:assign> <bpelx:insertAfter> <bpelx:from ... /> <bpelx:to ... /> </bpelx:insertAfter> </bpel:assign>
この操作は第6.14.2項「bpelx:insertBeforeの使用方法」で説明した機能に類似していますが、次の違いがあります。
to-spec
問合せで複数のL-Valueノードが返される場合は、最後のノードが参照ノードとして使用されます。
参照ノードの前にノードが挿入されるかわりに、参照ノードの後にソース・ノードが挿入されます。
この操作は、conditional-switch
+
(append
またはinsertBefore
)のマクロとみなすこともできます。
例6-49は、<insertAfter>
の実行前の構文を示しています。addrVar
の値は次のとおりです。
例6-49 実行前の構文
<a:usAddress> <a:addressLine>500 Oracle Parkway</a:addressLine> <a:state>CA</a:state> <a:zipcode>94065</a:zipcode> </a:usAddress>
例6-50は、実行後の構文を示しています。
例6-50 実行後の構文
<bpel:assign>
<bpelx:insertAfter>
<bpelx:from>
<a:addressLine>Mailstop 1op6</a:addressLine>
</bpelx:from>
<bpelx:to "addrVar" query="/a:usAddress/a:addressLine[1]" />
</bpelx:insertAfter>
</bpel:assign>
例6-51は、addrVar
の値を示しています。
例6-51 addrVarの値
<a:usAddress>
<a:addressLine>500 Oracle Parkway</a:addressLine>
<a:addressLine>Mailstop 1op6</a:addressLine>
<a:state>CA</a:state>
<a:zipcode>94065</a:zipcode>
</a:usAddress>
bpelx:insertAfter
内のfrom-spec
問合せでは、0(ゼロ)個以上のノードが取得されます。ノード・リストは、to-spec
問合せで指定したターゲット・ノードに子ノードとして追加されます。
例6-52に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:InsertAfter
構文の例を示します。BPEL 2.0では、この機能は第6.14.3.1項「BPEL 1.1のbpelx:InsertAfter」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:InsertAfter
拡張要素をラップします。
例6-52 BPEL 2.0のbpelx:InsertAfter拡張要素
<assign> <extensionAssignOperation> <bpelx:insertAfter> <bpelx:from> <bpelx:literal> <a:addressLine>Mailstop 1op6</a:addressLine> </bpelx:literal> </bpelx:from> <bpelx:to>$addrVar/a:addressLine[1]</bpelx:to> </bpelx:insertAfter> </extensionAssignOperation> </assign>
assignアクティビティでbpelx:remove
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは変数を削除できます。Oracle BPELデザイナでbpelx:remove
拡張要素を追加するには、「コピー・ルール」タブの右上隅にある「削除」アイコンを、削除するターゲット変数にドラッグしてカーソルを離します。図6-8に詳細を示します。
カーソルを離すと、bpelx:remove
拡張要素がターゲット変数に適用されます。図6-9に詳細を示します。
例6-53に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:remove
の例を示します。
例6-53 BPEL 1.1のbpelx:remove拡張要素
<bpel:assign> <bpelx:remove> <bpelx:target variable="ncname" part="ncname"? query="xpath_str" /> </bpelx:remove> </bpel:assign>
XPath式で指定したノード削除がサポートされます。XPath式では複数のノードを指定できますが、いずれもL-Valueである必要があります。この親からは、テキスト・ノード、属性ノードおよび要素ノードを削除できます。
XPath式では、1つ以上のノードを返すことができます。XPath式で0(ゼロ)個のノードが返される場合は、bpel:selectionFailure
フォルトが生成されます。
bpelx:target
の構文は、copy
操作のto-spec
に類似しており、そのサブセットです。
例6-54は、次の値を持つaddrVar
を示しています。
例6-54 addrVar
<a:usAddress> <a:addressLine>500 Oracle Parkway</a:addressLine> <a:addressLine>Mailstop 1op6</a:addressLine> <a:state>CA</a:state> <a:zipcode>94065</a:zipcode> </a:usAddress>
BPELプロセス・サービス・コンポーネント・ファイルで例6-55に示す構文を実行すると、2番目のアドレス行であるMailstop
が削除されます。
例6-55 2番目のアドレス行の削除
<bpel:assign>
<bpelx:remove>
<target variable="addrVar"
query="/a:usAddress/a:addressLine[2]" />
</bpelx:remove>
</bpel:assign>
BPELプロセス・サービス・コンポーネント・ファイルで例6-56に示す構文を実行すると、両方のアドレス行が削除されます。
例6-57に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:remove
構文の例を示します。BPEL 2.0では、この機能は第6.14.4.1項「BPEL 1.1のbpelx:remove」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:remove
拡張要素をラップします。
assignアクティビティでbpelx:rename
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントはXSDタイプ・キャストを使用して要素の名前を変更できます。Oracle BPELデザイナでbpelx:rename
拡張要素を追加するには、「コピー・ルール」タブの右上隅にある「名前の変更」アイコンを、削除するターゲット変数にドラッグしてカーソルを離します。図6-8に示すように、「名前の変更」アイコンは「削除」アイコンの右側に表示されます。カーソルを離すと、ターゲット変数の名前を変更するための「名前の変更」ダイアログが表示されます。
例6-58に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:rename
の例を示します。
例6-58 BPEL 1.1のbpelx:rename拡張要素
<bpel:assign> <bpelx:rename elementTo="QName1"? typeCastTo="QName2"?> <bpelx:target variable="ncname" part="ncname"? query="xpath_str" /> </bpelx:rename> </bpel:assign>
bpelx:target
の構文は、copy
操作のto-spec
に類似しており、そのサブセットです。ターゲットはさらに1つの要素ノードのリストを返す必要があります。それ以外の場合は、bpel:selectionFailure
フォルトが生成されます。from-spec
で指定した要素ノード名が、elementTo
属性で指定したQName
に変更されます。その要素ノードにxsi:type
属性が追加され、それらの要素がtypeCastTo
属性で指定したQName
タイプにキャストされます。
例6-59に示す従業員リストがあるとします。
例6-59 xsi:type属性
<e:empList> <e:emp> <e:firstName>John</e:firstName><e:lastName>Dole</e:lastName> <e:emp> <e:emp xsi:type="e:ManagerType"> <e:firstName>Jane</e:firstName><e:lastName>Dole</e:lastName> <e:approvalLimit>3000</e:approvalLimit> <e:managing /> <e:emp> <e:emp> <e:firstName>Peter</e:firstName><e:lastName>Smith</e:lastName> <e:emp> <e:emp> <e:firstName>Mary</e:firstName><e:lastName>Smith</e:lastName> <e:emp> </e:empList>
昇格の変更が、例6-60の従業員リストのPeter Smith
に適用されます。
例6-60 昇格変更の適用
<bpel:assign> <bpelx:rename typeCastTo="e:ManagerType"> <bpelx:target variable="empListVar" query="/e:empList/e:emp[./e:firstName='Peter' and ./e:lastName='Smith'" /> </bpelx:rename> </bpel:assign>
前述のキャスト(名前変更)の実行後は、例6-61に示すように、Peter Smith
にxsi:type
情報が追加され、データは次のようになります。
例6-61 データ出力
<e:empList>
<e:emp>
<e:firstName>John</e:firstName><e:lastName>Dole</e:lastName>
<e:emp>
<e:emp xsi:type="e:ManagerType">
<e:firstName>Jane</e:firstName><e:lastName>Dole</e:lastName>
<e:approvalLimit>3000</e:approvalLimit>
<e:managing />
<e:emp>
<e:emp xsi:type="e:ManagerType">
<e:firstName>Peter</e:firstName><e:lastName>Smith</e:lastName>
<e:emp>
<e:emp>
<e:firstName>Mary</e:firstName><e:lastName>Smith</e:lastName>
<e:emp>
</e:empList>
<approvalLimit>
および<managing>
がないため、Peter Smith
の従業員データは無効になっています。したがって、その情報を追加するために<append>
が使用されます。例6-62に例を示します。
例6-62 append拡張要素を使用した情報の追加
<bpel:assign> <bpelx:rename typeCastTo="e:ManagerType"> <bpelx:target variable="empListVar" query="/e:empList/e:emp[./e:firstName='Peter' and ./e:lastName='Smith'" /> </bpelx:rename> <bpelx:append> <bpelx:from> <e:approvalLimit>2500</e:approvalLimit> <e:managing /> </bpelx:from> <bpelx:to variable="empListVar" query="/e:empList/e:emp[./e:firstName='Peter' and ./e:lastName='Smith'" /> </bpelx:append> </bpel:assign>
rename
およびappend
の両方を実行すると、対応するデータは例6-63のようになります。
例6-64に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:rename
構文の例を示します。BPEL 2.0では、この機能は第6.14.5.1項「BPEL 1.1のbpelx:rename」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:rename
拡張要素をラップします。
assignアクティビティでbpelx:copyList
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツに対して別の変数へのcopyList
操作を実行できます。
BPEL 1.1でこの拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択し、ドロップダウン・リストから「リストのコピー」を選択します。BPEL 2.0でこの拡張要素を使用するには、図6-7に示すように、コピー・ルールを右クリックし、ルール・タイプの変更を選択して「リストのコピー」を選択します。
例6-65に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:copyList
の例を示します。
例6-65 BPEL 1.1のbpelx:copyList拡張要素
<bpel:assign> <bpelx:copyList> <bpelx:from ... /> <bpelx:to ... /> </bpelx:copyList> </bpel:assign>
from-spec
問合せでは、すべての属性ノードまたはすべての要素ノードのリストを取得できます。to-spec
問合せでは、L-Valueノード(すべての属性ノードまたはすべての要素ノード)のリストを取得できます。
to-spec
問合せで返される要素ノードは、すべて同じ親要素を持つ必要があります。to-spec
問合せで要素ノードのリストが返される場合は、すべての要素ノードが連続している必要があります。
from-spec
問合せで属性ノードが返される場合、to-spec
問合せでは属性ノードが返される必要があります。同様に、from-spec
問合せで要素ノードが返される場合、to-spec
問合せでは要素ノードが返される必要があります。それ以外の場合は、bpws:mismatchedAssignmentFailure
フォルトがスローされます。
from-spec
問合せでは0(ゼロ)個のノードを返すことができますが、to-spec
問合せではノードを1個以上返す必要があります。from-spec
問合せで0(ゼロ)個のノードが返される場合、copyList
操作の効果はremove
操作と同様になります。
copylist
操作には、次の機能があります。
to-spec
問合せが指すノードがすべて削除されます。
to-spec
問合せで要素ノードのリストが返され、そのノードが削除された後に子ノードが残っている場合、from-spec
問合せで返されたノードは、to-spec
問合せで指定した最後の要素と同レベルの次の要素の前に挿入されます。残りの子ノードがない場合は、append
操作が実行されます。
to-spec
問合せで属性ノードのリストが返される場合は、その属性が親要素から削除されます。次に、from-spec
問合せで返された属性が親要素に追加されます。
たとえば、例6-66に示すようなスキーマが定義されているとします。
例6-66 スキーマ
<schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/Event_jws/Event/EventTest" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="process"> <complexType> <sequence> <element name="payload" type="string" maxOccurs="unbounded"/> </sequence> </complexType> </element> <element name="processResponse"> <complexType> <sequence> <element name="payload" type="string" maxOccurs="unbounded"/> </sequence> </complexType> </element> </schema>
from
変数には、例6-67に示すコンテンツが含まれています。
例6-67 変数のコンテンツ
<ns1:process xmlns:ns1="http://xmlns.oracle.com/Event_jws/Event/EventTest"> <ns1: payload >a</ns1: payload > <ns1: payload >b</ns1: payload > </ns1:process>
to
変数には、例6-68に示すコンテンツが含まれています。
例6-68 変数のコンテンツ
<ns1:processResponse xmlns:ns1="http://xmlns.oracle.com/Event_ jws/Event/EventTest"> <ns1: payload >c</ns1: payload > </ns1:process>
bpelx:copyList
操作は、例6-69のようになります。
例6-69 bpelx:copyList
<assign> <bpelx:copyList> <bpelx:from variable="inputVariable" part="payload" query="/client:process/client:payload"/> <bpelx:to variable="outputVariable" part="payload" query="/client:processResponse/client:payload"/> </bpelx:copyList> </assign>
これにより、例6-70に示すto
変数が作成されます。
例6-71に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:copyList
構文の例を示します。BPEL 2.0では、この機能は第6.14.6.1項「BPEL 1.1のbpelx:copyList」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:copyList
拡張要素をラップします。
次の属性をassignアクティビティのコピー・ルールに割り当てることができます。
assignアクティビティの「コピー・ルール」タブの下部で、選択したコピー・ルールを右クリックして、適切な属性を選択するためのメニューを表示します。図6-10に詳細を示します。
ignoreMissingFromData
属性は、bpel:selectionFailure
標準フォルトを抑止します。表6-3に、BPELバージョン1.1とバージョン2.0の構文の違いを示します。
insertMissingToData
属性は、項目が選択されなかった場合、to-spec
で指定された(XPath) L-valueを実行するようにランタイムに指示します。表6-4に、BPELバージョン1.1とバージョン2.0の構文の違いを示します。
keepSrcElementName
属性を使用すると、(to-spec
の選択に従って)宛先の要素名をソースの要素名に置換できます。この属性は、BPEL 1.1では実装されていませんでした。表6-5に、BPELバージョン2.0でサポートされている構文を示します。
コードを検証してBPELプロジェクト内の無効なXMLデータを識別できます。
Oracle BPELデザイナ内のassignアクティビティで、次の手順を実行します。
「コンポーネント・パレット」の「BPELコンストラクト」セクションから、デザイナにassignアクティビティをドラッグします。
assignアクティビティをダブルクリックします。
「一般」タブで、アクティビティの名前を入力し、「検証」チェック・ボックスを選択します。
「適用」→「OK」の順にクリックします。
「ソース」タブをクリックして構文を表示します。
<assign name=Assign1" bpelx:validate="yes" . . . </assign>
Oracle BPELデザイナ内のスタンドアロン(assignアクティビティなしで使用可能な拡張validateアクティビティ)で、次の手順を実行します。
「コンポーネント・パレット」の「Oracle Extensions」セクションから、デザイナにvalidateアクティビティをドラッグします。
「検証」アイコンをダブルクリックします。
アクティビティの名前を入力します。
「追加」アイコンをクリックして、検証する変数を選択します。
変数を選択し、「OK」をクリックします。
「適用」→「OK」の順にクリックします。
「ソース」タブをクリックして構文を表示します。
<bpelx:validate name=Validate1" variables="inputVariable"/>
Oracle BPELデザイナ内のassignアクティビティで、次の手順を実行します。
「コンポーネント・パレット」の「BPELコンストラクト」セクションから、デザイナにassignアクティビティをドラッグします。
assignアクティビティをダブルクリックします。
「一般」タブで、アクティビティの名前を入力し、「検証」チェック・ボックスを選択します。
「適用」→「OK」の順にクリックします。
「ソース」タブをクリックして構文を表示します。assignアクティビティを使用してXMLデータを検証するための構文は、BPELバージョン1.1とバージョン2.0では多少異なります。
<assign name="Assign1" validate="yes"> . . . </assign>
Oracle BPELデザイナ内のスタンドアロン(assignアクティビティなしで使用可能な拡張validateアクティビティ)で、次の手順を実行します。
「コンポーネント・パレット」の「BPELコンストラクト」セクションから、デザイナにvalidateアクティビティをドラッグします。
「検証」アイコンをダブルクリックします。
アクティビティの名前を入力します。
「追加」アイコンをクリックして、検証する変数を選択します。
変数を選択し、「OK」をクリックします。
「適用」→「OK」の順にクリックします。
「ソース」タブをクリックして構文を表示します。validateアクティビティを使用してXMLデータを検証するための構文は、BPELバージョン1.1とバージョン2.0では多少異なります。
<validate name="Validate1" variables="inputVariable"/>
次のメッセージ交換アクティビティで変数を指定できます。
「Invoke」ダイアログの(inputVariable
属性の)「入力」フィールドと(outputVariable
属性の)「出力」フィールド
receiveアクティビティの(variable
属性の)「入力」フィールド
replyアクティビティの(variable
属性の)「出力」フィールド
これらのフィールドで参照される変数は通常、QNameが操作で使用される入力および出力メッセージ・タイプと一致するメッセージ・タイプ変数である必要があります。
例外は、アクティビティのWSDL操作が、要素を使用して定義された1つのパートを含むメッセージを使用している場合です。この場合、パートの定義に使用される同じ要素タイプの変数はそれぞれ、invokeアクティビティのinputVariable
属性とoutputVariable
属性、またはreceiveアクティビティまたはreplyアクティビティのvariable
属性で参照できます。
この状況で変数を使用するのは、関連するWSDLメッセージ・タイプに基づいて匿名の一時WSDLメッセージ・変数を宣言するのと同じである必要があります。
匿名の一時WSDLメッセージ変数と要素変数の間で要素データをコピーするのは、keepSrcElementName
属性がyes
に設定された1回のコピー操作による単一の仮想割当てとして機能します。仮想割当ては、実際のassignアクティビティと同じルールに従い、同じフォルトを使用する必要があります。表6-6に詳細を示します。
表6-6 WSDLメッセージ・パートのマップ
対象 | 説明 |
---|---|
|
属性で参照される変数の値により、匿名の一時WSDLメッセージ変数のパートの値が設定されます。 |
|
一時WSDLメッセージ変数の受信したパートの値により、属性で参照される変数の値が設定されます。 |
receiveアクティビティ |
着信パートの値により、variable属性で参照される変数の値が設定されます。 |
replyアクティビティ |
variable属性で参照される変数の値により、送信される匿名の一時WSDLメッセージ変数のパートの値が設定されます。フォルトを送信するreplyアクティビティの場合も、同じシナリオが適用されます。 |
keepSrcElementName
属性の詳細は、第6.14.7.3項「keepSrcElementName属性」を参照してください。
invokeアクティビティおよびreplyアクティビティのtoParts
要素は、BPEL変数のコンテンツから明示的に作成されるマルチパートWSDLメッセージの代替手段を提供します。
例6-72に示すように、toParts
要素を使用する場合、該当するWSDL操作の入力メッセージで指定されたタイプに基づいて、匿名の一時WSDL変数が定義されます。
toParts
要素は、単一の仮想assignアクティビティとして機能します。各toPart
は1回のコピー操作として機能します。WSDLメッセージ定義のパートごとに、最大で1つのtoPart
が存在します。各コピー操作では、fromVariable
属性で指定された変数から、toParts
要素のpart
属性で参照される匿名の一時WSDL変数のパートにデータがコピーされます。
receiveアクティビティ、invokeアクティビティ、scopeアクティビティのonEventブランチおよびpickアクティビティのonMessageブランチのfromParts
要素は、toParts
要素に似ています。例6-73に示すように、fromParts
要素は、着信マルチパートWSDLメッセージからデータを取得し、個別の変数に配置します。
fromParts
要素を使用するinvokeアクティビティでWSDLメッセージが受信されると、そのメッセージは、該当するWSDL操作の出力メッセージで指定されたタイプの匿名の一時WSDL変数に配置されます。
toParts
要素と同様に、fromParts
要素は単一の仮想assignアクティビティとして機能します。各fromPart
は1回のコピー操作として機能します。各コピー操作では、fromPart
のpart属性で参照される匿名の一時WSDL変数のパートのデータが、toVariable
属性で示した変数にコピーされます。
toParts
要素とfromParts
要素のどちらの場合も、仮想assignアクティビティは実際のassignアクティビティと同じセマンティックに従い、同じフォルトを生成する必要があります。
invokeアクティビティにfromParts
要素があるため、WSDLメッセージ定義のすべてのパートにfromPart
を指定する必要はありません。fromParts
要素で明示的に表されないパートは、匿名のWSDL変数から変数にコピーされません。
toParts
要素とfromParts
要素を使用してWSDLメッセージ・パートをマップする方法の詳細は、次のURLにある「Web Services Business Process Execution Language Version 2.0 Specification」を参照してください。
http://www.oasis-open.org
この項では、replyアクティビティがtoParts
要素を使用して変数のコンテンツをコピーする、単純なBPELプロセスの概要を示します。この例で使用されるWSDLファイルとBPELファイルは、第6.17.2項「WSDLメッセージ・パートのマップ時の処理内容」の例6-74および例6-75にあります。
BPEL 2.0でのWSDLメッセージ・パートのマップ方法
例6-74に、replyアクティビティに定義されたtoPart
要素を含む同期リクエストの.bpel
ファイルを示します。これは、例6-75に示すWSDLファイルに定義されている操作にマップされます。コピー操作では、fromVariable
属性で示される変数から匿名の一時WSDL変数Var1
のパートにデータがコピーされます。
例6-74 ToParts要素を含むBPELファイル
<sequence name="main"> <!-- Receive input from requestor. This maps to operation defined in WSDL --> <receive name="receiveInput" partnerLink="test_client" portType="client:Test" operation="process" variable="inputVariable" createInstance="yes"/> <!-- Generate reply to synchronous request --> <assign name="Assign_1"> <copy> <from>"test-type-variable"</from> <to>$Var1</to> </copy> </assign> <reply name="replyOutput" partnerLink="test_client" portType="client:Test" operation="process"> <toParts> <toPart part="payload" fromVariable="Var1"/> </toParts> </reply> </sequence>
例6-75 操作を定義するWSDLファイル
<wsdl:types> <schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/RT_Validate_P_02_jws/ch10_ 3toParts_1/Test" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="process"> <complexType> <sequence> <element name="input" type="string"/> </sequence> </complexType> </element> <element name="processResponse"> <complexType> <sequence> <element name="result" type="string"/> </sequence> </complexType> </element> </schema> </wsdl:types> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MESSAGE TYPE DEFINITION - Definition of the message types used as part of the port type defintions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> <wsdl:message name="TestRequestMessage"> <wsdl:part name="payload" element="client:process"/> </wsdl:message> <wsdl:message name="TestResponseMessage"> <wsdl:part name="payload" type="xsd:string"/> </wsdl:message> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PORT TYPE DEFINITION - A port type groups a set of operations into a logical service unit. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--> <!-- portType implemented by the Test BPEL process --> <wsdl:portType name="Test"> <wsdl:operation name="process"> <wsdl:input message="client:TestRequestMessage"/> <wsdl:output message="client:TestResponseMessage"/> </wsdl:operation> </wsdl:portType> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PARTNER LINK TYPE DEFINITION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--> <plnk:partnerLinkType name="Test"> <plnk:role name="TestProvider"> <plnk:portType name="client:Test"/> </plnk:role> </plnk:partnerLinkType> </wsdl:definitions>
例6-76に、invokeアクティビティおよびreplyアクティビティに定義されたtoPart
要素を含む.bpel
ファイルを示します。これは、例6-77に示すWSDLファイルに定義されている操作にマップされます。invokeアクティビティのコピー操作では、fromVariable
属性で示される変数から、匿名の一時WSDL変数request
のパートにデータがコピーされます。replyアクティビティのコピー操作では、fromVariable
属性で示される変数から、匿名の一時WSDL変数output
のパートにデータがコピーされます。
例6-76 ToParts要素を含むBPELファイル
<sequence> <!-- receive input from requestor --> <receive name="receiveInput" partnerLink="client" portType="tns:Test" operation="process" variable="input" createInstance="yes"/> <assign> <copy> <from>$input.payload</from> <to>$request</to> </copy> </assign> <invoke name="invokeDummyService" partnerLink="DummyService" portType="tns:DummyPortType" operation="process" outputVariable="response"> <toParts> <toPart part="payload" fromVariable="request"/> </toParts> </invoke> <assign> <copy> <from>$response</from> <to>$output</to> </copy> </assign> <!-- respond output to requestor --> <reply name="replyOutput" partnerLink="client" portType="tns:Test" operation="process"> <toParts> <toPart part="payload" fromVariable="output"/> </toParts> </reply> </sequence>
例6-77 操作を定義するWSDLファイル
<?xml version="1.0"?> <definitions name="ch10.3toParts" targetNamespace="http://samples.otn.com/bpel2.0/ch10.3" xmlns:tns="http://samples.otn.com/bpel2.0/ch10.3" xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns="http://schemas.xmlsoap.org/wsdl/" > <types> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://samples.otn.com/bpel2.0/ch10.3" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="input" type="string"/> <element name="output" type="string"/> </schema> </types> <message name="TestRequestMessage"> <part name="payload" element="tns:input"/> </message> <message name="TestResultMessage"> <part name="payload" element="tns:output"/> </message> <portType name="Test"> <operation name="process"> <input message="tns:TestRequestMessage"/> <output message="tns:TestResultMessage"/> </operation> </portType> <plnk:partnerLinkType name="Test"> <plnk:role name="TestProvider" portType="tns:Test"/> </plnk:partnerLinkType> </definitions>
例6-78に、pickアクティビティおよびinvokeアクティビティに定義されたfromParts
要素を含む.bpel
ファイルを示します。これは、例6-79に示すWSDLファイルに定義されている操作にマップされます。pickアクティビティのコピー操作では、toVariable
属性で示される変数から、匿名の一時WSDL変数request
のパートにデータがコピーされます。invokeアクティビティのコピー操作では、toVariable
属性で示される変数から、匿名の一時WSDL変数response
のパートにデータがコピーされます。
例6-78 FromParts要素を含むBPELファイル
<sequence> <!-- receive input from requestor --> <pick createInstance="yes"> <onMessage partnerLink="client" portType="tns:Test" operation="process"> <fromParts> <fromPart part="payload" toVariable="request"/> </fromParts> <empty/> </onMessage> </pick> <invoke name="invokeDummyService" partnerLink="DummyService" portType="tns:DummyPortType" operation="process" inputVariable="request"> <fromParts> <fromPart part="payload" toVariable="response"/> </fromParts> </invoke> <assign> <copy> <from>concat($response, " ", $response)</from> <to>$request</to> </copy> </assign> <invoke name="invokeDummyService" partnerLink="DummyService" portType="tns:DummyPortType" operation="process2" inputVariable="request"> <fromParts> <fromPart part="payload" toVariable="response"/> </fromParts> </invoke> <assign> <copy> <from>$response</from> <to>$output.payload</to> </copy> </assign> <!-- respond output to requestor --> <reply name="replyOutput" partnerLink="client" portType="tns:Test" operation="process" variable="output"/> </sequence>
例6-79 操作を定義するWSDLファイル
<?xml version="1.0"?> <definitions name="BPEL20TestCh10.4" targetNamespace="http://samples.otn.com/bpel2.0/ch10.4" xmlns:tns="http://samples.otn.com/bpel2.0/ch10.4" xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns="http://schemas.xmlsoap.org/wsdl/" > <types> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://samples.otn.com/bpel2.0/ch10.4" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="input" type="string"/> <element name="output" type="string"/> </schema> </types> <message name="TestRequestMessage"> <part name="payload" element="tns:input"/> </message> <message name="TestResultMessage"> <part name="payload" element="tns:output"/> </message> <portType name="Test"> <operation name="process"> <input message="tns:TestRequestMessage"/> <output message="tns:TestResultMessage"/> </operation> </portType> <plnk:partnerLinkType name="Test"> <plnk:role name="TestProvider" portType="tns:Test"/> </plnk:partnerLinkType> </definitions>
import
要素を使用して、BPELプロセスが依存する定義を指定できます。例6-80に示すように、バージョン2.0のBPELプロセスを作成すると、import
要素が.bpel
ファイルに追加されます。
例6-80 import要素
<process name="Loan Flow" . . . . . . <import namespace="http://xmlns.oracle.com/SOAApplication/SOAProject/LoanFlow" location="LoanFlow.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/>
例6-81に示すように、import
要素を使用して、ネームスペースのないスキーマをインポートすることもできます。
例6-81 ネームスペースのないスキーマのインポート
<process name="Loan Flow" . . . . . . <import location="xsd/NoNamespaceSchema.xsd" importType="http://www.w3.org/2001/XMLSchema"/>
例6-82に示すように、import
要素を使用して、ネームスペースを持つスキーマをインポートすることもできます。
例6-82 ネームスペースを持つスキーマのインポート
<process name="Loan Flow" . . . . . . <import namespace="http://www.example.org" location="xsd/TestSchema.xsd" importType="http://www.w3.org/2001/XMLSchema"/>
import
要素は、外部XMLスキーマまたはWSDL定義に対する依存性を宣言するために用意されています。任意の数のimport
要素をprocess
要素の子として表示できます。各import
要素には次の属性を含めることができます。
namespace
: インポートされた定義を指定する絶対URIを識別します。これはオプションの属性です。ネームスペースが指定されている場合、インポートされた定義はそのネームスペースに含まれている必要があります。ネームスペースが指定されていない場合、これはネームスペースで修飾されていない外部定義が使用中であることを示します。インポートされた定義にtargetNamespace
の指定を含めないでください。
location
: 重要な定義を含むドキュメントの場所を指定するURIを識別します。これはオプションの属性です。相対URIを指定できます。location
属性が指定されていない場合、プロセスでは外部定義が使用されます。ただし、これらの定義の配置先を示す文は指定されません。
importType
: インポートするドキュメントのタイプを識別します。これは、ドキュメントで使用されるエンコーディング言語を指定する絶対URIである必要があります。これは必須属性です。
XMLスキーマ1.0ドキュメントをインポートする場合は、この属性の値を"http://www.w3.org/2001/XMLSchema"
に設定する必要があります。
WSDL 1.1ドキュメントをインポートする場合は、値を"http://schemas.xmlsoap.org/wsdl/"
に設定する必要があります。この属性に他の値を指定することもできます。
詳細は、「Web Services Business Process Execution Language Specification Version 2.0」の第5.4項を参照してください。
データ・シーケンスは、XMLで使用される最も基本的なデータ・モデルの1つです。しかし、データ・シーケンスの操作が重要な場合があります。BPELプロセス・サービス・コンポーネントで使用される最も一般的なデータ・シーケンス・パターンの1つが配列です。XMLスキーマに基づき、データ・シーケンス定義はその属性maxOccurs
から識別できます。この属性が、1より大きい値に設定されているか、unboundedとしてマークされています。詳細は、http://www.w3.org/TR
のXML Schema Specificationを参照してください。
この項の例では、BPELのデータ・シーケンスを操作するいくつかの基本的な方法を示します。ただし、ループの実行、エンドポイントの動的参照など、関連するその他の要件が存在します。次の項では、データ・シーケンス操作の特定の要件について説明します。
必要な要素索引が設計時にわかっているとき、XPath機能を使用してデータ・シーケンス要素を選択する方法を次の2つの例で示します。これらのケースでは、最初の要素です。
例6-83の中で、addresses[1]
はアドレスのデータ・シーケンスの最初の要素を選択します。
例6-83 データ・シーケンス要素の選択
<assign> <!-- get the first address and assign to variable address --> <copy> <from variable="input" part="payload" query="/tns:invalidLoanApplication/autoloan:application /autoloan:customer/autoloan:addresses[1]"/> <to variable="address"/> </copy> </assign>
この問合せで、addresses[1]
はaddresses[position()=1]
と等価で、position
はコアXPath関数の1つです(「XML Path Language (XPath) Specification」の第2.4項と4.1項を参照してください)。例6-84の問合せでは、position
関数を明示的にコールして、アドレスのデータ・シーケンスの最初の要素を選択します。次に、そのアドレスのstreet
要素(アクティビティで変数street1
に割り当てられます)を選択します。
例6-84 position関数の使用
<assign> <!-- get the first address's street and assign to street1 --> <copy> <from variable="input" part="payload" query="/tns:invalidLoanApplication/autoloan:application /autoloan:customer/autoloan:addresses[position()=1] /autoloan:street"/> <to variable="street1"/> </copy> </assign>
WSDLファイルで入力変数の定義とそのペイロード・パートを確認する際、addressesフィールドの定義に到達するまでに、いくつかのレベルを下っていきます。そこで、maxOccurs="unbounded"
属性が見つかります。 2つのXPath索引付けメソッドは機能的には同じであり、どちらを使用してもかまいません。
Oracle SOA Suiteでは、SOAP RPCでエンコードされた配列をサポートしています。このサポートにより、Oracle BPEL Process Managerは、SOAP 1.1配列を使用するSOAP Webサービス(RPCでエンコードされた)をコールするクライアントとして機能できます。
例6-85に、myFavoriteNumbers
というSOAP配列ペイロードの例を示します。
例6-85 SOAP配列ペイロード
<myFavoriteNumbers SOAP-ENC:arrayType="xsd:int2">
<number>3</number>
<number>4</number>
</myFavoriteNumbers>
また、スキーマの要素の属性attributeFormDefault
およびelementFormDefault
が"unqualified"
に設定されていることを確認してください。例6-86に詳細を示します。
例6-86 スキーマ要素の属性
attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="java:services" xmlns:s0="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
次の機能はサポートされていません。
SOAP配列を使用するBPELによって公開されるサービス
部分的に送信される配列
スパース配列
多次元配列
SOAPでエンコードされた配列を使用する手順は、次のとおりです。
例6-87に、BPELプロジェクトにbpelx:append
タグの付いたSOAP配列を準備する手順を示します。
Oracle JDeveloperでBPELプロセスを作成します。
起動用のぺイロードを準備します。例6-87のbpelx:append
は、アイテムをSOAP配列に追加するために使用されます。
例6-87 SOAP配列
<bpws:assign> <bpws:copy> <bpws:from variable="input" part="payload" query="/tns:value"/> <bpws:to variable="request" part="strArray" query="/strArray/JavaLangstring"/> </bpws:copy> </bpws:assign> <bpws:assign> <bpelx:append> <bpelx:from variable="request" part="strArray" query="/strArray/JavaLangstring1"/> <bpelx:to variable="request" part="strArray" query="/strArray"/> </bpelx:append> </bpws:assign>
次のネームスペースをWSDLファイルにインポートします。WSDLスキーマ要素にインポート文が欠落している場合、Oracle JDeveloperではSOAP-ENC
タグを認識しません。
<xs:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
SOAPでエンコードされた配列は、BPEL仕様のバージョン2.0を使用するBPELプロジェクトでサポートされています。例6-88に、BPEL 2.0プロジェクトのSOAPでエンコードされた配列を持つassignアクティビティのサンプルを示します。
例6-88 BPEL 2.0のassignアクティビティのSOAPでエンコードされた配列
<assign name="Assign_1"> <copy> <from>$inputVariable.payload</from> <to>$Invoke_1_echoArray_InputVariable.strArray/JavaLangstring[1]</to> </copy> <extensionAssignOperation> <bpelx:append> <bpelx:from variable="Invoke_1_echoArray_InputVariable" part="strArray"> <bpelx:query> JavaLangstring[1] </bpelx:query> </bpelx:from> <bpelx:to variable="Invoke_1_echoArray_InputVariable" part="strArray"> </bpelx:to> </bpelx:append> </extensionAssignOperation> </assign>
例6-89に、BPEL 2.0プロジェクトのSOAPでエンコードされた配列を持つinvokeアクティビティのサンプルを示します。
データ・シーケンスの実行時のサイズ、つまりシーケンス内のノードまたはデータ項目の数を知る必要がある場合は、XPath組込み関数count()
とBPEL組込み関数getVariableData()
を組み合せて使用することで取得できます。
例6-90のコードは、item
シーケンス内の要素数を計算し、それを整数変数lineItemSize
に割り当てています。
多くの場合、データ・シーケンスへの索引付けに動的な値が必要になることがあります。つまり、シーケンスのn
番目のノード(n
の値は実行時に定義)の取得が必要な場合です。この項では、式の末尾にXPathを適用して動的な索引付けを行う方法について説明します。
例6-91に示す動的索引付け方法では、XPathをbpws:getVariableData()
の最後の引数として使用するのではなく、bwps:getVariableData()
の結果の末尾にXPathを適用します。末尾のXPathは、位置述語内の整数型の索引変数(つまり、[...]
)を参照します。
例6-91 動的索引付け
<variable name="idx" type="xsd:integer"/> ... <assign> <copy> <from expression="bpws:getVariableData('input','payload' )/p:line-item[bpws:getVariableData('idx')]/p:line-total" /> <to variable="lineTotalVar" /> </copy> </assign>
実行時に、idx
整数変数の値として2
が格納されるとします。前述のfrom
内の式は、例6-92の式と同等です
例6-92 同等のフォーマット
<from expression="bpws:getVariableData('input','payload' )/p:line-item[2]/p:line-total" />
XPathがbwps:getVariableData()
関数の末尾に使用される場合とこの関数内で使用される場合では、XPathの使用方法に多少の違いがあります。同じ例(payload
が要素p:invoice
のメッセージ・パートである例)を使用すると、XPathをgetVariableData()
関数内で使用する場合は、ルート要素名(/p:invoice
)をXPathの先頭に指定する必要があります。
例6-93に詳細を示します。
XPathをbwps:getVariableData()
関数の末尾に使用する場合、ルート要素名をXPath内に指定する必要はありません。
例:
bpws:getVariableData('input', 'payload')/p:line-item[2]/p:line-total
これは、getVariableData()
関数で返されるノードがルート要素であるためです。ルート要素名をXPathで再指定すると重複になり、XPathの標準セマンティクスでは不正となります。
assign
アクティビティでbpelx:append
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは既存の親要素に新しい要素を追加できます。例6-94に例を示します。
例6-94 bpelx:append拡張要素
<assign name="assign-3"> <copy> <from expression="bpws:getVariableData('idx')+1" /> <to variable="idx"/> </copy> <bpelx:append> <bpelx:from variable="partInfoResultVar" part="payload" /> <bpelx:to variable="output" part="payload" /> </bpelx:append> ... </assign>
この例のbpelx:append
ロジックにより、partInfoResultVar
変数のペイロード要素が、output
変数のペイロード要素に子として追加されます。つまり、output
変数のペイロード要素が親要素として使用されます。
2つのシーケンスを単一のデータ・シーケンスにマージできます。このパターンは、データ・シーケンスが配列内にある場合(つまり、互換性のあるタイプのデータ項目のシーケンスの場合)によく使用されます。例6-95に示すassign
の下の2つのappend
操作は、データ・シーケンスのマージ方法を示しています。
例6-95 append操作によるデータ・シーケンスのマージ
<assign> <!-- initialize "mergedLineItems" variable to an empty element --> <copy> <from> <p:lineItems /> </from> <to variable="mergedLineItems" /> </copy> <bpelx:append> <bpelx:from variable="input" part="payload" query="/p:invoice/p:lineItems/p:lineitem" /> <bpelx:to variable="mergedLineItems" /> </bpelx:append> <bpelx:append> <bpelx:from variable="literalLineItems" query="/p:lineItems/p:lineitem" /> <bpelx:to variable="mergedLineItems" /> </bpelx:append> </assign>
genEmptyElem
関数では、空要素の配列と等価の機能がXML構造に生成されます。この関数は、次の引数をとります。
genEmptyElem('ElemQName',int?, 'TypeQName'?, boolean?)
次の点に注意してください。
最初の引数では、空要素のQName
を指定します。
2番目の引数はオプションで整数型であり、空要素の数を指定します。指定されていない場合、デフォルトのサイズは1
です。
3番目の引数はオプションで、生成される空の名前のxsi:type
となるQName
を指定します。このxsi:type
パターンは、SOAPENC:Array
に相当します。指定されていないか、空の文字列である場合、xsi:type
属性は生成されません。
4番目のオプションのブール型引数は、要素がXSD-nillableの場合に、生成される空の要素がXSI - nil
かどうかを指定します。デフォルト値はfalse
です。指定されていないか、false
である場合、xsi:nil
は生成されません。
例6-96に、po
の下で10
個の空の<lineItem>
要素を使用して注文書(PO)を初期化するappend
文を示します。
例6-96 append文
<bpelx:assign> <bpelx:append> <bpelx:from expression="ora:genEmptyElem('p:lineItem',10)" /> <bpelx:to variable="poVar" query="/p:po" /> </bpelx:append> </bpelx:assign>
例6-96のgenEmptyElem
関数は、例6-97のように埋込みXQuery式で置き換えることができます。
この関数により生成される空要素は、通常は無効なXMLデータです。空要素の作成後に、さらにデータの初期化を実行します。前述と同じ例を使用して、次の操作を実行できます。
空のlineItem
要素に属性要素と子要素を追加します。
copy
操作を実行して空要素を置き換えます。たとえば、flowNアクティビティの下で、この等価配列内の個別エントリにWebサービスの結果からコピーします。
ネイティブ・フォーマット・ビルダー配列識別子環境での処理には、ノードの親ノードに関する情報が必要です。reportSAXEvents
APIが使用されるため、通常、この情報はアウトバウンド・メッセージ・シナリオには使用できません。ネイティブ・スキーマのnxsd:useArrayIdentifiers
をtrue
に設定することで、アウトバウンド・メッセージ・シナリオにDOM解析を使用できるようになります。大規模なペイロードによりパフォーマンスの低下につながる可能性があるため、この設定には注意が必要です。例6-98に詳細を示します。
例6-98 配列識別子
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
elementFormDefault="qualified"
attributeFormDefault="unqualified" nxsd:encoding="US-ASCII"
nxsd:stream="chars" nxsd:version="NXSD" nxsd:useArrayIdentifiers="true">
<xsd:element name="Root-Element">
....
</xsd:element>
</xsd:schema>
サービスは文字列を返すように定義されることがありますが、文字列の内容は実際にはXMLデータです。問題は、BPELではXMLデータの操作(XPath問合せや式などを使用)はサポートされていますが、変数またはフィールドが文字列型の場合にこの機能が使用できないことです。Javaでは、DOM関数を使用して文字列を構造化されたXMLオブジェクト・タイプに変換します。同じことが、BPEL XPath関数parseEscapedXML
を使用して実行できます。
parseEscapedXML
の詳細は、B.2.50項「parseEscapedXML」を参照してください。
parseEscapedXML
関数はXMLデータを受け取り、DOMによって解析し、型指定されたBPEL変数に割当て可能な構造化XMLデータを返します。例6-99に例を示します。
例6-99 文字列からXML要素への変換
<!-- execute the XPath extension function parseEscapedXML('<item>') and assign to a variable --> <assign> <copy> <from expression="oratext:parseEscapedXML( '<item xmlns="http://samples.otn.com" sku="006"> <description>sun ultra sparc VI server </description> <price>1000 </price> <quantity>2 </quantity> <lineTotal>2000 </lineTotal> </item>')"/> <to variable="escapedLineItem"/> </copy> </assign>
前述のすべての例はドキュメント形式のWSDLファイルに対応しており、メッセージは例6-100に示すようにXMLスキーマのelement
で定義されます。
例6-100 XMLスキーマ要素の定義
<message name="LoanFlowRequestMessage"> <part name="payload" element="s1:loanApplication"/> </message>
これは、例6-101に示すように、メッセージがXMLスキーマのtype
で定義される、RPC形式のWSDLファイルとは異なります。
例6-101 RPC形式タイプ定義
<message name="LoanFlowRequestMessage"> <part name="payload" type="s1:LoanApplicationType"/> </message>
2つのWSDLメッセージ形式ではXPath問合せの構成方法に違いがあるため、これはこの章の記述に影響します。RPC形式のメッセージの場合、最上位要素(およびXPath問合せ文字列の最初のノード)はパート名(例6-101ではpayload
)です。ドキュメント形式では、最上位ノードは要素名(たとえばloanApplication
)です。
例6-102および例6-103は、LoanServices
という名前のアプリケーションがRPC形式の場合に、XPath問合せ文字列がどのようになるかを示しています。
例6-102 RPC形式のWSDLファイル
<message name="LoanServiceResultMessage"> <part name="payload" type="s1:LoanOfferType"/> </message> <complexType name="LoanOfferType"> <sequence> <element name="providerName" type="string"/> <element name="selected" type="boolean"/> <element name="approved" type="boolean"/> <element name="APR" type="double"/> </sequence> </complexType>
BPELの通信アクティビティ(invoke、receive、replyおよびonMessage)は、指定のメッセージ変数を介してメッセージを送受信します。これらのデフォルト・アクティビティでは、各方向で1つの変数の操作が許可されます。たとえば、invokeアクティビティにはinputVariable
およびoutputVariable
属性があります。この2つの属性にそれぞれ変数を1つ指定できます。関連する特定の操作で使用するペイロード・メッセージが各方向で1つのみの場合は、これで十分です。
ただし、WSDLは1つの操作での複数のメッセージをサポートしています。SOAPの場合、SOAPヘッダーとしてメイン・ペイロード・メッセージとともに複数のメッセージを送信できます。ただし、BPELのデフォルトの通信アクティビティは、追加のヘッダー・メッセージに対応できません。
Oracle BPEL Process Managerでは、デフォルトのBPEL通信アクティビティをbpelx:headerVariable
拡張要素で拡張することで、この問題を解決しています。例6-104に、拡張要素の構文を示します。
例6-104 bpelx:headerVariable拡張要素
<invoke bpelx:inputHeaderVariable="inHeader1 inHeader2 ..." bpelx:outputHeaderVariable="outHeader1 outHeader2 ..." .../> <receive bpelx:headerVariable="inHeader1 inHeader2 ..." .../> <onMessage bpelx:headerVariable="inHeader1 inHeader2 ..." .../> <reply bpelx:headerVariable="inHeader1 inHeader2 ..." .../>
この項では、SOAPヘッダーを受信するBPELファイルとWSDLファイルの作成方法を、例を挙げて説明します。
BPELでSOAPヘッダーを受信する手順は、次のとおりです。
ヘッダー・メッセージとそれをSOAPリクエストにバインドするSOAPバインディングを宣言するWSDLファイルを作成します。例6-105に例を示します。
例6-105 WSDLファイルのコンテンツ
<!-- custom header --> <message name="CustomHeaderMessage"> <part name="header1" element="tns:header1"/> <part name="header2" element="tns:header2"/> </message> <binding name="HeaderServiceBinding" type="tns:HeaderService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="initiate"> <soap:operation style="document" soapAction="initiate"/> <input> <soap:header message="tns:CustomHeaderMessage" part="header1" use="literal"/> <soap:header message="tns:CustomHeaderMessage" part="header2" use="literal"/> <soap:body use="literal"/> </input> </operation> </binding>
例6-106に示すように、ヘッダー・メッセージ変数を宣言し、bpelx:headerVariable
を使用してヘッダーを受信するBPELソース・ファイルを作成します。
例6-106 bpelx:headerVariableの使用
<variables> <variable name="input" messageType="tns:HeaderServiceRequestMessage"/> <variable name="event" messageType="tns:HeaderServiceEventMessage"/> <variable name="output" messageType="tns:HeaderServiceResultMessage"/> <variable name="customHeader" messageType="tns:CustomHeaderMessage"/> </variables> <sequence> <!-- receive input from requester --> <receive name="receiveInput" partnerLink="client" portType="tns:HeaderService" operation="initiate" variable="input" bpelx:headerVariable="customHeader" createInstance="yes"/>
この項では、SOAPヘッダーの送信方法を例を挙げて説明します。
BPELでSOAPヘッダーを送信する手順は、次のとおりです。
composite.xml
でSCA参照を定義して、HeaderService
を参照します。
例6-107に示すように、カスタム・ヘッダー変数を定義して操作し、bpelx:inputHeaderVariable
を使用して送信します。
例6-107 bpelx:inputHeaderVariableの使用
<variables> <variable name="input" messageType="tns:HeaderTestRequestMessage"/> <variable name="output" messageType="tns:HeaderTestResultMessage"/> <variable name="request" messageType="services:HeaderServiceRequestMessage"/> <variable name="response" messageType="services:HeaderServiceResultMessage"/> <variable name="customHeader"messageType="services:CustomHeaderMessage"/> </variables> ... <!-- initiate the remote process --> <invoke name="invokeAsyncService" partnerLink="HeaderService" portType="services:HeaderService" bpelx:inputHeaderVariable="customHeader" operation="initiate" inputVariable="request"/>
バージョン2.0のBPELプロセスを拡張して、カスタム拡張ネームスペース宣言を追加できます。mustUnderstand
属性を使用すると、カスタム・ネームスペースがBPELプロセスで認識される必要があるセマンティックを持つかどうかを示すことができます。
mustUnderstand
がyes
に設定された1つ以上の拡張機能がBPELプロセスでサポートされていない場合、プロセス定義は拒否されます。
拡張機能はextensions
要素に定義されます。例6-108に詳細を示します。
例6-108 拡張ネームスペース宣言の構文
<process ...> ... <extensions>? <extension namespace="myURI" mustUnderstand="yes|no" />+ </extensions> ... </process>
extension
要素のコンテンツは、標準のBPELネームスペースとは異なるネームスペースで修飾された1つの要素である必要があります。
拡張宣言の詳細は、次のURLにある「Web Services Business Process Execution Language Version 2.0 Specification」を参照してください。
http://www.oasis-open.org
拡張ネームスペースを宣言する手順は、次のとおりです。
BPEL 2.0プロセスで、Oracle BPELデザイナの上にある「拡張機能」アイコンをクリックします。
「拡張機能」ダイアログが表示されます。
「拡張機能」フォルダを選択し、「追加」アイコンをクリックします。
「拡張機能」ダイアログが表示されます。
「ネームスペース」フィールドに、宣言する拡張ネームスペースを入力します。このネームスペースは、標準のBPELネームスペースとは異なるものにする必要があります。
拡張機能がBPELプロセスで認識されるようにするには、「認識する必要がある」チェック・ボックスを選択します。
「OK」をクリックします。
「閉じる」をクリックします。