|
この章では、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) で指定された定義を挿入し、インタフェースを削除することができます。加えて、管理者はインタフェース リポジトリ サーバが含まれるようにシステムをコンフィグレーションしなければならない場合があります。インタフェース リポジトリの管理コマンドについては、『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 管理コマンドを使用して作成され、追加されます。このコマンドについては、『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 ファイルを使用して、スタブなどを生成できます。詳細については、『Tuxedo 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 は、OMG 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 に設定されていれば、すべての属性とオペレーションが返されます。
|