目次 前 次 PDF


SALTプラグインの使用

SALTプラグインの使用
この章には次のトピックが含まれます:
SALTプラグインの理解
SALT GWWSサーバーは構成に基づくプロセスで、ほとんどの基本的なWebサービス・アプリケーションではプログラミングの必要はありません。ただし、カスタム型付きバッファ・データとカスタマイズした共有ライブラリを利用してGWWSサーバーを拡張するプラグイン・インタフェースを開発すると、SALTの機能を拡張できます。
プラグイン・インタフェースは、共有ライブラリによってエクスポートされた一連の機能です。共有ライブラリは、GWWSプロセスから特別な機能を実行するためにロードしたり呼び出したりできます。SALTには、プラグイン・インタフェースを定義して実装するための共通インタフェースとして、プラグイン・フレームワークが用意されています。プラグインを実装するには、実際の関数が含まれている共有ライブラリを使用します。プラグイン実装ライブラリはSALTのデプロイメント・ファイルで設定し、GWWSサーバーの起動中に動的にロードします。
プラグイン要素
プラグイン・インタフェースを定義するには、次の4つのプラグイン要素が必要です。
プラグインID
プラグイン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);
詳細は、「?$paratext>?」を参照してください。
プラグイン登録関数
プラグイン登録関数は、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設定関数
vtableは、プラグイン・インタフェースの実際のビジネス・ロジックに必要な関数ポインタが格納されるC構造体です。つまり、有効なプラグイン・インタフェースでは、対応するvtableで定義されているすべての関数を実装する必要があります。
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に示します。
リスト5-1 VTable構造体
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ドメイン間におけるメッセージの流れを示したものです。
図5-1 着信呼出しシナリオでのメッセージ変換プラグインの動作
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サービス・アプリケーション間におけるメッセージの流れを示したものです。
図5-2 発信呼出しシナリオでのメッセージ変換プラグインの動作
Oracle Tuxedoリクエスト・バッファをGWWSサーバーに配信する場合、GWWSはターゲット・サービスの入力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた関数(*soap_out_tuxedo__CUSTBUF)を呼び出します。
SOAPレスポンス・メッセージが外部Webサービス・アプリケーションから返された場合、GWWSはターゲット・サービスの出力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた関数(*soap_in_tuxedo__CUSTBUF)を呼び出します。
メッセージ変換プラグインの必要性
表5-1には、メッセージ変換プラグインの使用例を示します。
 
表5-1 メッセージ変換プラグインの使用例
シナリオの説明
soap_in_tuxedo_CUSTBUF
soap_out_tuxedo_CUSTBUF
Oracle Tuxedoから生成したサービス
 
SOAPメッセージ・ペイロードがカスタム・タイプ・バッファに変換されます。
必須
なし
カスタム・タイプ・バッファがSOAPメッセージ・ペイロードに変換されます。
なし
必須
SOAPメッセージ・ペイロードがOracle Tuxedoサービスの入力または出力(あるいはその両方の)バッファに変換されると、このバッファはカスタマイズされたXMLスキーマ定義に関連付けられます。
非XMLタイプ・バッファ:必須
 
XMLタイプ・バッファ:省略可能
なし
Oracle Tuxedoサービスの入力または出力(あるいはその両方の)バッファがSOAPメッセージ・ペイロードに変換されると、このバッファはカスタマイズされたXMLスキーマ定義に関連付けられます。
なし
非XMLタイプ・バッファ:必須
 
XMLタイプ・バッファ:省略可能
 
SOAPメッセージ・ペイロードがOracle Tuxedoバッファに変換される時の他の一般的な場合
省略可
なし
Oracle TuxedoバッファがSOAPメッセージ・ペイロードに変換される時の他の一般的な場合
なし
省略可
Webサービスから生成したサービス
Oracle TuxedoバッファがSOAPメッセージ・ペイロードに変換されるときのすべての場合
なし
省略可
SOAPメッセージ・ペイロードがOracle Tuxedoバッファに変換されるときのすべての場合
省略可
なし
表5-1から、次のメッセージ変換プラグインの一般的なルールが適用されます。
Oracle Tuxedoから生成したサービスがカスタム・タイプ・バッファを使用する場合、メッセージ変換プラグインが必要です。Oracle Tuxedoフレームワークは、カスタム型付きバッファの詳細なデータ構造を認識しません。そのため、SALTのデフォルト・データ型の変換ルールを適用できません。
Oracle Tuxedoから生成したサービスの入力または出力(あるいはその両方の)バッファが外部XMLスキーマに関連付けられるとき(TPSUCCESSTPFAILで返されるかに関係なく)、SALTのデフォルトのバッファ・タイプに基づく変換ルールによって正しく処理できることが確実ではない場合は、手動で変換を処理するようにメッセージ変換プラグインを開発する必要があります。
たとえば、独自のXMLスキーマをOracle TuxedoサービスのFML32型付きバッファに関連付けると、FML型付きバッファに変換するときにSALTのデフォルトのデータ・マッピングのルーチンがSOAPメッセージ・ペイロードの構造体を認識できないため、メッセージ変換プラグインを指定する必要があります。逆に、FML型付きバッファから変換されたSOAPメッセージ・ペイロードの構造体は、独自のXMLスキーマから定義したXMLの形と非常に異なることがあります。
独自のXMLスキーマをOracle TuxedoサービスのXMLタイプ・バッファに関連付けるとき、多くの場合はメッセージ変換プラグインを指定する必要がありません。これは、SALTがメッセージ変換の両方向にXMLデータをそのままで渡すためです。
詳細は、「SALTアプリケーションの構成」を参照してください。
必要に応じて、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の使用に注意する必要があります。
DOMDocumentXercesDOMParser::parse() APIでXML文字列から作成する場合。DOMDocumentオブジェクトのポインタを取得するためにXercesDOMParser::adoptDocument()を使用する必要があります。DOMDocumentオブジェクトのポインタを取得するためにXercesDOMParser::getDocument()を使用しないでください。これは、DOMDocumentオブジェクトは、XercesDOMParserオブジェクトによって維持され、XercesDOMParser::getDocument()関数によってDOMDocumentXercesDOMParserから分離しない場合は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カスタム・バッファ・タイプ・プラグイン
SALT 12cR2メッセージ変換プラグイン
プラグイン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で定義されます。
2.
以下の3つのプラグイン登録関数を作成します。詳細は、「?$paratext>?」を参照してください。
_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エントリを設定します。
3.
省略可能な関数を作成できます。:
_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];
} Cred_UserPass;
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ファイルに*SECURITYUSER_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;
}
 
ヒント:
資格証明はドメインとレルムをキーまたは索引としてデータベース内に格納できます。
 

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved