|               | 
 
この章では、Oracle Tuxedo CORBAインタフェース・リポジトリのインタフェースについて説明します。
| 注: | この章に記載されている情報の大部分は、「Common Object Request Broker: Architecture and Specification, Revision 2.4.2」(2001年2月)の第10章からの引用です。OMG情報は、インタフェース・リポジトリのインタフェースのOracle Tuxedo CORBAでの実装を説明するために、必要に応じて変更されています。OMGの許可を得て使用されています。 | 
| 注: | Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBはTuxedo 8.1で非推奨になり、Tuxedo 9.xではサポートされなくなりました。 Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBのすべてのテキスト・リファレンスや関連するサンプル・コードは、以下の場合にのみ使用してください。 | 
| 注: | サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートまたはドキュメントは提供していません。 | 
Oracle Tuxedo CORBAインタフェース・リポジトリには、Oracle Tuxedoドメイン内で実装されるCORBAオブジェクトのインタフェース記述が含まれています。
インタフェース・リポジトリは、インタフェース・リポジトリのCORBA定義に基づいています。これにより、CORBAで定義されるインタフェースの適切なサブセットが提供されます。つまり、プログラマが利用できるAPIは、「Common Object Request Broker: Architecture and Specification Revision 2.4」での定義に従って実装されます。ただし、すべてのインタフェースがサポートされるわけではありません。一般に、インタフェース・リポジトリからの読取りに必要なインタフェースはサポートされますが、インタフェース・リポジトリへの書込みに必要なインタフェースはサポートされません。また、すべてのTypeCodeインタフェースがサポートされるわけではありません。
インタフェース・リポジトリの管理は、Oracle Tuxedoソフトウェア固有のツールを使用して行われます。システム管理者はこれらのツールを使用して、インタフェース・リポジトリを作成し、Object Management Groupインタフェース定義言語(OMG IDL)で指定された定義を挿入し、インタフェースを削除することができます。加えて、管理者はインタフェース・リポジトリ・サーバーが含まれるようにシステムを構成しなければならない場合があります。インタフェース・リポジトリの管理コマンドについては、『Oracle Tuxedoコマンド・リファレンス』および『Oracle Tuxedoアプリケーションの設定』を参照してください。
いくつかの抽象インタフェースが、インタフェース・リポジトリのほかのオブジェクト用の基底インタフェースとして使用されます。インタフェース・リポジトリ内のオブジェクトを見つけるには、共通の操作のセットを使用します。これらの操作は、この章で説明する抽象インタフェースIRObject、Container、およびContainedで定義されます。インタフェース・リポジトリのオブジェクトはすべてIRObjectインタフェースから継承されます。これは、オブジェクトの実際の型を識別する操作を提供するインタフェースです。コンテナであるオブジェクトは、Containerインタフェースからナビゲーション操作を継承します。ほかのオブジェクトに包含されるオブジェクトは、ナビゲーション操作をContainedインタフェースから継承します。IDLTypeインタフェースは、インタフェース、typedef、および無名の型などOMG IDLの型を表す、すべてのインタフェース・リポジトリ・オブジェクトから継承されます。TypedefDefインタフェースは、名前の付いたすべての非インタフェース型から継承されます。
IRObject、Contained、Container、IDLType、およびTypedefDefインタフェースは、インスタンス化できません。
インタフェース・リポジトリ内の文字列データはすべて、ISO 8859-1文字セットの定義に従ってエンコードされます。
| 注: | Oracle Tuxedoソフトウェアは、インタフェース・リポジトリへの読取り権限のみをサポートしているため、この章ではWriteインタフェースには言及していません。インタフェース・リポジトリに対してWriteインタフェースを使用しようとすると、 CORBA::NO_IMPLEMENT例外が発生します。 | 
インタフェース・リポジトリは、データベースとサーバーという、2つの異なったコンポーネントで構成されています。サーバーは、データベースに対して操作を実行します。
  インタフェース・リポジトリのデータベースは、idl2ir管理コマンドを使用して作成され、追加されます。このコマンドについては、『Oracle Tuxedoコマンド・リファレンス』および『Oracle Tuxedoアプリケーションの設定』を参照してください。プログラマ側からは、インタフェース・リポジトリに対する書込み権限はありません。CORBAで定義されている書込み操作や、読取り専用でない属性に対する設定操作で、サポートされているものはありません。
インタフェース・リポジトリ・データベースの読取り権限は、常にインタフェース・リポジトリ・サーバーから与えられます。つまり、クライアントはサーバーで実行されたメソッドを呼び出すことによって、データからの読取りを行います。「CORBA Common Object Request Broker: Architecture and Specification, Revision 2.4」で定義されている読取り操作については、この章で説明します。
サーバーへのインタフェースは、OMG IDLファイルで定義します。OMG IDLファイルへのアクセス方法は、ビルドされているクライアントの種類に応じて変わります。ここではスタブ・ベースおよび動的起動インタフェース(DII)の2種類のクライアントについて検討します。
スタブ・スタイルの呼出しを使用するクライアント・アプリケーションでは、ビルド時にOMG IDLファイルが必要です。プログラマはOMG IDLファイルを使用して、スタブなどを生成できます。(詳細は、『CORBAクライアント・アプリケーションの作成』を参照してください。)インタフェース・リポジトリに対する、これ以外のアクセスは必要ありません。
  動的起動インタフェース(DII)を使用するクライアント・アプリケーションは、インタフェース・リポジトリにプログラマティックにアクセスする必要があります。インタフェース・リポジトリへのインタフェースはこの章で定義されており、「クライアント・アプリケーションのビルド」に説明があります。インタフェース・リポジトリにアクセスするための正確な手順は、クライアントが特定のオブジェクトに関する情報を検索するのか、またはあるインタフェースを見つけるためにリポジトリを参照するのかによって異なります。クライアントが特定のオブジェクトに関する情報を得るには、CORBA::Object::_get_interfaceメソッドを使用してInterfaceDefオブジェクトを取得します。(このメソッドの説明は、「CORBA::Object::_get_interface」を参照してください。)InterfaceDefオブジェクトを使用して、クライアントはインタフェースに関する完全な情報を取得できます。
DIIクライアントがインタフェース・リポジトリを参照できるようになるには、検索を開始するためのインタフェース・リポジトリのオブジェクト参照を取得する必要があります。
DIIクライアントは、Bootstrapオブジェクトを使用してオブジェクト参照を取得します。(このメソッドについては、「Tobj_Bootstrap::register_callback_port」を参照してください。)クライアントはオブジェクト参照を取得すると、インタフェース・リポジトリ内をルートから参照できるようになります。
クライアント・アプリケーションが関連付けられているドメイン内のインタフェース・リポジトリへのリファレンスを取得するには、クライアント・アプリケーションは次の2つのブートストラップ処理メカニズムのうち、どちらかを使用します。
“CORBA::Repository"の値を持つTobj_Bootstrap::resolve_initial_references操作を呼び出します。この操作は、クライアント・アプリケーションが現在付属しているドメイン内にあるInterfaceRepositoryオブジェクトへのリファレンスを返します。Oracle Tuxedoクライアント・ソフトウェアを使用している場合は、このメカニズムを使用します。詳細は、「Tobj_Bootstrap::resolve_initial_references」を参照してください。“CORBA::Repository"の値を持つCORBA::ORB::resolve_initial_references操作を呼び出します。この操作は、クライアント・アプリケーションが現在付属しているドメイン内にあるInterfaceRepositoryオブジェクトへのリファレンスを返します。サード・パーティ製のクライアントORBを使用している場合は、このメカニズムを使用します。詳細は、「CORBA::ORB::resolve_initial_references」を参照してください。| 注: | DIIを使用するには、OMG IDLファイルがインタフェース・リポジトリ内に格納されている必要があります。 | 
インタフェース・リポジトリへの実行時アクセスはすべて、インタフェース・リポジトリ・サーバーを介して行われます。リモート・サーバー・アプリケーションのリクエストでは、かなりのオーバーヘッドが生じるので、設計者はこの点を認識しておく必要があります。たとえば、オブジェクト参照を使用して、オブジェクト参照に対するDII呼出しを行うのに必要な情報を取得するために要求される対話について以下で考察します。手順は、次のとおりです。
CORBA::Objectの_get_interface操作を呼び出し、問題のオブジェクトに関連付けられたInterfaceDefオブジェクトを取得します。これにより、オブジェクト参照を作成したORBにメッセージが送信されます。is_a操作を呼び出し、このオブジェクトでサポートされているインタフェースの型を判断します。describe_interface操作を呼び出し、そのインタフェースの完全な記述(たとえばバージョン番号、属性、およびパラメータ)を取得します。これにより、インタフェース・リポジトリにメッセージが送信され、応答が返ります。
  インタフェース・リポジトリを使用するクライアントは、インタフェース・リポジトリのスタブ内で、リンクしている必要があります。リンク方法は、ベンダーごとに異なります。クライアント・アプリケーションがOracle Tuxedo ORBを使用している場合、Oracle Tuxedoソフトウェアはスタブをライブラリ形式で提供します。したがって、プログラマはスタブの構築に、インタフェース・リポジトリOMG IDLファイルを使用する必要がありません。インタフェース・リポジトリ定義はCORBA.hファイルにありますが、デフォルトでは包含されていません。 
| 注: | インタフェース・リポジトリ定義を使用するには、クライアント・アプリケーション・コードに CORBA.hを包含する前に、ORB_INCLUDE_REPOSITORYマクロを定義する必要があります(例:#Define ORB_INCLUDE_REPOSITORY)。 | 
クライアント・アプリケーションがサード・パーティ製のORB (たとえばORBIX)を使用している場合、プログラマはそのベンダーが提供しているメカニズムを使用しなければなりません。これには、ベンダーが提供しているIDLコンパイラを使用してOMG IDLファイルからスタブを生成すること、または単にベンダーが提供しているスタブに対するリンクを行うことなどのメカニズムが含まれます。
一部のサード・パーティ製ORBには、ローカル・インタフェース・リポジトリ機能が付属しています。この場合、ローカル・インタフェース・リポジトリはそのベンダーによって提供されたものであり、そのクライアントが必要とするインタフェース定義が追加されています。
InterfaceRepositoryオブジェクトへの初期リファレンスを取得するには、Bootstrapオブジェクトを使用します。Bootstrapオブジェクト・メソッドについては、コマンド「Tobj_Bootstrap::resolve_initial_references」を参照してください。
クライアント・アプリケーションは、インタフェース・リポジトリへのアクセスに、CORBAで定義されたインタフェースを使用します。このセクションでは、Oracle Tuxedoソフトウェアで実装される各インタフェースについて説明します。
| 注: | インタフェース・リポジトリのOracle Tuxedo CORBA実装は、インタフェースに対する読取り操作しかサポートしません。書込み操作は、実装されません。 | 
いくつかの型が、インタフェース・リポジトリのインタフェース定義全体に使用されています。
module CORBA {
    typedef string               Identifier;
    typedef string               ScopedName;
    typedef string               RepositoryId;
    enum DefinitionKind {
       dk_none, dk_all,
       dk_Attribute, dk_Constant, dk_Exception, dk_Interface,
       dk_Module, dk_Operation, dk_Typedef,
       dk_Alias, dk_Struct, dk_Union, dk_Enum,
       dk_Primitive, dk_String, dk_Sequence, dk_Array,
       dk_Repository,
       dk_Wstring, dk_Fixed,
       dk_Value, dk_ValueBox, dk_ValueMember,
       dk_Native
       };
};  Identifiersは、モジュール、インタフェース、値型、値メンバー、値ボックス、定数、typedef、例外、属性、操作、およびネイティブ型を識別する、単純な名前です。ちょうどOMG IDLの識別子に対応します。Identifierは、インタフェース・リポジトリ全体では必ずしも一意ではありません。特定のRepository、ModuleDef、InterfaceDef、ValueDef、またはOperationDef内でのみ、一意です。
  ScopedNameは、ダブル・コロン(::)で区切られた、1つまたは複数の識別子で構成される名前です。OMG IDLのスコープ指定された名前に対応します。絶対ScopedNameとは、先頭にダブル・コロン(::)があり、Repository内で定義を明確に識別するものを言います。Repository内の絶対ScopedNameは、OMG IDLファイルのグローバル名に対応します。相対ScopedNameは、先頭にダブル・コロン(::)がなく、何らかのコンテキストを基準として解決される必要があります。
  RepositoryIdは、モジュール、インタフェース、値型、値メンバー、値ボックス、ネイティブ型、定数、typedef、例外、属性、または操作を一意かつグローバルに識別するために使用される識別子です。RepositoryIdは文字列として定義されるため、言語バインディングの文字列操作ルーチンで操作(たとえばコピーや比較)が可能です。
  DefinitionKindは、インタフェース・リポジトリ・オブジェクトの型を識別します。
次に示す基底インタフェースIRObjectは、最も汎用性の高いインタフェースを表します。ここから、Repository自体を含む、インタフェース・リポジトリのほかのすべてのインタフェースが派正します。
module CORBA {
     interface IRObject {
            readonly attribute DefinitionKind def_kind;
      };
};次に示すContainedインタフェースは、ほかのインタフェース・リポジトリ・オブジェクトに包含されるインタフェース・リポジトリのすべてのインタフェースによって継承されます。ルート・オブジェクト(Repository)と無名定義(ArrayDef、StringDef、SequenceDef)以外の、インタフェース・リポジトリ内のすべてのオブジェクト、およびプリミティブ型が、ほかのオブジェクトに包含されます。
module CORBA {
    typedef string VersionSpec;interface Contained : IRObject {
readonly attribute RepositoryId id;
readonly attribute Identifier name;
readonly attribute VersionSpec version;readonly attribute Container defined_in;
readonly attribute ScopedName absolute_name;
readonly attribute Repository containing_repository;
struct Description {
DefinitionKind kind;
any value;
};
        Description describe ();
        };
};  別のオブジェクトに包含されるオブジェクトには、それをグローバルに識別するid属性と、包含Containerオブジェクト内で一意に識別するname属性が付いています。また、同じ名前を持つ別バージョンのオブジェクトと区別するためのversion属性も付いています。Oracle Tuxedo CORBAインタフェース・リポジトリは、同名オブジェクトの同時包含、または複数バージョンの存在をサポートしていません。
  包含オブジェクトには、それらが定義されるContainerを識別する、defined_in属性も付いています。オブジェクトが包含される理由は、包含するオブジェクト内で定義されるから、または包含するオブジェクトによって継承されるからです。前者の例は、インタフェースがモジュール内で定義される場合などです。後者の例は、あるインタフェースが別のインタフェースから操作を継承したことにより、その操作がそのインタフェース内に包含される場合などです。オブジェクトが継承によって包含された場合は、defined_in属性によって、オブジェクトの継承元であるInterfaceDefまたはValueDefが識別されます。
  absolute_name属性は、包含Repository内でContainedオブジェクトを一意に識別する、絶対ScopedNameです。このオブジェクトのdefined_in属性がRepositoryを参照している場合、文字列「::」と、このオブジェクトのname属性を結合することによって、absolute_nameが形成されます。それ以外の場合、absolute_nameの形成は、このオブジェクトのdefined_in属性によって参照されるオブジェクトのabsolute_name属性、文字列「::」、およびこのオブジェクトのname属性を結合することによって行われます。
   containing_repository属性は、オブジェクトのdefined_in属性に再帰的に従うことによって最終的に到達されるRepositoryを識別します。
  within操作は、オブジェクトを包含するオブジェクトのリストを返します。オブジェクトがインタフェースまたはモジュールである場合は、それを定義するオブジェクトによってのみ包含可能です。その他のオブジェクトは、それを定義するオブジェクトにも、継承するオブジェクトにも、包含可能です。
  describe操作は、インタフェースの情報が包含された構造体を返します。各インタフェースと関連付けられた記述構造体は、インタフェース定義の下に置かれます。返された構造体に記述される定義の種類は、返された構造体と共に提供されます。たとえば、describe操作が属性オブジェクトに対して呼び出されると、kindフィールドにdk_Attributeが包含され、値フィールドにAttributeDescription構造体を含むanyが包含されます。
基底インタフェースContainerは、インタフェース・リポジトリ内に包含の階層構造を形成するために使用されます。Containerは、Containedインタフェースから派生した任意の数のオブジェクトを包含できます。Repositoryを除くContainerはすべて、Containedからも派生します。
module CORBA {
    typedef sequence <Contained> ContainedSeq;    interface Container : IRObject {
       Contained lookup (in ScopedName search_name);
       ContainedSeq contents (
           in DefinitionKind        limit_type,
           in boolean               exclude_inherited
            );
       ContainedSeq lookup_name (
           in Identifier            search_name,
           in long                  levels_to_search,
           in DefinitionKind        limit_type,
           in boolean               exclude_inherited
            );        struct Description {
           Contained                 contained_object;
           DefinitionKind            kind;
           any                       value;
         };
         typedef sequence<Description>  DescriptionSeq;        DescriptionSeq describe_contents (
           in DefinitionKind         limit_type,
           in boolean                exclude_inherited,
           in long                   max_returned_objs
            );
      };
};  lookup操作は、スコープ指定された名前を指定されて、このコンテナと関連する定義を見つけます。名前のスコープ指定には、OMG IDL規則が使用されます。ダブル・コロン(::)が先頭に付く、絶対スコープ指定された名前は、包含Repositoryと関連する定義を見つけます。そのようなオブジェクトが見つからなければ、nilオブジェクト参照が返されます。
  contents操作は、オブジェクトに直接包含または継承されるオブジェクトのリストを返します。この操作は、オブジェクトの階層構造内を移動するのに使用されます。クライアントはこの操作を使用し、Repositoryオブジェクトを先頭に、Repositoryに包含されているすべてのオブジェクト、リポジトリ内のモジュールに包含されているすべてのオブジェクト、特定モジュール内のすべてのインタフェースおよび値型などをリストします。
limit_type
dk_allにlimit_typeが設定されると、すべての型のオブジェクトが返されます。たとえばこれがInterfaceDefであれば、属性、操作、および例外オブジェクトがすべて返されます。limit_typeが特定のインタフェースに設定されると、   その型のオブジェクトのみが返されます。たとえば、limit_typeがdk_Attributeに設定されると、属性オブジェクトのみが返されます。
exclude_inherited
TRUEに設定された継承オブジェクトは、存在したとしても、返されません。FALSEに設定されている場合、継承されたために包含されているオブジェクトも、オブジェクト内で定義されたために包含されているオブジェクトも、すべて返されます。  あるオブジェクトを、特定のオブジェクト内またはそのオブジェクトに包含されているオブジェクト内で名前を指定して見つけるには、lookup_name操作を使用します。describe_contents操作は、contents操作とdescribe操作を組み合わせます。contents操作から返された各オブジェクトについて、そのオブジェクトの記述が返されます。つまり、そのオブジェクトのdescribe操作が呼び出され、その結果が返されます。
  あるオブジェクトを、特定のオブジェクト内またはそのオブジェクトに包含されているオブジェクト内で名前を指定して見つけるには、lookup_name操作を使用します。
search_name
levels_to_search
levels_to_searchを -1に設定すると、現在のオブジェクトと、すべての包含オブジェクトが検索されます。levels_to_searchを1に設定すると、現在のオブジェクトのみが検索されます。0または -1以外の負数としたlevels_to_searchの値の使用は、未定義です。
  describe_contents操作は、contents操作とdescribe操作を組み合わせます。contents操作から返された各オブジェクトについて、そのオブジェクトの記述が返されます。つまり、そのオブジェクトのdescribe操作が呼び出され、その結果が返されます。
max_returned_objs
次に示す基底インタフェースIDLTypeは、OMG IDLの型を表すすべてのインタフェース・リポジトリ・オブジェクトによって継承されます。これは型を記述するTypeCodeへのアクセスを提供し、IDL型定義への参照が必要な場合には常に、ほかのインタフェースの定義に使用されます。
module CORBA {
       interface IDLType : IRObject {
             readonly attribute TypeCode          type;
       };
};  type属性は、IDLTypeから派生したオブジェクトによって定義される型を記述します。
  Repository(以下参照)は、インタフェース・リポジトリへのグローバル・アクセスを提供するインタフェースです。Repositoryオブジェクトには、定数、typedef、例外、インタフェース、値型、値ボックス、ネイティブ型、およびモジュールを含めることができます。これはContainerから継承されるので、nameとidのどちらによっても、任意の定義のルックアップに使用できます(グローバルに定義されているか、モジュールまたはインタフェース内で定義されているかは問いません)。
  Repositoryは、Containerからのみ派生し、Containedからは派生しないので、RepositoryIdが関連付けられることはありません。これはデフォルトでは、Repositoryオブジェクトに直接包含されているModuleDef、InterfaceDef、ValueDef、ValueBoxDef、TypedefDef、ExceptionDef、およびConstantDefの記述構造体におけるdefined_inフィールドに値を割り当てる目的で、RepositoryId “" (空の文字列)を備えていると見なされます。
module CORBA {
       interface Repository : Container {
            Contained lookup_id (in RepositoryId search_id);
            TypeCode get_canonical_typecode(in TypeCode tc);
            PrimitiveDef get_primitive (in PrimitiveKind kind);
       };
};  lookup_id操作は、RepositoryIdを指定して、Repository内のオブジェクトをルックアップする際に使用します。Repositoryにsearch_idの定義が含まれない場合、nilオブジェクト参照が返されます。
  get_canonical_typecode操作は、インタフェース・リポジトリ内のTypeCodeを調べ、すべてのリポジトリのID、名前、およびmember_namesが含まれる同等なTypeCodeを返します。配列およびシーケンスのTypeCodeや以前のORBからのTypeCodeの場合など、最上位のTypeCodeがRepositoryIdを含まない場合、またはターゲット・リポジトリ内に見つからないRepositoryIdを含む場合、元のTypeCodeの各メンバーTypeCodeに対してget_canonical_typecodeを再帰的に呼び出すことによって、新規のTypeCodeが構築されます。
  get_primitive操作は、指定したkind属性を備えたPrimitiveDefへのリファレンスを返します。PrimitiveDefsはすべて不変のものであり、Repositoryによって所有されます。
次に示すModuleDefは、定数、typedef、例外、インタフェース、値型、値ボックス、ネイティブ型、およびその他のモジュール・オブジェクトを包含することができます。
module CORBA {
       interface ModuleDef : Container, Contained {
       };        struct ModuleDescription {
               Identifier          name;
               RepositoryId        id;
               RepositoryId        defined_in;
               VersionSpec         version;
         };};  継承されるModuleDefオブジェクトのdescribe操作は、ModuleDescriptionを返します。
次に示すConstantDefオブジェクトは、名前の付いた定数を定義します。
module CORBA {
       interface ConstantDef : Contained {
              readonly attribute TypeCode      type;
              readonly attribute IDLType       type_def;
              readonly attribute any           value;
       };       struct ConstantDescription {
               Identifier        name;
               RepositoryId      id;
               RepositoryId      defined_in;
               VersionSpec       version;
               TypeCode          type;
               any               value;
       };
};type 
type_def 
value 
describe操作は、ConstantDescriptionを返します。
次に示すTypedefDefは、すべての名前の付いた非オブジェクト型(構造体、ユニオン、列挙、および別名)の基底インタフェースとして使用される、抽象インタフェースです。TypedefDefインタフェースは、プリミティブまたは無名型の定義オブジェクトによっては継承されません。
module CORBA {
      interface TypedefDef : Contained, IDLType {
      };      struct TypeDescription {
             Identifier              name;
             RepositoryId            id;
             RepositoryId            defined_in;
             VersionSpec             version;
             TypeCode                type;
       };
};  継承されるTypedefDefから派生したインタフェースのためのdescribe操作は、TypeDescriptionを返します。
次に示すStructDefは、OMG IDLの構造体定義を表します。これにはstructのメンバーが包含されます。
module CORBA {
       struct StructMember {
              Identifier       name;
              TypeCode         type;
              IDLType          type_def;
       };
       typedef sequence <StructMember> StructMemberSeq;
       interface StructDef : TypedefDef, Container{
               readonly attribute StructMemberSeq      members;
       };
};  members属性には、各構造体メンバーの記述が包含されます。
  継承されるtype属性は、構造体を記述するtk_struct TypeCodeです。
次に示すUnionDefは、OMG IDLのユニオン定義を表します。これにはユニオンのメンバーが包含されます。
module CORBA {
      struct UnionMember {
             Identifier    name;
             any           label;
             TypeCode      type;
             IDLType       type_def;
      };
      typedef sequence <UnionMember> UnionMemberSeq;
      interface UnionDef : TypedefDef, Container {
          readonly   attribute TypeCode    discriminator_type;
          readonly   attribute IDLType     discriminator_type_def;
          readonly   attribute UnionMemberSeq   members;
      };
};discriminator_typeおよびdiscriminator_type_def 
members
discriminator_typeのそれぞれ異なる値です。隣接するメンバーは、同じ名前を持つことができます。同名のメンバー同士は、型も同じである必要があります。octet型で値が0のラベルは、デフォルトのユニオン・メンバーであることを示します。
  継承されるtype属性は、ユニオンを記述するtk_union TypeCodeです。
次に示すEnumDefは、OMG IDLの列挙の定義を表します。
module CORBA {
      typedef sequence <Identifier> EnumMemberSeq;      interface EnumDef : TypedefDef {
             readonly attribute EnumMemberSeq         members;
      };
};members 
  継承されるtype属性は、列挙を記述するtk_enum TypeCodeです。
次に示すAliasDefは、ほかの定義の別名を行うOMG IDLのtypedefを表します。
module CORBA {
      interface AliasDef : TypedefDef {
            readonly attribute IDLType original_type_def;
      };
};original_type_def 
  継承されるtype属性は、別名を記述するtk_alias TypeCodeです。
  次に示すPrimitiveDefは、OMG IDLのプリミティブ型の1つを表します。プリミティブ型には名前が付かないので、このインタフェースはTypedefDefからもContainedからも派生しません。
module CORBA {
  enum PrimitiveKind {
    pk_null, pk_void, pk_short, pk_long, pk_ushort, pk_ulong,
    pk_float, pk_double, pk_boolean, pk_char, pk_octet,
    pk_any, pk_TypeCode, pk_Principal, pk_string, pk_objref,
     pk_longlong, pk_ulonglong, pk_longdouble, pk_wchar, pk_wstring,
    pk_value_base
  };
  interface PrimitiveDef: IDLType {
      readonly attribute PrimitiveKind        kind;
  };
};kind 
pk_nullのPrimitiveDefはありません。種類がpk_stringのPrimitiveDefは、pk_objrefのPrimitiveDefは、OMG IDLのObject型を表します。種類がpk_value_baseのPrimitiveDefは、IDLのValueBase型を表します。
  PrimitiveDefsはすべてRepositoryによって所有されます。これらに対するリファレンスは、Repository::get_primitiveを使用して取得されます。
StringDefは、IDLのバインドされた文字列型を表します。無制限文字列型は、PrimitiveDefとして表されます。文字列型は無名なので、このインタフェースはTypedefDefからもContainedからも派生しません。
module CORBA {
   interface StringDef : IDLType {
        attribute unsigned long bound;
   };
};  bound属性は、文字列内の最大文字数を指定します。0にはできません。 
  継承されるtype属性は、文字列を記述するtk_string TypeCodeです。
WstringDefは、IDLのワイド文字列を表します。バインドされていないワイド文字列型は、PrimitiveDefとして表されます。ワイド文字列型は無名なので、このインタフェースはTypedefDefからもContainedからも派生しません。
module CORBA {
   interface WstringDef : IDLType {
        attribute unsigned long bound;
   };
};  bound属性は、ワイド文字列内のワイド文字の最大数を指定します。0にはできません。 
  継承されるtype属性は、ワイド文字列を記述するtk_wstring TypeCodeです。
次に示すExceptionDefは、例外定義を表します。構造体、ユニオン、およびenumを包含することができます。
module CORBA {
     interface ExceptionDef : Contained, Container {
          readonly   attribute TypeCode              type;
          readonly   attribute StructMemberSeq       members;
     };     struct ExceptionDescription {
          Identifier               name;
          RepositoryId             id;
          RepositoryId             defined_in;
          VersionSpec              version;
          TypeCode                 type;
     };
};type 
members 
  ExceptionDefオブジェクトのdescribe操作は、ExceptionDescriptionを返します。
次に示すAttributeDefは、インタフェースの属性を定義する情報を表します。
module CORBA {
      enum AttributeMode {ATTR_NORMAL, ATTR_READONLY};      interface AttributeDef : Contained {
          readonly       attribute TypeCode          type;
                         attribute IDLType           type_def;
                         attribute AttributeMode     mode;
      };      struct AttributeDescription {
           Identifier         name;
           RepositoryId       id;
           RepositoryId       defined_in;
           VersionSpec        version;
           TypeCode           type;
           AttributeMode      mode;
      };
};type 
type_def 
mode 
  AttributeDefオブジェクトのdescribe操作は、AttributeDescriptionを返します。
次に示すOperationDefは、インタフェースの操作を定義するのに必要な情報を表します。
module CORBA {
      enum OperationMode {OP_NORMAL, OP_ONEWAY};
      enum ParameterMode {PARAM_IN, PARAM_OUT, PARAM_INOUT};
      struct ParameterDescription {
            Identifier            name;
            TypeCode              type;
            IDLType               type_def;
            ParameterMode         mode;
      };
      typedef sequence <ParameterDescription> ParDescriptionSeq;
      typedef Identifier ContextIdentifier;
      typedef sequence <ContextIdentifier> ContextIdSeq;
      typedef sequence <ExceptionDef> ExceptionDefSeq;
      typedef sequence <ExceptionDescription> ExcDescriptionSeq;
      interface OperationDef : Contained {
           readonly    attribute TypeCode              result;
           readonly    attribute IDLType               result_def;
           readonly    attribute ParDescriptionSeq     params;
           readonly    attribute OperationMode         mode;
           readonly    attribute ContextIdSeq          contexts;
           readonly    attribute ExceptionDefSeq       exceptions;
      };
      struct OperationDescription {
          Identifier                  name;
          RepositoryId                id;
          RepositoryId                defined_in;
          VersionSpec                 version;
          TypeCode                    result;
          OperationMode               mode;
          ContextIdSeq                contexts;
          ParDescriptionSeq           parameters;
          ExcDescriptionSeq           exceptions;
     };
};result 
result_def 
params 
nameメンバーは、パラメータ名を指定します。typeメンバーは、パラメータの型を記述するTypeCodeです。type_defメンバーは、パラメータの型の定義を識別します。modeメンバーは、パラメータがinパラメータ、outパラメータ、またはinoutパラメータのうちどれであるのかを示します。
mode
contexts 
exceptions 
  継承されるOperationDefオブジェクトのdescribe操作は、OperationDescriptionを返します。
  継承されるdescribe_contents操作は、この操作について定義されている各パラメータの記述をはじめとする、この操作の完全な記述を提供します。
次に示すInterfaceDefオブジェクトは、インタフェース定義を表します。定数、typedef、例外、操作、および属性を包含することができます。
module CORBA {
   interface InterfaceDef;
      typedef sequence <InterfaceDef> InterfaceDefSeq;
      typedef sequence <RepositoryId> RepositoryIdSeq;
      typedef sequence <OperationDescription> OpDescriptionSeq;
      typedef sequence <AttributeDescription> AttrDescriptionSeq;
      interface InterfaceDef : Container, Contained, IDLType {
           readonly attribute InterfaceDefSeq   base_interfaces;
           readonly attribute boolean            is_abstract;
           boolean is_a (in RepositoryId interface_id);          struct FullInterfaceDescription {
              Identifier              name;
              RepositoryId            id;
              RepositoryId            defined_in;
              VersionSpec             version;
              OpDescriptionSeq        operations;
              AttrDescriptionSeq      attributes;
              RepositoryIdSeq         base_interfaces;
              TypeCode                type;
              boolean                 is_abstract;
          };
           FullInterfaceDescription describe_interface();     };
     struct InterfaceDescription {
          Identifier                 name;
          RepositoryId               id;
          RepositoryId               defined_in; 
          VersionSpec                version;
          RepositoryIdSeq            base_interfaces;
          boolean                    is_abstract;
     };
};  base_interfaces属性は、このインタフェースの継承元であるすべてのインタフェースをリストします。 
  インタフェースが抽象インタフェース型である場合、is_abstract属性はTRUEです。
  is_a操作は、呼出し先のインタフェースが、interface_idパラメータによって識別されたインタフェースと同一であるか、このインタフェースから直接的または間接的に継承したものである場合は、TRUEを返します。それ以外の場合には、FALSEを返します。
  describe_interface操作は、インタフェースを記述するFullInterfaceDescriptionを返します。これには、操作や属性も含まれています。FullInterfaceDescription構造体の操作および属性の各フィールドには、記述されているインタフェースの継承グラフの推移閉包におけるすべての操作と属性が含まれます。
  継承されるInterfaceDefのdescribe操作は、InterfaceDescriptionを返します。
  継承されるcontents操作は、このInterfaceDefで定義される定数、typedef、および例外のリストと、このInterfaceDefで定義または継承される属性および操作のリストを返します。exclude_inheritedパラメータがTRUEに設定されていれば、このインタフェース内で定義された属性と操作のみが返されます。exclude_inheritedパラメータがFALSEに設定されていれば、すべての属性と操作が返されます。
|       |