BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   CORBA 要求レベルのインターセプタ   |   前へ   |   次へ   |   目次   |   索引

要求レベルのインターセプタの API

 

この章では、要求レベルのインターセプタのインプリメントに使用する次のインターフェイスについて説明します。

これらのインターフェイスは、位置制約付きオブジェクトです。リファレンスをその位置 (プロセス) の外部に渡そうとしたり、CORBA ORB object_to_string オペレーションを使用して、このインターフェイスをサポートしているオブジェクトを外部化しようとしたりすると、CORBA MARSHAL システム例外 (CORBA::MARSHAL) が発生します。

 


インターセプタの階層構造

要求レベルのインターセプタは、2 つのインターフェイスに分かれており、クライアント側とターゲット側で別個に機能します。次の図では、BEA Tuxedo 製品でサポートしている要求レベルのインターセプタの継承の階層構造を示します。


 

未使用インターフェイスについての注意事項

RequestLevelInterceptor インターフェイスから派生したクラスのオペレーションのメソッド・シグニチャには、次のインターフェイスのパラメータが含まれます。

これらのインターフェイスは 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_SHUTDOWN

ORB がシャットダウンされていることを示します。

RESOURCES_EXCEEDED

プロセスのリソースが限界まで消費されたことを示します。

CONNECTION_ABORTED

この例外は 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 つの部分に分かれます。

バージョン・メンバ

説明

major_version

メジャー・バージョン値を示します。このメンバの値は、旧バージョンとの下位互換性のない変更が RequestContext の内容やレイアウトに加えられた場合に増分されます。

minor_version

マイナー・バージョン値を示します。このメンバの値は、旧バージョンと下位互換性のある変更が RequestContext の内容やレイアウトに加えられた場合に増分されます。


 

request_id

初期化 ORB によって要求に割り当てられた識別子を指定する、unsigned long 型の値です。

response_flags

response_flags の最下位ビットは、この要求に対して応答メッセージが返される場合は 1 に設定します。 オペレーションが oneway と定義されておらず、要求が INV_NO_RESPONSE フラグを設定された DII を介して呼び出されるのではない場合、response_flags \x03 に設定します。

オペレーションが oneway と定義されているか、または要求が INV_NO_RESPONSE フラグを設定された DII を介して呼び出されている場合、response_flags\x00 または \x01 に設定できます。

このフラグが oneway オペレーションについて \x01 に設定されている場合、応答の受け取りは必ずしもオペレーションの完了を意味しません。

target

呼び出しのターゲットであるオブジェクトを識別するための、区別子を利用した共用体です。区別子は、ターゲットのアドレス指定が提示される形式を示します。想定されている区別子の値は、次のとおりです。

区別子

説明

KeyAddr

トランスポート固有の GIOP プロファイル (たとえばターゲット・オブジェクト用 IOR のカプセル化された IIOP プロファイル) からの object_key フィールドです。この値はサーバに対してのみ意味を持ち、クライアント側では解釈も変更もされません。

ProfileAddr

クライアント ORB によって、ターゲットの IOR 用に選択されたトランスポート固有の GIOP プロファイルです。

注記 BEA Tuxedo 8.0 製品では、この区別子の値はサポートされていませんが、将来 GIOP 1.2 をサポートする場合に備えて提供されています。

ReferenceAddr

ターゲット・オブジェクトの完全な IOR です。selected_profile_index は、クライアント ORB によって選択されたトランスポート固有の GIOP プロファイルを示します。

注記 BEA Tuxedo 8.0 製品では、この区別子の値はサポートされていませんが、将来 GIOP 1.2 をサポートする場合に備えて提供されています。


 

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 つの部分に分かれます。

バージョン・メンバ

説明

major_version

メジャー・バージョン値を示します。このメンバの値は、旧バージョンとの下位互換性のない変更が ReplyContext の内容やレイアウトに加えられた場合に増加します。

minor_version

マイナー・バージョン値を示します。このメンバの値は、旧バージョンと下位互換性のある変更が ReplyContext の内容やレイアウトに加えられた場合に増加します。


 

request_id

初期化 ORB によって要求に割り当てられた識別子を指定する、unsigned long 型の値です。

reply_status

関連の要求の完了ステータスを示します。また、応答本文の内容の一部を決定します。

ステータス値

説明

NO_EXCEPTION

要求されたオペレーションが正常に完了したことと、arg_stream パラメータの値にオペレーションの戻り値が含まれていることを示します。

USER_EXCEPTION

ターゲット・オブジェクトによって報告された例外のために、要求されたオペレーションが失敗したことを示します。

SYSTEM_EXCEPTION

ターゲット・オブジェクトまたはインフラストラクチャによって報告された例外のために、要求されたオペレーションが失敗したことを示します。

LOCATION_FORWARD

本文にオブジェクト・リファレンス (IOR) が含まれていることを示します。クライアント ORB の役割は、元の要求を、その別の要求に再送信することです。この再送信は、要求を行うクライアント・プログラムにとっては透過的に行われますが、インターセプタに対しては透過的ではありません。

LOCATION_FORWARD_PERM

本文にオブジェクト・リファレンスが含まれていることを示します。使い方は LOCATION_FORWARD の場合と同様ですが、サーバによって使用される場合、この値はクライアントに対して、古い IOR が新しい IOR で置換され得ることをも示します。新旧の IOR はどちらも有効ですが、将来の使用を考えると、新しい IOR のほうが有利です。この再送信は、要求を行うクライアント・プログラムにとっては透過的に行われますが、インターセプタに対しては透過的ではありません。

NEEDS_ADDRESSING_MODE

本文に GIOP::AddressingDisposition が含まれることを示します。クライアント ORB の役割は、要求されたアドレス指定モードで元の要求を再送信することです。この再送信は、要求を行うクライアント・プログラムにとっては透過的に行われますが、インターセプタに対しては透過的ではありません。


 

説明

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 オペレーションが呼び出されます。

  1. 例外が ORB またはメソッドで生成されたのではなく、別のインターセプタ によって設定された場合。

  2. ORB がオペレーティング・システムまたは通信関連の問題を検出した場合。

  3. クライアントが、遅延同期 DII の初期化に使用された 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 メソッドが返す値を特定したものです。

ステータス値

説明

LOCATION_FORWARDLOCATION_FORWARD_PERM、またはNEEDS_ADDRESSING_MODE

ニルの DataInputStream が指定されます。

NO_EXCEPTION

DataInputStream には、まず任意のオペレーション戻り値、次に inout パラメータと out パラメータが、左から右へ、オペレーションの IDL 定義に登場する順に含まれます。ニルの DataInputStream は、引数が存在しないことを示します。

USER_EXCEPTION または SYSTEM_EXCEPTION

DataInputStream には、オペレーションによって発生した例外が含まれます。


 

注記 例外には、文字列と、その後に続く任意の例外メンバが含まれます。文字列には、例外のリポジトリ 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 メソッドが返す値を特定したものです。

ステータス値

説明

LOCATION_FORWARDLOCATION_FORWARD_PERM、またはNEEDS_ADDRESSING_MODE

nil の DataInputStream が指定されます。

NO_EXCEPTION

DataInputStream には、まず任意のオペレーション戻り値、次に inout パラメータと out パラメータが、左から右へ、オペレーションの IDL 定義に登場する順に含まれます。ニルの DataInputStream は、引数が存在しないことを示します。

USER_EXCEPTION または SYSTEM_EXCEPTION

DataInputStream には、オペレーションによって発生した例外が含まれます。


 

注記 例外には、文字列と、その後に続く任意の例外メンバが含まれます。文字列には、例外のリポジトリ 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_varTypeCode_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

戻り値

特にありません。

 

back to top previous page next page