CORBAリクエスト・レベルのインターセプタの使用

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

リクエスト・レベルのインターセプタのAPI

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

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

 


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

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

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

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

これらのインタフェースはOracle Tuxedo製品では使用しません。しかしOracle Tuxedo製品では、将来のリリースでこれらのインタフェースの実装が提供されたときにCORBAアプリケーションを再コンパイルしなくてよいように、これらを定義してあります。ORBは常に実際の引数に対するnilオブジェクトを渡します。この引数を使用しようとしないでください。プロセスが深刻なエラーにより停止する可能性があります。

 


Interceptors::Interceptorインタフェース

Interceptors::Interceptorインタフェースは、リクエスト・レベルのインターセプタをはじめとする、すべての種類のインターセプタの基本インタフェースとして定義されます。このインタフェースには、全種類のインターセプタでサポートされる、オペレーションおよび属性のセットが含まれます。Interceptors::Interceptorインタフェースは、抽象インタフェースとして定義されるため、インタフェースのインスタンスはインスタンス化できません。

リスト8-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インタフェースの実装から継承されます。

リスト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,// 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 */

 


Interceptor::id

概要

ベンダーによって割り当てられたインターセプタのIDを文字列値として取得します。

C++マッピング

virtual CORBA::String id() = 0;

パラメータ

なし。

例外

なし。

説明

idアクセサ・オペレーションは、ベンダーによって割り当てられたインターセプタのIDを文字列値として取得するためにORBによって使用されます。この属性は、主にORBによって呼び出されたインターセプタのオペレーションのデバッグとトレーシングに使用されます。

戻り値

このオペレーションは、インターセプタの実装の提供者によって割り当てられたIDを含む、nullで終了する文字列へのポインタを返します。

 


Interceptor::shutdown

概要

インターセプタの実装に、インターセプタが停止されていることを通知します。

C++バインド

virtual ShutdownReturnStatus 
shutdown( ShutdownReason reason,
CORBA::Exception_ptr & excep_val) = 0;

パラメータ

reason

インターセプタが停止されている理由を示すShutdownReason値です。次のShutdownReason値を、オペレーションに渡すことができます。

ステータス値
説明
ORB_SHUTDOWN
ORBが停止中であることを示します。
RESOURCES_EXCEEDED
プロセスのリソースが限界まで消費されたことを示します。
CONNECTION_ABORTED
この例外はOracle 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&) { }
      }; // class 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プロファイルです。

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

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

注意: Oracle 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定義
//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インタフェースの実装から間接的に継承されます。

リスト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&) { }
      }; // class 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へのポインタです。
注意: Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。

request_arg_stream

インターセプタの実装が、オペレーションのパラメータ値の取得に使用できる、DataInputStreamへのポインタです。DataInputStreamには、すべてのinパラメータおよびinoutパラメータが、オペレーションのIDL定義で指定された順序で左から右へ配列されて含まれます。nilのDataInputStreamは、引数が存在しないことを示します。

reply_arg_stream

呼出しの開始プロセスに、応答として返されるパラメータを挿入するのに使用可能な、CORBA::DataOutputStreamへのポインタです。このパラメータの使用は、REPLY_NO_EXCEPTIONのステータスが返された場合のみ有効です。
注意: Oracle 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に含まれる情報があれば、それをそのリクエストの戻りパラメータ値として、処理し始めなければなりません。
注意: Oracle 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へのポインタです。 注意: Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。

arg_stream

インターセプタの実装がオペレーションの応答パラメータ値の取得に使用できる、DataInputStreamへのポインタです。
次の表は、ReplyContextオブジェクトに含まれるステータスに基づいてDataInputStreamオブジェクトにclient_responseメソッドが返す値を特定したものです。

ステータス値
説明
LOCATION_FORWARDLOCATION_FORWARD_PERM、またはNEEDS_ADDRESSING_MODE
nilのDataInputStreamが指定されます。
NO_EXCEPTION
DataInputStreamには、まず任意のオペレーション戻り値、次にinoutパラメータとoutパラメータが、左から右へ、オペレーションのIDL定義に登場する順に含まれます。nilの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定義
//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インタフェースの実装から間接的に継承されます。

リスト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&) { }
      }; // class 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へのポインタです。 Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。

request_arg_stream

インターセプタの実装が、オペレーションのパラメータ値の取得に使用できる、DataInputStreamへのポインタです。DataInputStreamには、すべてのinパラメータおよびinoutパラメータが、オペレーションのIDL定義で指定された順序で左から右へ配列されて含まれます。nilのDataInputStreamは、引数が存在しないことを示します。

reply_arg_stream

呼出しの開始プロセスに、応答として返されるパラメータを挿入するのに使用可能な、DataOutputStreamへのポインタです。このパラメータの使用は、REPLY_NO_EXCEPTIONのステータスが返された場合のみ有効です。
Oracle Tuxedo 8.0では、このパラメータの値は常にnilオブジェクトとなります。

excep_val

エラーを報告するためにインターセプタが例外を返すことのできる場所に対するリファレンスです。このパラメータの使用は、REPLY_EXCEPTIONのステータスが返された場合のみ有効です。ORBが、excep_valパラメータのためのメモリー管理の役割を持つことに注意してください。

例外

なし。

説明

target_invokeオペレーションは、RequestLevelInterceptor::TargetRequestInterceptorインタフェースをサポートするインターセプタの実装に対して呼び出されます。このオペレーションは、ターゲット・オブジェクトが異なるアドレス領域にあるか、同じアドレス領域にあるかに関係なく、呼出しがターゲット・オブジェクトによって受信されるとORBによって呼び出されます。

戻り値

INVOKE_NO_EXCEPTION

インターセプタが要求された処理をすべて正常に実行済みであり、ORBは呼出しの処理を続行して、ターゲット・オブジェクトに送信すべきであることを示します。

REPLY_NO_EXCEPTION

インターセプタがリクエストを完全に満たすために必要なすべての処理を正常に実行済みであることを示します。ORBは、完了されたリクエストを検討し、reply_arg_streamに含まれる情報があれば、それをそのリクエストの戻りパラメータ値として、処理し始めなければなりません。
注意: Oracle 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へのポインタです。 注意: Oracle 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定義に登場する順に含まれます。nilの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  {
//... 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インタフェースには、ユーザーの関心の対象となるものはありません。

リスト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 (); // 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>

概要

ストリームから値を返します。

C++バインド

<primitive> read_<primitive>();

パラメータ

なし。

例外

なし。

説明

DataInputStreamからプリミティブ要素(<primitive>)を読み取るためのオペレーションはすべて、同じ形式です。各オペレーションは、ストリームから値を戻します。

注意: メモリー管理には、String_varTypeCode_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シーケンスにプリミティブ値の配列を返します。

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 (Not implemented)
BooleanSeq
CharSeq
OctetSeq
ShortSeq
UshortSeq
LongSeq
UlongSeq
FloatSeq
DoubleSeq

戻り値

なし。


  先頭に戻る       前  次