注意:
|
この章に記載されている情報の大部分は、『Common Object Request Broker: Architecture and Specification, Revision 2.4.2』(2001年2月)の第10章からの引用です。OMG情報は、インタフェース・リポジトリのインタフェースのOracle Tuxedo CORBAでの実装を説明するために、必要に応じて変更されています。OMGの許可を得て使用されています。
|
インタフェース・リポジトリのデータベースは、idl2ir管理コマンドを使用して作成され、追加されます。このコマンドについては、
『Oracle Tuxedoコマンド・リファレンス』および
『Oracle Tuxedoアプリケーションの設定』を参照してください。プログラマ側からは、インタフェース・リポジトリに対する書込み権限はありません。CORBAで定義されている書込み操作や、読取り専用でない属性に対する設定操作で、サポートされているものはありません。
•
|
"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」という項を参照してください。
|
1.
|
クライアント・アプリケーションが、 CORBA::Objectの_ get_interface操作を呼び出し、問題のオブジェクトに関連付けられたInterfaceDefオブジェクトを取得します。これにより、オブジェクト参照を作成したORBにメッセージが送信されます。
|
注意:
|
インタフェース・リポジトリ定義を使用するには、クライアント・アプリケーション・コードに CORBA.hを包含する前に、 ORB_INCLUDE_REPOSITORYマクロを定義する必要があります(例: #Define ORB_INCLUDE_REPOSITORY)。
|
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は、インタフェース・リポジトリ・オブジェクトの型を識別します。
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;
};
別のオブジェクトに包含されるオブジェクトには、それをグローバルに識別する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が包含されます。
lookup操作は、スコープ指定された名前を指定されて、このコンテナと関連する定義を見つけます。名前のスコープ指定には、OMG IDL規則が使用されます。ダブル・コロン(::)が先頭に付く、絶対スコープ指定された名前は、包含Repositoryと関連する定義を見つけます。そのようなオブジェクトが見つからなければ、nilオブジェクト参照が返されます。
contents操作は、オブジェクトに直接包含または継承されるオブジェクトのリストを返します。この操作は、オブジェクトの階層構造内を移動するのに使用されます。クライアントはこの操作を使用し、Repositoryオブジェクトを先頭に、Repositoryに包含されているすべてのオブジェクト、リポジトリ内のモジュールに包含されているすべてのオブジェクト、特定モジュール内のすべてのインタフェースおよび値型などをリストします。
limit_typeが
dk_allに設定されると、すべての型のオブジェクトが返されます。たとえばこれがInterfaceDefであれば、属性、操作、および例外オブジェクトがすべて返されます。
limit_typeが特定のインタフェースに設定されると、
TRUEに設定されると、継承オブジェクトは返されません(存在する場合であっても)。FALSEに設定されている場合、継承されたために包含されているオブジェクトも、オブジェクト内で定義されたために包含されているオブジェクトも、すべて返されます。
describe_contents操作は、contents操作と
describe操作を組み合せます。contents操作から返された各オブジェクトについて、そのオブジェクトの記述が返されます。つまり、そのオブジェクトのdescribe操作が呼び出され、その結果が返されます。
type属性は、IDLTypeから派生したオブジェクトによって定義される型を記述します。
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によって所有されます。
members属性には、各構造体メンバーの記述が包含されます。
継承されるtype属性は、構造体を記述する
tk_struct TypeCodeです。
継承されるtype属性は、ユニオンを記述する
tk_union TypeCodeです。
継承されるtype属性は、列挙を記述する
tk_enum TypeCodeです。
継承されるtype属性は、別名を記述する
tk_alias TypeCodeです。
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;
};
};
PrimitiveDefで表されるプリミティブ型を示します。種類がpk_nullのPrimitiveDefはありません。種類が
pk_stringのPrimitiveDefは、
無制限の文字列を表します。種類が
pk_objrefのPrimitiveDefは、OMG IDLのObject型を表します。種類が
pk_value_baseのPrimitiveDefは、IDLのValueBase型を表します。
継承されるtype属性は、プリミティブ型を記述します。
bound属性は、文字列内の最大文字数を指定します。0にはできません。
継承されるtype属性は、文字列を記述する
tk_string TypeCodeです。
bound属性は、ワイド文字列内のワイド文字の最大数を指定します。0にはできません。
継承されるtype属性は、ワイド文字列を記述する
tk_wstring TypeCodeです。
操作のmodeは、一方向(つまり、出力が返されない)か、または通常です。
継承されるdescribe_contents操作は、この操作について定義されている各パラメータの記述を含め、この操作の完全な記述を提供します。
base_interfaces属性は、このインタフェースの継承元であるすべてのインタフェースをリストします。
is_a操作は、呼出し先のインタフェースが、
interface_idパラメータによって識別されたインタフェースと同一であるか、このインタフェースから直接的または間接的に継承したものである場合は、
TRUEを返します。それ以外の場合には、
FALSEを返します。
describe_interface操作は、インタフェースを記述するFullInterfaceDescriptionを返します。これには、操作や属性も含まれています。FullInterfaceDescription構造体の操作および属性の各フィールドには、記述されているインタフェースの継承グラフの推移閉包におけるすべての操作と属性が含まれます。
継承されるcontents操作は、このInterfaceDefで定義される定数、typedefおよび例外のリストと、このInterfaceDefで定義または継承される属性および操作のリストを返します。
exclude_inheritedパラメータが
TRUEに設定されていれば、このインタフェース内で定義された属性と操作のみが返されます。
exclude_inheritedパラメータが
FALSEに設定されていれば、すべての属性と操作が返されます。