ユーザーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容

XQuery の実装

AquaLogic Service Bus では、XQuery エンジンの BEA AquaLogic Data Services Platform 実装を使用します。XQuery エンジンは、1 つの例外モジュールを除き、XQuery の W3C (World Wide Web Consortium) の仕様に記載されているすべての言語機能を完全にサポートしています。XQuery 1.0 および XPath 2.0 の関数と演算子の詳細 (2004 年 7 月 23 日に公開された W3C の作業草案) については、次の URL を参照してください。

http://www.w3.org/TR/2004/WD-xpath-functions-20040723/

AquaLogic Service Bus では、以下の XQuery 関数をサポートしています。

注意 : すべての BEA の拡張関数で、次の関数プレフィックス fn-bea: を使用します。つまり、XQuery の完全な表記では拡張関数は次の形式になります。
fn-bea: function_name

 


AquaLogic Data Services Platform でサポートされる拡張関数

AquaLogic Service Bus は、以下の関数を除き、BEA AquaLogic Data Services Platform が提供するすべての拡張関数をサポートしています。

以下の関数は使用しないでください。他の言語機能で代用することをお勧めします。

AquaLogic Data Services Platform の拡張関数のリストと各関数の説明については、『XQuery 開発者ガイド』の「BEA の XQuery 実装」を参照してください。

 


AquaLogic Service Bus での拡張関数

AquaLogic Service Bus には、以下の XQuery 関数が用意されています。

fn-bea:lookupBasicCredentials

fn-bea:lookupBasicCredentials 関数は、指定されたサービス アカウントのユーザ名と暗号化されていないパスワードを返します。任意のタイプのサービス アカウントを指定できます (静的、パススルー、またはユーザマッピング)。詳細については、『AquaLogic Service Bus Console の使い方』の「サービス アカウント」を参照してください

fn-bea:lookupBasicCredentials 関数は、カスタム転送ヘッダ、または SOAP エンベロープのアプリケーション固有の場所にあるユーザ名とパスワードのエンコードに使用する XQuery 関数の大規模なセットの一部として使用します。ユーザ名とパスワードのみを HTTP 認証ヘッダに含める必要がある場合、または同様に WS-Security ユーザ名トークンのみの場合は、この関数を使用する必要はありません。AquaLogic Service Bus は事前にサービス アカウントからユーザ名とパスワードを取得し、必要に応じて HTTP 認証ヘッダにエンコードします (WS-Security ユーザ名トークンの場合も同様)。

関数には以下の署名が含まれます。

fn-bea:lookupBasicCredentials( $service-account as xs:string ) as UsernamePasswordCredential

ここで、$service-account は、以下の形式のサービス アカウントのパスと名前です。

project-name[/folder[...]]/service-account-name

戻り値は、以下の形式の XML 要素です。

<UsernamePasswordCredential
   xmlns="http://www.bea.com/wli/sb/services/security/config">
   <username>
name</username>
   <password>
unencrypted-password</password>
</UsernamePasswordCredential>

返された要素をユーザ定義の変数に保管し、必要なときにこの変数からユーザ名とパスワード値を取得できます。

たとえば、AquaLogic Service Bus プロジェクトには、myProject という名前が付けられます。myServiceAccount という名前の静的なサービス アカウントを、myFolder1/myFolder2 という名前のフォルダに作成します。サービス アカウントに、ユーザ名 pat とパスワード patspassword を保存します。

サービス アカウントのユーザ名とパスワードを取得するには、以下の関数を呼び出します。

fn-bea:lookupBasicCredentials( myProject/myFolder1/myFolder2/myServiceAccount )

関数は以下の要素を返します。

<UsernamePasswordCredential
   xmlns="http://www.bea.com/wli/sb/services/security/config">
   <username>pat</username>
   <password>patspassword</password>
</UsernamePasswordCredential>

fn-bea: uuid()

関数 fn-bea:uuid() は、汎用一意識別子を返します。関数には以下の署名が含まれます。

fn-bea:uuid() as xs:string

この関数をプロキシ パイプラインで使用して、ユニークな識別子を生成できます。生成されたユニークな識別子を、要素として XML ドキュメントに挿入できます。システム変数にユニークな識別子は生成できません。これを、メッセージ ペイロードの変更に使用できます。

たとえば、トラッキング用にユニークな識別子を生成してメッセージに追加するとします。この関数を使用してユニークな識別子を生成できます。関数が返す文字列を SOAP ヘッダに追加できます。

fn-bea:execute-sql()

fn-bea:execute-sql() 関数を使用すると、AquaLogic Service Bus のメッセージ フローで XQuery から低レベルのデータベースにアクセスできます。詳細については、「XQuery を使用したデータベースへのアクセス」を参照してください。クエリは、型付きデータを含むフラットな行要素のシーケンスを返します。

関数には以下の署名が含まれます。

fn-bea:execute-sql( $datasource as xs:string, $rowElemName as xs:QName, $sql as xs:string, $param1, ..., $paramk) as element()*

ここで、

戻り値は、型付きデータを含むフラットな行要素のシーケンスで、SQL/JDBC データ モデルと XQuery データ モデル間で値を自動的に変換します。サポート対象のデータベースについて XQuery エンジンが生成する、またはサポートするデータ型マッピングの詳細については、「XQuery-SQL マッピング参照」を参照してください。

AquaLogic Service Bus メッセージ フローから fn-bea:execute-sql() 関数を実行する場合、返された要素をユーザ定義の変数に格納できます。

以下の例では、AquaLogic Service Bus での fn-bea:execute sql() 関数の使用方法について説明します。

例 1 : 動的ルーティングのデータベースからの URI の取得

AquaLogic Service Bus プロキシ サービスでは、実行時のメッセージのルーティング (動的) 先である URI の仕様をサポートしています。詳細については、「動的ルーティングの使用」を参照してください。以下のコード リストは、動的ルーティング シナリオでデータベースから URI を取得する fn-bea:execute-sql() 関数の例です。

コード リスト 10-1 データベースからのビジネス サービスの URI の取得
<ctx:route><ctx:service>
{
    fn-bea:execute-sql(
    'ds.myJDBCDataSource', 
    xs:QName('customer'), 
    'SELECT targetService FROM DISPATCH_MAPPING WHERE customer_priority=?',
      xs:string($body/m:Request/m:customer_pri/text())
    )/TARGETSERVICE/text()
}
</ctx:service></ctx:route>

上記の例で、

DISPATCH_MAPPING テーブルが次のように生成されます。

コード リスト 10-2 DISPATCH_MAPPING テーブル
 INSERT INTO DISPATCH_MAPPING (customer_priority, targetService, soapPayload)
 VALUES ('0001', 'system/UCGetURI4DynamicRouting_proxy1', '<something/>');
 INSERT INTO DISPATCH_MAPPING (customer_priority, targetService, soapPayload)
 VALUES ('0002', 'system/UCGetURI4DynamicRouting_proxy2', '<something/>');
注意 : このシナリオでは、テーブルの 3 行目 (soapPayload) は使用しません。

例 3 の fn-bea:execute-sql の実行

プロキシ サービスが コード リスト 10-3 の要求メッセージを受信した結果として、コード リスト 10-1 の XQuery が実行される場合 (要求メッセージの <customer_pri> の値は 0001)、動的ルート シナリオに返される URI は次のようになります。

system/UCGetURI4DynamicRouting_proxy1

(コード リスト 10-2 も参照)

コード リスト 10-3 要求メッセージ $body の例
<m:Request xmlns:m="http://www.bea.com/alsb/example">
<m:customer_pri>0001</m:customer_pri>
</m:Request>

例 2 : データベースからの XMLType データの取得

サポート対象のデータベースについて XQuery エンジンが生成する、またはサポートするデータ型マッピングの詳細については、「XQuery-SQL マッピング参照」を参照してください。SQL の XMLType カラム タイプはサポートされていません。ただし、XMLType オブジェクトの getStringVal() メソッドを使用して XMLType カラムのデータにアクセスし、文字列値に変換できます。

以下のシナリオでは、Oracle データベースの XMLType カラムからデータを選択する際に使用できる手順について説明します。

  1. プロキシ サービスのメッセージ フローで割り当てアクションを使用して、次の XQuery の結果を変数 ($result) に割り当てます。
  2. コード リスト 10-4 データベースからの XMLType データの取得
    fn-bea:execute-sql(
        'ds.myJDBCDataSource', 
        'Rec', 
        'SELECT a.purchase_order.getStringVal() purchase_order from datatypes a'
    )

    ここで、

    • ds.myJDBCDataSource はデータ ソースの JNDI 名。
    • Rec$rowElemName。したがって、Rec は結果の要素シーケンスの各要素に指定された QName です。
    • select a.purchase_order.getStringVal() ... は、文字列値に変換するために、XMLType オブジェクトの getStringVal() メソッドを使用する SQL ステートメント。
    • datatypes は、XML の値の読み込み元であるテーブル (この場合、datatypes テーブルには 1 つの行が含まれている)。
    • 注意 : dataty.pes テーブルのテーブル定義を以下に示す。
      create table datatypes
      (
        purchase_order xmltype
      );
  3. 以下の置換アクションを使用して、$body のノードのコンテンツを fn-bea:execute-sql() クエリの結果 (前の手順で $result に割り当てた) に置換します。
  4. Replace [ node contents ] of [ undefined XPath ] in [ body ] with 
    [ $result/purchase_order/text() ]

    以下のサンプル コードは、置換後の $body を示します。

注意 : datatypes テーブルには 1 つの行 (発注書データを含む) が含まれています。この行には、コード リスト 10-5 に示す XML が含まれています。
コード リスト 10-5 fn-bea:execute-sql() の結果での XML コンテンツ置換後の $body
<soap-env:Body>
  <openuri:orders xmlns:openuri="http://openuri.com/"> 
    <openuri:order> 
      <openuri:customerID>123</openuri:customerID> 
      <openuri:orderID>123A</openuri:orderID> 
    </openuri:order> 
    <openuri:order> 
      <openuri:customerID>345</openuri:customerID> 
      <openuri:orderID>345B</openuri:orderID> 
    </openuri:order> 
    <openuri:order> 
      <openuri:customerID>789</openuri:customerID> 
      <openuri:orderID>789C</openuri:orderID> 
    </openuri:order> 
  </openuri:orders> 
</soap-env:Body>

  ページの先頭       前  次