|
|
要求レベルのインターセプタの API
この章では、要求レベルのインターセプタのインプリメントに使用する次のインターフェイスについて説明します。
Interceptors::Interceptor
RequestLevelInterceptor::RequestInterceptor
RequestLevelInterceptor::ClientRequestInterceptor
RequestLevelInterceptor::TargetRequestInterceptor
CORBA::DataInputStream
これらのインターフェイスは、位置制約付きオブジェクトです。リファレンスをその位置 (プロセス) の外部に渡そうとしたり、CORBA ORB object_to_string
オペレーションを使用して、このインターフェイスをサポートしているオブジェクトを外部化しようとしたりすると、CORBA MARSHAL
システム例外 (CORBA::MARSHAL
) が発生します。
インターセプタの階層構造
要求レベルのインターセプタは、2 つのインターフェイスに分かれており、クライアント側とターゲット側で別個に機能します。次の図では、BEA Tuxedo 製品でサポートしている要求レベルのインターセプタの継承の階層構造を示します。
未使用インターフェイスについての注意事項
RequestLevelInterceptor
インターフェイスから派生したクラスのオペレーションのメソッド・シグニチャには、次のインターフェイスのパラメータが含まれます。
RequestLevelInterceptor::DataOutputStream
RequestLevelInterceptor::ServiceContextList
これらのインターフェイスは BEA Tuxedo 製品では使用しません。しかし BEA Tuxedo 製品では、将来のリリースでこれらのインターフェイスのインプリメンテーションが提供されたときに CORBA アプリケーションを再コンパイルしなくてよいように、これらを定義してあります。ORB は常に実際の引数に対するニル・オブジェクトを渡します。この引数を使用しようとしないでください。プロセスが深刻なエラーにより停止する可能性があります。
Interceptors::Interceptor インターフェイス
Interceptors::Interceptor
インターフェイスは、要求レベルのインターセプタをはじめとする、すべての種類のインターセプタの基本インターフェイスとして定義されます。このインターフェイスには、全種類のインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。Interceptors::Interceptor
インターフェイスは、抽象インターフェイスとして定義されるため、インターフェイスのインスタンスはインスタンス化できません。
リスト 8-1 Interceptors::Interceptor インターフェイスの OMG IDL
// ファイル: Interceptors.idl
#ifndef _INTERCEPTORS_IDL
#define _INTERCEPTORS_IDL
#pragma prefix "beasys.com"
module Interceptors
{
native ExceptionValue;
local Interceptor
{
readonly attribute string id; // インターセプタの識別子
// インターセプタのシャットダウン時に ORB によって呼び出される
ShutdownReturnStatus shutdown(
in ShutdownReason reason,
out ExceptionValue excep_val
);
}; // 位置制約付き
};
#endif /* _INTERCEPTORS_IDL */
オペレーション _duplicate
、_narrow
、および _nil
のインプリメンテーションは、BEA Tuxedo 製品の CORBA ORB によって提供される CORBA::LocalBase
インターフェイスのインプリメンテーションから継承されます。
リスト 8-2 Interceptors::Interceptor インターフェイスの C++ 宣言
#ifndef _INTERCEPTORS_H
#define _INTERCEPTORS_H
#include <string.h>
#include <CORBA.h>
class OBBEXPDLL Interceptors
{
public:
class Interceptor;
typedef Interceptor * Interceptor_ptr;
enum InvokeReturnStatus
{
INVOKE_NO_EXCEPTION,// 通常どおり進行する
REPLY_NO_EXCEPTION, // 進行を停止し、応答処理を開始する
REPLY_EXCEPTION // 進行を停止し、例外を返す
};
enum ResponseReturnStatus
{
RESPONSE_NO_EXCEPTION, // 通常どおり進行する
RESPONSE_EXCEPTION
};
enum ShutdownReturnStatus
{
SHUTDOWN_NO_EXCEPTION,
SHUTDOWN_EXCEPTION
};
enum ShutdownReason
{
ORB_SHUTDOWN,
CONNECTION_ABORTED,
RESOURCES_EXCEEDED
};
struct Version
{
CORBA::Octet major_version;
CORBA::Octet minor_version;
};
typedef Version * Version_ptr;
//+
// すべてのインターセプタの抽象基本インターフェイス
//-
class OBBEXPDLL Interceptor : public virtual CORBA::LocalBase
{
public:
static Interceptor_ptr _duplicate(Interceptor_ptr obj);
static Interceptor_ptr _narrow(Interceptor_ptr obj);
static Interceptor_ptr _nil();
virtual ShutdownReturnStatus
shutdown( ShutdownReason reason,
CORBA::Exception_ptr & excep_val) = 0;
virtual CORBA::String id() = 0;
protected:
Interceptor();
virtual Interceptor();
};
};#endif /* _INTERCEPTORS_H */
Interceptor::id
概要
ベンダによって割り当てられたインターセプタの ID を文字列値として取得します。
C++マッピング
virtual CORBA::String id() = 0;
パラメータ
特にありません。
例外
特にありません。
説明
id
アクセサ・オペレーションは、ベンダによって割り当てられたインターセプタの ID を文字列値として取得するために ORB によって使用されます。この属性は、主に ORB によって呼び出されたインターセプタのオペレーションのデバッグとトレーシングに使用されます。
戻り値
このオペレーションは、インターセプタのインプリメンテーションの提供者によって割り当てられた ID を含む、ヌルで終了する文字列へのポインタを返します。
Interceptor::shutdown
概要
インターセプタのインプリメンテーションに、インターセプタがシャットダウンされていることを通知します。
C++ バインディング
virtual ShutdownReturnStatus
shutdown( ShutdownReason reason,
CORBA::Exception_ptr & excep_val) = 0;
パラメータ
reason
インターセプタがシャットダウンされている理由を示す ShutdownReason
値です。次の ShutdownReason
値を、オペレーションに渡すことができます。
ステータス値 |
説明 |
|
ORB がシャットダウンされていることを示します。 |
|
プロセスのリソースが限界まで消費されたことを示します。 |
|
この例外は BEA Tuxedo 8.0 では報告されません。 |
excep_val
ExceptionValue
へのリファレンスです。発生した例外はすべて、オペレーションによってこのパラメータに格納されます。このパラメータは、オペレーションから SHUTDOWN_EXCEPTION
の値が返された場合のみ有効です。
ExceptionValue
は、クラス CORBA::Exception
にマッピングされます。
例外
特にありません。
説明
shutdown
オペレーションは、インターセプタのインプリメンテーションに、インターセプタがシャットダウンされていることを通知するために、ORB によって使用されます。ORB は、オペレーションから ORB に制御が返されると、インターセプタのインスタンスを破棄します。
戻り値
SHUTDOWN_NO_EXCEPTION
オペレーションが例外を発生していないことを示します。
SHUTDOWN_EXCEPTION
オペレーションが例外を発生していることを示します。例外の値は、excep_val
パラメータに格納されます。
RequestLevelInterceptor::
RequestInterceptor インターフェイス
RequestLevelInterceptor::RequestInterceptor
インターフェイスは、すべての要求レベルのインターセプタの基本インターフェイスです。これは Interceptors::Interceptor
インターフェイスから直接継承されます。RequestLevelInterceptor::RequestInterceptor
インターフェイスの特長は次のとおりです。
OMG IDL による local
キーワードは、RequestInterceptor
インターフェイスが通常の CORBA オブジェクトではなく、したがってそのようには使用できないことを示します。
リスト 8-3 RequestLevelInterceptor::RequestInterceptor インターフェイスの OMG IDL
#ifndef _REQUEST_LEVEL_INTERCEPTOR_IDL
#define _REQUEST_LEVEL_INTERCEPTOR_IDL
#include <orb.idl>
#include <Giop.idl>
#include <Interceptors.idl>
#pragma prefix "beasys.com"
module RequestLevelInterceptor
{
local RequestInterceptor : Interceptors::Interceptor
{
void exception_occurred(
in ReplyContext reply_context,
in ExceptionValue excep_val
);
};
};
#endif /* _REQUEST_LEVEL_INTERCEPTOR_IDL */
RequestInterceptor
インターフェイスのインプリメンテーションは、CORBA::Object
ではなく、CORBA::LocalBase
から継承されます。CORBA::LocalBase
は、CORBA::Object
の場合と同様に、オペレーション _duplicate
、_narrow
、および _nil
のインプリメンテーションを提供します。
リスト 8-4 RequestInterceptor インターフェイスの C++ 宣言
#ifndef _RequestLevelInterceptor_h
#define _RequestLevelInterceptor_h
#include <CORBA.h>
#include <IOP.h>
#include <GIOP.h>
#include <Interceptors.h>
class OBBEXPDLL RequestLevelInterceptor
{
public:
class RequestInterceptor;
typedef RequestInterceptor * RequestInterceptor_ptr;
struct RequestContext
{
Interceptors::Version struct_version;
CORBA::ULong request_id;
CORBA::Octet response_flags;
GIOP::TargetAddress target;
CORBA::String_var interface_id;
CORBA::String_var operation;
RequestContext &operator=(const RequestContext obj);
};
typedef RequestContext * RequestContext_ptr;
typedef GIOP::ReplyStatusType_1_2 ReplyStatus;
struct ReplyContext
{
Interceptors::Version struct_version;
CORBA::ULong request_id;
ReplyStatus reply_status;
};
typedef ReplyContext * ReplyContext_ptr;
class OBBEXPDLL RequestInterceptor :
public virtual Interceptors::Interceptor
{
public:
static RequestInterceptor_ptr
_duplicate(RequestInterceptor_ptr obj);
static RequestInterceptor_ptr
_narrow(RequestInterceptor_ptr obj);
inline static RequestInterceptor_ptr _nil() { return 0; }
virtual void
exception_occurred( const ReplyContext & reply_context,
CORBA::Exception_ptr excep_val) = 0;
protected:
RequestInterceptor(CORBA::LocalBase_ptr obj = 0) { }
virtual RequestInterceptor(){ }
private:
RequestInterceptor( const RequestInterceptor&) { }
void operator=(const RequestInterceptor&) { }
}; // クラス RequestInterceptor
#endif /* _RequestLevelInterceptor_h */
RequestContext 構造体
概要
要求が処理されるコンテキストを表す情報が格納されます。
C++ バインディング
struct
RequestContext
{
Interceptors::Version struct_version;
CORBA::ULong request_id;
CORBA::Octet response_flags;
GIOP::TargetAddress target;
CORBA::String_var interface_id;
CORBA::String_var operation;
RequestContext&operator=(const RequestContext
obj);
};
メンバ
struct_version
形式とメンバを示す RequestContext のバージョン表示です。バージョン情報は、次の 2 つの部分に分かれます。
request_id
初期化 ORB によって要求に割り当てられた識別子を指定する、unsigned long 型の値です。
response_flags
response_flag
s の最下位ビットは、この要求に対して応答メッセージが返される場合は 1 に設定します。 オペレーションが oneway
と定義されておらず、要求が INV_NO_RESPONSE
フラグを設定された DII を介して呼び出されるのではない場合、response_flags
は
\x03
に設定します。
オペレーションが oneway と定義されているか、または要求が INV_NO_RESPONSE
フラグを設定された DII を介して呼び出されている場合、response_flags
は \x00
または \x01
に設定できます。
このフラグが oneway
オペレーションについて \x01
に設定されている場合、応答の受け取りは必ずしもオペレーションの完了を意味しません。
target
呼び出しのターゲットであるオブジェクトを識別するための、区別子を利用した共用体です。区別子は、ターゲットのアドレス指定が提示される形式を示します。想定されている区別子の値は、次のとおりです。
interface_id
オブジェクトのインターフェイスに割り当てられるリポジトリ識別子を指定する、NULL で終了する文字列です。
operation
ターゲット・メンバによって示されるターゲット・オブジェクトに対して要求されているオペレーションの名前を指定し、interface_id
メンバの値によって指定されるインターフェイスをサポートする、NULL で終了する文字列です。
説明
RequestContext
データ・オブジェクトには、要求が処理されるコンテキストを表す情報が格納されます。RequestContext
に含まれるコンテキスト情報は、所定の要求の処理と、対応する応答の間で調整を行うのに必要な情報を提供します。
RequestContext
構造体のコンテキスト情報は、インターセプタのインプリメンテーションでは変更できません。ORB は RequestContext
の所有権を維持し、RequestContext
が関連リソースの使用を終えると、それを解放する役割を果たします。
ReplyContext 構造体
概要
応答が処理されるコンテキストを表す情報が格納されます。
C++ バインディング
struct ReplyContext
{
Interceptors::Version struct_version;
CORBA::ULong request_id;
ReplyStatus reply_status;
};
メンバ
struct_version
形式とメンバを示す ReplyContext
のバージョン表示です。バージョン情報は、次の 2 つの部分に分かれます。
request_id
初期化 ORB によって要求に割り当てられた識別子を指定する、unsigned long 型の値です。
reply_status
関連の要求の完了ステータスを示します。また、応答本文の内容の一部を決定します。
説明
ReplyContext
データ・オブジェクトには、応答が処理されるコンテキストを表す情報が格納されます。ReplyContext
に含まれるコンテキスト情報は、所定の要求の処理と対応する応答の間で調整を行うのに必要な情報を提供します。
ReplyContext
のコンテキスト情報は、インターセプタのインプリメンテーションでは変更できません。ORB は ReplyContext
の所有権を維持し、ReplyContext
が関連リソースの使用を終えると、それを解放する役割を果たします。
RequestInterceptor::exception_occurred
概要
ORB によって呼び出されて、ある要求に固有の、インターセプタが管理していたと考えられる一切の状態を、そのインターセプががクリーンアップすることを許可します。
C++ バインディング
virtual void
exception_occurred( const ReplyContext & reply_context,
CORBA::Exception_ptr excep_val) = 0;
パラメータ
reply_context
応答が行われているコンテキストについての情報が含まれた ReplyContext
へのリファレンスです。
excep_val
ORB またはほかのインターセプタによって報告された例外へのポインタです。
例外
特にありません。
説明
次の 3 つのうちいずれかの場合、要求レベルのインターセプタ・インプリメンテーションの exception_occurred
オペレーションが呼び出されます。
Request
オブジェクト
を削除した場合。そのインターセプタの client_response
または
target_response
メソッドの代わりに、exception_occurred
メソッドが呼
び出されます。ORB が exception_occurred
メソッドを呼び出すことによ
り、インターセプタのインプリメンテーションは、管理していたと考えられ
る、ある要求に固有の一切の状態を、クリーンアップできるようになりま
す。
戻り値
特にありません。
RequestLevelInterceptor::
ClientRequestInterceptor インターフェイス
すべての要求レベルのインターセプタの基本インターフェイスです。これは RequestLevelInterceptor::RequestInterceptor
インターフェイスから直接継承されます。このインターフェイスには、クライアント側のすべての要求レベルのインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。
リスト 8-5 OMG IDL 定義
// ファイル: RequestLevelInterceptor.idl
#ifndef _REQUEST_LEVEL_INTERCEPTOR_IDL
#define _REQUEST_LEVEL_INTERCEPTOR_IDL
#include <orb.idl>
#include <Giop.idl>
#include <Interceptors.idl>
#pragma prefix "beasys.com"
module RequestLevelInterceptor
{
local ClientRequestInterceptor : RequestInterceptor
{
InvokeReturnStatus
client_invoke(
in RequestContext request_context,
in ServiceContextList service_context,
in CORBA::DataInputStream request_arg_stream,
in CORBA::DataOutputStream reply_arg_stream,
out ExceptionValue excep_val
);
ResponseReturnStatus
client_response(
in ReplyContext reply_context,
in ServiceContextList service_context,
in CORBA::DataInputStream arg_stream,
out ExceptionValue excep_val
);
};
};
#endif /* _REQUEST_LEVEL_INTERCEPTOR_IDL */
オペレーション _duplicate
、_narrow
、および _nil
のインプリメンテーションは、BEA Tuxedo 製品内の CORBA ORB によって提供される CORBA::LocalBase
インターフェイスのインプリメンテーションから間接的に継承されます。
リスト 8-6 C++ 宣言
#ifndef _RequestLevelInterceptor_h
#define _RequestLevelInterceptor_h
#include <CORBA.h>
#include <IOP.h>
#include <GIOP.h>
#include <Interceptors.h>
class OBBEXPDLL RequestLevelInterceptor
{
public:
class ClientRequestInterceptor;
typedef ClientRequestInterceptor *
ClientRequestInterceptor_ptr;
class OBBEXPDLL ClientRequestInterceptor :
public virtual RequestInterceptor
{
public:
static ClientRequestInterceptor_ptr
_duplicate(ClientRequestInterceptor_ptr obj);
static ClientRequestInterceptor_ptr
_narrow(ClientRequestInterceptor_ptr obj);
inline static ClientRequestInterceptor_ptr
_nil() { return 0; }
virtual Interceptors::InvokeReturnStatus
client_invoke(
const RequestContext & request_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
virtual Interceptors::ResponseReturnStatus
client_response(
const ReplyContext & reply_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
protected:
ClientRequestInterceptor(CORBA::LocalBase_ptr obj = 0) { }
virtual ClientRequestInterceptor(){ }
private:
ClientRequestInterceptor( const ClientRequestInterceptor&)
{ }
void operator=(const ClientRequestInterceptor&) { }
}; // クラス ClientRequestInterceptor
};
#endif /* _RequestLevelInterceptor_h */
ClientRequestInterceptor::client_invoke
概要
クライアント・アプリケーションがターゲット・オブジェクトに呼び出しを送信するときには必ず、クライアント側 ORB によって呼び出されます。
C++ バインディング
virtual Interceptors::InvokeReturnStatus
client_invoke(
const RequestContext & request_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
パラメータ
request_context
要求が行われているコンテキストについての情報が含まれた RequestContext へのリファレンスです。
service_context
ターゲット・オブジェクトへの要求の一部として送信される、サービス・コンテキスト情報が含まれた ServiceContextList
へのポインタです。
注記 BEA Tuxedo 8.0 では、このパラメータの値は常にニル・オブジェクトとなります。
request_arg_stream
インターセプタのインプリメンテーションが、オペレーションのパラメータ値の取得に使用できる、DataInputStream
へのポインタです。
DataInputStream
には、すべての in
パラメータおよび inout
パラメータが、オペレーションの IDL 定義で指定された順序で左から右へ配列されて含まれます。ニルの DataInputStream
は、引数が存在しないことを示します。
reply_arg_stream
呼び出しのイニシエータに、応答として返されるパラメータを挿入するのに使用可能な、CORBA::DataOutputStream
へのポインタです。このパラメータの使用は、REPLY_NO_EXCEPTION
のステータスが返された場合のみ有効です。
注記 BEA Tuxedo 8.0 では、このパラメータの値は常に nil オブジェクトとなります。
excep_val
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、REPLY_EXCEPTION
のステータスが返された場合のみ有効です。ORB が、excep_val
パラメータのためのメモリ管理の役割を持つことに注意してください。
例外
特にありません。
説明
client_invoke
オペレーションは、RequestLevelInterceptor::ClientRequestInterceptor
インターセプタのインターフェイスをサポートするインターセプタのインプリメンテーションに対して呼び出されます。このオペレーションは、ターゲット・オブジェクトが異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼び出しがターゲット・オブジェクトに送信されると ORB によって呼び出されます。
戻り値
INVOKE_NO_EXCEPTION
インターセプタが要求された処理をすべて正常に実行済みであり、ORB は呼び出しの処理を続行して、ターゲット・オブジェクトに送信すべきであることを示します。
REPLY_NO_EXCEPTION
インターセプタが要求を完全に満たすために必要なすべての処理を正常に実行済みであることを示します。ORB は、完了された要求を検討し、reply_arg_stream
に含まれる情報があれば、それをその要求の戻りパラメータ値として、処理し始めなければなりません。
注記 BEA Tuxedo 8.0 では、インターセプタがこのステータス値を返すことはできません。
REPLY_EXCEPTION
インターセプタがエラーに遭遇したため、ターゲットへの要求の処理が中断することを示します。ORB に例外を報告するのに、パラメータ excep_val
が使用されます。ORB は、クライアント・アプリケーションに戻る過程でのインターセプタの呼び出しを、client_response
オペレーションではなく、exception_occurred
オペレーションで行います。ORB が、excep_val
パラメータのためのメモリ管理の役割を持つことに注意してください。
ClientRequestInterceptor::client_response
概要
RequestLevelInterceptor::ClientRequestInterceptor
インターフェイスをサポートするインターセプタのインプリメンテーションに対して呼び出されます。
C++ バインディング
virtual Interceptors::ResponseReturnStatus
client_response(
const ReplyContext & reply_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
パラメータ
reply_context
応答が行われているコンテキストについての情報が含まれた ReplyContext
へのリファレンスです。
service_context
ターゲット・オブジェクトによる要求処理の結果として受信される、サービス・コンテキスト情報が含まれた ServiceContextList
へのポインタです。
注記 BEA Tuxedo 8.0 では、このパラメータの値は常に nil オブジェクトとなります。
arg_stream
インターセプタのインプリメンテーションがオペレーションの応答パラメータ値の取得に使用できる、DataInputStream
へのポインタです。
次の表は、ReplyContext
オブジェクトに含まれるステータスに基づいて DataInputStream
オブジェクトに client_response
メソッドが返す値を特定したものです。
注記 例外には、文字列と、その後に続く任意の例外メンバが含まれます。文字列には、例外のリポジトリ ID が含まれます。例外メンバは、struct と同じように渡されます。システム例外には、2 つの unsigned long 型メンバ、マイナー・コード、および完了ステータスが含まれます。
excep_val
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、REPLY_EXCEPTION
のステータスが返された場合のみ有効です。ORB が、excep_val
パラメータのためのメモリ管理の役割を持つことに注意してください。
例外
特にありません。
説明
client_response
オペレーションは、RequestLevelInterceptor::ClientRequestInterceptor
インターフェイスをサポートするインターセプタのインプリメンテーションに対して呼び出されます。このオペレーションは、イニシエータがターゲット・オブジェクトと異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼び出しへの応答が要求のイニシエータによって受信されると ORB によって呼び出されます。
戻り値
RESPONSE_NO_EXCEPTION
インターセプタが要求された処理をすべて正常に実行済みであり、ORB は要求に対する応答の処理を続行して、要求のイニシエータに送信すべきであることを示します。
RESPONSE_EXCEPTION
インターセプタがエラーに遭遇したことを示します。ORB に例外を報告するのに、パラメータ excep_val
が使用されます。クライアントに戻る過程でまだ呼び出されていないインターセプタはすべて、exception_occurred
オペレーションを ORB によって呼び出されて、要求の処理が失敗したことを通知されます。
RequestLevelInterceptor::
TargetRequestInterceptor インターフェイス
すべての要求レベルのインターセプタの基本インターフェイスです。これは RequestLevelInterceptor::RequestInterceptor
インターフェイスから直接継承されます。このインターフェイスには、ターゲット側のすべての要求レベルのインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。
リスト 8-7 OMG IDL 定義
// ファイル: RequestLevelInterceptor.idl
#ifndef _REQUEST_LEVEL_INTERCEPTOR_IDL
#define _REQUEST_LEVEL_INTERCEPTOR_IDL
#include <orb.idl>
#include <Giop.idl>
#include <Interceptors.idl>
#pragma prefix "beasys.com"
module RequestLevelInterceptor
{
local TargetRequestInterceptor : RequestInterceptor
{
InvokeReturnStatus
target_invoke(
in RequestContext request_context,
in ServiceContextList service_context,
in CORBA::DataInputStream request_arg_stream,
in CORBA::DataOutputStream reply_arg_stream,
out ExceptionValue excep_val
);
ResponseReturnStatus
target_response(
in ReplyContext reply_context,
in ServiceContextList service_context,
in CORBA::DataInputStream arg_stream,
out ExceptionValue excep_val
);
};
};
#endif /* _REQUEST_LEVEL_INTERCEPTOR_IDL */
オペレーション _duplicate
、_narrow
、および _nil
のインプリメンテーションは、BEA Tuxedo 製品内の CORBA ORB によって提供される、 CORBA::LocalBase
インターフェイスのインプリメンテーションから間接的に継承されます。
リスト 8-8 C++ 宣言
#ifndef _RequestLevelInterceptor_h
#define _RequestLevelInterceptor_h
#include <CORBA.h>
#include <IOP.h>
#include <GIOP.h>
#include <Interceptors.h>
class OBBEXPDLL RequestLevelInterceptor
{
public:
class TargetRequestInterceptor;
typedef TargetRequestInterceptor *
TargetRequestInterceptor_ptr;
class OBBEXPDLL TargetRequestInterceptor :
public virtual RequestInterceptor
{
public:
static TargetRequestInterceptor_ptr
_duplicate(TargetRequestInterceptor_ptr obj);
static TargetRequestInterceptor_ptr
_narrow(TargetRequestInterceptor_ptr obj);
inline static TargetRequestInterceptor_ptr
_nil() { return 0; }
virtual Interceptors::InvokeReturnStatus target_invoke(
const RequestContext & request_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
virtual Interceptors::ResponseReturnStatus
target_response(
const ReplyContext & reply_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
protected:
TargetRequestInterceptor(CORBA::LocalBase_ptr obj = 0) { }
virtual ~TargetRequestInterceptor(){ }
private:
TargetRequestInterceptor( const TargetRequestInterceptor&)
{ }
void operator=(const TargetRequestInterceptor&) { }
}; // クラス TargetRequestInterceptor
};
#endif /* _RequestLevelInterceptor_h */
TargetRequestInterceptor::target_invoke
概要
ターゲット・オブジェクトで呼び出しが受信されると、ターゲット側 ORB によって呼び出されます。
C++ バインディング
virtual Interceptors::InvokeReturnStatus
target_invoke(
const RequestContext & request_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
パラメータ
request_context
要求が行われているコンテキストについての情報が含まれた RequestContext
へのリファレンスです。
service_context
ターゲット・オブジェクトへの要求の一部として受信される、サービス・コンテキスト情報が含まれた ServiceContextList
へのポインタです。
BEA Tuxedo 8.0 では、このパラメータの値は常にニル・オブジェクトとなります。
request_arg_stream
インターセプタのインプリメンテーションが、オペレーションのパラメータ値の取得に使用できる、DataInputStream
へのポインタです。
DataInputStream
には、すべての in
パラメータおよび inout
パラメータが、オペレーションの IDL 定義で指定された順序で左から右へ配列されて含まれます。ニルの DataInputStream
は、引数が存在しないことを示します。
reply_arg_stream
呼び出しのイニシエータに、応答として返されるパラメータを挿入するのに使用可能な、DataOutputStream
へのポインタです。このパラメータの使用は、REPLY_NO_EXCEPTION
のステータスが返された場合のみ有効です。
BEA Tuxedo 8.0 では、このパラメータの値は常にニル・オブジェクトとなります。
excep_val
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、REPLY_EXCEPTION
のステータスが返された場合のみ有効です。ORB が、excep_val
パラメータのためのメモリ管理の役割を持つことに注意してください。
例外
特にありません。
説明
target_invoke
オペレーションは、RequestLevelInterceptor::TargetRequestInterceptor
インターフェイスをサポートするインターセプタのインプリメンテーションに対して呼び出されます。このオペレーションは、ターゲット・オブジェクトが異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼び出しがターゲット・オブジェクトによって受信されると ORB によって呼び出されます。
戻り値
INVOKE_NO_EXCEPTION
インターセプタが要求された処理をすべて正常に実行済みであり、ORB は呼び出しの処理を続行して、ターゲット・オブジェクトに送信すべきであることを示します。
REPLY_NO_EXCEPTION
インターセプタが要求を完全に満たすために必要なすべての処理を正常に実行済みであることを示します。ORB は、完了された要求を検討し、reply_arg_stream
に含まれる情報があれば、それをその要求の戻りパラメータ値として、処理し始めなければなりません。
注記 BEA Tuxedo 8.0 では、インターセプタがこのステータス値を返すことはできません。
REPLY_EXCEPTION
インターセプタがエラーに遭遇したため、それにより要求をターゲット・オブジェクトに送信するための処理が中断することを示します。ORB に例外を報告するのに、パラメータ excep_val
が使用されます。ORB は、クライアントに戻る過程でのインターセプタの呼び出しを、target_response
オペレーションではなく、exception_occurred
オペレーションで行います。ORB が、excep_val
パラメータのためのメモリ管理の役割を持つことに注意してください。
TargetRequestInterceptor::target_response
概要
呼び出しに対する応答が呼び出しのイニシエータに送信されると、ターゲット側 ORB によって呼び出されます。
C++ バインディング
virtual Interceptors::ResponseReturnStatus
target_response(
const ReplyContext & reply_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
パラメータ
reply_context
応答が行われているコンテキストについての情報が含まれた ReplyContext
へのリファレンスです。
service_context
ターゲット・オブジェクトによる要求処理の結果として送信される、サービス・コンテキスト情報が含まれた ServiceContextList
へのポインタです。
注記 BEA Tuxedo 8.0 では、このパラメータの値は常に nil オブジェクトとなります。
arg_stream
インターセプタのインプリメンテーションがオペレーションの応答パラメータ値の取得に使用できる、DataInputStream
へのポインタです。
次の表は、ReplyContext
オブジェクトに含まれるステータスに基づいて DataInputStream
オブジェクトに target_response
メソッドが返す値を特定したものです。
注記 例外には、文字列と、その後に続く任意の例外メンバが含まれます。文字列には、例外のリポジトリ ID が含まれます。例外メンバは、struct
と同じように渡されます。システム例外には、2 つの unsigned long 型メンバ、マイナー・コード、および完了ステータスが含まれます。
excep_val
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、REPLY_EXCEPTION
のステータスが返された場合のみ有効です。ORB が、excep_val
パラメータのためのメモリ管理の役割を持つことに注意してください。
例外
特にありません。
説明
target_response
オペレーションは、RequestLevelInterceptor::TargetRequestInterceptor
インターフェイスをサポートするインターセプタのインプリメンテーションに対して呼び出されます。このオペレーションは、イニシエータがターゲット・オブジェクトと異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼び出しへの応答が要求のイニシエータに送信されると、ターゲット側 ORB によって呼び出されます。
戻り値
RESPONSE_NO_EXCEPTION
インターセプタが要求された処理をすべて正常に実行済みであり、ORB は要求に対する応答の処理を続行して、要求のイニシエータに送信すべきであることを示します。
RESPONSE_EXCEPTION
インターセプタがエラーに遭遇したことを示します。ORB に例外を報告するのに、パラメータ excep_val
が使用されます。クライアントに戻る過程でまだ呼び出されていないインターセプタはすべて、exception_occurred
オペレーションを ORB によって呼び出されて、要求の処理が失敗したことを通知されます。ORB が、excep_val
パラメータのためのメモリ管理の役割を持つことに注意してください。
AppRequestInterceptorInit
概要
クライアント側およびターゲット側のインターセプタをインスタンス化および初期化します。
C++ バインディング
typedef void (*AppRequestInterceptorInit)(
CORBA::ORB_ptr TheORB,
RequestLevelInterceptor::ClientRequestInterceptor ** ClientPtr,
RequestLevelInterceptor::TargetRequestInterceptor ** TargetPtr,
CORBA::Boolean * RetStatus);
パラメータ
TheORB
インターセプタのインプリメンテーションが関連付けられた ORB オブジェクトへのポインタです。
ClientPtr
ORB で使用するためにインスタンス化された RequestLevelInterceptor::ClientRequestInterceptor
のインスタンスへのポインタが返される、ポインタです。
TargetPtr
ORB で使用するためにインスタンス化された RequestLevelInterceptor::TargetRequestInterceptor
のインスタンスへのポインタが返される、ポインタです。
RetStatus
インターセプタのインスタンス化と初期化が正常に実行されたかどうかが、インターセプタのインプリメンテーションによって示される、場所へのポインタです。CORBA::TRUE
の値は、インターセプタのインスタンス化と初期化が正常に実行されたことを示すために使用されます。CORBA::FALSE
の値は、インターセプタのインスタンス化と初期化が、何らかの理由により正常に実行されなかったことを示すために使用されます。
例外
特にありません。
説明
AppRequestInterceptorInit
関数は、クライアント側およびターゲット側のインターセプタをインスタンス化および初期化するために ORB によって使用される、ユーザ指定の関数です。
戻り値
特にありません。
CORBA::DataInputStream インターフェイス
DataInputStream
に適用される、IDL 中の abstract valuetype
キーワードは、それがインターフェイスと同じでないことを示します。
リスト 8-9 OMG IDL 定義
module CORBA {
//... ほかのすべて
// DataInputStream で使用される定義
typedef sequence<any> AnySeq;
typedef sequence<boolean> BooleanSeq;
typedef sequence<char> CharSeq;
typedef sequence<octet> OctetSeq;
typedef sequence<short> ShortSeq;
typedef sequence<unsigned short> UShortSeq;
typedef sequence<long> LongSeq;
typedef sequence<unsigned long> ULongSeq;
typedef sequence<float> FloatSeq;
typedef sequence<double> DoubleSeq;
// DataInputStream - ストリームからのデータの読み込みに使用する
abstract valuetype DataInputStream
{
any read_any(); // NO_IMPLEMENT を発生する
boolean read_boolean();
char read_char();
octet read_octet();
short read_short();
unsigned short read_ushort();
long read_long();
unsigned long read_ulong();
float read_float();
double read_double();
string read_string ();
Object read_Object();
TypeCode read_TypeCode();
void read_any_array( inout AnySeq seq,
in unsigned long offset,
in unsigned long length);
// NO_IMPLEMENT を発生する
void read_boolean_array(inout BooleanSeq seq,
in unsigned long offset,
in unsigned long length);
void read_char_array( inout CharSeq seq,
in unsigned long offset,
in unsigned long length);
void read_octet_array(inout OctetSeq seq,
in unsigned long offset,
in unsigned long length);
void read_short_array(inout ShortSeq seq,
in unsigned long offset,
in unsigned long length);
void read_ushort_array(inout UShortSeq seq,
in unsigned long offset,
in unsigned long length);
void read_long_array( inout LongSeq seq,
in unsigned long offset,
in unsigned long length);
void read_ulong_array(inout ULongSeq seq,
in unsigned long offset,
in unsigned long length);
void read_float_array(inout FloatSeq seq,
in unsigned long offset,
in unsigned long length);
void read_double_array(inout DoubleSeq seq,
in unsigned long offset,
in unsigned long length);
};
};
CORBA::DataInputStream
のインプリメンテーションは、CORBA::Object
ではなく CORBA::ValueBase
から継承されます。たとえば、_duplicate
、_narrow
、および_nil
の各オペレーションは、CORBA::Object
にのみ適用されるため、使用できません。このとき、CORBA::ValueBase
インターフェイスには、ユーザの関心の対象となるものはありません。
リスト 8-10 C++ 宣言
class CORBA
{
public:
class AnySeq {/* Normal sequence definition */};
typedef AnySeq * AnySeq_ptr;
class BooleanSeq {/* Normal sequence definition */};
typedef BooleanSeq * BooleanSeq_ptr;
static const CORBA::TypeCode_ptr _tc_BooleanSeq;
class CharSeq {/* Normal sequence definition */};
typedef CharSeq * CharSeq_ptr;
static const CORBA::TypeCode_ptr _tc_CharSeq;
class OctetSeq {/* Normal sequence definition */};
typedef OctetSeq * OctetSeq_ptr;
static const CORBA::TypeCode_ptr _tc_OctetSeq;
class ShortSeq {/* Normal sequence definition */};
typedef ShortSeq * ShortSeq_ptr;
static const CORBA::TypeCode_ptr _tc_ShortSeq;
class UshortSeq {/* Normal sequence definition */};
typedef UShortSeq * UShortSeq_ptr;
static const CORBA::TypeCode_ptr _tc_UShortSeq;
class LongSeq {/* Normal sequence definition */};
typedef LongSeq * LongSeq_ptr;
static const CORBA::TypeCode_ptr _tc_LongSeq;
class UlongSeq {/* Normal sequence definition */};
typedef ULongSeq * ULongSeq_ptr;
static const CORBA::TypeCode_ptr _tc_ULongSeq;
class FloatSeq {/* Normal sequence definition */};
typedef FloatSeq * FloatSeq_ptr;
static const CORBA::TypeCode_ptr _tc_FloatSeq;
class DoubleSeq {/* Normal sequence definition */};
typedef DoubleSeq * DoubleSeq_ptr;
static const CORBA::TypeCode_ptr _tc_DoubleSeq;
class OBBEXPDLL DataInputStream : public virtual ValueBase
{
public:
static DataInputStream_ptr _downcast(ValueBase_ptr obj);
virtual Any * read_any (); // NO_IMPLEMENT を発生する
virtual Boolean read_boolean ();
virtual Char read_char ();
virtual Octet read_octet ();
virtual Short read_short ();
virtual UShort read_ushort ();
virtual Long read_long ();
virtual ULong read_ulong ();
virtual Float read_float ();
virtual Double read_double ();
virtual Char * read_string ();
virtual Object_ptr read_Object ();
virtual TypeCode_ptr read_TypeCode ();
virtual void read_any_array ( AnySeq & seq,
ULong offset, ULong length);
// NO_IMPLEMENT を発生する
virtual void read_boolean_array(BooleanSeq & seq,
ULong offset, ULong length);
virtual void read_char_array ( CharSeq & seq,
ULong offset, ULong length);
virtual void read_octet_array ( OctetSeq & seq,
ULong offset, ULong length);
virtual void read_short_array ( ShortSeq & seq,
ULong offset, ULong length);
virtual void read_ushort_array (UShortSeq & seq,
ULong offset, ULong length);
virtual void read_long_array ( LongSeq & seq,
ULong offset, ULong length);
virtual void read_ulong_array ( ULongSeq & seq,
ULong offset, ULong length);
virtual void read_float_array ( FloatSeq & seq,
ULong offset, ULong length);
virtual void read_double_array (DoubleSeq & seq,
ULong offset, ULong length);
protected:
DataInputStream(){ };
virtual DataInputStream(){ }
private:
void operator=(const DataInputStream&) { }
};
typedef DataInputStream * DataInputStream_ptr;
};
DataInputStream::read_<primitive>
概要
ストリームから値を返します。
C++ バインディング
<primitive> read_<
primitive
>();
パラメータ
特にありません。
例外
特にありません。
説明
DataInputStream
からプリミティブ・エレメント (<
primitive
>
) を読み込むためのオペレーションはすべて、同じ形式です。各オペレーションは、ストリームから値を返します。
注記 メモリ管理には、String_var
、TypeCode_var
、または Object_var
を使用できます。これらを使用しない場合は、CORBA オブジェクトの string_free()
オペレーションによって文字列を解放し、CORBA オブジェクトの release()
オペレーションによって TypeCode
または Object
ポインタを解放する必要があります。
次のプリミティブがあります。
AnySeq (インプリメントされていません。)
BooleanSeq
CharSeq
OctetSeq
ShortSeq
UshortSeq
LongSeq
UlongSeq
FloatSeq
DoubleSeq
戻り値
特にありません。
DataInputStream::read_array_<primitive>
概要
ストリームから CORBA
シーケンスにプリミティブ値の配列を返します。
C++ バインディング
void read_array_<
primitive
>( <primitive
>Seq & seq,
ULong offset,
ULong length);
パラメータ
<
primitive
>Seq
読み込まれた配列エレメントを受信する、適切な型のシーケンスです。
このシーケンスに、追加のエレメントを格納できるだけの長さがない場合、この長さは合計値 offset + length に設定されます (長さは、下方調整されることはありません)。
Offset
エレメントを読み込むための、配列へのオフセットです。つまり、配列は、配列インデックス offset から配列インデックス offset + length - 1 までの新しいエレメントを持つようになります。
Length
seq
パラメータに返される配列のエレメント数です。
例外
特にありません。
説明
DataInputStream
からプリミティブ・エレメント (<
primitive
>
) の配列を読み込むためのオペレーションはすべて、同じ形式です。各オペレーションは、ストリームから、同じプリミティブ型の CORBA
シーケンスに、プリミティブ値の配列を返します。
次のプリミティブがあります。
AnySeq (インプリメントされていません。)
BooleanSeq
CharSeq
OctetSeq
ShortSeq
UshortSeq
LongSeq
UlongSeq
FloatSeq
DoubleSeq
戻り値
特にありません。
|
Copyright © 2001, BEA Systems, Inc. All rights reserved.
|