SALT
GWWSサーバーは構成に基づくプロセスで、ほとんどの基本的なWebサービス・アプリケーションではプログラミングの必要はありません。ただし、カスタム型付きバッファ・データとカスタマイズした共有ライブラリを利用してGWWSサーバーを拡張するプラグイン・インタフェースを開発すると、SALTの機能を拡張できます。
プラグイン・インタフェースは、共有ライブラリによってエクスポートされた一連の機能です。共有ライブラリは、GWWSプロセスから特別な機能を実行するためにロードしたり呼び出したりできます。SALTには、プラグイン・インタフェースを定義して実装するための共通インタフェースとして、プラグイン・フレームワークが用意されています。プラグインを実装するには、実際の関数が含まれている共有ライブラリを使用します。プラグイン実装ライブラリは
SALTのデプロイメント・ファイルで設定し、GWWSサーバーの起動中に動的にロードします。
プラグイン・インタフェースを定義するには、次の4つのプラグイン要素が必要です。
プラグインID要素は、特定のプラグイン・インタフェース関数を識別するための文字列です。同じような機能に同じプラグインIDを使用して、複数のプラグイン・インタフェースをグループ化できます。プラグインIDの値は、SALTによって事前に定義されています。任意の文字列を定義することはできません。
SALT
では、プラグインIDとして
P_CUSTOM_TYPEおよび
P_CREDENMAPをサポートしています。これは、カスタム型付きバッファ・データを処理するためのプラグイン・インタフェースを定義し、Oracle TuxedoユーザーIDとグループIDをHTTP基本認証が必要とするユーザー名/パスワードにマップするために使用します。
プラグイン名は、同じプラグインIDカテゴリ内のプラグイン実装を別のプラグイン実装と区別するために使用します。
プラグインIDが
P_CUSTOM_TYPEの場合、プラグイン名を使用して実際のカスタム・バッファ・タイプ名を示します。GWWSサーバーがOracle Tuxedoのカスタム・タイプ・バッファとXMLドキュメント間でデータを変換しようとするときに、プラグイン名を主な要素として、適切なプラグイン・インタフェースが検索されます。
実際のビジネス・ロジックでは、必要な関数をプラグインのvtable構造体に追加する必要があります。必要な関数は、プラグインIDのカテゴリによって異なる場合があります。
P_CREDENMAP IDのカテゴリでは、次の1つの関数を実装する必要があります。
|
•
|
int (* gwws_pi_map_http_basic) (char * domain, char * realm, char * t_userid, char * t_grpid, Cred_UserPass * credential);
|
プラグイン登録関数は、GWWSサーバーがプラグイン実装を呼び出すことができるようにプラグイン・インタフェースで実装する必要がある、一連の共通関数(またはルール),です。各プラグイン・インタフェースで3つの登録関数を実装する必要があります。これらの関数は次のとおりです。
この関数は省略可能です。これを使用すると、GWWSサーバーの起動中、プラグイン共有ライブラリのロード後すぐに呼び出されます。1つのプラグイン・ライブラリに複数のインタフェースを実装する場合、この関数を実装し、ライブラリにインタフェースの数、IDおよび名前を返す必要があります。
0が返された場合は、関数が正常に実行されたことを意味します。
0以外の値が返された場合は、実行に失敗したことを意味します。この関数が失敗した場合は、プラグインがロードされず、GWWSサーバーは起動しません。
int
_ws_pi_get_Id_and_Names(int * count, char **ids, char **names);
ライブラリ内の
count引数に実装のカウントの総数を返す必要があります。
idsおよび
namesの引数には、セミコロン「;」で区切られているすべての実装されたインタフェース
idsおよび
namesを含める必要があります。
開始関数は、プラグイン共有ライブラリに実装されたすべてのインタフェースを決定した後に呼び出されます。データ構造を初期化して、プラグインで使用できるグローバル環境を設定できます。
0が返された場合は、開始関数が正常に実行されたことを意味します。
0以外の値が返された場合は、プラグイン・インタフェースの開始に失敗したことを意味します。開始に失敗すると、GWWSサーバーは起動されません。
int _ws_pi_init_@ID@_@Name@(char * params, void **priv_ptr);
@ID@は、実際のプラグインIDの値です。
@Name@は、実際のプラグイン名です。たとえば、プラグインIDが
P_CUSTOM_TYPEでプラグイン名が
MyTypeであるプラグインの開始関数は、
_ws_pi_init_P_CUSTOM_TYPE_MyType (char * params, void **priv_ptr)です。
終了関数は、GWWSサーバーのシャットダウン中、プラグイン共有ライブラリの終了前に呼び出されます。予約されているすべてのプラグイン・リソースを解放する必要があります。
int _ws_pi_exit_@ID@_@Name@(void * priv);
@ID@は、実際のプラグインIDの値です。
@Name@は、実際のプラグイン名です。たとえば、プラグインIDが
P_CUSTOM_TYPEでプラグイン名が
MyTypeであるプラグインの終了関数は、
_ws_pi_exit_P_CUSTOM_TYPE_MyType(void * priv)です。
vtableは、プラグイン・インタフェースの実際のビジネス・ロジックに必要な関数ポインタが格納されるC構造体です。つまり、有効なプラグイン・インタフェースでは、対応するvtableで定義されているすべての関数を実装する必要があります。
int _ws_pi_set_vtbl_@ID@_@Name@(void * priv);
@ID@は、実際のプラグインIDの値です。
@Name@は、実際のプラグイン名です。たとえば、プラグインIDが
P_CUSTOM_TYPEでプラグイン名が
MyTypeであるプラグインの
vtable設定関数は、
_ws_pi_set_vtbl_P_CUSTOM_TYPE_MyType(void * priv)です。
vtable構造体は、プラグインIDのカテゴリによって異なる場合があります。このSALTリリースでは、
P_CUSTOM_TYPEおよび
P_CREDENMAPが唯一の有効なプラグインIDです。
使用可能なプラグイン・インタフェースの
vtable構造体を
リスト5-1に示します。
struct credmap_vtable {
int (* gwws_pi_map_http_basic) (char * domain, char * realm, char * t_userid, char * t_grpid, Cred_UserPass * credential); /* used for HTTP Basic Authentication */
/* for future use */
void * unused_1;
void * unused_2;
void * unused_3;
};
struct credmap_vtableは、
P_CREDENMAPプラグイン・インタフェースに対し1つの関数を実装する必要があることを示します。詳細は、
「?$paratext>?」を参照してください。
関数の入力パラメータ
void * privは、具体的な
vtableインスタンスを指しています。
vtable設定関数内の実際の関数を使用して
vtable構造体を設定する必要があります。
vtable設定関数内の実際の関数を使用して
vtable構造体を設定する例を
リスト5-2に示します。
リスト5-2
vtable設定関数内の実際の関数を使用したvtable構造体の設定
int _DLLEXPORT_ _ws_pi_set_vtbl_
P_CREDENMAP_TEST (void * vtbl)
{
struct
credmap_vtable * vtable;
if ( ! vtbl )
return -1;
vtable = (struct
credmap_vtable *) vtbl;
vtable->
gwws_pi_map_http_basic =
Credmap_HTTP_Basic;
return 0;
}
プラグイン・インタフェースを開発するには、次の手順に従います。
|
1.
|
プラグイン・インタフェースを実装する共有ライブラリを開発します。
|
|
2.
|
SALT構成ファイルでプラグイン・インタフェースを定義します。
|
プラグイン共有ライブラリを開発するには、次の手順に従います。
|
1.
|
実際のビジネス・ロジックのプラグイン実装関数をC言語で作成します。これらの関数は、共有ライブラリから公開する必要はありません。詳細は、 「?$paratext>?」を参照してください。
|
|
2.
|
必要に応じて、開始関数、終了関数、 vtable設定関数および情報記載関数を含むプラグイン登録関数をC言語で作成します。これらの登録関数は、GWWSサーバーから呼び出せるように公開する必要があります。詳細は、 「?$paratext>?」を参照してください。
|
|
3.
|
上記のすべての関数を1つの共有ライブラリにコンパイルします。
|
SALT構成ファイルでのプラグイン・インタフェースの定義
GWWSサーバーがロードするプラグイン共有ライブラリを定義するには、対応するプラグイン・ライブラリのパスをSALTのデプロイメント・ファイルで設定する必要があります。詳細は、
『SALT構成ガイド』の
SALTデプロイメント・ファイルの作成に関する項を参照してください。
SALTデプロイメント・ファイルでプラグイン情報を定義する例を
リスト5-3に示します。
リスト5-3
SALTデプロイメント・ファイルでのプラグインの定義
<?xml version="1.0" encoding="UTF-8"?>
<Deployment xmlns="http://www.bea.com/Tuxedo/SALTDEPLOY/2007">
. . . . . . .
. . . . . . .
<System>
<Plugin>
<Interface
id=���P_CREDENMAP���
name=���TEST���
library=���credmap_plugin.dll��� />
</Plugin>
</System>
</Deployment>
|
注意:
|
複数のプラグイン・インタフェースを定義するには、複数の <Interface>要素を指定する必要があります。各 <Interface>要素で1つのプラグイン・インタフェースを指定します。
|
複数のプラグイン・インタフェースを1つの共有ライブラリ・ファイルにビルドできます。
SALTでは、Oracle TuxedoバッファとSOAPメッセージ・ペイロード間のデータを変換するデフォルト・データ型の変換ルールの完全なセットが定義されています。ただし、デフォルト・データ型の変換ルールによって、SOAPメッセージをOracle Tuxedo型付きバッファに変換(またはその逆)するすべての要件を満たさないことがあります。特定のアプリケーション要件に対応するために、SALTでは、デフォルト・メッセージの変換を拡張するためにカスタマイズされたメッセージ・レベルの変換プラグインの開発をサポートしています。
|
注意:
|
SALT 12cR2メッセージ変換プラグインは、SALT 1.1カスタム・バッファ・タイプ変換プラグインの拡張された後継です。
|
メッセージ変換プラグインは、SALTがサポートされる1つのプラグインであり、SALTプラグイン・フレームワークで定義されています。すべてのメッセージ変換プラグイン・インスタンスには、同じ
プラグインID (
P_CUSTOM_TYPE)があります。特定の各メッセージ変換プラグイン・インスタンスでは、SOAPメッセージ・ペイロードをOracle Tuxedoバッファに変換する関数およびOracle TuxedoバッファをSOAPメッセージ・ペイロードに変換する関数という2つの関数を実装できます。これらの2つの関数のプロトタイプは、
リスト5-4で定義します。
リスト5-4
SALTのプラグインP_CUSTOM_TYPEのvtable構造体(C言語)
/* custtype_pi_ex.h */
struct custtype_vtable {
CustomerBuffer * (* soap_in_tuxedo__CUSTBUF) (void * xercesDOMTree, CustomerBuffer * tuxbuf, CustType_Ext * extinfo)
int (* soap_out_tuxedo__CUSTBUF) (void ** xercesDOMTree, CustomerBuffer * tuxbuf, CustType_Ext * extinfo)
......
}
関数のポインタ
(* soap_in_tuxedo__CUSTBUF)は、SOAPメッセージ・ペイロードをOracle Tuxedo型付きバッファに変換するカスタマイズされた関数を指しています。
関数のポインタ
(* soap_out_tuxedo__CUSTBUF)は、Oracle Tuxedo型付きバッファをSOAPメッセージ・ペイロードに変換するカスタマイズされた関数を指しています。
必要に応じて、メッセージ変換プラグインの
vtable構造体で定義された両方の関数を実装できます。1つの関数を実装して、他の関数を
NULLポインタで設定することもできます。
着信呼出しシナリオでのメッセージ変換プラグインの動作
着信呼出しシナリオは、外部Webサービス・プログラムを示し、SALTゲートウェイを介してOracle Tuxedoサービスを呼び出します。
図5-1は、Webサービス・クライアントとOracle Tuxedoドメイン間におけるメッセージの流れを示したものです。
SOAPリクエスト・メッセージをGWWSサーバーに配信する場合、GWWSはターゲット・サービスの入力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた
(*soap_in_tuxedo__CUSTBUF)関数を呼び出します。
Oracle Tuxedoレスポンス・バッファがOracle Tuxedoサービスから返された場合、GWWSはターゲット・サービスの出力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた関数
(*soap_out_tuxedo__CUSTBUF)を呼び出します。
発信呼出しシナリオでのメッセージ変換プラグインの動作
発信呼出しシナリオは、SALTゲートウェイを介して外部Webサービスを呼び出すOracle Tuxedoプログラムです。
図5-2は、Oracle TuxedoドメインとWebサービス・アプリケーション間におけるメッセージの流れを示したものです。
Oracle Tuxedoリクエスト・バッファをGWWSサーバーに配信する場合、GWWSはターゲット・サービスの入力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた関数
(*soap_out_tuxedo__CUSTBUF)を呼び出します。
SOAPレスポンス・メッセージが外部Webサービス・アプリケーションから返された場合、GWWSはターゲット・サービスの出力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた関数
(*soap_in_tuxedo__CUSTBUF)を呼び出します。
表5-1には、メッセージ変換プラグインの使用例を示します。
|
|
|
|
|
|
SOAPメッセージ・ペイロードがカスタム・タイプ・バッファに変換されます。
|
|
|
カスタム・タイプ・バッファがSOAPメッセージ・ペイロードに変換されます。
|
|
|
SOAPメッセージ・ペイロードがOracle Tuxedoサービスの入力または出力(あるいはその両方の)バッファに変換されると、このバッファはカスタマイズされたXMLスキーマ定義に関連付けられます。
|
|
|
Oracle Tuxedoサービスの入力または出力(あるいはその両方の)バッファがSOAPメッセージ・ペイロードに変換されると、このバッファはカスタマイズされたXMLスキーマ定義に関連付けられます。
|
|
|
SOAPメッセージ・ペイロードがOracle Tuxedoバッファに変換される時の他の一般的な場合
|
|
|
Oracle TuxedoバッファがSOAPメッセージ・ペイロードに変換される時の他の一般的な場合
|
|
|
|
|
Oracle TuxedoバッファがSOAPメッセージ・ペイロードに変換されるときのすべての場合
|
|
|
SOAPメッセージ・ペイロードがOracle Tuxedoバッファに変換されるときのすべての場合
|
|
|
表5-1から、次のメッセージ変換プラグインの一般的なルールが適用されます。
|
•
|
Oracle Tuxedoから生成したサービスがカスタム・タイプ・バッファを使用する場合、メッセージ変換プラグインが必要です。Oracle Tuxedoフレームワークは、カスタム型付きバッファの詳細なデータ構造を認識しません。そのため、SALTのデフォルト・データ型の変換ルールを適用できません。
|
|
•
|
Oracle Tuxedoから生成したサービスの入力または出力(あるいはその両方の)バッファが外部XMLスキーマに関連付けられるとき( TPSUCCESSか TPFAILで返されるかに関係なく)、SALTのデフォルトのバッファ・タイプに基づく変換ルールによって正しく処理できることが確実ではない場合は、手動で変換を処理するようにメッセージ変換プラグインを開発する必要があります。
|
|
•
|
たとえば、独自のXMLスキーマをOracle Tuxedoサービスの FML32型付きバッファに関連付けると、 FML型付きバッファに変換するときにSALTのデフォルトのデータ・マッピングのルーチンがSOAPメッセージ・ペイロードの構造体を認識できないため、メッセージ変換プラグインを指定する必要があります。逆に、 FML型付きバッファから変換されたSOAPメッセージ・ペイロードの構造体は、独自のXMLスキーマから定義したXMLの形と非常に異なることがあります。
|
|
•
|
独自のXMLスキーマをOracle TuxedoサービスのXMLタイプ・バッファに関連付けるとき、多くの場合はメッセージ変換プラグインを指定する必要がありません。これは、SALTがメッセージ変換の両方向にXMLデータをそのままで渡すためです。
|
|
•
|
必要に応じて、SALTのデフォルトのメッセージ変換ルーチンのかわりに、任意のメッセージ・レベルの変換用にメッセージ変換プラグインを開発できます。
|
SOAPメッセージ・ペイロードのOracle Tuxedoバッファへの変換
SOAP XMLペイロードをOracle Tuxedoバッファに変換するには、次の関数を実装する必要があります。
CustomerBuffer * (* soap_in_tuxedo__CUSTBUF) (void * xercesDOM, CustomerBuffer *a, CustType_Ext * extinfo);
#include <custtype_pi_ex.h>
CustomerBuffer * myxml2buffer (void * xercesDOM, CustomerBuffer *a, CustType_Ext * extinfo);
myxml2bufferは任意のカスタマイズした関数名です。
実装した関数では、指定されたXMLバッファを解析して、具体的なデータ項目をOracle Tuxedoカスタム・タイプ・バッファ・インスタンスに変換できる必要があります。
入力パラメータ
char * xmlbufは、XML形式のデータ・ストリームを表す
NULLで終わる文字列です。
|
注意:
|
XMLデータはカスタム型付きバッファの実際のXMLペイロードであって、SOAPエンベロープ全体でもSOAP本文全体でもありません。
|
入力パラメータ
char * typeは、カスタム・タイプ・バッファのタイプ名です。このパラメータは、GWWSサーバーに必要なカスタム型付きバッファ・ハンドラが現在のプラグイン関数に一致しているかどうかを確認するために使用されます。
出力パラメータ
CustomerBuffer *aは、割り当てられたカスタム・タイプ・バッファ・インスタンスを格納するために使用されます。Oracle Tuxedoカスタム型付きバッファは、このプラグイン関数から
tpalloc()を呼び出して割り当てる必要があります。割り当てられたカスタム・タイプ・バッファをプラグイン・コードで解放する必要はありません。使用されていないバッファはGWWSサーバーによって自動的に破棄されます。
この関数は、成功した場合に入力パラメータ
CustomerBuffer * aのポインタ値を返す必要があります。
リスト5-5に示すように、失敗した場合、この関数は
NULLを返します。
リスト5-5
Oracle Tuxedoカスタム型付きバッファへのXMLペイロード変換のコード例
CustomerBuffer * myxml2buffer (
void * xercesDOM, CustomerBuffer *a, CustType_Ext * extinfo)
{
// casting the input void * xercesDOM to class DOMDocument object
DOMDocument * DOMTree =
// allocate custom typed buffer via tpalloc
a->buf = tpalloc("MYTYPE", "MYSUBTYPE", 1024);
a->len = 1024;
// fetch data from DOMTree and set it into custom typed buffer
DOMTree ==> a->buf;
if ( error ) {
release ( DOMTree );
tpfree(a->buf);
a->buf = NULL;
a->len = 0;
return NULL;
}
release ( DOMTree );
return a;
}
|
ヒント:
|
Oracle TuxedoにバンドルされているXercesライブラリをXML解析に使用できます。Tuxedo 12cR2にはXerces 1.7がバンドルされ、Tuxedo 9.1にはXerces 2.5がバンドルされています。
|
Oracle TuxedoバッファのSOAPメッセージ・ペイロードへの変換
カスタム・タイプ・バッファをSOAP XMLペイロードに変換するには、次の関数を実装する必要があります。
int (*soap_out_tuxedo__CUSTBUF)(char ** xmlbuf, CustomerBuffer * a, char * type);
#include <custtype_pi_ex.h>
int * mybuffer2xml (char ** xmlbuf, CustomerBuffer *a, char * type);
"mybuffer2xml"は関数名で、必要に応じて有効な文字列を指定できます。
実装した関数は、指定されたカスタム・タイプ・バッファ・インスタンスをSOAPメッセージで使用するシングル・ルートのXMLドキュメントに変換します。
入力パラメータ(
CustomerBuffer *a)は、カスタム型付きバッファ応答インスタンスを格納するために使用されます。割り当てられたカスタム・タイプ・バッファをプラグイン・コードで解放する必要はありません。使用されていないバッファはGWWSサーバーによって自動的に破棄されます。
入力パラメータ(
char * type)は、カスタム型付きバッファ・タイプ名を示します。このパラメータは、SALT GWWSサーバーに必要なカスタム型付きバッファ・ハンドラが現在のプラグイン関数に一致しているかどうかを確認するために使用できます。
出力パラメータ(
char ** xmlbuf)は、新しく変換されたXMLペイロードを示すポインタです。XMLペイロード・バッファは、この関数で
malloc ()を呼び出して割り当てる必要があります。割り当てられたXMLペイロード・バッファをプラグイン・コードで解放する必要はありません。使用されていないバッファはGWWSサーバーによって自動的に破棄されます。
この関数は、成功した場合に
0を返す必要があります。
リスト5-6に示すように、失敗した場合、この関数は
-1を返す必要があります。
リスト5-6
SOAP XMLへのOracle Tuxedoカスタム型付きバッファ変換のコード例
int mybuffer2xml (void ** xercesDom, CustomerBuffer *a, CustType_Ext * extinfo)
{
// Use DOM implementation to create the xml payload
DOMTree = CreateDOMTree( );
if ( error )
return -1;
// fetch data from custom typed buffer instance,
// and add data to DOMTree according to the client side needed
// XML format
a->buf ==> DOMTree;
// allocate xmlbuf buffer via malloc
* xmlbuf = malloc( expected_len(DOMTree) );
if ( error ) {
release ( DOMTree );
return -1;
}
// casting the DOMDocument to void * pointer and returned
DOMTree >> (* xmlbuf);
if ( error ) {
release ( DOMTree );
free ( (* xmlbuf) );
return -1;
}
return 0;
}
|
警告:
|
プラグイン関数内に作成した DOMDocumentをGWWSフレームワークでリリースする必要があります。再度リリースしないようにするには、次のXerces APIの使用に注意する必要があります。
|
DOMDocumentを
XercesDOMParser::parse() APIでXML文字列から作成する場合。
DOMDocumentオブジェクトのポインタを取得するために
XercesDOMParser::adoptDocument()を使用する必要があります。
DOMDocumentオブジェクトのポインタを取得するために
XercesDOMParser::getDocument()を使用しないでください。これは、
DOMDocumentオブジェクトは、
XercesDOMParserオブジェクトによって維持され、
XercesDOMParser::getDocument()関数によって
DOMDocumentを
XercesDOMParserから分離しない場合は
XercesDOMParserオブジェクトを削除するときにリリースされるためです。
SALT 1.1カスタム・バッファ・タイプ変換プラグインの互換性
SALT 1.1カスタム・バッファ・タイプ変換プラグインには、Oracle Tuxedoカスタム・バッファ・タイプのみに対してカスタマイズしたメッセージ変換を提供します。
表5-2では、SALTメッセージ変換プラグインとSALT 1.1カスタム・バッファ型変換プラグインを比較しています。
表5-2
SALT 12cR2メッセージ変換プラグイン/SALT 1.1カスタム・バッファ型変換プラグインの比較
SALT 1.1カスタム・バッファ・タイプ・プラグイン
|
|
プラグインIDは 「P_CUSTOM_TYPE」です。
|
プラグインIDは 「P_CUSTOM_TYPE」です。
|
プラグイン名は、サポートしたカスタム・バッファ・タイプ名と同じである必要があります。
|
プラグイン名は、意味のある値で、他のプラグイン・インスタンスと区別するに使用されます。
|
SOAPメッセージ・ペイロードとOracle Tuxedoカスタム・バッファ・タイプ間のメッセージ変換のみをサポートします。
|
SOAPメッセージ・ペイロードと任意の種類のOracle Tuxedoバッファ・タイプ間のメッセージ変換をサポートします。
|
各プラグイン・インスタンスは、サポートされたカスタム・バッファ・タイプ名と同じ名前にする必要があります。各カスタム・バッファ・タイプには、1つのプラグインのみを実装できます。
1つのカスタム・バッファ・タイプはプラグイン・インスタンスに関連付けることができ、すべてのサービスによって使用されます。
|
各Oracle Tuxedoサービスは、プラグイン・インスタンス名によって、プラグイン・インスタンスを入力および/または出力バッファにそれぞれ関連付けることができます。
|
SOAPメッセージ・ペイロードはプラグイン・プログラミングの NULLで終わる文字列として保存されます。
|
SOAPメッセージ・ペイロードはプラグイン・プログラミングのXerces DOM Documentとして保存されます。
|
SALT 1.1カスタム・バッファ・タイプのプラグイン共有ライブラリはSALT 12cR2で直接使用できないことに注意してください。SALT 12cR2メッセージ変換プラグインにアップグレードするには、次の作業を実行する必要があります。
|
1.
|
SALTメッセージ変換プラグイン vtable関数のプロトタイプAPIに従って、関数 (*soap_in_tuxedo__CUSTBUF)および (*soap_out_tuxedo__CUSTBUF)を再実装します。主な変更点は、SOAPメッセージ・ペイロードは、古い文字列値のかわりにXercesクラス DOMDocumentオブジェクトとして保存されることです。
|
|
2.
|
関数を共有ライブラリとして再コンパイルして、GWWSサーバーによってロードできるように、この共有ライブラリを SALTのデプロイメント・ファイルで構成します。
|
|
ヒント:
|
アップグレードされたメッセージ変換プラグインを手動にサービス・バッファに関連付ける必要はありません。実行時に、カスタム・タイプ・バッファがメッセージの変換に含まれている場合、GWWSは、メッセージ変換プラグインのインタフェースが明示的に設定されなければ、バッファ・タイプと同じ名前のあるメッセージ変換プラグインを自動的に検索できます。
|
Oracle TuxedoクライアントがSOAP/HTTPを介してWebサービスにアクセスする場合、HTTPの基本認証を行うには、クライアントはユーザー名とパスワードをサーバーに送信する必要がある可能性があります。Oracle Tuxedoクライアントは、Oracle Tuxedoドメインに登録する時に
tpinit()を使用してユーザー名とパスワードを送信します。ただし、このユーザー名はOracle Tuxedoに使用されるもので、Webサービスに使用されるユーザー名と異なります(パスワードも異なる可能性があります)。
SALTは、ユーザー名のマッピングを可能にするため、Webサービスに送信するユーザー名とパスワードを選択できるプラグイン・インタフェース(資格証明マッピング・インタフェース),を備えています。
Oracle TuxedoクライアントがWebサービスを呼び出す際、実際に呼び出されるのは、WebサービスをOracle Tuxedoサービスとして宣言しているGWWSサーバーです。ユーザーIDおよびグループID (
tpusrおよび
tpgrpの各ファイルで定義済)がGWWSに送信されます。次にGWWSでは、Webサービスに構成項目
<Realm>があるかどうか確認されます。この項目がある場合、GWWSでは次のようになります。
|
•
|
サーバーのHTTPレルムに対してOracle TuxedoユーザーIDをユーザー名およびパスワードにマップするには、 vtable gwws_pi_map_http_basic関数の呼出しを試行します。
|
|
•
|
成功した呼出しに対して、 Base64で返されたユーザー名とパスワードをエンコードし、HTTPのヘッダー・フィールド「Authorization: Basic」に送信します。
|
|
•
|
呼出しが失敗した場合、Webサービスを呼び出さないでOracle Tuxedoクライアントに失敗したことを返されます。
|
資格証明マッピング・インタフェース・プラグインの実装
|
•
|
既存のWebサービス myservice (サイトは、http://www.abc.com/webservice)には、HTTP基本認証が必要です。ユーザー名は testで、パスワードは 1234です。レルムは myrealmです。
|
|
•
|
( wsdlcvtを使用して) WebサービスWSDLをSALT構成ファイルに変換した後で、 <Realm>myrealm</Ream>要素を WSDFファイルのエンドポイント定義に追加します。
|
SALTプラグイン・インタフェースを実装するには、次の手順を実行します。
|
1.
|
" myrealm"のOracle Tuxedo UID/GIDをwww.abc.comでの username/password にマップする関数を作成します。
|
|
•
|
Credmap_HTTP_Basic();を使用します。
|
この関数はHTTPユーザー名/パスワードを返します。この関数のプロトタイプは、
credmap_pi_ex.hで定義されます。
|
•
|
_ws_pi_init_P_CREDENMAP_TEST(char * params, void ** priv_ptr);
|
この関数は、GWWSサーバーが起動中にプラグイン共有ライブラリをロードしようとするときに呼び出されます。
|
•
|
_ws_pi_exit_P_CREDENMAP_TEST(void * priv);
|
この関数は、GWWSサーバーがシャットダウン中にプラグイン共有ライブラリをアンロードするときに呼び出されます。
|
•
|
_ws_pi_set_vtbl_P_CREDENMAP_TEST(void * vtbl);
|
手順1で実装された
Credmap_HTTP_Basic()関数を使用して
vtable構造体
credmap_vtable内の
gwws_pi_map_http_basicエントリを設定します。
|
•
|
_ws_pi_get_Id_and_Names(int * params, char ** ids, char ** names);
|
この関数は、どのライブラリ・インタフェースを実装したかを決定するためにGWWSサーバーが起動中にプラグイン共有ライブラリをロードしようとするときに呼び出されます。詳細は、
「?$paratext>?」を参照してください。
|
4.
|
前述した4つか5つの関数を1つの共有ライブラリ credmap_plugin.soにコンパイルします。
|
|
5.
|
SALTデプロイメント・ファイルでプラグイン・インタフェースを設定します。
|
リスト5-7に示すように、プラグイン・インタフェースを設定します。
リスト5-7
カスタム型付きバッファ・プラグイン・インタフェース
<?xml version="1.0" encoding="UTF-8"?>
<Deployment xmlns="http://www.bea.com/Tuxedo/SALTDEPLOY/2007">
. . . . . . .
. . . . . . .
<System>
<Plugin>
<Interface
id=���P_CREDENMAP���
name=���TEST���
library=���credmap_plugin.dll��� />
</Plugin>
</System>
</Deployment>
Oracle TuxedoのUIDおよびHTTPユーザー名のマッピング
HTTP基本認証のユーザー名/パスワードを返すには、次の関数を実装する必要があります。
typedef int (* GWWS_PI_CREDMAP_PASSTEXT) (char * domain, char * realm, char * t_userid, char * t_grpid, Cred_UserPass * credential);
#include <credmap_pi_ex.h>
typedef struct Cred_UserPass_s {
char username[UP_USERNAME_LEN];
char password[UP_PASSWORD_LEN];
int gwws_pi_map_http_basic (char * domain, char * realm, char * t_uid, char * t_gid, Cred_UserPass * credential);
「gwws_pi_map_http_basic」は関数名で、必要に応じて有効な文字列を指定できます。
実装した関数は、指定したドメインおよびレルムの指定したOracle Tuxedo uidおよびgidでユーザーを許可するために使用される認可資格証明(ユーザー名およびパスワード)を決定できます。
入力パラメータ(
char * domainおよびchar * realm)は、Webサービスが属するドメイン名およびHTTP Realmを表します。適切な資格証明を検索するためのスコープを決定するには、プラグイン・コードでこれらを使用する必要があります。
入力パラメータ(
char * t_uidおよび
char * t_gid)は、それぞれOracle TuxedoユーザーIDおよびグループIDの数値を含む文字列です。これらの2つのパラメータは、ユーザー名の検索に使用される場合があります。
出力パラメータ(
Cred_UserPass * credential)は、返されたユーザー名/パスワードを格納する事前割当て済のバッファを示すポインタです。プラグイン・コードでバッファを割り当てる必要はありません。
|
注意:
|
UBBCONFIGファイルに *SECURITYを USER_AUTHまたはそれ以上として設定する場合のみ、Oracle TuxedoユーザーIDを使用できます。 *SECURITYをACLまたはそれ以上として設定すると、グループIDを使用できます。デフォルトは 0です。
|
成功した場合、この関数は
0を返します。失敗した場合は、
リスト5-8に示すように
-1を返します。
リスト5-8
HTTP基本認証の資格証明マッピングのコード例
int
Credmap_HTTP_Basic(
char * domain, char * realm, char * t_uid, char * t_gid, Cred_UserPass * credential)
{
// Use domain and realm to determine scope
credentialList = FindAllCredentialForDomainAndRealm(domain, realm);
if ( error happens )
return -1;
// find appropriate credential in the scope
foreach cred in credentialList {
if (t_uid and t_gid match) {
*credential = cred;
return 0;
}
}
if ( not found and no default credential) {
return -1;
}
*credential = default_credential;
return 0;
}
|
ヒント:
|
資格証明はドメインとレルムをキーまたは索引としてデータベース内に格納できます。
|