データ サービス開発者ガイド

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

エンタープライズ メタデータの取得

BEA Aqualogic Data Services Platform 用のデータ サービスを作成するにあたっての最初の手順は、アプリケーションに必要となるメタデータを、物理データから取得することです。

この章ではこのプロセスについて説明します。内容は以下のとおりです。

 


データ ソースのメタデータの作成

メタデータとは単に、データ ソースの構造に関する情報のことです。 たとえば、リレーショナル データベースにおけるテーブルおよびカラムのリストは、メタデータです。 Web サービスにおけるオペレーションのリストは、メタデータです。

AquaLogic Data Services Platform では、物理データはほぼ全体が、物理データ ソース内に対する参照に基づいています。

図 3-1 RTL サンプル アプリケーションで使用可能なデータ サービス

RTL サンプル アプリケーションで使用可能なデータ サービス

表 3-2 に、AquaLogic Data Services Platform がメタデータを作成できるソースの種類を示します。

表 3-2 データ サービスのメタデータの作成に使用可能なデータ ソース
データ ソースのタイプ
アクセス
リレーショナル (テーブル、ビュー、ストアド プロシージャ、SQL など)
JDBC
Web サービス (WSDL ファイル)
URL、UDDI、WSDL
区切り文字付き (CSV ファイル)
スプレッドシートなど、ファイルベースのデータ
Java 関数 (.java)
プログラム的
XML (XML ファイル)
ファイルまたはデータのストリームベースの XML

メタデータ インポート ウィザードを使用して物理データに関する情報を作成すると、次の 2 つの処理が行われます。

アプリケーションで必要なデータ ソースのメタデータは、AquaLogic Data Services Platform のメタデータ インポート ウィザードを使用してインポートできます。 このウィザードは、使用可能なデータ ソース内を参照し、データ サービスおよび関数として表現できるデータ オブジェクトを識別します。 作成された物理データ サービスはクエリおよび論理データ サービスの構成要素となります。

データ ソース メタデータは、AquaLogic Data Services Platform の関数またはプロシージャとしてインポートできます。 たとえば、Web サービス オペレーションをインポートしたことによって、次のソースが得られたとします。

(::pragma function <f:function xmlns:f="urn:annotations.ld.bea.com" kind="read" nativeName="getCustomerOrderByOrderID" nativeLevel1Container="ElecDBTest" nativeLevel2Container="ElecDBTestSoap" style="docu	ment"/>::)
declare function f1:getCustomerOrderByOrderID($x1 as element(t1:getCustomerOrderByOrderID)) as schema-element(t1:getCustomerOrderByOrderIDResponse) external;

インポートされた Web サービスは、プラグマ内の「read」関数として記述されていることに留意してください。 「External」は、スキーマが別個のファイルであることを示しています。 ソース コードのアノテーションの詳細な説明は、『XQuery 開発者ガイド』の「Understanding AquaLogic Data Services Platform Annotations」を参照してください。

Web サービスなど、一部のデータ ソースの場合、インポートされたメタデータは、一般的に void を返す関数を表します (つまり、これらの関数は、データを返すのではなく操作を実行するものです)。 そのようなルーチンは、副作用関数、または正式には、AquaLogic Data Services Platform プロシージャとして分類されます。 また、ある特定のデータ ソースからインポートされたルーチンをプロシージャとしてマークすることもできます (「AquaLogic Data Services Platform のプロシージャの識別」を参照)。

Web サービス メタデータのインポートで、次のように副作用プロシージャとして識別されるオペレーションを含むソースが得られました。

(::pragma function <f:function xmlns:f="urn:annotations.ld.bea.com" kind="hasSideEffects" nativeName="setCustomerOrder" style="document"/>::)
declare function f1:setCustomerOrder($x1 as element(t3:setCustomerOrder)) as schema-element(t3:setCustomerOrderResponse) external;

上のプラグマでは、関数は「hasSideEffects」として認識されます。

注意 : AquaLogic Data Services Platform プロシージャは物理データ サービスとのみ関連付けられており、メタデータ インポート プロセスを通じてのみ作成可能です。 したがって、たとえばソース ビューを介して論理データ サービスへプロシージャを追加しようとすると、エラーが発生します。

AquaLogic Data Services Platform のプロシージャの識別

Web サービス、リレーショナル ストアド プロシージャ、または Java 関数のソース メタデータをインポートする際には、副作用ルーチンを表すメタデータを識別する機会があります。 一般的な例としては、新規顧客レコードを作成する Web サービスが挙げられます。 データ サービス側から見ると、このようなルーチンはプロシージャです。

プロシージャは、スタンドアロンではありません。常に同じデータ ソースからのデータ サービスの一部です。

そのようなソースからデータをインポートする場合、メタデータ インポート ウィザードは void を返すルーチンを自動的にプロシージャとして分類します。 その理由は単純に、データを返さないルーチンは、他のデータ サービス関数と相互運用できないからです。

しかし、データを返すと共に、副作用もあるルーチンが存在します。これらのルーチンを、メタデータ インポート プロセス中に、プロシージャとして識別する必要があります。 そのようなプロシージャを識別することにより、アプリケーション開発者には、2 つの重要な利点がもたらされます。

表 3-4 に、共通の AquaLogic Data Services Platform における操作を示し、データ サービス プロシージャに使用できるものと使用できないものを特定します。

表 3-4 AquaLogic Data Services Platform におけるプロシージャの範囲
アーティファクト
使用できるプロシージャ
使用できないプロシージャ
AquaLogic Data Services Platform IDE
  • メタデータ インポート操作
  • テスト ビューからの関数の実行
  • AquaLogic Data Services Platform の制御クエリ関数パレット
  • AquaLogic Data Services Platform パレット
  • XQuery エディタ関数リスト
  • クエリ プラン ビューア関数リスト
  • クエリで使用するもの
  • 論理データ サービスで使用するもの
AquaLogic Data Services Platform Console
  • 関数のセキュリティ設定
  • 左側のツリーへのアクセス
  • キャッシュ操作
AquaLogic Data Services Platform API
  • invokeProcedure()
  • 強力な型付き API
  • AquaLogic Data Services Platform 制御
  • invoke() API (関数にのみ使用)
  • クエリ実行用の prepareExpression()

プロシージャを使用すると、invokeProcedure( ) API を指定することによって、非リレーショナルなバックエンドのデータ ソースを更新するプロセスが大幅に簡素化されます。 この API には、リレーショナル ストアド プロシージャ、Web サービス、または Java 関数を呼び出すのに必要なオペレーション論理がカプセル化されています。 このような場合には、更新論理をバックエンドのデータ ソース ルーチン内に構築でき、そのルーチンがデータを更新します。

非リレーショナルなソースの更新やその他の特別な場合に関する情報は、「データ サービスを介した更新の処理」を参照してください。

メタデータ インポート プロセス中に副作用プロシージャを識別する方法の例については、「Web サービスのメタデータのインポート」を参照してください。

 


リレーショナル ソースからのメタデータの取得

BEA WebLogic Platform で使用可能なすべてのリレーショナル データ ソースについて、メタデータを取得することができます。 詳細については、BEA Platform のドキュメント「SQL Server や Oracle などのデータベースにデータベース コントロールを接続するには」を参照してください。

リレーショナル データ ソースからは、次の 5 種類のメタデータを取得できます。

注意 : XA トランザクション ドライバを使用している場合、単一のデータベースによる読み取りと更新を正常に実行させるためには、LocalTransaction を許可するようにデータ ソースの接続プールをマークする必要があります。
注意 : XA トランザクション アダプタ設定の詳細については、BEA WebLogic Integrationのドキュメントの『アダプタの開発』http://edocs.beasys.co.jp/e-docs/wli/docs81/devadapt/dbmssamp.html を参照してください。

リレーショナル テーブルおよびビューのメタデータのインポート

リレーショナル テーブルおよびビューに関するメタデータを作成するには、次の手順に従います。

  1. メタデータを作成するプロジェクトを選択します。 たとえば、myLDProject というプロジェクトがある場合、そのプロジェクト名を右クリックして、ポップアップ メニューから [ソース メタデータのインポート] を選択します。 [次へ] をクリックします。
  2. インポート ウィザードの使用可能なデータ ソースから、[関係演算子] を選択します (図 3-5 を参照)。
  3. 図 3-5 メタデータ インポート ウィザードからのリレーショナル ソースの選択


    メタデータ インポート ウィザードからのリレーショナル ソースの選択

  4. 使用可能なソースの中からデータ ソースを選択するか、WLS で使用できる新しいデータ ソースを作成します。
  5. 図 3-6 データ ソース メタデータのインポート選択ダイアログ ボックス


    データ ソース メタデータのインポート選択ダイアログ ボックス

データ オブジェクト選択オプション

新しいデータ ソースの作成については、「新しいデータ ソースを作成する」を参照してください。

既存のデータ ソースから選択する場合は、いくつかのオプションが指定可能です (図 3-6)。

すべてのデータベース オブジェクトを選択する

すべてを選択した場合は、カタログおよびスキーマによって整理された、データ ソース内のすべてのテーブル、ビュー、およびストアド プロシージャを含む表が表示されます。

データ ソース オブジェクトをフィルタ処理する

場合によっては、データ ソース内のデータ サービスに変換するオブジェクトが正確に分かっていることがあります。 あるいは、データ ソースが大きすぎて、フィルタが必要な場合もあります。 また、特定の命名特性 (囲まれている文字列を含むすべてのオブジェクトを取得する、%audit2003% という文字列など) を持つオブジェクトを探している場合もあります。

そのような場合、標準的な JDBC のワイルドカードを使用して、データ サービスの候補とするリレーショナル ソースの部分を正確に識別できます。 アンダースコア (_) を付けると、単独の文字のためのワイルドカードになります。 パーセント記号 (%) は、文字列用のワイルドカードを示します。 入力内容の大文字/小文字は区別されます。

たとえば、CUST% と入力することで、CUST で開始されるすべてのテーブルを検索できます。 また、ELECTRONICS というリレーショナル スキーマがある場合は、[スキーマ] フィールドにその語を入力し、そのスキーマの一部であるすべてのテーブル、ビュー、およびストアド プロシージャを取得できます。

別の例としては、

 CUST%, PAY%  

と [テーブル/ビュー] フィールドに入力することで、CUST または PAY で開始されるすべてのテーブルおよびビューが取得されます。

注意 : 特定のフィールドについて、項目が何も入力されていなければ、一致するすべての項目が取得されます。 たとえば、[プロシージャ] フィールドにフィルタ処理用の入力がなかった場合、データ オブジェクト内のすべてのストアド プロシージャが取得されます。

リレーショナル テーブルおよびビューについては、[すべて選択] または [データ ソース オブジェクトのフィルタ処理] を選択する必要があります。

また、内部ストアド プロシージャに関するメタデータのインポートのサポートのために、ワイルドカードを使用することもできます。 たとえば、次の文字列をストアド プロシージャ フィルタとして入力します。

%TRIM%

これにより、以下のシステムのストアド プロシージャに関するメタデータが取得されます。

STANDARD.TRIM

このような状況では、同時に [テーブル/ビュー] フィールドに意味をなさない入力を行い、データベース内のすべてのテーブルおよびビューが取得されてしまうことを回避するとよいでしょう。

ストアド プロシージャの詳細については、「ストアド プロシージャベースのメタデータのインポート」を参照してください。

SQL 文

データ サービス作成の基盤として使用される SQL 文の入力を行えます。 詳細については、「SQL を使用したメタデータのインポート」を参照してください。

新しいデータ ソースを作成する

ほとんどの場合、作業は既存のデータ ソースで行います。 しかし、[新規...] を選択した場合は、WLS データソース ビューアが表示されます (図 3-7)。 データソース ビューアを使用すると、新しいデータ プールおよびソースを作成できます。

図 3-7 BEA WebLogic データソース ビューア

BEA WebLogic データソース ビューア

データソース ビューアの使い方の詳細については、WebLogic Workshop のドキュメントの「データ ソースをコンフィグレーションする」を参照してください。

既存のデータ ソースを選択する

AquaLogic Data Services Platform アプリケーションまたはプロジェクトで使用できるのは、BEA WebLogic Administration Console で設定したデータ ソースのみです。 AquaLogic Data Services Platform によって使用されている BEA WebLogic Server が、特定のリレーショナル データ ソースにアクセスするためには、JDBC 接続プールおよび JDBC データ ソースを設定することが必要です。

データ ソースを選択したら、メタデータの開発を、データベース内のすべてのオブジェクトを選択することによって行うのか、データベース オブジェクトをフィルタ処理して行うのか、それとも SQL 文を入力することによって行うのかを選択する必要があります (図 3-6 を参照)。

テーブルベースおよびビューベースのメタデータを作成する

データ ソースおよび任意指定のフィルタを選択し終わると、使用可能なデータベース オブジェクトが表示されます。

図 3-9 データ サービスとして使用するデータベース オブジェクトの識別

データ サービスとして使用するデータベース オブジェクトの識別

標準のダイアログ コマンドを使って、1 つまたは複数のテーブルを、選択済みデータ オブジェクトのリストに追加できます。 テーブルの選択を解除するには、右側のカラムでそのテーブルを選択し、[削除] をクリックします。

[検索] フィールドを利用することもできます。 これは、多くのオブジェクトがあるデータ ソースには有用です。 検索文字列を入力して [検索] のクリックを繰り返し、リスト内を移動します。

  1. 1 つまたは複数のデータ ソースを選択し終わったら、[次へ] をクリックして、作成予定のデータ サービスの場所と、新しいデータ サービスの名前を確認します。
  2. インポートされたデータの概要画面では、次のことが行われています。

    • 選択されたオブジェクトを名前で表示。 XML 型の上にマウス カーソルを合わせると、完全なパスを確認できます (図 3-10)。
    • 現在のアプリケーション内の生成されたデータ サービスの場所を表示。
    • 名前の衝突がある場合は、それを特定。 名前の衝突が起こるのは、対象ディレクトリ内に同じ名前のデータ サービスがある場合です。 名前の衝突がある場合は、赤色で強調表示されています。
名前を明確にする、または衝突を避けるために、ファイル名を編集できます。 単に、ファイル名をクリックして、任意の編集変更を行います。

または、[すべて削除] を選択して、初期の何も設定されていない状態に戻ります。

  1. データ サービスの名前を変更する必要が生じる状況は、いくつかあります。
    • アプリケーション内に、同名のデータ サービスがすでに存在する。
    • 同名のデータ サービスを複数、作成しようとしている。
    • そのような場合、名前の衝突が起こっているデータ サービスの名前が、赤色で表示されます。 単純に、組み込みのライン エディタを使用して、ユニークな名前に変更します。

      図 3-10 リレーショナル ソース インポート データの概要画面


      リレーショナル ソース インポート データの概要画面

  2. [完了] をクリックします。 選択された各オブジェクトについて、データ サービスが作成されます。 作成されたデータ サービスのファイル拡張子は、常に .ds となります。
データベース固有の考慮事項

データベースのベンダによる、データベース カタログおよびスキーマのサポート状況は、さまざまです。表 3-11 では、いくつかの大手ベンダの場合の、このサポートについて説明します。

表 3-11 カタログおよびスキーマ オブジェクトに対するベンダのサポート
ベンダ
カタログ
スキーマ
Oracle
カタログはサポートしていない。 データベース オブジェクト指定時、カタログ フィールドは空白にしておくこと。
一般的には、Oracle ユーザ ID の名前。
DB2
データベース オブジェクトを指定する場合、カタログ フィールドは空白にしておくこと。
スキーマ名はデータベースのカタログ所有者 (db2admin など) に対応する。
Sybase
カタログ名はデータベース名。
スキーマ名はデータベース所有者に対応する。
Microsoft SQL Server
カタログ名はデータベース名。
スキーマ名はカタログ所有者 (dbo など) に対応する。 スキーマ名は、接続しているデータベースのカタログまたはデータベース所有者と一致する必要がある。
Informix
カタログはサポートしていない。 データベース オブジェクトを指定する場合、カタログ フィールドは空白にしておくこと。
必要なし。
PointBase
PointBase データベース システムは、カタログをサポートしていない。 データベース オブジェクトを指定する場合、カタログ フィールドは空白にしておくこと。
スキーマ名はデータベース名に対応する。

XML 名前変換に関する考慮事項

XML の命名規約の範疇に収まらないソース名があった場合、デフォルトで生成された名前は、SQLX 標準に記載されているルールに従って変換されます。 一般的に、無効な XML 名の文字は、16 進値のエスケープ シーケンス (_xUUUU_ の形式) に置換されます。

詳細については、この標準の W3C 草案バージョンにおける節 9.1 を参照してください。


http://www.sqlx.org/SQL-XML-documents/5WD-14-XML-2003-12.pdf 

データ サービスを作成し終えたら、物理データに関する論理ビューの構築を開始できる準備が整った状態です。 「データ サービスの設計」および「データ サービスのモデル化」を参照してください。

ストアド プロシージャベースのメタデータのインポート

多くの DBMS システムでは、クエリのパフォーマンス向上、データ操作の管理およびスケジューリング、セキュリティ強化などのために、ストアド プロシージャを利用しています。 特定的にサポートされているベンダの場合、ストアド プロシージャに基づくメタデータをインポートすることができます。 各ストアド プロシージャは、データ サービスとなります。

注意 : 詳細については、AquaLogic Data Services Platform の『リリース ノート』の「サポート対象のコンフィグレーション」を参照してください。 ストアド プロシージャの作成と管理の詳細については、特定の DBMS のドキュメントを参照してください。

ストアド プロシージャとは本質的に、SQL のセットと、ネイティブ データベース プログラミング言語の文を論理的に 1 つのグループとし、特定のタスクを実行するものです。

表 3-12 では、いくつかの共通に使用される用語を、ストアド プロシージャに関するこの説明に当てはまるように定義しています。

表 3-12 ストアド プロシージャの説明で共通に使用される用語
用語
使用方法
関数
関数は、プロシージャと同じである。ただし関数は常に呼び出し側に 1 つまたは複数の値を返し、プロシージャはまったく値を返さない。 この値は、単純型、行型、または複合的なユーザ定義型であり得る。
パッケージ
パッケージとは、関連付けされたプロシージャおよび関数を、それらが使用するカーソルおよび変数と合わせたグループで、1 つの単位として継続的に使用するためにデータベース内に一緒に格納されている。 スタンドアロンのプロシージャおよび関数と同様に、パッケージ化されたプロシージャおよび関数は、アプリケーションまたはユーザが、明示的に呼び出すことができる。
ストアド プロシージャ
拡張 SQL (PL/SQL、T-SQL など)、Java、または XQuery で書かれたプログラミング コマンドのシーケンス。パフォーマンスを最大化してセキュリティを強化するため、使用するデータベース内に格納される。 アプリケーションは、データベース レコードを取得または操作する際に、データベースの外部のコードを使用するのではなく、プロシージャを呼び出して同じ結果を得ることができる。 ストアド プロシージャは、値を返さない。
AquaLogic Data Services Platform プロシージャ
一般的に、作業を実行するが、データを返さないルーチン。 例としては、ログ ファイルに情報を書き込む、データ サービスから呼び出し可能なルーチンが挙げられる。
行セット
プロシージャまたはクエリによって返される行のセット。
結果セット
行セットの、JDBC 用語。
パラメータ モード
プロシージャには、IN、OUT、および INOUT という 3 つのモードがあり得る。 それぞれは、大まかに「書き込み」、「読み取り」、および「読み取り/書き込み」に相当する。

メタデータ インポート ウィザードを使用したストアド プロシージャのインポート

インポートされたストアド プロシージャのメタデータは、リレーショナル テーブルおよびビューのインポートされたメタデータに、極めて似通っています。 ストアド プロシージャをインポートする手順の最初の 3 つは、任意のリレーショナル メタデータ (「リレーショナル テーブルおよびビューのメタデータのインポート」で説明) をインポートする際の手順と同じです。

注意 : ストアド プロシージャの戻り値が 1 つしかなく、その値が、既存のスキーマにマッピングする単純型または行セットのいずれかである場合、スキーマ ファイルは作成されません。

リレーショナル ソース インポート データの概要画面

データ ベース テーブル、ビュー、およびストアド プロシージャは、どのような組み合わせででも選択できます。 1 つまたは複数のストアド プロシージャを選択すると、メタデータ インポート ウィザードにより、ストアド プロシージャをデータ サービスに変換するために必要なさらなる手順が指示されます。 これらの手順は以下のとおりです。

  1. 1 つまたは複数のストアド プロシージャを選択します。 1 つのデータ サービスが相当できるのは、1 つのストアド プロシージャのみです。 つまり、ストアド プロシージャが 5 つある場合、5 つのデータ サービスを作成することになります。
  2. 図 3-13 インポートするストアド プロシージャ データベース オブジェクトの選択


    インポートするストアド プロシージャ データベース オブジェクトの選択

  3. データ サービスにするデータ ベース オブジェクトを選択後、[次へ] をクリックします。
  4. 選択されたプロシージャ (図 3-14) から、各ストアド プロシージャをコンフィグレーションします。 ストアド プロシージャに、複合要素を要求する OUT パラメータがある場合、スキーマの指定が必要なことがあります。
  5. 図 3-14 前編集モードでのストアド プロシージャのコンフィグレーション


    前編集モードでのストアド プロシージャのコンフィグレーション

    メタデータ インポート ウィザードで識別できないストアド プロシージャ内のデータ オブジェクトは、データ型なしで赤色表示されます。 そのような場合は、編集モードに入って ([編集] ボタンをクリック) データ型を特定する必要があります。

    ストアド プロシージャと関連付けられた「<unknown>」条件 (図 3-14) を修正するにあたっての目的は、インポート ウィザードによって取得されたメタデータを、ストアド プロシージャの実際のメタデータに準拠させることです。 場合によっては、これは戻り値型の場所を修正することによって行われます。 それ以外の場合には、プロシージャの要素と関連付けられた型を調整するか、またはストアド プロシージャ内を最初に参照した際に見つからなかった要素を追加することが必要となります。

    図 3-15 編集モードのストアド プロシージャ (付記あり)


    編集モードのストアド プロシージャ (付記あり)

  6. 次の手順で、適宜プロシージャを編集します。
    1. ストアド プロシージャの詳細なリストから、データ サービスに変換するストアド プロシージャを 1 つ選択します。
    2. 設定モード (in、out、inout) および型、また out パラメータに関してはスキーマの場所など、ストアド プロシージャのパラメータを編集します。
    3. パラメータを確認し、必要であれば追加、削除、または順序の変更を行います。
    4. 行セットを確認し、必要であれば追加、削除、または編集可能なものについては変更を行います。
    5. メタデータ インポート ウィザードが型を判断できなかった場合には、戻り値型を指定 (スキーマの場所を特定することにより、単純型、複合型のいずれかを指定) します。
    6. 変更の受け入れまたは取り消しを行います。
    7. 次の手順に進む前に、選択した各ストアド プロシージャについて情報の指定を完了させる必要があります。 特に、赤色で表示されているストアド プロシージャはすべて対処する必要があります。

      ストアド プロシージャのインポート ダイアログ ボックスの各セクションの詳細を以下に示します。

プロシージャのプロファイル

ストアド プロシージャ内の各要素は、型と関連付けられています。 その項目が単純型である場合は、型のポップアップ リストから選択するだけで済みます。

図 3-16 ストアド プロシージャ内の要素の型の変更

ストアド プロシージャ内の要素の型の変更

複合型の場合は、適切なスキーマの指定が必要なことがあります。 スキーマの場所ボタンをクリックして、スキーマのパス名を入力するか、スキーマの場所を参照します。 このスキーマは、アプリケーション内に存在しているものでなければなりません。

スキーマ選択後は、スキーマ ファイルへのパスと、URI の両方が表示されます。 次に例を示します。

http://temp.openuri.org/schemas/Customer.xsd}CUSTOMER
プロシージャのパラメータ

JDBC を介して機能するメタデータ インポート ウィザードは、ストアド プロシージャのパラメータもすべて識別します。 これには、名前、モード (入力 [in]、出力 [out]、または双方向 [inout]) およびデータ型が含まれます。 out モードは、スキーマの組み込みをサポートしています。

複合型は、次の 3 つの条件下でしかサポートされません。

行セット

すべてのデータベースで行セットがサポートされているわけではありません。 加えて、JDBC は定義済みの行セットに関連付けられた情報を報告しません。 行セット情報を使用するストアド プロシージャからデータ サービスを作成するには、正しい順序 (一致する番号) とスキーマを指定します。 スキーマに複数のグローバル要素がある場合、[タイプ] 列から適切なものを選択できます。 選択しなかった場合、タイプはスキーマ ファイル内の最初のグローバル要素になります。

行セット情報の順序は重要です。この順序は、データ ソース内の順序に一致している必要があります。 [上へ] および [下へ] コマンドを使用して、行セットに割り当てられた順序番号を調整します。

[概要] 画面で項目を確認して受け入れることにより、プロシージャのインポートを完了させます (詳細については、「リレーショナル テーブルおよびビューのメタデータのインポート」の手順 4 を参照)。

注意 : ストアド プロシージャから生成されたデータ サービスの XML 型では、ネイティブ型が表示されません。 しかし、ソース ビュー プラグマ (「XQuery ソースの操作」を参照) でネイティブ型を表示することができます。

ストアド プロシージャの行セットの処理

行セットの型は、複合型です。 行セットの型の名前としては、以下のものがあります。

  1. 適切なインポートされたストアド プロシージャ メタデータを AquaLogic Data Services Platform プロシージャとしてマークします。
ストアド プロシージャをデータ サービス プロシージャとして識別する

独立したルーチンを、データ サービスを介してのエンタープライズ情報管理の一部として活用すると、役立つことがよくあります。 分かりやすい例としては、スタンドアロンの更新またはセキュリティ関数の、データ サービスを介した活用が挙げられます。 そのような関数は、noXML 型です。実際、通常は何も返しません (または、void を返します)。 その代わり、データ サービスではこれらの関数が副作用のあるものであり、プロシージャとして、同じデータ ソースのデータ サービスと関連付けられていることが認識されています。

ストアド プロシージャは、データに対して内部処理を行うため、データ サービス側から見ると、非常に多くの場合、副作用プロシージャです。 そのような場合は、メタデータ インポート プロセス中に、ストアド プロシージャをデータ サービス プロシージャとして識別するだけで済みます。

データ サービスまたは XML ファイル ライブラリ (XFL) に追加するストアド プロシージャを識別した後に、これらのうちどれをデータ サービス プロシージャとして識別するかを指定する機会も提供されます。

図 3-17 副作用ストアド プロシージャの識別

副作用ストアド プロシージャの識別

注意 : 最小 (単純) 型の周辺を基盤とするデータ サービス プロシージャは、識別された XML 関数ライブラリ (XFL) ファイル内に収集されます。 その他のプロシージャは、AquaLogic Data Services Platform 対応のプロジェクトに対してローカルなデータ サービスと関連付けられる必要があります。
内部ストアド プロシージャのサポート

内部ストアド プロシージャのメタデータをインポートできます。 詳細については、「データ ソース オブジェクトをフィルタ処理する」を参照してください。

ストアド プロシージャのバージョンのサポート

最新バージョンのストアド プロシージャのみが、AquaLogic Data Services Platform にインポート可能です。 このため、メタデータ インポート ウィザードでストアド プロシージャをインポートする際には、バージョン番号の識別はできません。 同様に、AquaLogic Data Services Platform ソースにバージョン番号を追加すると、クエリ例外が発生します。

null 値を許す入力パラメータを持つストアド プロシージャをサポートする

ストアド プロシージャの入力パラメータが null 値を許す (null 値を受け入れることができる) ことが分かっている場合、ソース ビューで関数のシグネチャを変更して、パラメータの末尾に疑問符を付加することにより、そのようなパラメータを任意指定のものにすることができます。 次に例を示します (疑問符を太字で表示)。

	function myProc($arg1 as xs:string) ...

これを、下記のように変更します。

function myProc($arg1 as xs:string?) ...

ソース ビューの詳細については、「XQuery ソースの操作」を参照してください。

一般的に使用されるデータベースのストアド プロシージャのサポート

ストアド プロシージャに対するアプローチは、データベース ベンダごとにさまざまです。 XQuery サポートの制限は、一般に、JDBC ドライバ上の制限に起因しています。

一般的な制限

AquaLogic Data Services Platform では、行セットを入力パラメータとしてサポートしていません。

Oracle ストアド プロシージャのサポート

表 3-18 では、Oracle データベース プロシージャに対する AquaLogic Data Services Platform のサポートの概要を示しています。

表 3-18 Oracle ストアド プロシージャのサポート
用語
使用方法
プロシージャ型
  • プロシージャ
  • 関数
  • パッケージ
パラメータ モード
  • 入力専用
  • 出力専用
  • 入出力
  • なし
パラメータ データ型
下記のもの以外のすべての Oracle PL/SQL データ型
  • ROWID
  • UROWID

注意 : 関数のシグネチャを定義する際には、Oracle の %TYPE 型と %ROWTYPE 型は、ストアド プロシージャの %TYPE 宣言と %ROWTYPE 宣言の基底となる本来の型に一致する XQuery 型に変換される必要がある。 %TYPE 宣言は単純型にマップし、%ROWTYPE 宣言は行セット型にマップする。

AquaLogic Data Services Platform でサポートされるデータベース型のリストについては、「リレーショナル データ型からメタデータへの変換」を参照。
関数から返されたデータ
Oracle は、NUMBER、VARCHAR、%TYPE、%ROWTYPE など、返される PL/SQL データ型を、パラメータとしてサポートする。
コメント
以下は、Oracle データベース プロシージャ メタデータのインポートと関連付けられた制限を識別する。
  • メタデータ インポート ウィザードが検出できるのは、バインディング PL/SQL レコードのあるカーソルのデータ構造のみ。 動的なカーソルについては、手動でカーソル スキーマを指定する必要がある。
  • PL/SQL レコード構造からのデータは、Oracle JDBC ドライバの制限があるため、取得できない。
  • Oracle JDBC ドライバが行セット出力パラメータをサポートするのは、それらがパッケージ内の参照カーソルとして定義されている場合のみ。
  • Oracle JDBC ドライバは、NATURALN および POSITIVEN を出力専用パラメータとしてはサポートしない。

Sybase ストアド プロシージャのサポート

表 3-19 では、Sybase SQL Server データベース プロシージャに対する AquaLogic Data Services Platform のサポートの概要を示しています。

表 3-19 Sybase ストアド プロシージャのサポート
用語
使用方法
プロシージャ型
  • プロシージャ
  • グループ化されたプロシージャ
  • 関数
  • 関数は、スカラーまたはインラインのテーブル値関数および複数文のテーブル値関数として分類される。 インラインのテーブル値関数および複数文のテーブル値関数は、行セットを返す。

パラメータ モード
  • 入力専用
  • 出力専用
パラメータ データ型
AquaLogic Data Services Platform でサポートされるデータベース型の詳細なリストについては、「リレーショナル データ型からメタデータへの変換」を参照。
関数から返されたデータ
Sybase 関数は、単一の値またはテーブルの戻りをサポートする。
プロシージャは、次のようにデータを返す。
  • データ (整数値、文字値など)、カーソル変数 (カーソルとは、一度に 1 行ずつ取得できる行セット) のどちらでも返すことができる出力パラメータとして。
  • 常に整数値である、戻り値コードとして。
  • ストアド プロシージャ、またはそのストアド プロシージャによって呼び出される任意のほかのストアド プロシージャ内に格納されている各 SELECT 文の行セットとして。
  • ストアド プロシージャのサポート外で参照され得る、単一の値または複数の値を返すグローバル カーソルとして。
コメント
以下は、Sybase データベース プロシージャ メタデータのインポートと関連付けられた制限を識別する。
  • Sybase JDBC ドライバは、行セットである入出力または出力専用パラメータ (カーソル変数を含む) をサポートしない。
  • Jconnect ドライバおよび BEA Sybase ドライバの一部のバージョンでは、プロシージャのパラメータ モードを検出できない。 この場合、戻り値モードは UNKNOWN となり、メタデータのインポートは回避される。 続行するには、正しいモードの設定が必要である。
  • ストアド プロシージャの一部としてインポートできるのは、一般的に AquaLogic Data Services Platform メタデータ インポートによってサポートされているデータ型のみ。

IBM DB2 ストアド プロシージャのサポート

表 3-20 では、IBM DB2 データベース プロシージャに対する AquaLogic Data Services Platform のサポートの概要を示しています。

表 3-20 IBM DB2 ストアド プロシージャのサポート
用語
使用方法
プロシージャ型
  • プロシージャ
  • 関数
  • パッケージ
各関数は、スカラー関数、カラム関数、行関数、またはテーブル関数としても分類される。
関数の分類に関するさらなる詳細を以下に示す。
  • スカラー関数は、呼び出されるたびに単一値の応答を返す関数。
  • カラム関数は、概念的には同様な値 (カラム) のセットを渡され、単一値の応答 (AVG( )) を返す関数。
  • 行関数は、1 行の値を返す関数。
  • テーブル関数は、それを参照した SQL 文へテーブルを返す関数。
パラメータ モード
  • 入力専用
  • 出力専用
  • 入出力
パラメータ データ型
AquaLogic Data Services Platform でサポートされるデータベース型の詳細なリストについては、「リレーショナル データ型からメタデータへの変換」を参照。
関数から返されたデータ
DB2 は、単一の値、値の行、またはテーブルの戻りをサポートする。
コメント
以下は、DB2 データベース プロシージャ メタデータのインポートと関連付けられた制限を識別する。
  • カラム型の関数はサポートされていない。
  • 出力パラメータとしての行セットはサポートされていない。
  • DB2 JDBC ドライバは、float、double および decimal 型の入力専用パラメータおよび出力専用パラメータをサポートする。
  • float、double および decimal データ型は、入出力パラメータとしてはサポートされていない。

  • ストアド プロシージャの一部としてインポートできるのは、一般的に AquaLogic Data Services Platform メタデータ インポートによってサポートされているデータ型のみ。

Microsoft SQL Server ストアド プロシージャのサポート

表 3-21 では、Microsoft SQL Server データベース プロシージャに対する AquaLogic Data Services Platform のサポートの概要を示しています。

表 3-21 AquaLogic Data Services Platform による Microsoft SQL Server ストアド プロシージャのサポート
用語
使用方法
プロシージャ型
SQL Server は、プロシージャ、グループ化されたプロシージャ、および関数をサポートする。 各関数は、スカラーまたはインラインのテーブル値関数および複数文のテーブル値関数としても分類される。
インラインのテーブル値関数および複数文のテーブル値関数は、行セットを返す。
パラメータ モード
SQL Server は、入力専用および出力専用パラメータをサポートする。
パラメータ データ型
SQL Server のプロシージャ/関数は、すべての SQL Server データ型をパラメータとしてサポートする。
関数から返されたデータ
SQL Server 関数は、単一の値またはテーブルの戻りをサポートする。
データは、次のように返され得る。
  • データ (整数値、文字値など)、カーソル変数 (カーソルとは、一度に 1 行ずつ取得できる行セット) のどちらでも返すことができる出力パラメータとして。
  • 常に整数値である、戻り値コードとして。
  • ストアド プロシージャ、またはそのストアド プロシージャによって呼び出される任意のほかのストアド プロシージャ内に格納されている各 SELECT 文の行セットとして。
コメント
以下は、SQL Server プロシージャ メタデータのインポートと関連付けられた制限を識別する。
  • SQL Server から返された結果セットは (Sybase から返された結果セットと同様に) 自動的には検出されない。 代わりに、パラメータを手動で結果として追加する必要がある。
  • Microsoft SQL Server JDBC ドライバは、行セットの入出力または出力専用パラメータ (カーソル変数を含む) をサポートしない。
  • ストアド プロシージャの一部としてインポートできるのは、一般的に AquaLogic Data Services Platform メタデータ インポートによってサポートされているデータ型のみ。

SQL を使用したメタデータのインポート

リレーショナル インポート メタデータ オプション (図 3-6 を参照) の 1 つは、SQL 文を使用して、データ ソース内への参照をカスタマイズすることです。 このオプションを選択すると、[SQL ステートメント] ダイアログが表示されます。

図 3-22 [SQL ステートメント] ダイアログ ボックス

[SQL ステートメント] ダイアログ ボックス

文のボックス (図 3-22) に SELECT 文の入力または貼り付けを行えます。その際、パラメータは、疑問符「?」で示します。 AquaLogic Data Services Platform データ サンプルの 1 つで、次の SELECT 文を使用できます。

SELECT * FROM RTLCUSTOMER.CUSTOMER WHERE CUSTOMER_ID = ?

RTLCUSTOMER はデータ ソース内のスキーマ、CUSTOMER はこの場合テーブルです。

パラメータ フィールドについては、データ型を選択する必要があります。 この場合は、CHAR または VARCHAR です。

次の手順は、データ サービス名の割り当てです。

テスト ビューでクエリを実行する際には、そのクエリを正常に実行させるため、パラメータを指定する必要があります。

SQL 文および必要なすべてのパラメータを入力したら、[次へ] をクリックして、新しいデータ サービスの名前と場所を変更または確認します。

[SQL ステートメント] ダイアログ ボックス

図 3-23 リレーショナル SQL 文のインポート データの概要画面

リレーショナル SQL 文のインポート データの概要画面

インポートされるデータの概要画面により、新しいデータ サービスについて提案される名前が識別されます。

最後の手順は、テーブルまたはビューからデータ サービスを作成した際のものと変わりありません。

リレーショナル データ型からメタデータへの変換

次の表では、各種のリレーショナル データベースによって提供されるデータ型が、どのように XQuery データ型に変換されるのかを示します。 表 3-24 において、各型はアルファベット順に示されます。

表 3-24 リレーショナル データ型および対応する XQuery データ型
データ型名
同等な XQuery データ型
Oracle
IBM DB2
Sybase
Informix
Microsoft SQL Server
PointBase
ARRAY
サポートされていない
x
         
BFILE
サポートされていない
x
         
BIGINT
xs:long
 
x
   
x
x
BINARY
xs:hexBinary
   
x
 
x
 
BIT
xs:boolean
   
x
 
x
 
BLOB
xs:hexBinary
x
x
 
x
 
x
BOOLEAN
xs:Boolean
     
x
 
x
BYTE
xs:hexBinary
     
x
   
CHAR
xs:string
x
x
x
x
x
x
CHAR() (ビット データ用)
xs:hexBinary
 
x
       
CLOB
xs:string
x
x
 
x
 
x
DATE
xs:date
 
x
     
x
DATE
xs:datetime
x
         
DATETIME
xs:datetime
   
x
x
x
 
DECIMAL{n, s}
s>0
xs:decimal
 
x
x
x
x
x
DECIMAL{n}
xs:integer
 
x
x
x
x
x
DOUBLE
xs:double
 
x
       
DOUBLE PRECISION
xs:double
   
x
   
x
FLOAT
xs:double
x
x
x
x
x
x
IMAGE
xs:hexBinary
   
x
 
x
 
INT
xs:int
   
x
 
x
 
INT8
xs:long
     
x
   
INTEGER
xs:int
 
x
 
x
 
x
INTERVAL
サポートされていない
     
x
   
INTERVALDS
xdt:dayTimeduration
x
         
INTERVALYM
xdt:yearMonthduration
x
         
LONG
xs:string
x
         
LONG RAW
xs:hexBinary
x
         
LONG VARCHAR
xs:string
 
x
       
LONG VARCHAR (ビット データ用)
xs:hexBinary
 
x
       
LVARCHAR
xs:string
     
x
   
MONEY
xs:decimal
   
x
x
x
 
MSLABEL
サポートされていない
x
         
NCHAR
xs:string
x
 
x
x
x
 
NTEXT
xs:string
       
x
 
NUMBER
xs:double
x
         
NUMBER{n, s} s<0
xs:integer
x
         
NUMBER{n, s} s>0
xs:decimal
x
         
NUMBER{n}
xs:integer
x
         
NUMERIC{n, s}
s>0
xs:decimal
 
x
x
 
x
x
NUMERIC{n}
xs:decimal
 
x
x
 
x
x
NVARCHAR
xs:string
   
x
x
x
 
NVARCHAR2
xs:string
x
         
RAW
xs:hexBinary
x
         
REAL
xs:float
 
x
x
 
x
x
REF
サポートされていない
x
         
ROWID
xs:string
x
         
SERIAL
サポートされていない
     
x
   
SERIAL8
サポートされていない
     
x
   
SMALLDATETIME
xs:datetime
   
x
 
x
 
SMALLFLOAT
xs:float
     
x
   
SMALLINT
xs:short
 
x
x
x
x
x
SMALLMONEY
xs:decimal
   
x
 
x
 
SQL_VARIANT
xs:string
       
x
 
STRUCT
サポートされていない
x
         
SYSNAME
xs:string
   
x
 
x
 
TEXT
xs:string
   
x
x
x
 
TIME
xs:time
 
x
     
x
TIMESTAMP
xs:datetime
x
x
     
x
TIMESTAMP
xs:hexBinary
       
x
 
TIMESTAMP (ローカル タイム ゾーンによる)
xs:datetime
x
         
TIMESTAMP (タイム ゾーンによる)
xs:datetime
x
         
TINYINT
xs:short
   
x
 
x
 
UNIQUEIDENTIFIER
xs:hexbinary
       
x
 
UROWID
xs:string
x
         
VARBINARY
xs:hexBinary
   
x
 
x
 
VARCHAR
xs:string
 
x
x
x
x
x
VARCHAR() (ビット データ用)
xs:hexBinary
 
x
       
VARCHAR2
xs:string
x
         

AquaLogic Data Services Platform リレーショナル ソースへのロールベース アクセスの提供

リレーショナル ソースからメタデータをインポートする場合、ユーザのロールに応じて、さまざまなデータ ソースへユーザをマップする論理をアプリケーション内に指定できます。 これは、インターセプタを作成して、アプリケーション内の各データ サービスの RelationalDB アノテーションに属性を追加することによって実現します。

インターセプタとは、SourceBindingProvider インタフェースを実装する Java クラスです。 このクラスは、ユーザの現在の資格に応じて、論理データ ソース名 (1 つまたは複数) に、ユーザをマップするための論理を提供します。 これにより、論理データ ソース名に基づき、リレーショナル物理ソースへのアクセス レベルを制御できるようになります。

たとえば、WebLogic Server 上にデータ ソース名 cgDataSource1、cgDataSource2、および cgDataSource3 を定義し、管理者であるユーザは 3 つすべてのデータ ソースにアクセスできるが、通常のユーザはデータ ソース cgDataSource1 にしかアクセスできないように、クラス内の論理を定義できます。

注意 : 同じリレーショナル データ ソースを参照する、すべてのリレーショナル、更新オーバーライド、ストアド プロシージャ データ サービス、またはストアド プロシージャ XFL ファイルは、ソース バインディング プロバイダも同じものを使用する必要があります。つまり、データ サービス (.ds) ファイルの少なくとも 1 つに対しソース バインディング プロバイダを指定したならば、その他のデータ サービス ファイルについてもそれを設定しなければなりません。

インターセプタ論理を実装するには、次の手順に従います。

  1. インタフェース com.bea.ld.binds.SourceBindingsProvider を実装する Java クラス SQLInterceptor を記述し、クラス内に getBindings() パブリック メソッドを定義します。 このメソッドのシグネチャは、次のとおりです。
  2. public String getBinding(String genericLocator, boolean isUpdate)

    genericLocator パラメータは、現在の論理データ ソース名を指定します。 isUpdate パラメータは、読み取りまたは更新が発生しているかどうかを示します。 true 値は、更新を示します。 false 値は、読み取りを示します。 返される文字列は、ユーザのマップ先となる論理データ ソース名です。コード リスト 3-1 に、SQLInterceptor クラスの例を示します。

  3. クラスを JAR ファイルにコンパイルします。
  4. アプリケーション内で、JAR ファイルを WebLogic Workshop アプリケーションの APP-INF/lib ディレクトリに保存します。
  5. RelationalDB アノテーションに sourceBindingProviderClassName 属性を追加することにより、DS または XFL ファイル (必要であれば両方) にデータ ソースのコンフィグレーション インターセプタを定義します。 属性は、有効な Java クラスの名前 (インターセプタ クラスの名前) に割り当てる必要があります。 次に例を示します (属性および Java クラスは太字)。
  6. <relationalDB dbVersion="4" dbType="pointbase" name="cgDataSource" sourceBindingProviderClassName="sql.SQLInterceptor"/>
  7. アプリケーションをコンパイルして実行します。 実行時に、インターセプタが呼び出されます。
  8. コード リスト 3-1 インターセプタ クラスの例
    public class SqlProvider implements com.bea.ld.bindings.SourceBindingProvider{
    public String getBinding(String dataSourceName, boolean isUpdate) {

    weblogic.security.Security security = new weblogic.security.Security();
    javax.security.auth.Subject subject = security.getCurrentSubject();
    weblogic.security.SubjectUtils subUtils =
    new weblogic.security.SubjectUtils();

    System.out.println(" the user name is " + subUtils.getUsername(subject));

    if (subUtils.getUsername(subject).equals("weblogic"))
    dataSourceName = "cgDataSource1";
           System.out.println("The data source is " + dataSourceName);
    System.out.println("SDO " + (isUpdate ? " YES " : " NO ") );

    return dataSourceName;
    }
    }

 


Web サービスのメタデータのインポート

Web サービスとは、HTTP や SOAP など標準ベースのインターネット プロトコルだけでなく、アプリケーション アダプタを介してもアクセス可能な、完全に独立した、プラットフォームに依存しない、ビジネス論理単位です。

Web サービスにより、アプリケーション間の通信が著しく容易になります。 そのため、Web サービスはエンタープライズ データ リソースにおいて、ますます中心的なものとなってきています。 外部化された Web サービスのよく知られた例としては、Web アプリケーションに容易に統合できる更新頻度の高い天気ポートレットや株価ポートレットがあります。 同様に、Web サービスは、販売者から製造者への直送注文の追跡にも、効果的に利用できます。

注意 : RPC モードの多次元配列はサポートされていません。

Web サービス定義 (スキーマ) に基づいたデータ サービスの作成は、リレーショナル データ ソース メタデータのインポートに類似しています (「リレーショナル テーブルおよびビューのメタデータのインポート」を参照)。

Web サービス固有の必要な手順は、次のとおりです。

  1. Web サービス メタデータを作成する AquaLogic Data Services Platform ベースのプロジェクトを選択します。 たとえば、DataServices というプロジェクトがある場合、そのプロジェクト名を右クリックして、ポップアップ メニューから [ソース メタデータのインポート] を選択します。
  2. メタデータ インポート ウィザードの使用可能なデータ ソースの中から、Web サービスを選択して [次へ] をクリックします。
  3. Web サービスへのアクセス方法は、3 つあります。
    • 現在の AquaLogic Data Services Platform プロジェクト内の Web サービス記述言語 (WSDL) ファイルから。
    • URL (HTTP) 経由でアクセス可能な WSDL である URI から。
    • Universal Description, Discovery, and Integration (UDDI) サービスから。
    • 図 3-25 Web サービスの検索


      Web サービスの検索

注意 : Web サービス メタデータのインポート方法を示す目的で、以降の手順では RTLApp サンプルからの WSDL ファイルが使用されています。 この手順に従うならば、以下を URI フィールドに入力して、RTLApp に付属の WSDL にアクセスします。
注意 : http://localhost:7001/ElecWS/controls/ElecDBTestContract.wsdl
  1. 選択された Web サービスから、データ サービスまたは XFL 関数に変換するオペレーションを選択します。
  2. 存在する場合は、どの Web サービスベースのデータ サービスを副作用のあるものとしてマークするかを識別します。
注意 : インポートするオペレーションで void を返すものは、自動的に AquaLogic Data Services Platform プロシージャとしてインポートされます。 [副作用プロシージャの選択] ダイアログ (図 3-26) を使用し、他のオペレーションをプロシージャとして識別できます。

副作用オペレーションを、データ サービスを介してのエンタープライズ情報管理の一部として活用すると、役立つことがよくあります。 分かりやすい例としては、スタンドアロンの更新またはセキュリティ関数の、データ サービスを介した管理が挙げられます。 データ サービスは、該当するオペレーションを副作用のあるものとして登録します。

プロシージャは、スタンドアロンではありません。常に同じデータ ソースからのデータ サービスの一部です。

Web サービスは、実際にはデータを返す場合であっても、データ サービス側から見れば副作用のあるものです。 そのような場合、メタデータ インポート プロセス中に、Web サービス オペレーションをデータ サービスと関連付ける必要があります。

図 3-26 インポートされるオペレーションの AquaLogic Data Services Platform プロシージャのマーキング

インポートされるオペレーションの AquaLogic Data Services Platform プロシージャのマーキング

プロシージャは、AquaLogic Data Services Platform 対応のプロジェクトに対してローカルなデータ サービスと関連付けられる必要があります。

図 3-27 データ サービスとして使用する Web サービス オペレーションの識別

データ サービスとして使用する Web サービス オペレーションの識別

標準的なダイアログの編集コマンドを使用し、選択済みの Web サービス オペレーションのリストに追加する 1 つまたは複数のオペレーションを選択できます。 オペレーションの選択を解除するには、それをクリックしてから、[削除] をクリックします。 あるいは、[すべて削除] を選択して、初期状態に戻ります。

  1. [次へ] をクリックして、作成予定のデータ サービスの場所とその名前を確認します。
  2. 図 3-28 Web サービスのインポート データ概要画面


    Web サービスのインポート データ概要画面

    図 3-28 の概要画面では、次のことが行われています。

    • 選択した Web サービス オペレーションを表示。
    • 生成されたデータ サービスの対象名を表示。
    • データ サービス名の衝突があれば、赤色で識別。
    • 名前の衝突がなくても、明確化のためにデータ サービス名を変更できます。 単にデータ サービス名をクリックして、新しい名前を入力します。

    • 同じ WSLD に基づく既存のデータ サービスに関数を追加するオプションを提供。 このオプションは、プロジェクト内に該当するデータ サービスがある場合のみ有効化されています。 同じ WSDL に基づくデータ サービスが複数ある場合は、ドロップダウン メニューが表示され、その関数用のデータ サービスを選択できます。
注意 : 副作用プロシージャとして識別された Web サービス関数は、同じ WSDL に基づくデータ サービスと関連付けられている必要があります。
注意 : それ自体に依存する (またはそれ自体を参照する) 1 つ以上のスキーマがある Web サービス オペレーションをインポートする場合、メタデータ インポート ウィザードは内部命名規約に従い、第 2 レベルのスキーマを作成します。 いくつかのオペレーションが同じ第 2 のスキーマを参照する場合、そのスキーマ用に生成された名前は、Web サービスを再インポートするか、または Web サービスと同期した場合には、変更されることがあります。
  1. [完了] をクリックします。 選択された各オペレーションについて、データ サービスが作成されます。

  2. Web サービスのインポート データ概要画面

インターネット Web サービス URI によるメタデータ インポートのテスト

インターネット Web サービス URI でメタデータ インポート ウィザードをテストする場合、(本文書作成時点において) 下記のページでサンプル URI を提供しています。

http://www.strikeiron.com/BrowseMarketplace.aspx?c=14&m=1

単に、トピックを選択し、次のようなサンプル WSDL を示すページに移動します。

http://ws.strikeiron.com/SwanandMokashi/StockQuotes?WSDL

文字列を Web サービス URI フィールドにコピーし、[次へ] をクリックして、サンプル データ サービスまたはプロシージャに変換するオペレーションを選択します。

メタデータ インポートのテストに使用できるその他の外部 Web サービスは、下記の場所にあります。

http://www.whitemesa.net/wsdl/std/echoheadersvc.wsdl

AquaLogic Data Services Platform がアクセスする Web サービスのハンドラの設定

AquaLogic Data Services Platform 用の Web サービスからメタデータをインポートする際、SOAP 要求および応答をインターセプトする SOAP ハンドラを作成できます。 ハンドラは、Web サービス メソッドが呼び出されたときに、呼び出されます。 コンフィグレーション ファイル内でシーケンスを定義することにより、特定のシーケンスにおいて次々と呼び出されるハンドラを連鎖させることができます。

ハンドラを作成して連鎖させるには、次の 2 つの手順に従います。

  1. インタフェース javax.xml.rpc.handler.GenericHandler を実装する Java クラスを作成します。これがハンドラになります (複数のハンドラを作成することができます。 たとえば、WShandler という名前のものを 1 つと、AuditHandler という名前のものを 1 つ作成できます)。コード リスト 3-2 では、GenericHandler クラスの実装例を示しています。 ハンドラは、WebLogic Workshop の WShandler というフォルダに入れます (ハンドラ記述方法の詳細については、『WebLogic Web サービス プログラマーズ ガイド』の「SOAP メッセージをインターセプトする SOAP メッセージ ハンドラの使用」を参照してください。
  2. コード リスト 3-2 インターセプト ハンドラ例
    package WShandler;

    import java.util.Iterator;
    import javax.xml.rpc.handler.MessageContext;
    import javax.xml.rpc.handler.soap.SOAPMessageContext;
    import javax.xml.soap.SOAPElement;
    import javax.xml.rpc.handler.HandlerInfo;
    import javax.xml.rpc.handler.GenericHandler;
    import javax.xml.namespace.QName;

    /**
    * Purpose: Log all messages to the Server console
    */
    public class WShandler extends GenericHandler
    {
    HandlerInfo hinfo = null;

    public void init (HandlerInfo hinfo) {
    this.hinfo = hinfo;
    System.out.println("*****************************");
    System.out.println("ConsoleLoggingHandler r: init");
    System.out.println(
    "ConsoleLoggingHandler : init HandlerInfo" + hinfo.toString());
    System.out.println("*****************************");
    }

    /**
    * Handles incoming web service requests and outgoing callback requests
    */
    public boolean handleRequest(MessageContext mc) {
    logSoapMessage(mc, "handleRequest");
    return true;
    }

    /**
    * Handles outgoing web service responses and
    * incoming callback responses
    */
    public boolean handleResponse(MessageContext mc) {
    this.logSoapMessage(mc, "handleResponse");
    return true;
    }

    /**
    * Handles SOAP Faults that may occur during message processing
    */
    public boolean handleFault(MessageContext mc){
    this.logSoapMessage(mc, "handleFault");
    return true;
    }

    public QName[] getHeaders() {
    QName [] qname = null;
    return qname;
    }

    /**
    * Log the message to the server console using System.out
    */
    protected void logSoapMessage(MessageContext mc, String eventType){
    try{
    System.out.println("*****************************");
    System.out.println("Event: "+eventType);
    System.out.println("*****************************");
    }
    catch( Exception e ){
    e.printStackTrace();
    }
    }

    /**
    * Get the method Name from a SOAP Payload.
    */
    protected String getMethodName(MessageContext mc){

    String operationName = null;

    try{
    SOAPMessageContext messageContext = (SOAPMessageContext) mc;
    // オペレーション名が SOAP:Body 要素の後の最初の
    // 要素であると仮定する
    Iterator i = messageContext.
    getMessage().getSOAPPart().getEnvelope().getBody().getChildElements();
    while ( i.hasNext() )
    {
    Object obj = i.next();
    if(obj instanceof SOAPElement)
    {
    SOAPElement e = (SOAPElement) obj;
    operationName = e.getElementName().getLocalName();
    break;
    }
    }
    }
    catch(Exception e){
    e.printStackTrace();
    }
    return operationName;
    }
    }
  3. アプリケーション内にコンフィグレーション ファイルを定義します。 このファイルでは、ハンドラ チェーンと、ハンドラの呼び出しの順序が指定されます。 このコンフィグレーション ファイルの XML は、コード リスト 3-3 に示すスキーマに準拠している必要があります。
  4. コード リスト 3-3 ハンドラ チェーン スキーマ
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema targetNamespace="http://www.bea.com/2003/03/wlw/handler/config/" xmlns="http://www.bea.com/2003/03/wlw/handler/config/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="wlw-handler-config">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="handler-chain" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
    <xs:element name="handler">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="init-param"
    minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="description"
    type="xs:string" minOccurs="0"/>
    <xs:element name="param-name" type="xs:string"/>
    <xs:element name="param-value" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    <xs:element name="soap-header"
    type="xs:QName" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element name="soap-role"
    type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="handler-name"
    type="xs:string" use="optional"/>
    <xs:attribute name="handler-class"
    type="xs:string" use="required"/>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:schema>

    以下に、ハンドラ チェーン コンフィグレーションの例を示します。 このコンフィグレーションでは、2 つのチェーンがあります。 1 つは、LoggingHandler という名前です。 もう 1 つは、SampleHandler という名前です。 1 つ目のチェーンは、AuditHandler という名前の 1 つのハンドラを呼び出すのみです。 ハンドラ クラス属性により、ハンドラの完全修飾名が指定されます。

    <?xml version="1.0"?> 
    <hc:wlw-handler-config name="sampleHandler" xmlns:hc="http://www.bea.com/2003/03/wlw/handler/config/">
    <hc:handler-chain name="LoggingHandler">
    <hc:handler
    handler-name="handler1"handler-class="WShandler.AuditHandler"/>
    </hc:handler-chain>
    <hc:handler-chain name="SampleHandler">
    <hc:handler
    handler-name="TestHandler1" handler-class="WShandler.WShandler"/>
    <hc:handler handler-name="TestHandler2"
    handler-class="WShandler.WShandler"/>
    </hc:handler-chain>
    </hc:wlw-handler-config>
  5. AquaLogic Data Services Platform アプリケーションで、ハンドラを添付するデータ サービス内のメソッドのインターセプタ コンフィグレーションを定義します。 これを行うには、次の例に示す太字のテキストと同様な行を追加します。
  6. xquery version "1.0" encoding "WINDOWS-1252";

    (::pragma xds <x:xds xmlns:x="urn:annotations.ld.bea.com"
    targetType="t:echoStringArray_return"
    xmlns:t="ld:SampleWS/echoStringArray_return">
    <creationDate>2005-05-24T12:56:38</creationDate>
    <webService targetNamespace=
    "http://soapinterop.org/WSDLInteropTestRpcEnc"
    wsdl="http://webservice.bea.com:7001/rpc/WSDLInteropTestRpcEncService?WSDL"/></x:xds>::)

    declare namespace f1 = "ld:SampleWS/echoStringArray_return";

    import schema namespace t1 = "ld:AnilExplainsWS/echoStringArray_return" at "ld:SampleWS/schemas/echoStringArray_param0.xsd";

    (::pragma function <f:function xmlns:f="urn:annotations.ld.bea.com" kind="read" nativeName="echoStringArray" nativeLevel1Container="WSDLInteropTestRpcEncService" nativeLevel2Container="WSDLInteropTestRpcEncPort" style="rpc">
    <params>
    <param nativeType="null"/>
    </params>
    <interceptorConfiguration aliasName="LoggingHandler" fileName="ld:SampleWS/handlerConfiguration.xml" />
    </f:function>::)

    declare function f1:echoStringArray($x1 as element(t1:echoStringArray_param0)) as schema-element(t1:echoStringArray_return) external;
    <interceptorConfiguration aliasName="LoggingHandler" fileName="ld:testHandlerWS/handlerConfiguration.xml">

    ここでは、呼び出されるハンドラ チェーンの名前が aliasName 属性で指定され、コンフィグレーション ファイルの場所を fileName 属性が指定しています。

  7. JAR ファイルを、コンフィグレーション ファイルで参照されているハンドラ クラスを定義するライブラリ モジュール内に格納します。
  8. アプリケーションをコンパイルして実行します。 ハンドラが、コンフィグレーション ファイルで指定した順序で呼び出されます。

 


Java 関数のメタデータのインポート

カスタム Java 関数に基づくメタデータを作成できます。 メタデータ インポート ウィザードを使用して .class ファイル内を参照すると、メタデータは複合型と単純型の双方の周辺に作成されています。 複合型はデータ サービスになりますが、単純型の Java ルーチンは XQuery に変換されて、XQuery 関数ライブラリ (XFL) 内に置かれます。 ソース ビュー (「XQuery ソースの操作」を参照) では、Java クラス、要素など複合型の関数シグネチャおよび関連のスキーマ型を定義するプラグマが作成されます。

RTLApp DataServices/Demo ディレクトリに、Java 関数メタデータのインポートの説明に使用できるサンプルがあります。

Web サービスのインポート データ概要画面

サポートされる Java 関数の種類

Java ファイルには、2 種類の関数を含めることができます。 これらについて、表 3-29 で説明します。

表 3-29 メタデータ インポートについてサポートされる Java 関数の種類
Java 関数のタイプ
AquaLogic Data Services Platform のアプリケーション
プリミティブ型またはプリミティブ型の配列を処理する関数
XQuery 関数ライブラリ ファイルにグループ化され、同じアプリケーション内の任意のデータ サービスから呼び出し可能。
複合型または複合型の配列を処理する関数
XMLBean Java-to-XML テクノロジを使用し、データ サービスにグループ化される。

カスタム Java 関数に関するメタデータを作成する前に、スキーマおよび関数の情報を双方とも含む Java クラスを作成する必要があります。 詳細な例が、「Java 関数用の XMLBean サポートの作成」で説明されています。

インポート ウィザードを使用した Java 関数のメタデータの追加

Java 関数メタデータのインポートは、リレーショナル データ ソース メタデータのインポートに類似しています (「リレーショナル テーブルおよびビューのメタデータのインポート」を参照)。 Java 関数固有の必要な手順は、次のとおりです。

  1. Java 関数メタデータを作成する AquaLogic Data Services Platform ベースのプロジェクトを選択します (RTLApp の DataServices プロジェクトに、XML、CSV、および Java データとスキーマのサンプルが格納された特別な Demo フォルダがあります)。
  2. プロジェクトをビルドして、コンテンツを検証します。 ビルドにより、.java 関数から .class ファイルが作成され、アプリケーションのライブラリ内に置かれます。
  3. Java フォルダを右クリックし、ポップアップ メニューから [ソース メタデータのインポート] を選択します。
  4. メタデータ インポート ウィザードの使用可能なデータ ソースから、[Java 関数] を選択します (図 3-30 を参照)。 [次へ] をクリックします。
  5. 図 3-30 データ ソースとしての Java 関数の選択


    データ ソースとしての Java 関数の選択

  6. Java .class ファイルは、BEA WebLogic アプリケーション内に存在している必要があります。 ファイルの場所を参照するか、AquaLogic Data Services Platform ベースのプロジェクトのルート ディレクトリから始まる完全修飾されたパス名を入力できます。
  7. 図 3-31 メタデータ インポートのための Java クラス ファイルの指定


    メタデータ インポートのための Java クラス ファイルの指定

  8. インポートする Java 関数を選択します。
  9. 図 3-32 データ サービスまたは XFL 関数にする Java 関数の選択


    データ サービスまたは XFL 関数にする Java 関数の選択

  10. 次の入力型および出力型の Java 関数のインポートがサポートされています。
  1. 存在する場合は、どの Java 関数ベースのデータ サービスを副作用のあるものとして識別するかを指定します。
  2. 独立したルーチンを、データ サービスを介してのエンタープライズ情報管理の一部として活用すると、役立つことがよくあります。 分かりやすい例としては、スタンドアロンの更新またはセキュリティ関数の、データ サービスを介した活用が挙げられます。 そのような関数は、noXML 型です。実際、通常は何も返しません (または、void を返します)。 その代わり、データ サービスではそのルーチンに副作用があることが分かっています。しかし、この副作用はサービスに対して透過的ではありません。 AquaLogic Data Services Platform プロシージャはまた、副作用関数として捉えることもできます。

    Java 関数は、データに対して内部処理を行う場合、データ サービス側から見ると、「副作用」関数です。

    プロジェクトに追加する Java 関数を識別した後は、これらの中に AquaLogic Data Services Platform プロシージャとして処理するものがあれば、それを識別できます (図 3-33)。 main() の場合、メタデータ インポート ウィザードはこれが void を返すことを検出しているため、すでにプロシージャとしてマークされています。

    図 3-33 Java 関数の AquaLogic Data Services Platform プロシージャとしてのマーキング


    Java 関数の AquaLogic Data Services Platform プロシージャとしてのマーキング

    最小 (単純) 型の周辺を基盤とする関数は、識別された XML 関数ライブラリ (XFL) ファイル内に収集されます。

注意 : 副作用プロシージャは、同じデータ ソースからのデータ サービスと関連付けられている必要があります。 この場合、ソースは Java ファイルです。 つまり、Java 関数をプロシージャとして指定するには、複合要素を返す同じファイル内の関数を同時に作成する、またはこれがプロジェクト内にすでに存在している必要があります。
  1. [次へ] をクリックし、新しいデータ サービスの名前と場所を確認します。
  2. 図 3-34 Java 関数のインポートされるデータ概要画面


    Java 関数のインポートされるデータ概要画面

    提案されたデータ サービス名は、明確化のために、あるいは既存のデータ サービスまたは予定されているデータ サービスとの衝突を回避するために、編集することができます。 複合データ型を返すすべての関数が、同じデータ サービス内に置かれます。 提案されたデータ サービス名をクリックして変更します。

    プロシージャは、同じデータ ソース (Java ファイル) からデータを引き出すデータ サービスと関連付けられている必要があります。 図 3-34 に示すサンプルでは、唯一の使用可能なデータ サービスは PRODUCTS (または、任意に選択した名前) です。

    プロジェクト内に既存の XFL ファイルがある場合は、そのライブラリに最小関数を追加するか、それらの関数のために新しいライブラリを作成するかの選択肢があります。 すべての Java ファイル最小関数は、同じライブラリ内に置かれます。

  3. [完了] をクリックします。

Java 関数用の XMLBean サポートの作成

Java 関数メタデータをインポートできるようになるには、その前にグローバル要素および Java 関数のコンパイル済みバージョンに基づく XMLBean クラスが含まれた .class ファイルを作成する必要があります。 そのためには、まずデータのスキーマに基づく XMLBean クラスを作成します。 これを実現するには、いくつかの方法があります。 この節の例では、スキーマ型の WebLogic Workshop プロジェクトを作成します。

一般的に、このプロセスには、以下の作業が含まれます。

メタデータで強化される Java クラスを作成する : 例

次の例では、FuncData.java という .java ファイルに、いくつかのカスタム関数があります。 RTLApp では、このファイルは下記の場所に置かれています。

ld:DataServices/Demo/Java/FuncData.java

このファイルの一部の関数はプリミティブ データ型を返し、その他の関数は複合要素を返します (表 3-35)。 参照されるデータを表す複合要素は、FuncData.xsd というスキーマ ファイル内にあります。

表 3-35 メタデータが強化された Java クラス アーティファクト
ファイル
目的
FuncData.java
データ サービスのクエリ関数に変換される Java 関数を含む。 また、小さいデータ サンプルも含まれている。
FuncData.xsd
FuncData.java で識別される複合要素のスキーマを含む。

このスキーマ ファイルは、下記の場所にあります。

ld:DataServices/Demo/Java/schema/FuncData.xsd

このサンプルを簡素化するため、.java ファイル内に、小さいデータ セットが文字列として含まれています。

以下の手順により、FuncData.java 内の Java 関数からデータ サービスが作成されます。

  1. CustomFunctions という AquaLogic Data Services Platform ベースの新しいアプリケーションを作成します。
  2. スキーマ型の新しいプロジェクトを、アプリケーション内に作成し、Schemas という名前を付けます。
  3. 新しく作成した Schemas プロジェクトを右クリックして、[インポート...] オプションを選択します。
  4. RTLApp を参照して、インポート対象として FuncData.xsd を選択します。
  5. スキーマ プロジェクトにスキーマ ファイルをインポートすると、プロジェクト ビルド プロセスが自動的に開始されます。

    正常に完了すると、Java ファイル内の各関数に対して XMLBean クラスが作成され、JavaFunctSchema.jar という JAR ファイル内に入れられます。

    JAR ファイルは、アプリケーションのライブラリ セクションにあります。

  6. プロジェクトをビルドします。
  7. AquaLogic Data Services Platform ベースのプロジェクト (customFunctionsDataServices) 内に、JavaFuncMetadata というフォルダを作成します。
  8. 新しく作成した JavaFuncMetadata フォルダを右クリックして、[インポート...] オプションを選択します。
  9. RTLApp の ld:DataServices/Demo/Java フォルダを参照して、インポート対象として FuncData.java を選択します。 [インポート] をクリックします。
  10. プロジェクトをビルドします。
  11. AquaLogic Data Services Platform ベースのプロジェクト用に名前を付けられた JAR ファイルが、FuncData.class という名前の .class ファイルを含むように更新されます。メタデータ インポート ウィザードで参照できるのは、このファイルです。 このファイルは、アプリケーションのライブラリ セクション内の JavaFuncMetadata というフォルダにあります。

    図 3-36 クラス ファイルで生成された Java 関数 XML Bean


    クラス ファイルで生成された Java 関数 XML Bean

  12. これで、Java 関数からメタデータを作成する準備が整いました。 これらの手順は、「インポート ウィザードを使用した Java 関数のメタデータの追加」で説明されています。

Java ソースの確認

この例で使用される .java ファイルには、関数とデータの双方が含まれています。 さらに多くの場合、ルーチンは、データ インポート関数を介してデータにアクセスします。

コード リスト 3-4 の最初の関数は単に、PRODUCTS の配列内の最初の要素を取得するだけのものです。 2 番目の関数は、配列全体を返します。

コード リスト 3-4 JavaFunc.java getFirstPRODUCT( ) 関数と getAllPRODUCTS( ) 関数
public class JavaFunc {

 ...

public static noNamespace.PRODUCTSDocument.PRODUCTS getFirstProduct(){
noNamespace.PRODUCTSDocument.PRODUCTS products = null;
try{
noNamespace.DbDocument dbDoc = noNamespace.DbDocument.Factory.parse(testCustomer);
products = dbDoc.getDb().getPRODUCTSArray(1);
// products を返す
}catch(Exception e){
e.printStackTrace();
}
return products;
}

public static noNamespace.PRODUCTSDocument.PRODUCTS[] getAllProducts(){
noNamespace.PRODUCTSDocument.PRODUCTS[] products = null;
try{
noNamespace.DbDocument dbDoc = noNamespace.DbDocument.Factory.parse(testCustomer);
products = dbDoc.getDb().getPRODUCTSArray();
// products を返す
}catch(Exception e){
e.printStackTrace();
}
return products;
}
}

XMLBean の作成に使用されるスキーマを、コード リスト 3-5 に示します。 これは単に、複合要素の構造をモデル化するものです。最初にデータを直接参照することで得られていることもあります。

コード リスト 3-5 Java 関数によって解析される B-PTest.xsd モデルの複合要素
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="db">
<xs:complexType>
<xs:sequence>
<xs:element ref="PRODUCTS" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AVERAGE_SERVICE_COST" type="xs:decimal"/>
<xs:element name="LIST_PRICE" type="xs:decimal"/>
<xs:element name="MANUFACTURER" type="xs:string"/>
<xs:element name="PRODUCTS">
<xs:complexType>
<xs:sequence>
<xs:element ref="PRODUCT_NAME"/>
<xs:element ref="MANUFACTURER"/>
<xs:element ref="LIST_PRICE"/>
<xs:element ref="PRODUCT_DESCRIPTION"/>
<xs:element ref="AVERAGE_SERVICE_COST"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="PRODUCT_DESCRIPTION" type="xs:string"/>
<xs:element name="PRODUCT_NAME" type="xs:string"/>
</xs:schema>


Java 関数では、返された要素 (戻り値のシグネチャで指定されている) が、有効な XML ドキュメントから得られることを必要としています。 有効な XML ドキュメントには、0 または 1 以上の子を持つ単一のルート要素があり、そのコンテンツは、参照されるスキーマに一致しています。

コード リスト 3-6 データがドキュメントを介して取得される場合のアプローチ
	public static noNamespace.PRODUCTSDocument.PRODUCTS getNextProduct(){

// dbDocument (ルート) を作成する
noNamespace.DbDocument dbDoc = noNamespace.DbDocument.Factory.newInstance();
// そこからの db 要素
noNamespace.DbDocument.Db db = dbDoc.addNewDb();
// PRODUCTS 要素を取得する
PRODUCTS product = db.addNewPRODUCTS();
//.. 子を作成する
product.setPRODUCTNAME("productName");
product.setMANUFACTURER("Manufacturer");
product.setLISTPRICE(BigDecimal.valueOf((long)12.22));
product.setPRODUCTDESCRIPTION("Product Description");
product.setAVERAGESERVICECOST(BigDecimal.valueOf((long)122.22));

// .. db の子を更新する
db.setPRODUCTSArray(0,product);

// .. db でドキュメントを更新する
dbDoc.setDb(db);

//.. これで dbDoc は db のある有効なドキュメントであり、かつ子である
// db の子である PRODUCTS が作業対象である
// したがって常に子を処理する前に有効なドキュメントを作成
すること
// 単に子要素を作成して返すだけでは、ドキュメントが
// 有効であるということにはならないため、不十分である
// 子は、グローバル要素のために作成された有効な
// ドキュメントから得られたものであることが必要である

return dbDoc.getDb().getPRODUCTSArray(0);

}

Java 関数のメタデータの作成方法

AquaLogic Data Services Platform では、ユーザ定義関数は通常、Java クラスです。 以下のものがサポートされます。

この機能をサポートするため、メタデータ インポート ウィザードでは、Java におけるトークン イテレータが XML に、また XML がトークン イテレータに変換されるよう、マーシャリングとマーシャリング解除をサポートしています。

作成する関数は、静的 Java 関数として定義される必要があります。 XQuery で使用される場合の Java メソッド名は、ネームスペースで修飾された XQuery 関数名となります。

表 3-37 に、単純 Java 型、スキーマ型、および XQuery 型に関するキャスト アルゴリズムを示します。

表 3-37 単純 Java 型および対応する XQuery 型
Java 単純型または定義型
スキーマ型
boolean
xs:boolean
byte
xs:byte
char
xs:char
double
xs:double
float
xs:float
int
xs:int
long
xs:long
short
xs:short
string
xd:string
java.lang.Date
xs:datetime
java.lang.Boolean
xs:boolean
java.math.BigInteger
xs:integer
java.math.BigDecimal
xs:decimal
java.lang.Byte
xs.byte
java.lang.Char
xs:char
java.lang.Double
xs:double
java.lang.Float
xs:float
java.lang.Integer
xs:integer
java.lang.Long
xs:long
java.lang.Short
xs:short
java.sql.Date
xs:date
java.sql.Time
xs:time
java.sql.Timestamp
xs:datetime
java.util.Calendar
xs:datetime

Java 関数はまた、XMLBean からスキーマを処理することによって生成される XMLBean 型の変数も消費します。 XMLBean によって生成されるクラスは、Java 関数ではパラメータまたは戻り値型として参照されます。

スキーマ内で参照される要素または型は、グローバル要素とする必要があります。これらだけが XMLBean の中で静的な解析メソッドを定義されている型であるためです。

次の節では、メタデータ インポート ウィザードが Java 関数をどのように使用してデータ サービスを作成するかを説明する、追加のコード サンプルを示します。

技術的な詳細と追加のサンプル コード

データ サービスまたは XQuery 関数ライブラリのメンバーを作成するには、まず Java 関数の定義から始めます。

Java プリミティブの配列を返す関数を処理する

たとえば、Java 関数 getListGivenMixed( ) は、次のように定義できます。

public static float[ ] getListGivenMixed(float[ ] fpList, int size) { 
int listLen = ((fpList.length > size) ? size : fpList.length);
float fpListop = new float[listLen];
for (int i =0; i < listLen; i++)
fpListop[i]=fpList[i];
return fpListop;
}

関数がウィザードで処理された後は、次のメタデータ情報が作成されます。

xquery version "1.0" encoding "WINDOWS-1252";

(::pragma xfl <x:xfl xmlns:x="urn:annotations.ld.bea.com">
<creationDate>2005-06-01T14:25:50</creationDate>
<javaFunction class="DocTest"/>
</x:xfl>::)

declare namespace f1 = "lib:testdoc/library";

(::pragma function <f:function xmlns:f="urn:annotations.ld.bea.com" nativeName="getListGivenMixed">
<params>
<param nativeType="[F"/>
<param nativeType="int"/>
</params>
</f:function>::)

declare function f1:getListGivenMixed($x1 as xsd:float*, $x2 as xsd:int) as xsd:float* external;

上記の関数を実行するための対応する XQuery は、次のとおりです。

declare namespace f1 = "ld:javaFunc/float"; 
let $y := (2.0, 4.0, 6.0, 8.0, 10.0)
let $x := f1:getListGivenMixed($y, 2)
return $x
XMLBean で表現される複合型を処理する

以下に示すように、Customer というスキーマ (customer.xsd) があると考えます。

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema targetNamespace="ld:xml/cust:/BEA_BB10000" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="CUSTOMER">
<xs:complexType>
<xs:sequence>
<xs:element name="FIRST_NAME" type="xs:string" minOccurs="1"/>
<xs:element name="LAST_NAME" type="xs:string" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

CUSTOMER 要素に準拠するリストを生成する場合は、XMLBean 経由でスキーマを処理し、xml.cust.beaBB10000.CUSTOMERDocument.CUSTOMER を得られます。 これで、以下のように CUSTOMER 要素を使用できるようになりました。

public static xml.cust.beaBB10000.CUSTOMERDocument.CUSTOMER[] 
getCustomerListGivenCustomerList(
xml.cust.beaBB10000.CUSTOMERDocument.CUSTOMER[] ipListOfCust)
throws XmlException {
xml.cust.beaBB10000.CUSTOMERDocument.CUSTOMER [] mylocalver =
ipListOfCust;
return mylocalver;
}

その後、ウィザードによって生成されるメタデータ情報は、以下のようになります。

(::pragma function <f:function xmlns:f="urn:annotations.ld.bea.com" kind="datasource" access="public"> 
<params>
<param nativeType="[Lxml.cust.beaBB10000.CUSTOMERDocument$CUSTOMER;"/>
</params>
</f:function>::)

declare function f1:getCustomerListGivenCustomerList($x1 as element(t1:CUSTOMER)*) as element(t1:CUSTOMER)* external;

上記の関数を実行するための対応する XQuery は、次のとおりです。

declare namespace f1 = "ld:javaFunc/CUSTOMER";  
let $z := (  
validate(<n:CUSTOMER xmlns:n="ld:xml/cust:/BEA_BB10000"><FIRST_NAME>John2</FIRST_NAME><LAST_NAME>Smith2</LAST_NAME>  
</n:CUSTOMER>),  
validate(<n:CUSTOMER xmlns:n="ld:xml/cust:/BEA_BB10000"><FIRST_NAME>John2</FIRST_NAME><LAST_NAME>Smith2</LAST_NAME>  
</n:CUSTOMER>),  
validate(<n:CUSTOMER xmlns:n="ld:xml/cust:/BEA_BB10000"><FIRST_NAME>John2</FIRST_NAME><LAST_NAME>Smith2</LAST_NAME>  
</n:CUSTOMER>),  
validate(<n:CUSTOMER xmlns:n="ld:xml/cust:/BEA_BB10000"><FIRST_NAME>John2</FIRST_NAME><LAST_NAME>Smith2</LAST_NAME>  
</n:CUSTOMER>))  
for $zz in $z 
return
  f1:getCustomerListGivenCustomerList($z)
Java 関数に関する制限

Java 関数には、以下の制限が適用されます。

 


文字区切り形式ファイルのメタデータのインポート

スプレッドシートは、情報 (特に迅速に変更する必要がある情報) を格納および操作するための非常に適応させやすい手段となります。 そのようなスプレッドシート データは、容易にデータ サービスにできます。

スプレッドシート ドキュメントは、多くの場合、カンマ区切り値 (comma-separated values) を意味する CSV ファイルとして言及されています。 CSV はスプレッドシートとして一般的な本来の形式ではありませんが、スプレッドシートを CSV ファイルとして保存する機能は、ほぼ世界標準となっています。

セパレータ フィールドは多くの場合、カンマですが、メタデータ インポート ウィザードでは固定長フィールドと共に、任意の ASCII 文字をセパレータとしてサポートしています。

注意 : 1 つのサーバの文字区切り形式ファイルは、同一のエンコーディング形式を共有している必要があります。 このエンコーディングは、システム プロパティ ld.csv.encoding を使って指定し、JVM コマンドラインで直接、または startWebLogic.cmd (Windows) や startWebLogic.sh (UNIX) などのスクリプトを使って設定できます。
注意 : このコマンドの形式は次のとおりです。
-Dld.csv.encoding=<encoding format>

ld.csv.encoding で形式が指定されていない場合は、file.encoding システム プロパティで指定された形式が使用されます。

RTLApp DataServices/Demo ディレクトリに、文字区切り形式ファイルのメタデータのインポートの説明に使用できるサンプルがあります。

クラス ファイルで生成された Java 関数 XML Bean

ドキュメント名、スキーマ名、または両方の指定

文字区切り形式の情報に関するメタデータの作成には、必要に応じて、およびソースの性質に応じて、いくつかの方法があります。

文字区切り形式ファイルに対するメタデータ インポート ウィザードの使用

XML ファイル情報のインポートは、リレーショナル データ ソース メタデータのインポートに類似しています (「リレーショナル テーブルおよびビューのメタデータのインポート」を参照)。 必要な手順は、次のとおりです。

  1. 文字区切り形式ファイル メタデータを作成するプロジェクトを選択します。 たとえば、myProject というプロジェクトがある場合、そのプロジェクト名を右クリックして、ポップアップ メニューから [ソース メタデータのインポート] を選択します。
  2. メタデータ インポート ウィザードの使用可能なデータ ソースから、[区切り文字付きデータ] を選択します (図 3-38 を参照)。
  3. 図 3-38 メタデータ インポート ウィザードからの文字区切り形式ソースの選択


    メタデータ インポート ウィザードからの文字区切り形式ソースの選択

  4. スキーマ名、ソース ファイル名、またはその両方を指定できます。 ウィザードを使って、プロジェクト内にあるファイルの場所を参照できます。 また、先頭に以下の文字列を付加した絶対パスを使用して、システム上の任意の CSV ファイルからデータをインポートすることもできます。
  5. file:///

    たとえば、Windows システムの場合、以下の URI を使用して、ルート C: ディレクトリから Orders.xml などの XML ファイルにアクセスできます。

    file:///<c:/home>/Orders.csv

    UNIX システムの場合、以下の URI でそのようなファイルにアクセスします。

    file:///<home>/Orders.csv
  6. さらにインポート オプションを選択します。
    • [ヘッダ付き]。 文字区切り形式ファイルにヘッダ データが含まれるかどうかを示します。 ヘッダ データは、スプレッドシートの 1 行目にあります。 このオプションをチェックすると、1 行目はデータとして処理されません。
    • [区切り文字付き] または [固定幅]。 ファイル内のデータは、特定の文字 (カンマなど) で区切られているか、固定幅 (スペース 10 個など) であるかのどちらかです。 データが文字区切り形式の場合は、区切り文字も指定する必要があります。 デフォルトでは、この文字はカンマ (,) です。
    • 図 3-39 インポート用の文字区切り形式メタデータ特性の指定


      インポート用の文字区切り形式メタデータ特性の指定

  7. ドキュメントと、必要に応じてスキーマを選択したら、[次へ] をクリックして、新しいデータ サービスの場所と、ユニークな場所/名前を確認します。
  8. 図 3-40 文字区切り形式ドキュメントのインポート データ概要画面


    文字区切り形式ドキュメントのインポート データ概要画面

    データ サービス名は、明確化のために、あるいは既存のデータ サービスまたは予定されているデータ サービスとの衝突を回避するために、編集することができます。 名前の衝突がある場合は、赤色で表示されています。 名前を変更するには、データ サービス名をダブルクリックして、ライン エディタをアクティブ化します。

  9. [完了] をクリックします。 スキーマを XML 型としたデータ サービス (.ds ファイル) が作成されます。
注意 : CSV タイプのデータをインポートする際、いくつか留意すべき点があります。

 


XML ファイルのメタデータのインポート

XML ファイルは、階層的なデータを処理する便利な手段です。 XML ファイル、および関連のスキーマは、容易にデータ サービスにすることができます。

XML ファイル情報のインポートは、リレーショナル データ ソース メタデータのインポートに類似しています (「リレーショナル テーブルおよびビューのメタデータのインポート」を参照)。

メタデータ インポート ウィザードを使用すると、アプリケーション内の任意の場所にある XML ファイルを参照できます。 また、先頭に以下の文字列を付加した絶対パスを使用して、システム上の任意の XML ファイルからデータをインポートすることもできます。

file:///

たとえば、Windows システムの場合、以下の URI を使用して、ルート C: ディレクトリから Orders.xml などの XML ファイルにアクセスできます。

file:///c:/Orders.xml

UNIX システムの場合、以下の URI でそのようなファイルにアクセスします。

file:///home/Orders.xml

XML ファイルのインポートのサンプル

RTLApp DataServices/Demo ディレクトリに、XML ファイルのメタデータのインポートの説明に使用できるサンプルがあります。

必要な手順は次のとおりです。

  1. XML ファイル メタデータを作成する AquaLogic Data Services Platform ベースのプロジェクトを選択します。 たとえば、myProject というプロジェクトがある場合、そのプロジェクト名を右クリックして、ポップアップ メニューから [ソース メタデータのインポート] を選択します。
  2. メタデータ インポート ウィザードの使用可能なデータ ソースから、[XML データ] を選択します。
  3. 図 3-41 メタデータ インポート ウィザードからの XML ファイルの選択


    メタデータ インポート ウィザードからの XML ファイルの選択

  4. XML データにアクセスするには、まずスキーマを識別する必要があります。スキーマは、アプリケーション内に存在していなければなりません。
  5. 図 3-42 XML メタデータのインポートのための XML ファイル スキーマの指定


    XML メタデータのインポートのための XML ファイル スキーマの指定

  6. 必要に応じて、XML ファイルを指定します。 XML ファイルが AquaLogic Data Services Platform ベースのプロジェクト内に存在する場合は、その場所を参照するだけで済みます。 実際には、ドキュメントは URI として得られることが多く、その場合は XML ファイル フィールドは空のままにしておき、実行時に URI を指定します。
  7. スキーマおよび省略可能なドキュメント名の選択後は、[次へ] をクリックして、新しいデータ サービスの名前がアプリケーションにとってユニークであることを確認します。
  8. 図 3-43 XML ファイルのインポート データ概要画面


    XML ファイルのインポート データ概要画面

    データ サービス名は、明確化のために、あるいは既存のデータ サービスまたは予定されているデータ サービスとの衝突を回避するために、編集することができます。 衝突は、赤色で示されています。 単純にデータ サービス名をクリックして、名前を変更します。 [次へ] をクリックします。

  9. 次に、スキーマ内のグローバル要素を選択します (図 3-44)。 [OK] をクリックします。
  10. 図 3-44 XML メタデータのインポート時のグローバル要素の選択


    XML メタデータのインポート時のグローバル要素の選択

  11. [概要] 画面で項目を確認して受け入れることにより、プロシージャのインポートを完了させます (詳細については、「リレーショナル テーブルおよびビューのメタデータのインポート」の手順 4 を参照)。

  12. XML メタデータのインポート時のグローバル要素の選択

XML データ ソースでのメタデータ インポート ウィザードのテスト

XML データ ソースのメタデータを作成したが、データ ソース名を指定しなかった場合、データ サービスの読み取り関数を実行する際に、パラメータとしてデータ ソースの URI を識別する必要があります (データ サービス関数への各種アクセス方法の詳細については、『クライアント アプリケーション開発者ガイド』を参照)。

この識別は、下記の形式で行われます。

<uri>/path/filename.xml

ここで、uri はパスまたはパスのエリアスを表し、path はディレクトリを表し、filename.xml はファイル名を表します。 拡張子 .xml が必要です。

次の文字列を先頭に付加した絶対パスを使用して、ファイルにアクセスすることができます。

file:///

たとえば、Windows システムの場合、以下の URI を使用して、ルート C: ディレクトリから Orders.xml などの XML ファイルにアクセスできます。

file:///c:/Orders.xml

UNIX システムの場合、以下の URI でそのようなファイルにアクセスします。

file:///home/Orders.xml

図 3-45 では、XML ソース ファイルへの参照方法を示します。

図 3-45 テスト ビューでの XML ソース URI の指定

テスト ビューでの XML ソース URI の指定

 


データ ソースのメタデータの更新

最初に物理データ サービスを作成するときには、その基底となるメタデータは定義上、そのデータ ソースと整合しています。 しかし時間の経過と共に、次のようないくつかの理由により、メタデータは「同期がずれて」しまう場合があります。

[ソース メタデータの更新] 右クリック メニュー オプションを使用して、ソース メタデータ ファイルとソース データ構造の間の、以下のような相違点を識別できます。

使用できないソースがある場合、この問題はおそらく、接続またはパーミッションに関連しています。 その他の種類の報告については、基底のデータ ソースに準拠するようデータ ソースのメタデータを更新すべきかどうかをユーザ側で判断できます。

メタデータと基底のソースの間に差がない場合、ソース メタデータ更新ウィザードは、テストされた各データ サービスについての最新情報を報告します。

ソース メタデータを更新する場合の考慮事項

ソース メタデータの更新には、注意が必要です。なぜなら、この操作には、直接的な影響と間接的な影響の双方が伴う場合があるからです。 たとえば、2 つの物理データ サービス間の関係を追加していた場合、ソース メタデータを更新すると、双方のデータ サービスからその関係を削除してしまうことになりかねません。 モデル ダイアグラム内にその関係が表示される場合、その関係の線は、現在はもうその関係がそれぞれのデータ サービスで記述されていないことを示す赤色で表示されます。

多くの場合、ソース メタデータ更新ウィザードは、ユーザによる変更を、更新されたメタデータと自動的に結合できます。 詳細については、「ソース メタデータ更新ウィザードの使用」を参照してください。

直接的および間接的な影響

直接的な影響は、物理データ サービスに適用されます。 間接的な影響は、論理データ サービスに生じます。なぜなら、このようなサービスは、最終的にはそれ自体が (少なくとも部分的には) 物理データ サービスに基づいているからです。 たとえば、物理データ サービスと論理データ サービスの間に新しい関係を作成した場合、物理データ サービスを更新すると、その関係が無効になってしまうかもしれません。 物理データ サービスの場合は、関係の参照はありません。 論理データ サービスは、関係を記述したコードを保持しますが、対になる関係表記が存在しなくなっていれば、無効になります。

したがって、ソース メタデータの更新を行う際には、注意が必要です。 開発努力を無駄にせず、かつメタデータを最新のものに保ち続けられるようにしておくため、いくつかの予防手段が設けられています。 ソース更新の一環として、現在のメタデータがどのように保存されているかについては、「ソース メタデータのアーカイバル」を参照してください。

ソース メタデータ更新ウィザードの使用

ソース メタデータ更新ウィザードを使用すると、ソース メタデータを更新できます。

注意 : ソース メタデータの更新を試行する前に、ビルド プロジェクトにエラーがないことを確認する必要があります。
図 3-46 複数のデータ サービスのソース メタデータの更新

複数のデータ サービスのソース メタデータの更新

AquaLogic Data Services Platform ベースのプロジェクトの 1 つまたは複数の物理データ サービスに対し、メタデータの更新を実行することで、データ構造を確実に最新のものとすることができます。 たとえば、図 3-46 ではプロジェクト内のすべての物理データ サービスが更新されます。

対象を選択後、ウィザードは確認されるメタデータ、およびメタデータと基底のソースの間のすべての相違点を識別します。

ダイアログ内に表示されている任意のデータ サービスまたは XFL ファイルを、その名前の左にあるチェック ボックスを使用して、選択または選択解除できます (図 3-47)。

図 3-47 更新されるデータ サービス メタデータ

更新されるデータ サービス メタデータ

メタデータの更新の分析

次に、ウィザードによってメタデータに対し、分析が行われます。 以下に示すタイプの同期化の不一致が識別されます。

これらの相違点の全般的な説明とフィールド レベルのデータに関する説明の双方を行う、更新プレビュー画面のレポート (図 3-48) が用意されています。

図 3-48 RTLApp の DataServices プロジェクトのメタデータ更新プラン

RTLApp の DataServices プロジェクトのメタデータ更新プラン

[メタデータ更新ブレビュー] 画面では、以下のものが識別されます。

アイコンにより、追加された要素、削除された要素、変更された要素が区別されています。表 3-49 で、ソース メタデータ更新メッセージの種類と色凡例について説明します。

表 3-49 ソース メタデータ更新の対象と色凡例
カテゴリ
説明
追加されたデータ ソース フィールド
緑色
最後のメタデータ更新後に、データ ソース フィールドが追加された。
変更されたデータ サービス スキーマ (XML 型)
黒色
データ ソースから派生したスキーマ内で変更が行われた。
削除されたデータ ソース フィールド
赤色
メタデータで使用されているフィールドが、ソースに表示されなくなった。
変更されたフィールド
青色
メタデータ内のフィールドが、データ ソース フィールドに正確に一致しない。
変更された関数
青色
メタデータ内の関数が、データ ソース関数に正確に一致しない。

同期化の不一致

状況によっては、ソース メタデータ更新ウィザードは、実際には変更が行われていない場合に、ローカルで変更されたものとしてデータ サービス アーティファクトにフラグを付けることがあります。

たとえば、Web サービス オペレーションのインポートの場合、別のスキーマによって依存される (または参照される) スキーマに、内部生成されたファイル名が割り当てられます。 プロジェクト内の 2 番目にインポートされた Web サービス オペレーションが同じ依存スキーマを参照する場合、ウィザードは同期化時に、インポートされる 2 次スキーマ ファイルの名前が変更されたことを指摘するかもしれません。 そのまま同期化を続行してください。古い第 2 レベルのスキーマは、自動的に削除されます。

ソース メタデータのアーカイバル

ソース メタデータを更新する際には、2 つのファイルが作成されて、アプリケーション内の特別なディレクトリに格納されます。

メタデータ ソース更新操作により、生成されたファイルの双方に、同じタイムスタンプが割り当てられます。

図 3-50 UpdateMetadataHistory ディレクトリのサンプル コンテンツ

UpdateMetadataHistory ディレクトリのサンプル コンテンツ

特定の更新操作のレポートおよびソースによる作業をしていると、多くの場合、関係やその他のメタデータに対して加えられる変更を迅速に復元できる一方で、メタデータを確実に最新のものとしておけます。


  ページの先頭       前  次