この章の内容は次のとおりです。
注意:
この章の大部分の例では、関連するメッセージ・タイプを定義するWSDLファイルは、Remote Procedure Call (RPC)形式ではなくドキュメント・リテラル形式であると想定しています。RPC形式のWSDL定義の場合、XPath問合せ文字列の構成方法に違いがあります。RPCのWSDLファイルで定義されたタイプを使用する場合は、「ドキュメント形式とRPC形式のWSDLの違いの理解」を参照してください。
この項では、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要素は、互換性のあるタイプの割当てのソースとターゲット(コピー先とコピー元の内容)を指定します。
次の例に、に記載されているBPELバージョン1.1の正式な構文を示します。
<assign standard-attributes> standard-elements <copy> from-spec to-spec </copy> </assign>
次の例に、に記載されている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
は、次の例に示すように、変数または変数パートを指定します。
<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属性を含めることができます。次にコードの例を示します。
<from variable="input" part="payload" query="/p:CreditFlowRequest/p:ssn"/>
query属性の値には、ノードを1つのみ選択するロケーション・パスを指定する必要があります。query
属性およびXPath標準の構文の詳細は、それぞれ(第14.3項)または(第8.4項)およびを参照してください。
XPath式
XPath式(from
句のexpression
属性で指定)を使用して、変数に格納する値を指定します。次に例を示します。
<from expression="100"/>
式には一般的な式(つまり、任意のXPath値のタイプに評価されるXPath式)を指定できます。同様に、式属性の値がコピー操作内のfrom
句で使用される場合、式属性の値は必ず1つのノードまたは1つのオブジェクトのみを返す必要があります。XPath式の詳細は、の第9.1.4項を参照してください。
XPath式内では、次の種類の関数をコールできます。
コアXPath関数
XPathでは、文字列操作関数(concat
など)や数値関数(sum
など)を含む多数の組込み関数がサポートされています。
<from expression="concat('string one', 'string two')"/>
XPath標準に組み込まれた関数の完全なリストは、の第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"/>
詳細は、の第9.1項および第14.1項を参照してください。getVariableData
の詳細は、「getVariableData」を参照してください。
BPEL 2.0の場合も、拡張関数は標準BPELネームスペースhttp://schemas.xmlsoap.org/ws/2003/03/business-process/
で定義されます。ただし、接頭辞はbpel
:になります。
<from>bpel:getVariableProperty('input', 'propertyName')</from>
詳細は、の第8.3項を参照してください。getVariableProperty
の詳細は、「getVariableProperty (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
ファイルに格納されます。詳細は、「ユーザー定義XPath拡張関数の作成」を参照してください。
高度なデータ操作をBPELのassignアクティビティやコアXPath関数で実行するのは困難な場合があります。ただし、複雑なデータ操作やデータ・トランスフォーメーションは、XSLT、Java、またはassignアクティビティのbpelx
操作(「bpelx拡張要素を使用したXMLデータの操作」を参照)を使用したり、Webサービスとして実行することができます。XSLTの場合、には、これらのトランスフォーメーションを実行するXPath関数が組み込まれています。
XPathおよびXQueryトランスフォーメーション・コード例の詳細は、「XSLTマップ・エディタを使用したトランスフォーメーションの作成」および「XQueryマッパーを使用したトランスフォーメーションの作成」を参照してください。
assignアクティビティの詳細は、「Assignアクティビティ」を参照してください。
注意:
assignアクティビティ経由で大きいスキーマが渡されると、「Assignの編集」ダイアログのターゲットまたはソース・ペイロード・ノードを右クリックして「すべての子ノードを開く」を選択した場合に、Oracle JDeveloperが停止したり、メモリー不足になる可能性があります。回避策として、ペイロード要素は手動で開いてください。
エンティティ変数を使用して、基礎となるデータ・プロバイダ・サービスがBPELデータ操作を実行するように指定できます。データ・プロバイダ・サービスはデータ・ストア内でデータ操作をバックグラウンドで実行しますが、Oracle SOA Suiteが提供する他のデータ・ストア関連の機能(たとえば、データベース・アダプタ)を使用しません。これにより、Oracle SOA Suiteの実行時パフォーマンスが向上し、コンパイルおよび実行時に、基礎となるデータ・プロバイダ・サービスのネイティブ機能が組み込まれます。
エンティティ変数は、SDOベースのデータを使用してOracle Application Development Framework (ADF) Business Componentデータ・プロバイダ・サービスと一緒に使用できます。
11gより前のリリースでは、BPELビジネス・プロセス内で交換された変数およびメッセージは、XML構造に組み込まれる分離されたペイロード(Webサービスから返されるデータのスナップショット)でした。ある場合では、ユーザーにはこの構成要素タイプが必要でした。別の場合では、この構成要素は難題でした。
エンティティ変数は、次のような11gより前のリリースの問題に対応しています。
拡張データ変換
基礎となるデータがXML形式でない場合は、データ変換(デリミタ付きテキストからXMLへの変換など)が必要でした。基礎となるデータのサイズが大きい場合、処理はパフォーマンスに影響を与える場合がありました。
失効したスナップショット・データ
(WSDLメッセージを含めて)BPEL内の変数は分離されたペイロードでした。これが必要な場合もありました。別の場合では、Oracle BPEL Process Managerの外部にある他のアプリケーションによって変数が最新データに変更されて表示されることが必要でした。つまり、分離されたデータ・モデルでは、すべてのニーズを満たさない失効したデータ・セットが提供されていました。また、スナップショットによってデータが重複するため、データ・サイズが大きい場合はパフォーマンスに影響を与えていました。
ネイティブ・データ動作の損失
一部のデータ変換の実装には、XMLスキーマの範囲外のデータ構造の適用またはビジネス・データ・ロジックが必要でした。たとえば、開始日は終了日より前である必要があります。変数が分離されたペイロードの場合は、関連するWebサービスの起動中にのみ検証が実行されました。特定の操作後(ただしWebサービスの起動前)に、特別なビジネス・データ・ロジックを必要に応じて実行することが推奨される場合がありました。
リリース11gからリリース12cまででこれらの課題に対応するには、変数宣言時にエンティティ変数を作成します。エンティティ変数は、バックグラウンドで様々なデータ・プロバイダ・サービス・テクノロジにアクセスし、プラグインするためのデータ・ハンドルとして機能します。コンパイルおよび実行時に、Oracle BPEL Process Managerは基礎となるデータ・プロバイダ・サービスにデータ操作を委任します。
表6-1では、以前のリリース(例としてデータベース・アダプタを使用)と、エンティティ変数を使用するリリース11gと12cで、データ変換がどのように実行されるかを説明します。
表6-1 以前および現在のリリースでのデータ操作機能
10.1.xリリース | エンティティ変数を使用する場合の11gと12cのリリース |
---|---|
データを明示的にロードして保存するようなデータ操作は、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と12cでもサポートされています。
この項では、Oracle JDeveloperでエンティティ変数とバインディング・キーを作成する方法について説明します。
Oracle BPEL Process Managerのリリース10.1.xでは、すべての変数データはDOM形式でした。リリース11g以降、リリース12cでも、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に示すように、コンポジット・アプリケーションへのエントリ・ポイントを外部に提供します。
およびOracle BPELデザイナを使用して次のタスクを実行します。
SDOバインディング・コンポーネント・サービスとBPELプロセス・サービス・コンポーネントをコンポジット・アプリケーションに定義します。
SDOサービスとBPELプロセス・サービス・コンポーネントを接続(ワイヤ)します。
BPELプロセス・サービス・コンポーネントの詳細を定義します。
の使用方法の詳細は、「SOAコンポジット・アプリケーションの開発のスタート・ガイド」を参照してください。
図6-2に示すように、SDOバインディング・コンポーネント参照を使用すると、コンポジット・アプリケーションからOracle ADF Business Componentアプリケーションの外部のパートナにメッセージを送信できます。
Oracle ADF Business Componentアプリケーションが外部へのパートナ・リンクの場合、には、アウトバウンド通信を作成するためにコンポジット・アプリケーションにドラッグする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アプリケーションのために、エンティティ変数を作成し、パートナ・リンクを選択します。次の例は、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すために、bind entityアクティビティを使用して、OrderProcessor BPELプロセス・サービス・コンポーネントが注文IDを受け取る方法を示しています。
注意:
エンティティ変数は、BPEL仕様のバージョン1.1または2.0を使用するBPELプロジェクトでサポートされています。
エンティティ変数を作成し、パートナ・リンクを選択する手順は、次のとおりです。
ここでは、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すキーを作成します。
バインディング・キーを作成する手順は、次のとおりです。
SDOを使用する方法の詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』を参照してください。このガイドには、アプリケーション・モジュールをWebサービスとして公開する方法や、表示データ・オブジェクトの行をSDOとして公開する方法が記載されています。アプリケーション・モジュールは、ビジネス・ロジックを関連する一連のビジネス機能としてカプセル化するADFフレームワーク・コンポーネントです。
BPELプロセス変換アクティビティにより、ネイティブXSDフォーマットとXMLフォーマットとの間でメッセージを変換できます。次の変換タイプがサポートされています。
インバウンド変換:
ネイティブ・フォーマットからXMLへ
不透明からXMLへ
ネイティブからディレクトリの添付ファイルへ
アウトバウンド変換:
XMLからネイティブ・フォーマットへ
XMLからディレクトリの添付ファイルへ
BPEL 1.1と.2.0の両方のプロジェクトでサポートされています。
インバウンド・メッセージ変換では自動的に、doTranslateFromNative
関数を使用します。アウトバウンド・メッセージ変換では自動的に、doTranslateToNative
関数を使用します。assignアクティビティを作成して「式ビルダー」ダイアログを起動し、これらの関数を構成する必要はありません。translateアクティビティは、assignアクティビティを自動的に生成します。
この項では、インバウンド・メッセージをネイティブXSDフォーマット(この例では、文字列データ)で受信しXMLフォーマットに変換するために、変換アクティビティをBPELプロセスで構成方法について説明します。ネイティブ・フォーマット・ビルダー・ウィザードを使用して、新しいスキーマ・ファイルを作成します。
ネイティブ・データをXMLデータに変換する手順は、次のとおりです。
BPELプロセスをSOAコンポジット・エディタで右クリックし、「編集」を選択します。
Oracle BPELデザイナが表示されます。
「コンポーネント」ウィンドウの「Oracle Extensions」セクションを展開し、変換アクティビティをBPELプロセスにドラッグします。図6-7に詳細を示します。
変換アクティビティを右クリックし、「編集」を選択します。
「変換」ダイアログが編集用に表示されます。
NativeからXMLにを選択して、インバウンド・ネイティブ・データ(この例では、単一の文字列)を受信します。
「入力」フィールドの右側にある「参照」アイコンをクリックします。
「変数XPathビルダー」ダイアログが表示されます。
XMLフォーマットに変換するインバウンド・ペイロードの一部であるネイティブ文字列を選択して、「OK」をクリックします。図6-8に詳細を示します。
「NXSDスキーマ」フィールドの右側で、使用するスキーマを選択します。
スキーマが存在する場合、「検索」(1番目)アイコンを選択し、「タイプ・チューザ」ダイアログを起動します。
スキーマが存在しない場合、2番目のアイコンを選択して、ネイティブ・フォーマット・ビルダー・ウィザードを起動し、スキーマを作成します。
次の例では、ネイティブ・フォーマット・ビルダー・ウィザードを使用して、カンマ区切りデリミタを使用するテキスト・ファイルから新規スキーマを作成する方法について説明しています。
「ファイル名とディレクトリ」ダイアログの「ファイル名」フィールドで、名前を入力し、「次へ」をクリックします。
「タイプの選択」ダイアログで、「デリミタ付き(フィールドが特殊文字で区切られているレコードが含まれています)」を選択し、「次へ」をクリックします。
「ファイルの説明」ダイアログで、「参照」 をクリックし、カンマ区切りデリミタを使用するテキスト・ファイルを選択します。
「サンプル・ファイルの選択」ダイアログが表示されます。
使用するファイルを選択して「OK」をクリックします。
このファイルの内容が、「ファイルの説明」ダイアログの下部に表示されます。図6-9に詳細を示します。
「次へ」をクリックします。
「レコード編成」で、「次へ」をクリックします。
「要素の指定」ダイアログで、レコードを示す要素の名前を入力(この例では、addr
を入力)し、「次へ」をクリックします。
フィールドをテキスト・ファイルで区切る特殊文字としてカンマのデフォルト値を「デリミタの指定」ダイアログで受け入れ、「次へ」をクリックします。
「フィールド・プロパティ」ダイアログの「名前」列で、「C1」、「C2」、「C3」、「C4」、「C5」および「C6」のかわりに適切な値を入力し、「次へ」をクリックします。図6-10に詳細を示します。
新しいスキーマが生成されたネイティブ・フォーマット・スキーマ・ダイアログに表示されます。
「テスト」をクリックして、スキーマをテストします。
「結果XML」セクションで、緑色の矢印をクリックします。
ネイティブ・スキーマとその結果のXMLが表示されます。図6-11に詳細を示します。
「OK」をクリックして、生成されたネイティブ・フォーマット・スキーマ・ダイアログに戻ります。
「次へ」、「終了」、の順にクリックします。
addr_schema1.xsdファイルが生成され、「変換」ダイアログの「NXSDスキーマ」フィールドに表示されます。
「出力タイプ」リストから、「DOM」を選択します。「DOM」を選択した場合、DOMとSDOMの両方がサポートされます。
「出力」フィールドの右側で、スキーマの変数を選択します。
手順7で指定されたスキーマに準拠している出力変数がある場合、「検索」(1番目)アイコンをクリックし、既存の変数を選択します。
既存の変数がない場合、「追加」(2番目)アイコンをクリックし、「変数の作成」ダイアログを起動します。デフォルト値をそのまま使用するか、変数の名前を変更して出力変数を作成して、「OK」をクリックします。手順7で作成されたスキーマを変数は自動的に指します。
完成すると、「変換」ダイアログは図6-12のようになります。
同期リクエストの出力は、新しいスキーマを指すように変更する必要があります。
「アプリケーション」ウィンドウで、BPELプロセスのWSDLファイル(この例では、BPELProcess1.wsdlという名前)を選択します。
Oracle BPELデザイナの下部で、「ソース」をクリックします。
WSDLファイルの<wsdl:message>セクションまでスクロールします。
レスポンス要素(この例では、名前はprocessResponse)をBPELProcess1ResponseMessageメッセージ用にクリックし、プロパティ・インスペクタを右下の隅で起動します。図6-13に詳細を示します。
プロパティ・インスペクタで新規ルート要素を選択します(この例では、ns1:addr)。図6-14に詳細を示します。
ns1:addrルート要素がWSDLファイルに追加されています。図6-15に詳細を示します。
変換アクティビティの下にあるBPELプロセスにassignアクティビティをドラッグします。
変換出力変数をBPEL出力変数に割り当てます。
assignアクティビティの「コピー・ルール」タブで、変数をマップし、「OK」をクリックします。図6-16に詳細を示します。
これで、設計は完了します。
この項では、受信したXMLメッセージをネイティブ・データ・フォーマット(カンマ区切り文字列など)に変換する方法について説明します。この例では、「ネイティブ・データからXMLデータへの変換方法」で作成したスキーマ・ファイルをネイティブXSDフォーマットに変換するためのアウトバウンドXMLフォーマットとして使用しています。
XMLフォーマットをネイティブ・データに変換する手順は、次のとおりです。
スタンドアロンSDOベースの変数は、通常のBPEL XML-DOMベースの変数と類似しています。主な違いは、基礎となるデータ形式がDOMベースではなくSDOベースであることです。したがって、SDOベースの変数は、Java APIアクセス、簡単に使用できる最新のAPI、変更内容のサマリーなど、様々なSDO機能を使用できます。ただし、SDOを使用する場合は、XML-DOMベースの変数を使用する場合にはない複数の制限も適用されます。最も顕著な制限は、SDOがXPath式の小さいサブセットのみをサポートしていることです。
SDOベースの変数を宣言するための構文は、BPEL変数を宣言する構文と類似しています。次の例に詳細を示します。
<variable name="deptVar_s" element="hrtypes:dept" /> <variable name="deptVar_v" element="hrtypes:dept" bpelx:sdoCapable="false" />
自動検出を無効にする場合は、bpelx:sdoCapable="true|false"
スイッチを使用します。たとえば、ここでのサンプルの変数deptVar_v
は通常のDOMベースの変数です。次に、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
がサポートされないなど)。
次に、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>
次に、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>
次に、SDOデータを削除する例を示します。
<assign> <bpelx:remove> <bpelx:target variable="deptVar_s" query="hrtypes:Emp[2]" /> </bpelx:remove> </assign>
注意:
SDOベースの変数に対するbpelx:append
操作は、次の理由によりサポートされていません。
SDOベースの変数に対する<copy>
操作には、高性能な更新機能があります(<copy>
操作の前に<bpelx:append>
操作を実行する必要がないなど)。
SDOデータ・オブジェクトはメタデータ駆動で、一般的に新しいプロパティを任意に追加することがサポートされていません。
BPELでは、リテラルXMLを変数に代入する方法が役立つことがよくあります(たとえば、動的データを変数に対するXMLデータ・コンテンツ内の特定のフィールドにコピーする前に、変数を初期化する場合などです)。また、XMLデータ値をプロセスにハード・コーディングするときのテストにも役立ちます。assignアクティビティの「コピー・ルール」タブで「リテラル」アイコンをターゲット・ノードにドラッグすることによって、リテラルXMLを割り当てます。
assignアクティビティでのリテラルXMLの割当ての詳細は、「Assignアクティビティ」を参照してください。
次の例では、リテラルのresult
要素をoutput
変数のpayload
パートに割り当てます。
<assign> <!-- copy from literal xml to the variable --> <copy> <from> <result xmlns="http://samples.otn.com"> <name/> <symbol/> <price>12.3</price> <quantity>0</quantity> <approved/> <message/> </result> </from> <to variable="output" part="payload"/> </copy> </assign>
変数間のコピーでは、1つの変数(またはパート)から互換性のあるタイプの別の変数に直接コピーします。どちらの変数でも特定のフィールドを指定する必要はありません。つまり、XPath問合せを指定する必要はありません。
図6-25に示すように、「Assignの編集」ダイアログの「コピー・ルール」タブで、変数のコピーを実行します。
「コピー・ルール」タブの詳細は、「bpelx拡張要素を使用したXMLデータの操作」および「Assignアクティビティ」を参照してください。
次の例は、2つの割当ての実行を示しています。最初に同じタイプの2つの変数の間でコピーを実行し、次に変数パートをそのパートと同じタイプの別の変数にコピーします。
<assign> <copy> <from variable="c1"/> <to variable="c2"/> </copy> <copy> <from variable="c1" part = "address"/> <to variable="c3"/> </copy> </assign>
次の例に示すように、BPELファイルは変数を定義します。
<variable name="c1" messageType="x:person"/> <variable name="c2" messageType="x:person"/> <variable name="c3" element="y:address"/>
次の例に示すように、WSDLファイルはperson
メッセージ・タイプを定義します。
<message name="person" xmlns:x="http://tempuri.org/bpws/example"> <part name="full-name" type="xsd:string"/> <part name="address" element="x:address"/> </message>
このコード例の詳細は、の第9.3.2項を参照してください。BPEL 2.0の場合は、の第8.4.4項の類似した例を参照してください。
詳細は、「Assignアクティビティ」を参照してください。
インラインfrom-spec
を使用することで、必要に応じて変数を初期化できます。このタイプの変数を作成するには、BPEL 2.0プロジェクトの「変数の作成」ダイアログで「初期化」タブをクリックします。図6-26に詳細を示します。
インライン変数の初期化は、概念的には、変数宣言に表示される順序でそれぞれが初期化された、一連の仮想assignアクティビティを含む1つの仮想sequenceアクティビティとして設計されます。各仮想assignアクティビティには、from-spec
が変数の初期化で指定されている1つの仮想コピー操作が含まれます。to-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>
詳細は、の第8.1項を参照してください。
Oracle JDeveloperの「構造」ウィンドウでは、scopeアクティビティ間で変数を移動およびコピーできます。
「構造」ウィンドウで、scopeアクティビティに移動する変数を選択します。
[Ctrl]キーを押したままにします。
scopeアクティビティの「変数」フォルダに変数をドラッグします。
両方の「変数」フォルダに変数が表示されます(図6-30を参照)。
ほとんどのWSDLファイルやXSDファイルに定義のタイプが存在する場合は、要素およびメッセージ・タイプに基づいて変数パート内のコピー元またはコピー先フィールドのレベルに移動する必要があります。そこで、XMLスキーマの複合型を順に使用します。このアクションを実行するには、assignアクティビティの「コピー・ルール」タブのfrom
句またはto
句にXPath問合せを指定します。
「コピー・ルール」タブの詳細は、「bpelx拡張要素を使用したXMLデータの操作」および「Assignアクティビティ」を参照してください。
次の例では、ssn
フィールドはCreditFlow
プロセスの入力メッセージから信用格付けサービスの入力メッセージのssn
フィールドにコピーされます。
<assign> <copy> <from variable="input" part="payload" query="/tns:CreditFlowRequest/tns:ssn"/> <to variable="crInput" part="payload" query="/tns:ssn"/> </copy> </assign>
次の例に、この割当てに必要なメッセージ・タイプベースの変数をBPELファイルで定義する方法を示します。
<variable name="input" messageType="tns:CreditFlowRequestMessage"/> <variable name="crInput" messageType="services:CreditRatingServiceRequestMessage"/>
crInput
変数は、信用格付けサービスへの入力メッセージとして使用されます。そのメッセージ・タイプCreditFlowRequestMessage
は、次の例に示すように、CreditFlowService.wsdl
ファイルで定義されます。
<message name="CreditFlowRequestMessage"> <part name="payload" element="tns:CreditFlowRequest"/> </message>
CreditFlowRequest
は、ssn
という名前のフィールドで定義されます。メッセージ・タイプCreditRatingServiceRequestMessage
は、次の例に示すように、CreditRatingService.wsdl
ファイルで定義されます。
<message name="CreditRatingServiceRequestMessage"> <part name="payload" element="tns:ssn"/> </message>
次の例に、最初の割当て例の割当てに含まれるメッセージ・タイプベース変数をBPELファイルで定義する方法のBPEL 2.0の構文を示します。/tns:CreditFlowRequest
は不要であることに注意してください。
<copy> <from>$input.payload/tns:ssn</from> <to>$crInput.payload</to> </copy>
BPELプロセスでは、要素ベースの変数も使用できます。次の例に、BPEL 1.1で要素ベースの変数を使用する方法を示します。autoloan
フィールドは融資申請プロセスの入力メッセージからWebサービスの入力メッセージのcustomer
フィールドにコピーされます。
<assign> <copy> <from variable="input" part="payload" query="/tns:invalidLoanApplication/autoloan: application/autoloan:customer"/> <to variable="customer"/> </copy> </assign>
次の例に、BPEL 2.0で要素ベースの変数を使用する方法を示します。
<assign> <copy> <from>$input.payload/autoloan:application/autoloan:customer</from> <to>$customer</to> </copy> </assign>
次の例に、割当てに必要な要素ベースの変数をBPELファイルで定義する方法を示します。
<variable name="customer" element="tns:customerProfile"/>
次の項の式のように、単純な計算式を使用して、数値を増分させることができます。
次の例では、BPEL XPath関数getVariableData
により、増分した値が取得されます。getVariableData
への引数は、from
句のvariable、partおよびquery属性と同じです(オプションの最後の2つの引数を含む)。
<assign> <copy> <from expression="bpws:getVariableData('input', 'payload', '/p:value') + 1"/> <to variable="output" part="payload" query="/p:result"/> </copy> </assign>
また、次の例に示すように、BPEL 1.1で$variable
構文を使用することもできます。
<assign> <copy> <from expression="$input.payload + 1"/> <to variable="output" part="payload" query="/p:result"/> </copy> </assign>
次の例に、BPEL 2.0で$variable
構文を使用する方法を示します。
<assign> <copy> <from>$input.payload + 1</from> <to>$output.payload</to> </copy> </assign>
assignアクティビティの「コピー・ルール」タブで、文字列リテラルを変数に割り当てることができます。
assignアクティビティの詳細は、「bpelx拡張要素を使用したXMLデータの操作」および「Assignアクティビティ」を参照してください。
次の例のコードは、文字列リテラル'GE'
から評価されるBPEL 1.1式を、指定された変数パート内のsymbolフィールドにコピーしています。(二重引用符および一重引用符を使用していることに注意してください)。
<assign> <!-- copy from string expression to the variable --> <copy> <from expression="'GE'"/> <to variable="output" part="payload" query="/p:result/p:symbol"/> </copy> </assign>
次の例に、BPEL 2.0でこの式を実行する方法を示します。
<assign> <copy> <from>'GE'</from> <to>$output.payload/p:symbol</from> </copy> </assign>
詳細は、「Assignアクティビティ」を参照してください。
1つの文字列変数(または変数パート、フィールド)の値を別の文字列変数にコピーするのではなく、いくつかの文字列を連結するなどの文字列操作を最初に実行できます。
連結は、concat
というコアXPath関数を使用して実行します。また、連結に含まれる変数値は、BPEL XPath関数getVariableData
を使用して取得します。次の例では、getVariableData
がinput
変数のpayload
パートからname
フィールドの値をフェッチします。次に、文字リテラル'Hello '
が、この値の先頭に連結されます。
<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で使用できるその他の文字列操作関数は、の第4.2項にリストされています。
XPathブール関数を使用してブール値を割り当てることができます。
次の例に、BPEL 1.1でブール値を割り当てる例を示します。from
句のXPath式は、XPathブール関数true
のコールであり、指定されたapprovedフィールドがtrue
に設定されます。関数false
も使用できます。
<assign> <!-- copy from boolean expression function to the variable --> <copy> <from expression="true()"/> <to variable="output" part="payload" query="/result/approved"/> </copy> </assign>
次の例に、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
をコールして、出力用により適切な文字に変換できます。
関連情報は、の第9.1.2項およびの第8.3.2項を参照してください。
XPath関数および式ビルダーの詳細は、「XPath拡張関数」を参照してください。
次の例に、BPEL 1.1で関数getCurrentDate
を使用する例を示します。
<!-- execute the XPath extension function getCurrentDate() --> <assign> <copy> <from expression="xpath20:getCurrentDate()"/> <to variable="output" part="payload" query="ns1:invoice/invoiceDate"/> </copy> </assign>
次の例に、BPEL 2.0で関数getCurrentDate
を使用する例を示します。
<assign> <copy> <from>xpath20:getCurrentDate()</from> <to>$output.payload/invoiceDate</to> </copy> </assign>
次の例では、XSD形式で指定された日時の値をformatDate
関数が文字列'Jun 10, 2005'
に変換し、文字列フィールドformattedDate
に割り当てています。
<!-- 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="ns1:invoice/formattedDate"/> </copy> </assign>
次の例に、BPEL 2.0でのformatDate
関数の動作を示します。
<assign> <copy> <from>ora:formatDate('2005-06-10T15:56:00','MMM dd, yyyy')</from> <to>$output.payload/formattedDate</to> </copy> </assign>
XML属性として定義されている要素は相互にコピーできます。XPath問合せ構文では、@
記号は子要素のかわりに属性を参照します。
次の例のコードは、このXMLデータから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>
次の例のBPEL 1.1のコードは、customerフィールドのcustId
属性を選択し、変数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>
次の例に、customerフィールドのcustId
属性を選択し、変数custId
に割り当てるためのBPEL 2.0の対応する構文を示します。
<assign> <copy> <from>$input.payload/autoloan:application/autoloan:customer/@custId</from> <to>$custId</to> </copy> </assign>
この例のネームスペース接頭辞は必須ではありません。次の例に示すように、WSDLファイルは、custId
が属性として定義される型を持つように顧客を定義します。
<complexType name="CustomerProfileType"> <sequence> <element name="name" type="string"/> ... </sequence> <attribute name="custId" type="string"/> </complexType>
assignアクティビティではXMLデータに対して様々な操作を実行できます。この項で説明されているbpelx
拡張要素タイプにはこの機能が用意されています。Oracle BPELデザイナでは、「割当て」ダイアログの「コピー・ルール」タブの下部にbpelx
拡張要素タイプを追加できます。コピー・ルールを作成した後、作成したルールを選択し、BPEL 1.1のドロップダウン・リストまたはBPEL 2.0のコンテキスト・メニューからbpelx
拡張要素タイプを選択します。これにより、コピー・ルールが選択した拡張要素タイプに変更されます。
BPEL 1.1では、図6-31に示すように、ドロップダウン・リストから拡張要素タイプを選択します。
BPEL 2.0では、図6-32に示すように、コピー・ルールを右クリックし、ルール・タイプの変更を選択して拡張要素タイプを選択することで、拡張要素タイプを選択します。
詳細は、このダイアログのオンライン・ヘルプおよび「Assignアクティビティ」を参照してください。
assignアクティビティでbpelx:append
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツに追加できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。
BPEL 1.1の場合は、図6-31のように、コピー・ルールを選択してドロップダウン・リストから「追加」を選択します。
BPEL 2.0の場合、図6-32のように、コピー・ルールを右クリックしてルール・タイプの変更を選択し、「追加」を選択します。
注意:
bpelx:append
拡張要素では、SDO変数の使用はサポートされていません。エラーが発生します。
次に、BPELバージョン1.1をサポートするBPELプロジェクトの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
問合せではパートナ・リンクを参照できません。
次の例では、1つの部品表(BOM)の複数のb:part
を連結BOMのb:
part
に追加することで、複数のBOMを1つのBOMに連結しています。
<bpel:assign> <bpelx:append> <bpelx:from variable="billOfMaterialVar" query="/b:bom/b:parts/b:part" /> <bpelx:to variable="consolidatedBillOfMaterialVar" query="/b:bom/b:parts" /> </bpelx:append> </bpel:assign>
次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:append
構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:append」で説明されている機能と同じですが、構文が多少異なります。
<bpel:assign> <bpelx:append> <bpelx:from>$billOfMaterialVar/b:parts/b:part</bpelx:from> <bpelx:to>$consolidatedBillOfMaterialVar/b:parts</bpelx:from> </bpelx:append> </bpel:assign>
注意:
bpelx:insertBefore
拡張要素ではSDO変数を使用できますが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。
assignアクティビティでbpelx:insertBefore
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの前に挿入できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。
次に、BPELバージョン1.1をサポートするBPELプロジェクトの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
問合せではパートナ・リンクを参照できません。
次の例に、<insertBefore>
の実行前の構文を示します。addrVar
の値は次のとおりです。
<a:usAddress> <a:state>CA</a:state> <a:zipcode>94065</a:zipcode> </a:usAddress>
次の例に、実行後の構文を示します。
<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>
次の例に、addrVar
の値を示します。
<a:usAddress>
<a:city>Redwood Shore</a:city>
<a:state>CA</a:state>
<a:zipcode>94065</a:zipcode>
</a:usAddress>
次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:insertBefore
構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:insertBefore」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:insertBefore
拡張要素をラップします。
<assign> <extensionAssignOperation> <bpelx:insertBefore> <bpelx:from> <bpelx:literal> <a:city>Redwood Shore></a:city> </bpelx:literal> </bpelx:from> <bpelx:to>$addrVar/a:state</bpelx:to> </bpelx:insertBefore> </extensionAssignOperation> </assign>
注意:
bpelx:insertAfter
拡張要素ではSDO変数を使用できすが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。
assignアクティビティでbpelx:insertAfter
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの後に挿入できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。
次に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:insertAfter
の例を示します。
<bpel:assign> <bpelx:insertAfter> <bpelx:from ... /> <bpelx:to ... /> </bpelx:insertAfter> </bpel:assign>
この操作は「bpelx:insertBeforeの使用方法」で説明した機能に類似していますが、次の違いがあります。
to-spec
問合せで複数のL-Valueノードが返される場合は、最後のノードが参照ノードとして使用されます。
参照ノードの前にノードが挿入されるかわりに、参照ノードの後にソース・ノードが挿入されます。
この操作は、conditional-switch
+
(append
またはinsertBefore
)のマクロとみなすこともできます。
次の例に、<insertAfter>
の実行前の構文を示します。addrVar
の値は次のとおりです。
<a:usAddress> <a:addressLine>500 Oracle Parkway</a:addressLine> <a:state>CA</a:state> <a:zipcode>94065</a:zipcode> </a:usAddress>
次の例に、実行後の構文を示します。
<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>
次の例に、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
問合せで指定したターゲット・ノードに子ノードとして追加されます。
次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:insertAfter
構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:InsertAfter」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素は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-33に詳細を示します。
カーソルを離すと、bpelx:remove
拡張要素がターゲット変数に適用されます。図6-34に詳細を示します。
次に、BPELバージョン1.1をサポートするBPELプロジェクトの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
に類似しており、そのサブセットです。
次の例に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プロセス・サービス・コンポーネント・ファイルで次に示す構文を実行すると、2番目のアドレス行であるMailstop
が削除されます。
<bpel:assign>
<bpelx:remove>
<target variable="addrVar"
query="/a:usAddress/a:addressLine[2]" />
</bpelx:remove>
</bpel:assign>
BPELプロセス・サービス・コンポーネント・ファイルで次に示す構文を実行すると、両方のアドレス行が削除されます。
<bpel:assign>
<bpelx:remove>
<target variable="addrVar"
query="/a:usAddress/a:addressLine" />
</bpelx:remove>
</bpel:assign>
次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:remove
構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:remove」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:remove
拡張要素をラップします。
<assign> <extensionAssignOperation> <bpelx:remove> <bpelx:target>$ncname.ncname/xpath_str</bpelx:target> </bpelx:remove> </extensionAssignOperation> </assign>
assignアクティビティでbpelx:rename
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントはXSDタイプ・キャストを使用して要素の名前を変更できます。Oracle BPELデザイナでbpelx:rename
拡張要素を追加するには、「コピー・ルール」タブの右上隅にある「名前の変更」アイコンを、名前を変更するターゲット変数にドラッグしてカーソルを離します。図6-33に示すように、「名前の変更」アイコンは「削除」アイコンの右側に表示されます。カーソルを離すと、ターゲット変数の名前を変更するための「名前の変更」ダイアログが表示されます。このアイコンを、センター・キャンバスにドラッグしてこのダイアログを呼び出し、名前を指定し、ダイアログを保存して閉じ、アイコンをターゲット・ノードにドラッグすることもできます。
次に、BPELバージョン1.1をサポートするBPELプロジェクトの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
に類似しており、そのサブセットです。ターゲットは要素ノードのリストを返す必要があります。それ以外の場合は、bpel:selectionFailure
フォルトが生成されます。from-spec
で指定した要素ノード名が、elementTo
属性で指定したQName
に変更されます。その要素ノードにxsi:type
属性が追加され、それらの要素がtypeCastTo
属性で指定したQName
タイプにキャストされます。
次の例に示す従業員リストがあるとします。
<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>
昇格の変更が、次の例の従業員リストのPeter
Smith
に適用されます。
<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>
前述のキャスト(名前変更)の実行後は、Peter
Smith
に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 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>
が使用されます。次に例を示します。
<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
の両方を実行すると、対応するデータは次の例のようになります。
<e:emp xsi:type="e:ManagerType"> <e:firstName>Peter</e:firstName><e:lastName>Smith</e:lastName> <e:approvalLimit>2500</e:approvalLimit> <e:managing /> <e:emp>
次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:rename
構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:rename」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:rename
操作をラップします。
<bpel:assign> <extensionAssignOperation> <bpelx:rename elementTo="QName1"? typeCastTo="QName2"?> <bpelx:target>$ncname[.ncname][/xpath_str]</bpelx:target> </bpelx:rename> </extensionAssignOperation> </bpel:assign>
assignアクティビティでbpelx:copyList
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツに対して別の変数へのcopyList
操作を実行できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。
次に、BPELバージョン1.1をサポートするBPELプロジェクトの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
問合せで返された属性が親要素に追加されます。
たとえば、次に示すようなスキーマが定義されているとします。
<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
変数には、次の例に示すコンテンツが含まれています。
<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
変数には、次の例に示すコンテンツが含まれています。
<ns1:processResponse xmlns:ns1="http://xmlns.oracle.com/Event_ jws/Event/EventTest"> <ns1: payload >c</ns1: payload > </ns1:process>
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>
これによって、次の例のようにto
変数が定義されます。
<ns1:processResponse xmlns:ns1="http://xmlns.oracle.com/Event_ jws/Event/EventTest"> <ns1: payload >a</ns1: payload > <ns1: payload >b</ns1: payload > </ns1:process>
次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:copyList
構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:copyList」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation
要素はbpelx:copyList
拡張要素をラップします。
<assign> <extensionAssignOperation> <bpelx:copyList> <bpelx:from>$inputVariable.payload/client:payload</bpelx:from> <bpelx:to>$outputVariable.payload/client:payload</bpelx:to> </bpelx:copyList> </extensionAssignOperation> </assign>
次の属性をassignアクティビティのコピー・ルールに割り当てることができます。
ignoreMissingFromData
insertMissingToData
keepSrcElementName
assignアクティビティの「コピー・ルール」タブの下部で、選択したコピー・ルールを右クリックして、適切な属性を選択するためのメニューを表示します。図6-35に詳細を示します。
ignoreMissingFromData
属性は、bpel:selectionFailure
標準フォルトを抑止します。表6-3に、BPELバージョン1.1とバージョン2.0の構文の違いを示します。
表6-3 ignoreMissingFromData属性の構文
BPEL 1.1 | BPEL 2.0 |
---|---|
<copy bpelx:ignoreMissingFromData="yes|no"/> |
<copy ignoreMissingFromData="yes|no"/> |
insertMissingToData
属性は、項目が選択されなかった場合、to-spec
で指定された(XPath) L-valueを実行するようにランタイムに指示します。表6-4に、BPELバージョン1.1とバージョン2.0の構文の違いを示します。
表6-4 insertMissingToData属性の構文
BPEL 1.1 | BPEL 2.0 |
---|---|
<copy bpelx:insertMissingToData="yes|no"/> |
<copy bpelx:insertMissingToData="yes|no"/> |
keepSrcElementName
属性を使用すると、(to-spec
の選択に従って)宛先の要素名をソースの要素名に置換できます。この属性は、BPEL 1.1では実装されていませんでした。表6-5に、BPELバージョン2.0でサポートされている構文を示します。
表6-5 keepSrcElementName属性の構文
BPEL 1.1 | BPEL 2.0 |
---|---|
未実装 |
<copy keepSrcElementName="yes|no"/> |
コードを検証してBPELプロジェクト内の無効なXMLデータを識別できます。
この項では、BPEL 2.0のXMLデータの検証について説明します。
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"/>
この項では、BPEL 1.1の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"/>
次のメッセージ交換アクティビティで変数を指定できます。
「Invoke」ダイアログの(inputVariable
属性の)「入力」フィールドと(outputVariable
属性の)「出力」フィールド
receiveアクティビティの(variable
属性の)「入力」フィールド
replyアクティビティの(variable
属性の)「出力」フィールド
これらのフィールドで参照される変数は通常、QNameが操作で使用される入力および出力メッセージ・タイプと一致するメッセージ・タイプ変数である必要があります。
例外は、アクティビティのWSDL操作が、要素を使用して定義された1つのパートを含むメッセージを使用している場合です。この場合、パートの定義に使用される同じ要素タイプの変数はそれぞれ、invokeアクティビティのinputVariable
属性とoutputVariable
属性、またはreceiveアクティビティまたはreplyアクティビティのvariable
属性で参照できます。
この状況で変数を使用するのは、関連するWSDLメッセージ・タイプに基づいて匿名の一時WSDLメッセージ変数を宣言するのと同じである必要があります。
匿名の一時WSDLメッセージ変数と要素変数の間で要素データをコピーするのは、keepSrcElementName
属性がyes
に設定された1回のコピー操作による単一の仮想assignアクティビティとして機能します。仮想割当ては、実際のassignアクティビティと同じルールに従い、同じフォルトを使用する必要があります。表6-6に詳細を示します。
表6-6 WSDLメッセージ・パートのマップ
対象 | 説明 |
---|---|
|
属性で参照される変数の値により、匿名の一時WSDLメッセージ変数のパートの値が設定されます。 |
|
一時WSDLメッセージ変数の受信したパートの値により、属性で参照される変数の値が設定されます。 |
receiveアクティビティ |
着信パートの値により、variable属性で参照される変数の値が設定されます。 |
replyアクティビティ |
variable属性で参照される変数の値により、送信される匿名の一時WSDLメッセージ変数のパートの値が設定されます。フォルトを送信するreplyアクティビティの場合も、同じシナリオが適用されます。 |
keepSrcElementName
属性の詳細は、「keepSrcElementName属性」を参照してください。
invokeアクティビティおよびreplyアクティビティの「引数マッピング」セクションは、BPEL変数のコンテンツから明示的に作成されるマルチパートWSDLメッセージの代替手段を提供します。
「引数マッピング」セクションを使用する場合、該当するWSDL操作の入力メッセージで指定されたタイプに基づいて、匿名の一時WSDL変数が定義されます。
WSDLメッセージ・パートのマッピングの詳細は、次のURLにあるを参照してください。
http://www.oasis-open.org
import
要素を使用して、BPELプロセスが依存する定義を指定できます。次の例に示すように、バージョン2.0のBPELプロセスを作成すると、import
要素が.bpel
ファイルに追加されます。
<process name="Loan Flow" . . . . . . <import namespace="http://xmlns.oracle.com/SOAApplication/SOAProject/LoanFlow" location="LoanFlow.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/>
次の例に示すように、import
要素を使用して、ネームスペースのないスキーマをインポートすることもできます。
<process name="Loan Flow" . . . . . . <import location="xsd/NoNamespaceSchema.xsd" importType="http://www.w3.org/2001/XMLSchema"/>
次の例に示すように、import
要素を使用して、ネームスペースを持つスキーマをインポートすることもできます。
<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/"
に設定する必要があります。この属性に他の値を指定することもできます。
詳細は、の第5.4項を参照してください。
データ・シーケンスは、XMLで使用される最も基本的なデータ・モデルの1つです。しかし、データ・シーケンスの操作が重要な場合があります。BPELプロセス・サービス・コンポーネントで使用される最も一般的なデータ・シーケンス・パターンの1つが配列です。XMLスキーマに基づき、データ・シーケンス定義はその属性maxOccurs
から識別できます。この属性が、1より大きい値に設定されているか、unboundedとしてマークされています。詳細は、http://www.w3.org/TR
のXML Schema Specificationを参照してください。
この項の例では、BPELのデータ・シーケンスを操作するいくつかの基本的な方法を示します。ただし、ループの実行、エンドポイントの動的参照など、関連するその他の要件が存在します。次の項では、データ・シーケンス操作の特定の要件について説明します。
必要な要素索引が設計時にわかっているとき、XPath機能を使用してデータ・シーケンス要素を選択する方法を次の2つの例で示します。これらのケースでは、最初の要素です。
次の例では、addresses[1]
はaddressesデータ・シーケンスの最初の要素を選択します。
<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つです(の第2.4項と第4.1項を参照)。次の例の問合せでは、position
関数を明示的にコールして、アドレスのデータ・シーケンスの最初の要素を選択します。次に、そのアドレスのstreet
要素(アクティビティで変数street1
に割り当てられます)を選択します。
<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でエンコードされた)をコールするクライアントとして機能できます。
次の例に、myFavoriteNumbers
というSOAP配列ペイロードの例を示します。
<myFavoriteNumbers SOAP-ENC:arrayType="xsd:int2">
<number>3</number>
<number>4</number>
</myFavoriteNumbers>
また、スキーマの要素の属性attributeFormDefault
およびelementFormDefault
が"unqualified"
に設定されていることを確認してください。次の例に詳細を示します。
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でエンコードされた配列を使用する手順は、次のとおりです。
次の例に、BPELプロジェクトにbpelx:append
タグの付いたSOAP配列を準備する方法を示します。
Oracle JDeveloperでBPELプロセスを作成します。
起動用のぺイロードを準備します。bpelx:append
は、項目を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プロジェクトでサポートされています。次の例に、BPEL 2.0プロジェクトのSOAPでエンコードされた配列を持つassignアクティビティのサンプルを示します。
<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>
次の例に、BPEL 2.0プロジェクトのSOAPでエンコードされた配列を持つinvokeアクティビティのサンプルを示します。
<invoke name="Invoke1" partnerLink="FileOut" portType="ns3:Write_ptt" operation="Write" bpelx:invokeAsDetail="no"> <toParts> <toPart part="body" fromVariable="ArrayVariable"/> </toParts> </invoke>
SOAPでエンコードされた配列のWSDLでは、スキーマ内でwsdl:arrayType
属性を使用してSOAP配列を宣言できます。次の例に詳細を示します。
<xsd:complexType name="UserObject"> <xsd:sequence> <xsd:element name="userInformation" nillable="true" type="n5:ArrayOfKeyValuePair"/> <xsd:element name="username" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ArrayOfKeyValuePair"> <xsd:complexContent> <xsd:restriction base="soapenc:Array"> <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="n5:KeyValuePair[]"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="KeyValuePair"> <xsd:sequence> <xsd:element name="key" nillable="true" type="xsd:string"/> <xsd:element name="value" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType>
次の例に、BPEL 1.1でSOAPでエンコードされた配列を作成してアクセスする方法を示します。
<bpws:copy> <bpws:from> <ns1:userInformation soapenc:arrayType="com1:KeyValuePair[1]" xmlns:ns1="http://www.schematargetnamespace.com/wsdl/Impl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"/> <ns1:KeyValuePair xmlns:ns1="http://www.schematargetnamespace.com/wsdl/Impl/"> <key>testkey</key> <value>testval1</value> </ns1:KeyValuePair> </ns1:userInformation> </bpws:from> <bpws:to variable="Inputvar" part="userObject" query="/userObject/userInformation"/> </bpws:copy> <!--Update elements with SOAPENC Array--> <bpws:copy> <bpws:from variable="KeyValueVar" part="KeyValuePair" query="/KeyValuePair/ns2:key"/> <bpws:to variable="Inputvar" part="userObject' query="//*[local-name()='KeyValuePair'][1]/*[local-name()='key']"/> </bpws:copy> <bpws:copy> <bpws:from variable="KeyValueVar" part="KeyValuePair" query="/KeyValuePair/client:value"/> <bpws:to variable="Inputvar" part="userObject" query="//*[local-name()='KeyValuePair'][1]/*[local-name()='value']"/> </bpws:copy> <!-- Append elements within SOAPENC Array --> <bpelx:append> <bpelx:from variable="Inputvar" part="userObject" query="//*[local-name()='KeyValuePair'][1]"/> <bpelx:to variable="Inputvar" part="userObject" query="/userObject/userInformation"/> </bpelx:append>
データ・シーケンスの実行時のサイズ、つまりシーケンス内のノードまたはデータ項目の数を知る必要がある場合は、XPath組込み関数count()
とBPEL組込み関数getVariableData()
を組み合せて使用することで取得できます。
次の例のコードは、item
シーケンス内の要素数を計算し、それを整数変数lineItemSize
に割り当てています。
<assign> <copy> <from expression="count(bpws:getVariableData('outpoint', 'payload', '/p:invoice/p:lineItems/p:item')"/> <to variable="lineItemSize"/> </copy> </assign>
多くの場合、データ・シーケンスへの索引付けに動的な値が必要になることがあります。つまり、シーケンスのn
番目のノード(n
の値は実行時に定義)の取得が必要な場合です。この項では、式の末尾にXPathを適用して動的な索引付けを行う方法について説明します。
次の例に示す動的索引付けメソッドでは、XPathをbpws:getVariableData()
の最後の引数として使用するのではなく、bwps:getVariableData()
の結果の末尾にXPathを適用します。末尾のXPathは、位置述語内の整数型の索引変数(つまり、[...]
)を参照します。
<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
内の式は、次の例の式と同等です。
<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の先頭に指定する必要があります。
次の例に詳細を示します。
bpws:getVariableData('input', 'payload','/p:invoice/p:line-item[2]/p:line-total')
XPathをbwps:getVariableData()
関数の末尾に使用する場合、ルート要素名をXPath内に指定する必要はありません。
次に例を示します。
bpws:getVariableData('input', 'payload')/p:line-item[2]/p:line-total
これは、getVariableData()
関数で返されるノードがルート要素であるためです。ルート要素名をXPathで再指定すると重複になり、XPathの標準セマンティクスでは不正となります。
assignアクティビティでbpelx:append
拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは既存の親要素に新しい要素を追加できます。次に例を示します。
<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つのシーケンスを単一のデータ・シーケンスにマージできます。このパターンは、データ・シーケンスが配列内にある場合(つまり、互換性のあるタイプのデータ項目のシーケンスの場合)によく使用されます。次に示すassign
の下の2つの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
は生成されません。
次の例に、po
の下で10
個の空の<lineItem>
要素を使用して発注書(PO)を初期化するappend
文を示します。
<bpelx:assign> <bpelx:append> <bpelx:from expression="ora:genEmptyElem('p:lineItem',10)" /> <bpelx:to variable="poVar" query="/p:po" /> </bpelx:append> </bpelx:assign>
前述の例のgenEmptyElem
関数は、次の例のように埋込みXQuery式で置き換えることができます。
ora:genEmptyElem('p:lineItem',10) == for $i in (1 to 10) return <p:lineItem />
この関数により生成される空要素は、通常は無効なXMLデータです。空要素の作成後に、さらにデータの初期化を実行します。前述と同じ例を使用して、次の操作を実行できます。
空のlineItem
要素に属性要素と子要素を追加します。
copy
操作を実行して空要素を置き換えます。たとえば、flowNアクティビティの下で、この等価配列内の個別エントリにWebサービスの結果からコピーします。
ネイティブ・フォーマット・ビルダー配列識別子環境での処理には、ノードの親ノードに関する情報が必要です。reportSAXEvents
APIが使用されるため、通常、この情報はアウトバウンド・メッセージ・シナリオには使用できません。ネイティブ・スキーマのnxsd:useArrayIdentifiers
をtrue
に設定することで、アウトバウンド・メッセージ・シナリオにDOM解析を使用できるようになります。大規模なペイロードによりパフォーマンスの低下につながる可能性があるため、この設定には注意が必要です。次の例に詳細を示します。
<?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
の詳細は、「parseEscapedXML」を参照してください。
parseEscapedXML
関数はXMLデータを受け取り、DOMによって解析し、型指定されたBPEL変数に割当て可能な構造化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>
この章のこれまでの項で示した例は、次の例のように、メッセージがXMLスキーマのelement
で定義されているドキュメント形式のWSDLファイルでした。
<message name="LoanFlowRequestMessage"> <part name="payload" element="s1:loanApplication"/> </message>
これは、次の例に示すように、メッセージがXMLスキーマのtype
で定義される、RPC形式のWSDLファイルとは異なります。
<message name="LoanFlowRequestMessage"> <part name="payload" type="s1:LoanApplicationType"/> </message>
これは、この章のこれまでの情報とは異なります。これらの2つのWSDLメッセージ形式では、XPath問合せの作成方法に相違があります。RPC形式のメッセージの場合、最上位要素(およびXPath問合せ文字列の最初のノード)はパート名(前述の例ではpayload
)です。ドキュメント形式メッセージでは、最上位ノードは要素名(たとえばloanApplication
)です。
次の例(WSDLファイルおよびBPELファイル)に、LoanServices
という名前のアプリケーションがRPC形式の場合のXPath問合せ文字列を示します。
<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>
<variable name="output" messageType="tns:LoanServiceResultMessage"/> ... <assign> <copy> <from expression="9.9"/> <to variable="output" part="payload" query="/payload/APR"/> </copy> </assign>
BPELの通信アクティビティ(invoke、receive、replyおよびonMessage)は、指定のメッセージ変数を介してメッセージを送受信します。これらのデフォルト・アクティビティでは、各方向で1つの変数の操作が許可されます。たとえば、invokeアクティビティにはinputVariable
およびoutputVariable
属性があります。この2つの属性にそれぞれ変数を1つ指定できます。関連する特定の操作で使用するペイロード・メッセージが各方向で1つのみの場合は、これで十分です。
ただし、WSDLは1つの操作での複数のメッセージをサポートしています。SOAPの場合、SOAPヘッダーとしてメイン・ペイロード・メッセージとともに複数のメッセージを送信できます。ただし、BPELのデフォルトの通信アクティビティは、追加のヘッダー・メッセージに対応できません。
Oracle BPEL Process Managerでは、デフォルトのBPEL通信アクティビティを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ヘッダーを受信する手順は、次のとおりです。
BPELバージョン2.0のプロセスを拡張して、カスタム拡張ネームスペース宣言を追加できます。mustUnderstand
属性を使用すると、カスタム・ネームスペースがBPELプロセスで認識される必要があるセマンティックを持つかどうかを示すことができます。
mustUnderstand
がyes
に設定された1つ以上の拡張機能がBPELプロセスでサポートされていない場合、プロセス定義は拒否されます。
拡張機能はextensions
要素に定義されます。次の例に詳細を示します。
<process ...> ... <extensions>? <extension namespace="myURI" mustUnderstand="yes|no" />+ </extensions> ... </process>
extension
要素のコンテンツは、標準のBPELネームスペースとは異なるネームスペースで修飾された1つの要素である必要があります。
拡張宣言の詳細は、次のURLにあるを参照してください。
http://www.oasis-open.org