この章では、リクエスト・レベルのインターセプタの実装に使用する次のインタフェースについて説明します。
•
|
Interceptors::Interceptor
|
•
|
RequestLevelInterceptor::RequestInterceptor
|
•
|
RequestLevelInterceptor::ClientRequestInterceptor
|
•
|
RequestLevelInterceptor::TargetRequestInterceptor
|
これらのインタフェースは、
位置制約付きオブジェクトです。リファレンスをその位置(プロセス)の外部に渡そうとしたり、CORBA ORB
object_to_stringオペレーションを使用して、このインタフェースをサポートしているオブジェクトを外部化しようとしたりすると、CORBA
MARSHALシステム例外(
CORBA::MARSHAL)が発生します。
リクエスト・レベルのインターセプタは、2つのインタフェースに分かれており、クライアント側とターゲット・サイドで別個に機能します。次の図では、Oracle Tuxedo製品でサポートしているリクエスト・レベルのインターセプタの継承の階層構造を示します。
RequestLevelInterceptorインタフェースから派生したクラスのオペレーションのためのメソッド・シグネチャには、次のインタフェースのパラメータが含まれます。
•
|
RequestLevelInterceptor::DataOutputStream
|
•
|
RequestLevelInterceptor::ServiceContextList
|
これらのインタフェースはOracle Tuxedo製品では使用しません。しかしOracle Tuxedo製品では、将来のリリースでこれらのインタフェースの実装が提供されたときにCORBAアプリケーションを再コンパイルしなくてよいように、これらを定義してあります。ORBは常に実際の引数に対するnilオブジェクトを渡します。この引数を使用しようとしないでください。プロセスが深刻なエラーにより停止する可能性があります。
Interceptors::Interceptorインタフェース
Interceptors::Interceptorインタフェースは、リクエスト・レベルのインターセプタをはじめとする、すべての種類のインターセプタの基本インタフェースとして定義されます。このインタフェースには、全種類のインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。
Interceptors::Interceptorインタフェースは、抽象インタフェースとして定義されるため、インタフェースのインスタンスはインスタンス化できません。
リスト7-1
Interceptors::InterceptorインタフェースのOMG IDL
//File: Interceptors.idl
#ifndef _INTERCEPTORS_IDL
#define _INTERCEPTORS_IDL
#pragma prefix "beasys.com"
module Interceptors
{
native ExceptionValue;
local Interceptor
{
readonly attribute string id; // identifier of interceptor
// called by ORB when interceptor is being shutdown
ShutdownReturnStatus shutdown(
in ShutdownReason reason,
out ExceptionValue excep_val
);
}; // locality constrained
};
#endif /* _INTERCEPTORS_IDL */
オペレーション
_duplicate、
_narrow、および
_nilの実装は、Oracle Tuxedo製品のCORBA ORBによって提供される
CORBA::LocalBaseインタフェースの実装から継承されます。
リスト7-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,// proceed normally
REPLY_NO_EXCEPTION, // stop proceeding; start reply processing
REPLY_EXCEPTION // stop proceeding; reply with exception
};
enum ResponseReturnStatus
{
RESPONSE_NO_EXCEPTION, // proceed normally
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;
//+
// Abstract base interface for all Interceptors
//-
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 */
ベンダーによって割り当てられたインターセプタのIDを文字列値として取得します。
virtual CORBA::String id() = 0;
idアクセサ・オペレーションは、ベンダーによって割り当てられたインターセプタのIDを文字列値として取得するためにORBによって使用されます。この属性は、主にORBによって呼び出されたインターセプタのオペレーションのデバッグとトレーシングに使用されます。
このオペレーションは、インターセプタの実装の提供者によって割り当てられたIDを含む、nullで終了する文字列へのポインタを返します。
インターセプタの実装に、インターセプタが停止されていることを通知します。
virtual ShutdownReturnStatus
shutdown( ShutdownReason reason,
CORBA::Exception_ptr & excep_val) = 0;
インターセプタが停止されている理由を示す
ShutdownReason値です。次の
ShutdownReason値を、オペレーションに渡すことができます。
|
|
|
|
|
プロセスのリソースが限界まで消費されたことを示します。
|
|
この例外はOracle Tuxedo 8.0では報告されません。
|
ExceptionValueへのリファレンスです。発生した例外はすべて、オペレーションによってこのパラメータに格納されます。このパラメータは、オペレーションから
SHUTDOWN_EXCEPTIONの値が返された場合のみ有効です。
ExceptionValueは、クラス
CORBA::Exceptionにマッピングされます。
shutdownオペレーションは、インターセプタの実装に、インターセプタが停止中であることを通知するために、ORBによって使用されます。ORBは、オペレーションからORBに制御が返されると、インターセプタのインスタンスを破棄します。
オペレーションが例外を発生していないことを示します。
オペレーションが例外を発生していることを示します。例外の値は、
excep_valパラメータに格納されます。
RequestLevelInterceptor::
RequestInterceptorインタフェース
RequestLevelInterceptor::RequestInterceptorインタフェースは、すべてのリクエスト・レベルのインターセプタの基本インタフェースです。これは
Interceptors::Interceptorインタフェースから直接継承されます。
RequestLevelInterceptor::RequestInterceptorインタフェースの特長は次のとおりです。
•
|
すべてのリクエスト・レベルのインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。
|
•
|
抽象インタフェースとして定義されるため、このインタフェースのインスタンスはインスタンス化できません。
|
OMG IDLによる
localキーワードは、
RequestInterceptorインタフェースが通常のCORBAオブジェクトではなく、したがってそのようには使用できないことを示します。
リスト7-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の実装を提供します。
リスト7-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&) { }
}; // class RequestInterceptor
#endif /* _RequestLevelInterceptor_h */
リクエストが処理されるコンテキストを表す情報が格納されます。
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);
};
形式とメンバーを示すRequestContextのバージョン表示です。バージョン情報は、次の2つの部分に分かれます。
|
|
|
メジャー・バージョン値を示します。このメンバーの値は、旧バージョンとの後方互換性のない変更が RequestContextの内容やレイアウトに加えられた場合にインクリメントされます。
|
|
マイナー・バージョン値を示します。このメンバーの値は、旧バージョンと後方互換性のある変更が RequestContextの内容やレイアウトに加えられた場合にインクリメントされます。
|
初期化ORBによってリクエストに割り当てられた識別子を指定する、unsigned long型の値です。
response_flagsの最下位ビットは、この要求に対して応答メッセージが返される場合は1に設定します
オペレーションが
onewayと定義されておらず、リクエストが
INV_NO_RESPONSEフラグを設定されたDIIを介して呼び出されるのではない場合、
response_flagsは
\x03に設定します。
オペレーションがonewayと定義されているか、またはリクエストが
INV_NO_RESPONSEフラグを設定されたDIIを介して呼び出されている場合、
response_flagsは
\x00または
\x01に設定できます。
このフラグが
onewayオペレーションについて
\x01に設定されている場合、応答の受け取りは必ずしもオペレーションの完了を意味しません。
呼出しのターゲットであるオブジェクトを識別するための、区別子を利用したユニオンです。区別子は、ターゲットのアドレス指定が提示される形式を示します。想定されている区別子の値は、次のとおりです。
|
|
|
トランスポート固有のGIOPプロファイル(たとえばターゲット・オブジェクト用IORのカプセル化されたIIOPプロファイル)からの object_keyフィールドです。この値はサーバーに対してのみ意味を持ち、クライアントでは解釈も変更もされません。
|
|
クライアントORBによって、ターゲットのIOR用に選択されたトランスポート固有のGIOPプロファイルです。
注意:
|
Oracle Tuxedo 8.0製品では、この区別子の値はサポートされていませんが、将来GIOP 1.2をサポートする場合に備えて提供されています。
|
|
|
ターゲット・オブジェクトの完全なIORです。 selected_profile_indexは、クライアントORBによって選択されたトランスポート固有のGIOPプロファイルを示します。
注意:
|
Oracle Tuxedo 8.0製品では、この区別子の値はサポートされていませんが、将来GIOP 1.2をサポートする場合に備えて提供されています。
|
|
オブジェクトのインタフェースに割り当てられるリポジトリ識別子を指定する、NULLで終了する文字列です。
ターゲット・メンバーによって示されるターゲット・オブジェクトに対してリクエストされているオペレーションの名前を指定し、
interface_idメンバーの値によって指定されるインタフェースをサポートする、NULLで終了する文字列です。
RequestContextデータ・オブジェクトには、リクエストが処理されるコンテキストを表す情報が格納されます。
RequestContextに含まれるコンテキスト情報は、所定のリクエストの処理と、対応する応答の間で調整を行うのに必要な情報を提供します。
RequestContext構造体のコンテキスト情報は、インターセプタの実装では変更できません。ORBは
RequestContextの所有権を維持し、
RequestContextが関連リソースの使用を終えると、それを解放する役割を果たします。
応答が処理されるコンテキストを表す情報が格納されます。
struct ReplyContext
{
Interceptors::Version struct_version;
CORBA::ULong request_id;
ReplyStatus reply_status;
};
形式とメンバーを示す
ReplyContextのバージョン表示です。バージョン情報は、次の2つの部分に分かれます。
|
|
|
メジャー・バージョン値を示します。このメンバーの値は、旧バージョンとの後方互換性のない変更が ReplyContextの内容やレイアウトに加えられた場合に増加します。
|
|
マイナー・バージョン値を示します。このメンバーの値は、旧バージョンと後方互換性のある変更が ReplyContextの内容やレイアウトに加えられた場合に増加します。
|
初期化ORBによってリクエストに割り当てられた識別子を指定する、unsigned long型の値です。
関連付けられているリクエストの完了ステータスを示します。また、応答本文の内容の一部を決定します。
|
|
|
リクエストされたオペレーションが正常に完了したことと、 arg_streamパラメータの値にオペレーションの戻り値が含まれていることを示します。
|
|
ターゲット・オブジェクトによって報告された例外のために、リクエストされたオペレーションが失敗したことを示します。
|
|
ターゲット・オブジェクトまたはインフラストラクチャによって報告された例外のために、リクエストされたオペレーションが失敗したことを示します。
|
|
本文にオブジェクト参照(IOR)が含まれていることを示します。クライアントORBの役割は、元のリクエストを、その別のオブジェクトに再送信することです。この再送信は、リクエストを行うクライアント・プログラムにとっては透過的に行われますが、インターセプタに対しては透過的ではありません。
|
|
本文にオブジェクト参照が含まれていることを示します。使い方は LOCATION_FORWARDの場合と同様ですが、サーバーによって使用される場合、この値はクライアントに対して、古いIORが新しいIORで置換され得ることをも示します。新旧のIORはどちらも有効ですが、将来の使用を考えると、新しいIORのほうが有利です。この再送信は、リクエストを行うクライアント・プログラムにとっては透過的に行われますが、インターセプタに対しては透過的ではありません。
|
|
本文に GIOP::AddressingDispositionが含まれることを示します。クライアントORBの役割は、リクエストされたアドレス指定モードで元のリクエストを再送信することです。この再送信は、リクエストを行うクライアント・プログラムにとっては透過的に行われますが、インターセプタに対しては透過的ではありません。
|
ReplyContextデータ・オブジェクトには、応答が処理されるコンテキストを表す情報が格納されます。
ReplyContextに含まれるコンテキスト情報は、所定のリクエストの処理と対応する応答の間で調整を行うのに必要な情報を提供します。
ReplyContextのコンテキスト情報は、インターセプタの実装では変更できません。ORBは
ReplyContextの所有権を維持し、
ReplyContextが関連リソースの使用を終えると、それを解放する役割を果たします。
RequestInterceptor::exception_occurred
ORBによって呼び出されて、あるリクエストに固有の、インターセプタが管理していたと考えられる一切の状態を、そのインターセプタがクリーンアップすることを許可します。
virtual void
exception_occurred( const ReplyContext & reply_context,
CORBA::Exception_ptr excep_val) = 0;
応答が行われているコンテキストについての情報が含まれた
ReplyContextへのリファレンスです。
ORBまたはほかのインターセプタによって報告された例外へのポインタです。
次の3つのうちいずれかの場合、リクエスト・レベルのインターセプタ実装の
exception_occurredオペレーションが呼び出されます。
1.
|
例外がORBまたはメソッドで生成されたのではなく、別のインターセプタによって設定された場合。
|
2.
|
ORBがオペレーティング・システムまたは通信関連の問題を検出した場合。
|
3.
|
クライアントが、遅延同期DIIの初期化に使用された Requestオブジェクトを削除した場合。そのインターセプタの client_responseまたは target_responseメソッドのかわりに、 exception_occurredメソッドが呼び出されます。ORBが exception_occurredメソッドを呼び出すことにより、インターセプタの実装は、管理していたと考えられる、あるリクエストに固有の一切の状態を、クリーンアップできるようになります。
|
RequestLevelInterceptor::
ClientRequestInterceptorインタフェース
すべてのリクエスト・レベルのインターセプタの基本インタフェースです。これは
RequestLevelInterceptor::RequestInterceptorインタフェースから直接継承されます。このインタフェースには、クライアント側のすべてのリクエスト・レベルのインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。
//File: 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の実装は、Oracle Tuxedo製品内のCORBA ORBによって提供される、
CORBA::LocalBaseインタフェースの実装から間接的に継承されます。
#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&) { }
}; // class ClientRequestInterceptor
};
#endif /* _RequestLevelInterceptor_h */
ClientRequestInterceptor::client_invoke
クライアント・アプリケーションがターゲット・オブジェクトに呼出しを送信するときには必ず、クライアント側ORBによって呼び出されます。
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;
リクエストが行われているコンテキストについての情報が含まれたRequestContextへのリファレンスです。
ターゲット・オブジェクトへのリクエストの一部として送信される、サービス・コンテキスト情報が含まれた
ServiceContextListへのポインタです。
注意: Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。
インターセプタの実装が、オペレーションのパラメータ値の取得に使用できる、
DataInputStreamへのポインタです。
DataInputStreamには、すべての
inパラメータおよび
inoutパラメータが、オペレーションのIDL定義で指定された順序で左から右へ配列されて含まれます。nilの
DataInputStreamは、引数が存在しないことを示します。
呼出しのイニシエータに、応答として返されるパラメータを挿入するのに使用可能な、
CORBA::DataOutputStreamへのポインタです。このパラメータの使用は、
REPLY_NO_EXCEPTIONのステータスが返された場合のみ有効です。
注意: Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、
REPLY_EXCEPTIONのステータスが返された場合のみ有効です。ORBが、
excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。
client_invokeオペレーションは、
RequestLevelInterceptor::ClientRequestInterceptorインターセプタのインタフェースをサポートするインターセプタの実装に対して呼び出されます。このオペレーションは、ターゲット・オブジェクトが異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼出しがターゲット・オブジェクトに送信されるとORBによって呼び出されます。
インターセプタが要求された処理をすべて正常に実行済であり、ORBは呼出しの処理を続行して、ターゲット・オブジェクトに送信すべきであることを示します。
インターセプタがリクエストを完全に満たすために必要なすべての処理を正常に実行済であることを示します。ORBは、完了されたリクエストを検討し、
reply_arg_streamに含まれる情報があれば、それをそのリクエストの戻りパラメータ値として、処理し始めなければなりません。
注意: Oracle Tuxedo 8.0では、インターセプタがこのステータス値を返すことはできません。
インターセプタがエラーに遭遇したため、ターゲットへのリクエストの処理が中断することを示します。ORBに例外を報告するのに、パラメータ
excep_valが使用されます。ORBは、クライアント・アプリケーションに戻る過程でのインターセプタの呼出しを、
client_responseオペレーションではなく、
exception_occurredオペレーションで行います。ORBが、
excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。
ClientRequestInterceptor::client_response
RequestLevelInterceptor::ClientRequestInterceptorインタフェースをサポートするインターセプタの実装に対して呼び出されます。
virtual Interceptors::ResponseReturnStatus
client_response(
const ReplyContext & reply_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
応答が行われているコンテキストについての情報が含まれた
ReplyContextへのリファレンスです。
ターゲット・オブジェクトによるリクエスト処理の結果として受信される、サービス・コンテキスト情報が含まれた
ServiceContextListへのポインタです。
注意: Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。
インターセプタの実装がオペレーションの応答パラメータ値の取得に使用できる、
DataInputStreamへのポインタです。
次の表は、
ReplyContextオブジェクトに含まれるステータスに基づいて
DataInputStreamオブジェクトに
client_responseメソッドが返す値を特定したものです。
|
|
LOCATION_FORWARD、 LOCATION_FORWARD_PERM、または NEEDS_ADDRESSING_MODE
|
nilの DataInputStreamが指定されます。
|
|
DataInputStreamには、まず任意のオペレーション戻り値、次に inoutパラメータと outパラメータが、左から右へ、オペレーションのIDL定義に登場する順に含まれます。nilの DataInputStreamは、引数が存在しないことを示します。
|
USER_EXCEPTIONまたは SYSTEM_EXCEPTION
|
DataInputStreamには、オペレーションによって発生した例外が含まれます。
|
注意:例外には、文字列と、その後に続く任意の例外メンバーが含まれます。文字列には、例外のリポジトリIDが含まれます。例外メンバーは、structと同じように渡されます。システム例外には、2つのunsigned long型メンバー、マイナー・コード、および完了ステータスが含まれます。
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、
REPLY_EXCEPTIONのステータスが返された場合のみ有効です。ORBが、
excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。
client_responseオペレーションは、
RequestLevelInterceptor::ClientRequestInterceptorインタフェースをサポートするインターセプタの実装に対して呼び出されます。このオペレーションは、イニシエータがターゲット・オブジェクトと異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼出しへの応答がリクエストのイニシエータによって受信されるとORBによって呼び出されます。
インターセプタがリクエストされた処理をすべて正常に実行済であり、ORBはリクエストに対する応答の処理を続行して、リクエストのイニシエータに送信すべきであることを示します。
インターセプタがエラーに遭遇したことを示します。ORBに例外を報告するのに、パラメータ
excep_valが使用されます。クライアントに戻る過程でまだ呼び出されていないインターセプタはすべて、
exception_occurredオペレーションをORBによって呼び出されて、リクエストの処理が失敗したことを通知されます。
RequestLevelInterceptor::
TargetRequestInterceptorインタフェース
すべてのリクエスト・レベルのインターセプタの基本インタフェースです。これは
RequestLevelInterceptor::RequestInterceptorインタフェースから直接継承されます。このインタフェースには、ターゲット・サイドのすべてのリクエスト・レベルのインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。
//File: 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の実装は、Oracle Tuxedo製品内のCORBA ORBによって提供される、
CORBA::LocalBaseインタフェースの実装から間接的に継承されます。
#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&) { }
}; // class TargetRequestInterceptor
};
#endif /* _RequestLevelInterceptor_h */
TargetRequestInterceptor::target_invoke
ターゲット・オブジェクトで呼出しが受信されると、ターゲット・サイドORBによって呼び出されます。
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;
リクエストが行われているコンテキストについての情報が含まれた
RequestContextへのリファレンスです。
ターゲット・オブジェクトへのリクエストの一部として受信される、サービス・コンテキスト情報が含まれた
ServiceContextListへのポインタです。
Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。
インターセプタの実装が、オペレーションのパラメータ値の取得に使用できる、
DataInputStreamへのポインタです。
DataInputStreamには、すべての
inパラメータおよび
inoutパラメータが、オペレーションのIDL定義で指定された順序で左から右へ配列されて含まれます。nilの
DataInputStreamは、引数が存在しないことを示します。
呼出しのイニシエータに、応答として返されるパラメータを挿入するのに使用可能な、
DataOutputStreamへのポインタです。このパラメータの使用は、
REPLY_NO_EXCEPTIONのステータスが返された場合のみ有効です。
Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、
REPLY_EXCEPTIONのステータスが返された場合のみ有効です。ORBが、
excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。
target_invokeオペレーションは、
RequestLevelInterceptor::TargetRequestInterceptorインタフェースをサポートするインターセプタの実装に対して呼び出されます。このオペレーションは、ターゲット・オブジェクトが異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼出しがターゲット・オブジェクトによって受信されるとORBによって呼び出されます。
インターセプタが要求された処理をすべて正常に実行済であり、ORBは呼出しの処理を続行して、ターゲット・オブジェクトに送信すべきであることを示します。
インターセプタがリクエストを完全に満たすために必要なすべての処理を正常に実行済であることを示します。ORBは、完了されたリクエストを検討し、
reply_arg_streamに含まれる情報があれば、それをそのリクエストの戻りパラメータ値として、処理し始めなければなりません。
注意: Oracle Tuxedo 8.0では、インターセプタがこのステータス値を返すことはできません。
インターセプタがエラーに遭遇したため、それによりリクエストをターゲット・オブジェクトに送信するための処理が中断することを示します。ORBに例外を報告するのに、パラメータ
excep_valが使用されます。ORBは、クライアントに戻る過程でのインターセプタの呼出しを、
target_responseオペレーションではなく、
exception_occurredオペレーションで行います。ORBが、
excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。
TargetRequestInterceptor::target_response
呼出しに対する応答が呼出しのイニシエータに送信されると、ターゲット・サイドORBによって呼び出されます。
virtual Interceptors::ResponseReturnStatus
target_response(
const ReplyContext & reply_context,
ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val ) = 0;
応答が行われているコンテキストについての情報が含まれた
ReplyContextへのリファレンスです。
ターゲット・オブジェクトによるリクエスト処理の結果として送信される、サービス・コンテキスト情報が含まれた
ServiceContextListへのポインタです。
注意: Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。
インターセプタの実装がオペレーションの応答パラメータ値の取得に使用できる、
DataInputStreamへのポインタです。
次の表は、
ReplyContextオブジェクトに含まれるステータスに基づいて
DataInputStreamオブジェクトに
target_responseメソッドが返す値を特定したものです。
|
|
LOCATION_FORWARD、 LOCATION_FORWARD_PERM、または NEEDS_ADDRESSING_MODE
|
nilの DataInputStreamが指定されます。
|
|
DataInputStreamには、まず任意のオペレーション戻り値、次に inoutパラメータと outパラメータが、左から右へ、オペレーションのIDL定義に登場する順に含まれます。nilの DataInputStreamは、引数が存在しないことを示します。
|
USER_EXCEPTIONまたは SYSTEM_EXCEPTION
|
DataInputStreamには、オペレーションによって発生した例外が含まれます。
|
注意:例外には、文字列と、その後に続く任意の例外メンバーが含まれます。文字列には、例外のリポジトリIDが含まれます。例外メンバーは、
structと同じように渡されます。システム例外には、2つのunsigned long型メンバー、マイナー・コード、および完了ステータスが含まれます。
エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、
REPLY_EXCEPTIONのステータスが返された場合のみ有効です。ORBが、
excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。
target_responseオペレーションは、
RequestLevelInterceptor::TargetRequestInterceptorインタフェースをサポートするインターセプタの実装に対して呼び出されます。このオペレーションは、イニシエータがターゲット・オブジェクトと異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼出しへの応答がリクエストのイニシエータに送信されると、ターゲット・サイドORBによって呼び出されます。
インターセプタがリクエストされた処理をすべて正常に実行済であり、ORBはリクエストに対する応答の処理を続行して、リクエストのイニシエータに送信すべきであることを示します。
インターセプタがエラーに遭遇したことを示します。ORBに例外を報告するのに、パラメータ
excep_valが使用されます。クライアントに戻る過程でまだ呼び出されていないインターセプタはすべて、
exception_occurredオペレーションをORBによって呼び出されて、リクエストの処理が失敗したことを通知されます。ORBが、
excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。
AppRequestInterceptorInit
クライアント側およびターゲット・サイドのインターセプタをインスタンス化および初期化します。
typedef void (*AppRequestInterceptorInit)(
CORBA::ORB_ptr TheORB,
RequestLevelInterceptor::ClientRequestInterceptor ** ClientPtr,
RequestLevelInterceptor::TargetRequestInterceptor ** TargetPtr,
CORBA::Boolean * RetStatus);
インターセプタの実装が関連付けられたORBオブジェクトへのポインタです。
ORBで使用するためにインスタンス化された
RequestLevelInterceptor::ClientRequestInterceptorのインスタンスへのポインタが返される、ポインタです。
ORBで使用するためにインスタンス化された
RequestLevelInterceptor::TargetRequestInterceptorのインスタンスへのポインタが返される、ポインタです。
インターセプタのインスタンス化と初期化が正常に実行されたかどうかが、インターセプタの実装によって示される、場所へのポインタです。
CORBA::TRUEの値は、インターセプタのインスタンス化と初期化が正常に実行されたことを示すために使用されます。
CORBA::FALSEの値は、インターセプタのインスタンス化と初期化が、何らかの理由により正常に実行されなかったことを示すために使用されます。
AppRequestInterceptorInit関数は、クライアント側およびターゲット・サイドのインターセプタをインスタンス化および初期化するためにORBによって使用される、ユーザー指定の関数です。
CORBA::DataInputStreamインタフェース
DataInputStreamに適用される、IDL中の
abstract valuetypeキーワードは、それがインタフェースと同じでないことを示します。
module CORBA {
//... all the rest
// Definitions used by 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 - for reading data from the stream
abstract valuetype DataInputStream
{
any read_any(); // Raises 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);
// Raises 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インタフェースには、ユーザーの関心の対象となるものはありません。
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 (); // Raises 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);
// Raises 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>
<primitive> read_<
primitive>();
DataInputStreamからプリミティブ要素(
<primitive>)を読み取るためのオペレーションはすべて、同じ形式です。各オペレーションは、ストリームから値を戻します。
注意:
|
メモリー管理には、 String_var、 TypeCode_varまたは Object_varを使用できます。これらを使用しない場合は、CORBAオブジェクトの string_free()オペレーションによって文字列を解放し、CORBAオブジェクトの release()オペレーションによって TypeCodeまたは Objectポインタを解放する必要があります。
|
AnySeq (Not implemented)
BooleanSeq
CharSeq
OctetSeq
ShortSeq
UshortSeq
LongSeq
UlongSeq
FloatSeq
DoubleSeq
DataInputStream::read_array_<
primitive>
ストリームから
CORBAシーケンスにプリミティブ値の配列を返します。
void read_array_<
primitive>(
<primitive>Seq & seq,
ULong offset,
ULong length);
読み込まれた配列要素を受信する、適切な型のシーケンスです。
このシーケンスに、追加の要素を格納できるだけの長さがない場合、この長さは合計値offset + lengthに設定されます。(長さは、下方調整されることはありません。)
要素を読み込むための、配列へのオフセットです。つまり、配列は、配列索引offsetから配列索引offset + length - 1までの新しい要素を持つようになります。
DataInputStreamからプリミティブ要素(
<primitive>)の配列を読み取るためのオペレーションはすべて、同じ形式です。各オペレーションは、ストリームから、同じプリミティブ型の
CORBAシーケンスに、プリミティブ値の配列を戻します。
AnySeq (Not implemented)
BooleanSeq
CharSeq
OctetSeq
ShortSeq
UshortSeq
LongSeq
UlongSeq
FloatSeq
DoubleSeq