ヘッダーをスキップ
Oracle® Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1 (11.1.1.4.0)
B56238-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

6 BPELプロセスでのXMLデータの操作

この章では、BPELプロセス・サービス・コンポーネントでのXMLデータの操作方法について説明します。 この章では様々な例を提供します。変数、シーケンスおよび配列の使用方法とXPath式の使用方法、数学的計算などのタスクの実行方法に関するトピックが含まれています。サポートされる仕様についても説明しています。

項目は次のとおりです。


注意:

この章の大部分の例では、関連するメッセージ・タイプを定義するWSDLファイルは、RPC形式ではなくドキュメント・リテラル形式であると想定しています。RPC形式のWSDL定義の場合、XPath問合せ文字列の構成方法に違いがあります。RPCのWSDLファイルで定義されたタイプを使用する場合は、第6.21項「ドキュメント形式とRPC形式のWSDLの違いの理解」を参照してください。

Oracle BPEL Process Managerのサンプルについては、次のURLにアクセスしてください。

https://soasamples.samplecode.oracle.com

6.1 BPELプロセスでのXMLデータの操作の概要

この項では、BPELプロセスでのXMLデータの使用について概要を説明します。

6.1.1 BPELのXMLデータ

BPELプロセス・サービス・コンポーネントでは、ほとんどのデータはXMLフォーマットです。データには、BPELプロセス・サービス・コンポーネントとの間で受け渡されるメッセージ、外部サービスとの間で交換されるメッセージ、プロセスで使用されるローカル変数などがあります。通常は次のいずれかのXMLスキーマを使用して、これらのメッセージおよび変数のタイプを定義します。

  • フローのWeb Services Description Language (WSDL)ファイル

  • 起動されるサービスのWSDLファイル

  • そのWSDLファイルで参照されるXSDファイル

したがって、BPELのほとんどの変数はXMLデータであり、BPELプロセス・サービス・コンポーネントはそのコードの大部分を使用して、これらのXML変数を操作します。通常は、様々なサービスに必要な表現間でのデータ・トランスフォーメーション、データのローカル操作(複数のサービス呼出しからの結果の結合など)などが行われます。

BPELでは、サービス・データ・オブジェクト(SDO)変数もサポートしています。この変数は、XML形式ではなく、メモリー構造形式です。

6.1.2 データ操作とXPath標準

BPELでデータ操作を開始するには、assignアクティビティを使用します。assignアクティビティはXPath標準に基づいています。XPath問合せ、XPath式および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の選択に従って)ソースの要素名で置換されるかどうかを指定します。keepSrcElementNameno (デフォルト値)に設定すると、元の宛先要素の名前(つまり、ネームスペース名とローカル名のプロパティ)が、作成される要素の名前として使用されます。keepSrcElementNameyesに設定すると、ソース要素名が、作成される宛先要素の名前として使用されます。

例6-2 BPEL 2.0のassignアクティビティ

<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に例を示します。

    例6-4 query属性

    <from variable="input" part="payload"
          query="/p:CreditFlowRequest/p:ssn"/>
    

    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.56.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.56.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トランスフォメーション・コードの例の詳細は、第38章「XSLTマッパーを使用したトランスフォーメーションの作成」を参照してください。


注意:

assignアクティビティ経由で大きいスキーマが渡されると、assignの編集ダイアログのターゲットまたはソース・ペイロード・ノードを右クリックして「すべての子ノードを開く」を選択した場合に、Oracle JDeveloperが停止したり、メモリー不足になる可能性があります。回避策として、ペイロード要素は手動で開いてください。

6.2 データ・プロバイダ・サービスへのXMLデータ操作の委任

エンティティ変数を使用して、基礎となるデータ・プロバイダ・サービスがBPELデータ操作を実行するように指定できます。データ・プロバイダ・サービスはデータ・ストア内でデータ操作をバックグラウンドで実行しますが、Oracle SOA Suiteが提供する他のデータ・ストア関連の機能(たとえば、データベース・アダプタ)を使用しません。これにより、Oracle SOA Suiteの実行時パフォーマンスが向上し、コンパイルおよび実行時に、基礎となるデータ・プロバイダ・サービスのネイティブ機能が組み込まれます。


注意:

この機能はBPEL 1.1プロジェクトでのみサポートされます。

エンティティ変数は、SDOベースのデータを使用してOracle Application Development Framework(ADF)Business Componentデータ・プロバイダ・サービスと一緒に使用できます。

11g,以前のリリースでは、BPELビジネス・プロセス内で交換された変数およびメッセージは、XML構造に組み込まれる分離されたペイロード(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アプリケーションには、エンティティ変数の使用例が記載されています。

6.2.1 エンティティ変数の作成方法

この項では、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がリハイドレートする場合は、エンティティ変数のキーのみが格納され、ウェイクアップ時には、暗黙的なバインドが行われて現在のデータが取得されます。

6.2.1.1 インバウンド方向のSDOの動作の理解

SDOバインディング・コンポーネント・サービスは、図6-1に示すように、コンポジット・アプリケーションへのエントリ・ポイントを外部に提供します。

図6-1 インバウンド方向

図6-1の説明が続きます
「図6-1 インバウンド方向」の説明

SOAコンポジット・エディタおよびOracle BPELデザイナを使用して次のタスクを実行します。

  • SDOバインディング・コンポーネント・サービスとBPELプロセス・サービス・コンポーネントをコンポジット・アプリケーションに定義します。

  • SDOサービスとBPELプロセス・サービス・コンポーネントを接続(ワイヤ)します。

  • BPELプロセス・サービス・コンポーネントの詳細を定義します。

SOAコンポジット・エディタの使用方法の詳細は、第2章「Oracle SOA Suiteを使用したSOAコンポジット・アプリケーションの開発」を参照してください。

6.2.1.2 アウトバウンド方向のSDO動作の理解

図6-2に示すように、SDOバインディング・コンポーネント参照を使用すると、コンポジット・アプリケーションからOracle ADF Business Componentアプリケーションの外部のパートナにメッセージを送信できます。

図6-2 アウトバウンド方向

図6-2の説明が続きます
「図6-2 アウトバウンド方向」の説明

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プロパティ)で自動的に更新されます。

6.2.1.3 エンティティ変数の作成とパートナ・リンクの選択

ここでは、Oracle ADF Business Componentアプリケーションのために、エンティティ変数を作成し、パートナ・リンクを選択します。次の例は、WebLogic Fusion Order Demoアプリケーションで、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すために、bind entityアクティビティを使用して、OrderProcessor BPELプロセス・サービス・コンポーネントが注文IDを受け取る方法を示しています。

エンティテイ変数を作成し、パートナ・リンクを選択する手順は、次のとおりです。

  1. Oracle JDeveloperで、BPELプロセス・サービス・コンポーネントの「構造」ウィンドウに移動します。

  2. 「変数」フォルダを右クリックし、「すべての子ノードを開く」を選択します。

  3. 2番目の「変数」フォルダで、右クリックして「変数の作成」を選択します。

    「変数の作成」ダイアログが表示されます。

  4. 「名前」フィールドに、名前を入力します。

  5. 「エンティティ変数」チェック・ボックスを選択し、「パートナ・リンク」フィールドの右側の「検索」アイコンを選択します。

    「パートナ・リンク・チューザ」ダイアログに、使用可能なサービス(「ADF-BCサービス」というSDOサービスを含む)のリストが表示されます。

  6. Oracle ADF Business Componentアプリケーションのためのサービスを参照し、選択します。

  7. 「OK」をクリックし、「パートナ・リンク・チューザ」ダイアログと「変数の作成」ダイアログを閉じます。

    ダイアログは図6-3のようになります。

    図6-3 「変数の作成」ダイアログ

    図6-3の説明が続きます
    「図6-3 「変数の作成」ダイアログ」の説明

6.2.1.4 バインディング・キーの作成

ここでは、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すキーを作成します。

バインディング・キーを作成する手順は、次のとおりです。

  1. BPEL 1.1プロジェクトの「コンポーネント・パレット」で、「Oracle Extensions」を展開します。

  2. bind entityアクティビティを、BPELプロセス・サービス・コンポーネントにドラッグします。

    「Bind Entity」ダイアログが表示されます。

  3. 「名前」フィールドに、名前を入力します。

  4. 「エンティティ変数」フィールドの右側の「検索」アイコンをクリックします。

    「変数チューザ」ダイアログが表示されます。

  5. 第6.2.1.3項「エンティティ変数の作成とパートナ・リンクの選択」で作成したエンティティ変数を選択し、「OK」をクリックします。

  6. 「一意キー」セクションで、「追加」アイコンをクリックします。

    「キーの指定」ダイアログが表示されます。このダイアログを使用して、Oracle ADF Business Componentデータ・プロバイダ・サービスから注文IDを取得するためのキーを作成します。

  7. 表6-2に記載されている詳細を入力し、バインディング・キーを定義します。

    表6-2 「キーの指定」ダイアログのフィールドと値

    フィールド

    キー・ローカル・パート

    キーのローカル・パートを入力します。

    キー・ネームスペースURI

    キーに対するネームスペースURIを入力します。

    キー値

    キー値式を入力します。この式はキーのタイプと一致する必要があります。次に、POIDキーに対する式値キーの例を示します。

    • $inputMsg.payload/tns:poid

    • bpws:getVariableData('inputmsg','payload','tns:poid')

    エンティティ変数に対するPOIDキーは、通常、別のメッセージから取得されます。POIDキーのタイプが整数で、式の結果がABCの文字列である場合、文字列から整数への変換は失敗し、bind entityアクティビティも実行時に失敗となります。


    図6-4に、完成した「キーの指定」ダイアログを示します。

    図6-4 「キーの指定」ダイアログ

    図6-4の説明が続きます
    「図6-4 「キーの指定」ダイアログ」の説明

  8. 「OK」をクリックして「キーの指定」ダイアログを閉じます。

    図6-5に示すように、「一意キー」の表に名前/値ペアが表示されます。これで、設計は完了します。

    図6-5 「Bind Entity」ダイアログ

    図6-5の説明が続きます
    「図6-5 「Bind Entity」ダイアログ」の説明

  9. 「OK」をクリックして「Bind Entity」ダイアログを閉じます。

    実行時にbind entityアクティビティが実行されると、エンティティ変数を使用する準備が整います。

SDOの使用方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。このガイドには、アプリケーション・モジュールをWebサービスとして公開する方法や、表示データ・オブジェクトの行をSDOとして公開する方法が記載されています。アプリケーション・モジュールは、ビジネス・ロジックを関連する一連のビジネス機能としてカプセル化するADFフレームワーク・コンポーネントです。

6.3 スタンドアロンSDOベースの変数の使用

スタンドアロンSDOベースの変数は、通常のBPEL XML-DOMベースの変数と類似しています。主な違いは、基礎となるデータ形式がDOMベースではなくSDOベースであることです。したがって、SDOベースの変数は、Java APIアクセス、簡単に使用できる最新のAPI、変更内容の要約など、様々なSDO機能を使用できます。ただし、SDOを使用する場合は、XML-DOMベースの変数を使用する場合にはない複数の制限も適用されます。最も顕著な制限は、SDOがXPath式の小さいサブセットのみをサポートしていることです。

6.3.1 SDOベースの変数の宣言方法

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>

6.3.2 XMLからSDOへの変換方法

Oracle BPEL Process Managerでは、DOMとSDOの2つのデータ形式をサポートしています。同じビジネス・プロセス内で、さらに同じ式の中で、DOMベースの変数とSDOベースの変数の使用を切り替えることができます。Oracle BPEL Process Managerのデータ・フレームワークは、DOM形式とSDO形式を自動的に変換します。

Oracle BPEL Process Managerでは、エンティティ変数のXPathリライト機能を使用することで、基本的なSDO仕様ではサポートされない複数のXPath機能(変数の参照、関数コールなど)を使用できます。一方で、SDOベースの変数を使用するXPathには、別の制限があります(andorおよび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データの一部を削除する例を示します。

例6-9 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データ・オブジェクトはメタデータ駆動で、一般的に新しいプロパティを任意に追加することがサポートされていません。


6.4 式定数またはリテラルXMLでの変数の初期化

BPELでは、リテラルXMLを変数に割り当てる方法が役立つことがよくあります。たとえば、動的データを変数に対するXMLデータ・コンテンツ内の特定のフィールドにコピーする前に、変数を初期化する場合などです。また、XMLデータ値をプロセスにハード・コーディングするときのテストにも役立ちます。

6.4.1 リテラルXML要素の割当て方法

例6-10では、リテラルのresult要素をoutput変数のpayloadパートに割り当てています。

例6-10 リテラル要素の割当て

<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>

6.5 変数間のコピー

変数間のコピーでは、1つの変数(またはパート)から互換性のあるタイプの別の変数に直接コピーします。どちらの変数でも特定のフィールドを指定する必要はありません。つまり、XPath問合せを指定する必要はありません。

6.5.1 変数間でのコピー方法

例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アクティビティ」を参照してください。

6.5.2 BPEL 2.0のインラインfrom-specを使用した変数の初期化

インライン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項を参照してください。

6.6 要素変数およびメッセージ・タイプ変数内のフィールドへのアクセス

ほとんどのWSDLファイルやXSDファイルに定義のタイプが存在する場合は、要素およびメッセージ・タイプに基づいて変数パート内のコピー元またはコピー先フィールドのレベルに移動する必要があります。そこで、XMLスキーマの複合型を順に使用します。このアクションを実行するには、assignアクティビティのfrom句またはto句にXPath問合せを指定します。

6.6.1 要素ベース変数およびメッセージ・タイプベース変数内のフィールドへのアクセス方法

例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で要素ベースの変数を使用する方法を示します。

例6-21 BPEL 2.0のレベルをコピーするフィールド

<assign>
   <copy>
      <from>$input.payload/autoloan:application/autoloan:customer</from>
      <to>$customer</to>
   </copy>
</assign>

例6-22は、割当てに必要な要素ベースの変数をBPELファイルに定義する方法を示しています。

例6-22 BPELファイル定義 - 要素ベースの変数

    <variable name="customer" element="tns:customerProfile"/>

6.7 数値の割当て

XPath式では数値を割り当てることができます。

6.7.1 数値の割当て方法

例6-23は、整数値100のXPath式を割り当てる方法を示しています。

例6-23 XPath式の割当て

<assign>
   <!-- copy from integer expression to the variable -->
   <copy>
      <from expression="100"/>
      <to variable="output" part="payload" query="/p:result/p:quantity"/>
   </copy>
</assign>

6.8 XPath標準による数学的計算の使用

第6.8.1項「XPath標準による数学的計算の使用方法」の数値を増分する数式のような簡単な数式を使用できます。

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構文を使用する方法を示します。

例6-26 BPEL 2.0での$variable構文の使用

<assign>
   <copy>
      <from>$input.payload + 1</from>
      <to>$output.payload</to>
   </copy>
</assign>

6.9 文字列リテラルの割当て

文字列リテラルをBPEL内の変数に割り当てることができます。

6.9.1 文字列リテラルの割当て方法

例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でこの式を実行する方法を示します。

例6-28 BPEL 2.0での式のコピー

<assign>
   <copy>
      <from>'GE'</from>
      <to>$output.payload/p:symbol</from>
   </copy>
</assign>

6.10 文字列の連結

1つの文字列変数(または変数パート、フィールド)の値を別の文字列変数にコピーするのではなく、いくつかの文字列を連結するなどの文字列操作を最初に実行できます。

6.10.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項にリストされています。

6.11 ブール値の割当て

XPathブール関数を使用してブール値を割り当てることができます。

6.11.1 ブール値の割当て方法

例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またはfalsetrueまたはfalse定数ではなく相対要素ステップと解釈されます。現行のXPathコンテキスト・ノードでtrueという子ノードの選択が試行されます。ほとんどの場合、trueノードは存在しません。したがって、空の結果ノードセットが返され、それがXPath 1.0のboolean()関数によりfalseの結果に変換されます。この結果は混同される可能性があります。

6.12 日付または時刻の割当て

Oracle BPEL XPath関数のgetCurrentDategetCurrentTimeまたは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.12.1 日付または時刻の割当て方法

例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を使用する例を示しています。

例6-33 BPEL 2.0での日付または時刻の割当て

<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関数の動作を示します。

例6-35 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>

6.13 属性の操作

XML属性として定義されている要素は相互にコピーできます。XPath問合せ構文では、@記号は子要素のかわりに属性を参照します。

6.13.1 属性の操作方法

例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が属性として定義される型を持つように顧客を定義します。

例6-39 custId属性の定義

<complexType name="CustomerProfileType">
   <sequence>
      <element name="name" type="string"/>
      ...
   </sequence>
   <attribute name="custId" type="string"/>
</complexType>

6.14 bpelx拡張要素を使用したXMLデータの操作

assignアクティビティではXMLデータに対して様々な操作を実行できます。この項で説明されているbpelx拡張要素タイプにはこの機能が用意されています。Oracle BPELデザイナでは、「割当て」ダイアログの「コピー・ルール」タブの下部にbpelx拡張要素タイプを追加できます。コピー・ルールを作成した後、作成したルールを選択し、BPEL 1.1のドロップダウン・リストまたはBPEL 2.0のコンテキスト・メニューからbpelx拡張要素タイプを選択します。これにより、コピー・ルールが選択した拡張要素タイプに変更されます。

BPEL 1.1では、図6-6に示すように、ドロップダウン・リストから拡張要素タイプを選択します。

図6-6 BPEL 1.1のbpelx拡張要素に変換されたコピー・ルール

図6-6の説明が続きます
「図6-6 BPEL 1.1のbpelx拡張要素に変換されたコピー・ルール」の説明

BPEL 2.0では、図6-7に示すように、コピー・ルールを右クリックし、ルール・タイプの変更を選択して拡張要素タイプを選択することで、拡張要素タイプを選択します。

図6-7 BPEL 2.0のbpelx拡張要素に変換されたコピー・ルール

図6-7の説明が続きます
「図6-7 BPEL 2.0のbpelx拡張要素に変換されたコピー・ルール」の説明

詳細は、このダイアログのオンライン・ヘルプおよびA.2.2項「assignアクティビティ」を参照してください。

6.14.1 bpelx:appendの使用方法

assignアクティビティでbpelx:append拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツに追加できます。この拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択した後、ドロップダウン・リストから「追加」を選択します。


注意:

bpelx:append拡張要素では、SDO変数の使用はサポートされていません。エラーが発生します。

6.14.1.1 BPEL 1.1のbpelx:append

例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-41 複数の部品表の連結

<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>

6.14.1.2 BPEL 2.0のbpelx:append

例6-42に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:append構文の例を示します。BPEL 2.0では、この機能は第6.14.1.1項「BPEL 1.1のbpelx:append」で説明されている機能と同じですが、構文が多少異なります。

例6-42 BPEL 2.0の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>

6.14.2 bpelx:insertBeforeの使用方法


注意:

bpelx:insertBefore拡張要素ではSDO変数を使用できますが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。

assignアクティビティでbpelx:insertBefore拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの前に挿入できます。この拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択した後、ドロップダウン・リストからInsertBeforeを選択します。

6.14.2.1 BPEL 1.1のbpelx: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-44 実行前の構文

<a:usAddress>
       <a:state>CA</a:state>
       <a:zipcode>94065</a:zipcode> 
</a:usAddress> 

例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-46 addrVarの値

<a:usAddress>
       <a:city>Redwood Shore</a:city>
       <a:state>CA</a:state>
       <a:zipcode>94065</a:zipcode> 
</a:usAddress> 

6.14.2.2 BPEL 2.0のbpelx:insertBefore

例6-47に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:insertBefore構文の例を示します。BPEL 2.0では、この機能は第6.14.2.1項「BPEL 1.1のbpelx:insertBefore」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:insertBefore拡張要素をラップします。

例6-47 BPEL 2.0の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>

6.14.3 bpelx:insertAfterの使用方法


注意:

bpelx:insertAfter拡張要素ではSDO変数を使用できすが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。

assignアクティビティでbpelx:insertAfter拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの後に挿入できます。この拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択した後、ドロップダウン・リストからInsertAfterを選択します。

6.14.3.1 BPEL 1.1のbpelx: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.14.3.2 BPEL 2.0のbpelx:InsertAfter

例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>

6.14.4 bpelx:removeの使用方法

assignアクティビティでbpelx:remove拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは変数を削除できます。Oracle BPELデザイナでbpelx:remove拡張要素を追加するには、「コピー・ルール」タブの右上隅にある「削除」アイコンを、削除するターゲット変数にドラッグしてカーソルを離します。図6-8に詳細を示します。

図6-8 assignアクティビティの「コピー・ルール」タブの「削除」アイコン

図6-8の説明が続きます
「図6-8 assignアクティビティの「コピー・ルール」タブの「削除」アイコン」の説明

カーソルを離すと、bpelx:remove拡張要素がターゲット変数に適用されます。図6-9に詳細を示します。

図6-9 ターゲット変数に適用されたbpelx:remove拡張要素

図6-9の説明が続きます
「図6-9 ターゲット変数に適用されたbpelx:remove拡張要素」の説明

6.14.4.1 BPEL 1.1のbpelx:remove

例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-56 両方のアドレス行の削除

<bpel:assign>
    <bpelx:remove>
        <target variable="addrVar" 
            query="/a:usAddress/a:addressLine" />
    </bpelx:remove> 
</bpel:assign>

6.14.4.2 BPEL 2.0のbpelx:remove

例6-57に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:remove構文の例を示します。BPEL 2.0では、この機能は第6.14.4.1項「BPEL 1.1のbpelx:remove」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:remove拡張要素をラップします。

例6-57 BPEL 2.0のbpelx:remove拡張要素

<assign>
   <extensionAssignOperation>
      <bpelx:remove>
         <bpelx:target>$ncname.ncname/xpath_str</bpelx:target>
      </bpelx:remove>
   </extensionAssignOperation>
</assign>

6.14.5 bpelx:renameおよびXSDタイプ・キャストの使用方法

assignアクティビティでbpelx:rename拡張要素を使用すると、BPELプロセス・サービス・コンポーネントはXSDタイプ・キャストを使用して要素の名前を変更できます。Oracle BPELデザイナでbpelx:rename拡張要素を追加するには、「コピー・ルール」タブの右上隅にある「名前の変更」アイコンを、削除するターゲット変数にドラッグしてカーソルを離します。図6-8に示すように、「名前の変更」アイコンは「削除」アイコンの右側に表示されます。カーソルを離すと、ターゲット変数の名前を変更するための「名前の変更」ダイアログが表示されます。

6.14.5.1 BPEL 1.1のbpelx:rename

例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 Smithxsi: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-63 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>

6.14.5.2 BPEL 2.0のbpelx:rename

例6-64に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:rename構文の例を示します。BPEL 2.0では、この機能は第6.14.5.1項「BPEL 1.1のbpelx:rename」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:rename拡張要素をラップします。

例6-64 BPEL 2.0のbpelx:rename拡張要素

 <bpel:assign>
   <extensionAssignOperation>
      <bpelx:rename elementTo="QName1"? typeCastTo="QName2"?>
         <bpelx:target>$ncname[.ncname][/xpath_str]</bpelx:target>
      </bpelx:rename>
   </extensionAssignOperation>
</bpel:assign>

6.14.6 bpelx:copyListの使用方法

assignアクティビティでbpelx:copyList拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツに対して別の変数へのcopyList操作を実行できます。

BPEL 1.1でこの拡張要素を使用するには、図6-6に示すように、「コピー・ルール」タブの下部にあるコピー・ルールを選択し、ドロップダウン・リストから「リストのコピー」を選択します。BPEL 2.0でこの拡張要素を使用するには、図6-7に示すように、コピー・ルールを右クリックし、ルール・タイプの変更を選択して「リストのコピー」を選択します。

6.14.6.1 BPEL 1.1のbpelx:copyList

例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-70 変数のコンテンツ

<ns1:processResponse xmlns:ns1="http://xmlns.oracle.com/Event_
 jws/Event/EventTest">
            <ns1: payload >a</ns1: payload >
            <ns1: payload >b</ns1: payload >
</ns1:process> 

6.14.6.2 BPEL 2.0のbpelx:copyList

例6-71に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:copyList構文の例を示します。BPEL 2.0では、この機能は第6.14.6.1項「BPEL 1.1のbpelx:copyList」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:copyList拡張要素をラップします。

例6-71 BPEL 2.0の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>

6.14.7 assign拡張要素の属性の使用方法

次の属性をassignアクティビティのコピー・ルールに割り当てることができます。

  • ignoreMissingFromData

  • insertMissingToData

  • keepSrcElementName

assignアクティビティの「コピー・ルール」タブの下部で、選択したコピー・ルールを右クリックして、適切な属性を選択するためのメニューを表示します。図6-10に詳細を示します。

図6-10 assign拡張要素の属性

図6-10の説明が続きます
「図6-10 assign拡張要素の属性」の説明

6.14.7.1 ignoreMissingFromData属性

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"/>

6.14.7.2 insertMissingToData属性

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"/>

6.14.7.3 keepSrcElementName属性

keepSrcElementName属性を使用すると、(to-specの選択に従って)宛先の要素名をソースの要素名に置換できます。この属性は、BPEL 1.1では実装されていませんでした。表6-5に、BPELバージョン2.0でサポートされている構文を示します。

表6-5 keepSrcElementName属性の構文

BPEL 1.1 BPEL 2.0

未実装

<copy keepSrcElementName="yes|no"/>

6.15 XMLデータの検証

コードを検証してBPELプロジェクト内の無効なXMLデータを識別できます。

6.15.1 BPEL 1.1のXMLデータの検証方法

  • Oracle BPELデザイナ内のassignアクティビティで、次の手順を実行します。

    1. 「コンポーネント・パレット」の「BPELコンストラクト」セクションから、デザイナにassignアクティビティをドラッグします。

    2. assignアクティビティをダブルクリックします。

    3. 「一般」タブで、アクティビティの名前を入力し、「検証」チェック・ボックスを選択します。

    4. 「適用」「OK」の順にクリックします。

    5. 「ソース」タブをクリックして構文を表示します。

      <assign name=Assign1" bpelx:validate="yes"
        . . .  
      </assign>
      
  • Oracle BPELデザイナ内のスタンドアロン(assignアクティビティなしで使用可能な拡張validateアクティビティ)で、次の手順を実行します。

    1. 「コンポーネント・パレット」の「Oracle Extensions」セクションから、デザイナにvalidateアクティビティをドラッグします。

    2. 「検証」アイコンをダブルクリックします。

    3. アクティビティの名前を入力します。

    4. 「追加」アイコンをクリックして、検証する変数を選択します。

    5. 変数を選択し、「OK」をクリックします。

    6. 「適用」「OK」の順にクリックします。

    7. 「ソース」タブをクリックして構文を表示します。

      <bpelx:validate name=Validate1" variables="inputVariable"/>
      

6.15.2 BPEL 2.0のXMLデータの検証方法

  • Oracle BPELデザイナ内のassignアクティビティで、次の手順を実行します。

    1. 「コンポーネント・パレット」の「BPELコンストラクト」セクションから、デザイナにassignアクティビティをドラッグします。

    2. assignアクティビティをダブルクリックします。

    3. 「一般」タブで、アクティビティの名前を入力し、「検証」チェック・ボックスを選択します。

    4. 「適用」「OK」の順にクリックします。

    5. 「ソース」タブをクリックして構文を表示します。assignアクティビティを使用してXMLデータを検証するための構文は、BPELバージョン1.1とバージョン2.0では多少異なります。

      <assign name="Assign1" validate="yes">
       . . .
      </assign>
      
  • Oracle BPELデザイナ内のスタンドアロン(assignアクティビティなしで使用可能な拡張validateアクティビティ)で、次の手順を実行します。

    1. 「コンポーネント・パレット」の「BPELコンストラクト」セクションから、デザイナにvalidateアクティビティをドラッグします。

    2. 「検証」アイコンをダブルクリックします。

    3. アクティビティの名前を入力します。

    4. 「追加」アイコンをクリックして、検証する変数を選択します。

    5. 変数を選択し、「OK」をクリックします。

    6. 「適用」「OK」の順にクリックします。

    7. 「ソース」タブをクリックして構文を表示します。validateアクティビティを使用してXMLデータを検証するための構文は、BPELバージョン1.1とバージョン2.0では多少異なります。

      <validate name="Validate1" variables="inputVariable"/>
      

6.16 BPEL 2.0のメッセージ交換アクティビティでの要素変数の使用

次のメッセージ交換アクティビティで変数を指定できます。

これらのフィールドで参照される変数は通常、QNameが操作で使用される入力および出力メッセージ・タイプと一致するメッセージ・タイプ変数である必要があります。

例外は、アクティビティのWSDL操作が、要素を使用して定義された1つのパートを含むメッセージを使用している場合です。この場合、パートの定義に使用される同じ要素タイプの変数はそれぞれ、invokeアクティビティのinputVariable属性とoutputVariable属性、またはreceiveアクティビティまたはreplyアクティビティのvariable属性で参照できます。

この状況で変数を使用するのは、関連するWSDLメッセージ・タイプに基づいて匿名の一時WSDLメッセージ・変数を宣言するのと同じである必要があります。

匿名の一時WSDLメッセージ変数と要素変数の間で要素データをコピーするのは、keepSrcElementName属性がyesに設定された1回のコピー操作による単一の仮想割当てとして機能します。仮想割当ては、実際のassignアクティビティと同じルールに従い、同じフォルトを使用する必要があります。表6-6に詳細を示します。

表6-6 WSDLメッセージ・パートのマップ

対象 説明

inputVariable属性

属性で参照される変数の値により、匿名の一時WSDLメッセージ変数のパートの値が設定されます。

outputVariable属性

一時WSDLメッセージ変数の受信したパートの値により、属性で参照される変数の値が設定されます。

receiveアクティビティ

着信パートの値により、variable属性で参照される変数の値が設定されます。

replyアクティビティ

variable属性で参照される変数の値により、送信される匿名の一時WSDLメッセージ変数のパートの値が設定されます。フォルトを送信するreplyアクティビティの場合も、同じシナリオが適用されます。


keepSrcElementName属性の詳細は、第6.14.7.3項「keepSrcElementName属性」を参照してください。

6.17 BPEL 2.0でのWSDLメッセージ・パートのマップ

invokeアクティビティおよびreplyアクティビティのtoParts要素は、BPEL変数のコンテンツから明示的に作成されるマルチパートWSDLメッセージの代替手段を提供します。

例6-72に示すように、toParts要素を使用する場合、該当するWSDL操作の入力メッセージで指定されたタイプに基づいて、匿名の一時WSDL変数が定義されます。

例6-72 toParts要素

<toParts>
   <toPart part="payload" fromVariable="request"/>
</toParts>

toParts要素は、単一の仮想assignアクティビティとして機能します。各toPartは1回のコピー操作として機能します。WSDLメッセージ定義のパートごとに、最大で1つのtoPartが存在します。各コピー操作では、fromVariable属性で指定された変数から、toParts要素のpart属性で参照される匿名の一時WSDL変数のパートにデータがコピーされます。

receiveアクティビティ、invokeアクティビティ、scopeアクティビティのonEventブランチおよびpickアクティビティのonMessageブランチのfromParts要素は、toParts要素に似ています。例6-73に示すように、fromParts要素は、着信マルチパートWSDLメッセージからデータを取得し、個別の変数に配置します。

例6-73 fromParts要素

<fromParts>
   <fromPart part="payload" toVariable="request"/>
</fromParts>

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

6.17.1 WSDLメッセージ・パートのマップ方法

この項では、replyアクティビティがtoParts要素を使用して変数のコンテンツをコピーする、単純なBPELプロセスの概要を示します。この例で使用されるWSDLファイルとBPELファイルは、第6.17.2項「WSDLメッセージ・パートのマップ時の処理内容」例6-74および例6-75にあります。

BPEL 2.0でのWSDLメッセージ・パートのマップ方法

  1. 図6-11のreceiveアクティビティには、クライアントからの標準のinputVariable変数が含まれています。

    図6-11 receiveアクティビティ

    図6-11の説明が続きます
    「図6-11 receiveアクティビティ」の説明

  2. 図6-12のassignアクティビティは、test-type-variableのコンテンツをVar1にコピーします。

    図6-12 assignアクティビティ

    図6-12の説明が続きます
    「図6-12 assignアクティビティ」の説明

  3. 図6-13では、「変数」ボタンではなく、replyアクティビティの下部にある「送信先パート」ボタンが有効になっていることに注意してください。「追加」アイコンをクリックして、この項の情報を作成します。コピー操作により、「送信元変数」属性で示される変数Var1から、Part属性で参照される匿名の一時WSDL変数のパートにデータがコピーされます。

    図6-13 replyアクティビティの下部で定義される「送信先パート」セクション

    図6-13の説明が続きます
    「図6-13 replyアクティビティの下部で定義される「送信先パート」セクション」の説明

6.17.2 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>

6.18 BPEL 2.0でのプロセス定義のインポート

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要素には次の属性を含めることができます。

詳細は、「Web Services Business Process Execution Language Specification Version 2.0」の第5.4項を参照してください。

6.19 配列に類似したXMLデータ・シーケンスの操作

データ・シーケンスは、XMLで使用される最も基本的なデータ・モデルの1つです。しかし、データ・シーケンスの操作が重要な場合があります。BPELプロセス・サービス・コンポーネントで使用される最も一般的なデータ・シーケンス・パターンの1つが配列です。XMLスキーマに基づき、データ・シーケンス定義はその属性maxOccursから識別できます。この属性が、1より大きい値に設定されているか、unboundedとしてマークされています。詳細は、http://www.w3.org/TRXML Schema Specificationを参照してください。

この項の例では、BPELのデータ・シーケンスを操作するいくつかの基本的な方法を示します。ただし、ループの実行、エンドポイントの動的参照など、関連するその他の要件が存在します。次の項では、データ・シーケンス操作の特定の要件について説明します。

6.19.1 配列を使用するXMLデータ・シーケンスへの静的な索引付け方法

必要な要素索引が設計時にわかっているとき、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索引付けメソッドは機能的には同じであり、どちらを使用してもかまいません。

6.19.2 SOAPでエンコードされた配列の使用方法

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配列を準備する手順を示します。

  1. Oracle JDeveloperでBPELプロセスを作成します。

  2. 起動用のぺイロードを準備します。例6-87bpelx: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>
    
  3. 次のネームスペースをWSDLファイルにインポートします。WSDLスキーマ要素にインポート文が欠落している場合、Oracle JDeveloperではSOAP-ENCタグを認識しません。

    <xs:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
    

6.19.2.1 BPEL 2.0のSOAPでエンコードされた配列

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アクティビティのサンプルを示します。

例6-89 BPEL 2.0のinvokeアクティビティのSOAPでエンコードされた配列

<invoke name="Invoke1" partnerLink="FileOut"
   portType="ns3:Write_ptt" operation="Write"
   bpelx:invokeAsDetail="no">
   <toParts>
      <toPart part="body" fromVariable="ArrayVariable"/>
   </toParts>
</invoke>

6.19.3 シーケンス・サイズの決定方法

データ・シーケンスの実行時のサイズ、つまりシーケンス内のノードまたはデータ項目の数を知る必要がある場合は、XPath組込み関数count()とBPEL組込み関数getVariableData()を組み合せて使用することで取得できます。

例6-90のコードは、itemシーケンス内の要素数を計算し、それを整数変数lineItemSizeに割り当てています。

例6-90 シーケンス・サイズの決定

<assign>
   <copy>
      <from expression="count(bpws:getVariableData('outpoint', 'payload',
                        '/p:invoice/p:lineItems/p:item')"/>
      <to variable="lineItemSize"/>
   </copy>
</assign>

6.19.4 式の末尾へのXPathの適用による動的な索引付け方法

多くの場合、データ・シーケンスへの索引付けに動的な値が必要になることがあります。つまり、シーケンスのn番目のノード(nの値は実行時に定義)の取得が必要な場合です。この項では、式の末尾にXPathを適用して動的な索引付けを行う方法について説明します。

6.19.4.1 getVariableDataの結果の末尾への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に詳細を示します。

例6-93 ルート要素名の指定

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の標準セマンティクスでは不正となります。

6.19.4.2 bpelx:append拡張要素によるシーケンスへの新しい項目の追加

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変数のペイロード要素が親要素として使用されます。

6.19.4.3 データ・シーケンスのマージ

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>

6.19.4.4 空要素の配列と等価の機能の生成

genEmptyElem関数では、空要素の配列と等価の機能がXML構造に生成されます。この関数は、次の引数をとります。

genEmptyElem('ElemQName',int?, 'TypeQName'?, boolean?)

次の点に注意してください。

  • 最初の引数では、空要素のQNameを指定します。

  • 2番目の引数はオプションで整数型であり、空要素の数を指定します。指定されていない場合、デフォルトのサイズは1です。

  • 3番目の引数はオプションで、生成される空の名前のxsi:typeとなるQNameを指定します。このxsi:typeパターンは、SOAPENC:Arrayに相当します。指定されていないか、空の文字列である場合、xsi:type属性は生成されません。

  • 4番目の引数は、オプションでブール型であり、生成される空の要素において、XSD-nillableがtrueの場合に、XSI - nilをtrueにするかどうかを指定します。デフォルト値は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-96genEmptyElem関数は、例6-97のように埋込みXQuery式で置き換えることができます。

例6-97 埋込みXQuery式

ora:genEmptyElem('p:lineItem',10) 
== for $i in (1 to 10) return <p:lineItem />

この関数により生成される空要素は、通常は無効なXMLデータです。空要素の作成後に、さらにデータの初期化を実行します。前述と同じ例を使用して、次の操作を実行できます。

  • 空のlineItem要素に属性要素と子要素を追加します。

  • copy操作を実行して空要素を置き換えます。たとえば、flowNアクティビティの下で、この等価配列内の個別エントリにWebサービスの結果からコピーします。

6.19.5 配列識別子の使用に関する注意事項

ネイティブ・フォーマット・ビルダー配列識別子環境での処理には、ノードの親ノードに関する情報が必要です。reportSAXEvents APIが使用されるため、通常、この情報はアウトバウンド・メッセージ・シナリオには使用できません。ネイティブ・スキーマのnxsd:useArrayIdentifierstrueに設定することで、アウトバウンド・メッセージ・シナリオに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> 

6.20 文字列からXML要素への変換

サービスは文字列を返すように定義されることがありますが、文字列の内容は実際にはXMLデータです。問題は、BPELではXMLデータの操作(XPath問合せや式などを使用)はサポートされていますが、変数またはフィールドが文字列型の場合にこの機能が使用できないことです。Javaでは、DOM関数を使用して文字列を構造化されたXMLオブジェクト・タイプに変換します。同じことが、BPEL XPath関数parseEscapedXMLを使用して実行できます。

parseEscapedXMLの詳細は、B.2.47項「parseEscapedXML」を参照してください。

6.20.1 文字列からXML要素への変換方法

parseEscapedXML関数はXMLデータを受け取り、DOMによって解析し、型指定されたBPEL変数に割当て可能な構造化XMLデータを返します。例6-99に例を示します。

例6-99 文字列からXML要素への変換

<!-- execute the XPath extension function
parseEscapedXML('&lt;item&gt;') and assign to a variable
-->
<assign>
   <copy>
      <from expression="oratext:parseEscapedXML(
         '&lt;item xmlns=&quot;http://samples.otn.com&quot;
                   sku=&quot;006&quot;&gt;
          &lt;description&gt;sun ultra sparc VI server
          &lt;/description&gt;
          &lt;price&gt;1000
          &lt;/price&gt;
          &lt;quantity&gt;2
          &lt;/quantity&gt;
          &lt;lineTotal&gt;2000
          &lt;/lineTotal&gt;
          &lt;/item&gt;')"/>
      <to variable="escapedLineItem"/>
   </copy>
</assign>

6.21 ドキュメント形式とRPC形式のWSDLの違いの理解

前述のすべての例はドキュメント形式の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>

6.21.1 RPC形式ファイルの使用方法

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>

例6-103 RPC形式のBPELファイル

<variable name="output"
          messageType="tns:LoanServiceResultMessage"/>
...
<assign>
   <copy>
      <from expression="9.9"/>
      <to variable="output" part="payload" query="/payload/APR"/>
   </copy>
</assign>

6.22 BPELでのSOAPヘッダーの操作

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 ..." .../>

6.22.1 BPELでのSOAPヘッダーの受信方法

この項では、SOAPヘッダーを受信するBPELファイルとWSDLファイルの作成方法を、例を挙げて説明します。

BPELでSOAPヘッダーを受信する手順は、次のとおりです。

  1. ヘッダー・メッセージとそれを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>
    
  2. 例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"/>
    

6.22.2 BPELでのSOAPヘッダーの送信方法

この項では、SOAPヘッダーの送信方法を例を挙げて説明します。

BPELでSOAPヘッダーを送信する手順は、次のとおりです。

  1. composite.xmlでSCA参照を定義して、HeaderServiceを参照します。

  2. 例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"/>
    

6.23 BPEL 2.0での拡張ネームスペースの宣言

バージョン2.0のBPELプロセスを拡張して、カスタム拡張ネームスペース宣言を追加できます。mustUnderstand属性を使用すると、カスタム・ネームスペースがBPELプロセスで認識される必要があるセマンティックを持つかどうかを示すことができます。

mustUnderstandyesに設定された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

6.23.1 拡張ネームスペースの宣言方法

拡張ネームスペースを宣言する手順は、次のとおりです。

  1. BPEL 2.0プロセスで、Oracle BPELデザイナの上にある「拡張機能」アイコンをクリックします。

    「拡張機能」ダイアログが表示されます。

  2. 「拡張機能」フォルダを選択し、「追加」アイコンをクリックします。

    「拡張機能」ダイアログが表示されます。

  3. 「ネームスペース」フィールドに、宣言する拡張ネームスペースを入力します。このネームスペースは、標準のBPELネームスペースとは異なるものにする必要があります。

  4. 拡張機能がBPELプロセスで認識されるようにするには、「認識する必要がある」チェック・ボックスを選択します。

  5. 「OK」をクリックします。

  6. 「閉じる」をクリックします。

6.23.2 拡張機能作成時の処理内容

設計の完了後、.bpelプロセスは例6-109のようになります。

例6-109 カスタム・ネームスペースを持つ拡張機能

<extensions>
   <extension namespace="http://xmlns.mycompany.com/myNamespace"
    mustUnderstand="yes"/>
</extensions>