注意:
|
この章に記載されている情報の一部は、『Common Object Request Broker: Architecture and Specification』からの引用です。Revision 2.4.2 (Object Management Group (OMG)により、2001年2月に発行)OMGの許可を得て使用されています。
|
ここでは、Anyクラスの各メンバー関数について説明します。
これは、CORBA::Anyクラスのデフォルトのコンストラクタです。型
tc_nullおよび値0 (ゼロ)のTypeCodeで
Anyオブジェクトを作成します。
別のAnyオブジェクトのコピーである
Anyオブジェクトを作成します。
これは、CORBA::Anyクラスのコピー・コンストラクタです。このコンストラクタは、渡される
AnyのTypeCode参照を複製します。
実行されるコピーの種類は、コピーされるAnyオブジェクトの
releaseフラグによって決まります。
releaseが
CORBA_TRUEと評価された場合、コンストラクタはパラメータの値をディープ・コピーします。
releaseが
CORBA_FALSEと評価された場合、コンストラクタはパラメータの値をシャロー・コピーします。シャロー・コピーを使用すると、メモリー割当ての最適化をより高度に制御できます。ただし、呼出し側は、解放済メモリーを
Anyが使用していないことを確認する必要があります。
Anyオブジェクトの作成で使用するデータへのポインタ。この引数のデータ型は、指定されたTypeCodeと一致していなければなりません。
Value引数で指定されたメモリーの所有権を
Anyが想定するかどうかを指定します。
Releaseが
CORBA_TRUEの場合、
Anyは所有権を想定します。
Releaseが
CORBA_FALSEの場合、
Anyは所有権を想定しません。この場合、
Value引数が指すデータは、割当て時または破棄時に解放されません。
このコンストラクタは、型保障でないAnyインタフェースで使用されます。指定されたTypeCodeオブジェクト参照を複製してから、
Anyオブジェクト内の値が指すデータを挿入します。
このデストラクタは、Releaseフラグが
CORBA_TRUEに指定されている場合に
CORBA::Anyが保持しているメモリーを解放します。また、
Anyに含まれるTypeCode擬似オブジェクト参照も解放します。
代入で使用するAnyへの参照。代入で使用する
Anyによって、
Anyが
Valueのメモリーの所有権を想定するかどうかが決まります。
Releaseが
CORBA_TRUEの場合、
Anyは所有権を想定して
InitAny引数の値をディープ・コピーします。Releaseが
CORBA_FALSEの場合、
Anyは
InitAny引数の値をシャロー・コピーします。
これは、Anyクラスの代入演算子です。このメンバー関数のメモリー管理は、
Releaseフラグの現在の値によって決まります。また、
Releaseフラグの現在の値によって、現在のメモリーが割当て前に解放されるかどうかも決まります。現在の
Releaseフラグが
CORBA_TRUEの場合、
Anyは前に保持していたすべての値を解放します。現在のReleaseフラグが
CORBA_FALSEの場合、
Anyは前に保持していた値を解放しません。
InitAnyのコピーを保持する
Anyを返します。
この挿入メンバー関数は、型保障挿入を実行します。Anyに前の値があり、
Releaseフラグが
CORBA_TRUEの場合、メモリーの割当てを解除し、前のTypeCodeオブジェクト参照を解放します。
Valueパラメータを使用して渡された値をコピーして
Anyに新しい値を挿入します。これにより、適切なTypeCodeリファレンスが複製されます。
Value引数は、
Anyオブジェクトに格納されている値の出力を受け取る関連オブジェクトへの参照です。
この抽出メンバー関数は、型保障抽出を実行します。Anyオブジェクトに指定の型が格納されている場合、このメンバー関数は、
Anyのポインタを出力参照値
Valueに代入し、
CORBA_TRUEを返します。
Anyに適切な型が格納されていない場合は、
CORBA_FALSEを返します。ストレージは
Anyオブジェクトによって所有および管理されているため、呼出し側はストレージの解放または削除を試行しないでください。
Value引数は、
Anyオブジェクトに格納されている値の出力を受け取る関連オブジェクトへの参照です。
Anyオブジェクトに適切な型が格納されていない場合、値は変更されません。
Anyに特定の型の値が格納されていた場合は
CORBA_TRUE。
Anyに特定の型の値が格納されていなかった場合は
CORBA_FALSE。
これらの挿入メンバー関数は、Anyに
CORBA::Boolean、
CORBA::Charまたは
CORBA::Octet参照を型保障で挿入します。
Anyに前の値があり、その
Releaseフラグが
CORBA_TRUEの場合、メモリーの割当てを解除し、前のTypeCodeオブジェクト参照を解放します。
Valueパラメータを使用して渡された値をコピーして
Anyオブジェクトに新しい値を挿入します。これにより、適切なTypeCodeリファレンスが複製されます。
Anyオブジェクトに格納されている値の出力を受け取る関連オブジェクトへの参照。
Anyオブジェクトに適切な型が格納されていない場合、値は変更されません。
これらの抽出メンバー関数は、Anyから
CORBA::Boolean、
CORBA::Char、
CORBA::Octet、
CORBA::ObjectまたはString参照を型保障で抽出します。これらのメンバー関数は、
Anyクラス内でネストされたヘルパーです。その目的は、C++ではBoolean型、char型、octet型の識別が不要なため、OMG IDLのこれらの型を識別して抽出することです。
Anyに指定の型が格納されている場合、このメンバー関数は、
Anyオブジェクト参照の値を出力変数
Valueに代入し、
CORBA_TRUEを返します。
Anyオブジェクトに適切な型が格納されていない場合は、
CORBA_FALSEを返します。
この関数は、Anyに関連付けられたTypeCodeオブジェクトの
TypeCode_ptr擬似オブジェクト参照を返します。
TypeCode_ptr擬似オブジェクト参照は、
CORBA::releaseメンバー関数で解放する必要があります。または、
TypeCode_varに割り当てて自動的に解放されるようにする必要があります。
置き換えられるAnyオブジェクトのTypeCode値を指定するTypeCode擬似オブジェクト参照。この引数は複製されます。
Anyオブジェクトが指すストレージを指定するvoidポインタ。
Anyが指定の
Value引数を管理するかどうかを指定します。
Releaseが
CORBA_TRUEの場合、
Anyは所有権を想定します。
Releaseが
CORBA_FALSEの場合、
Anyは所有権を想定しません。この場合、
Valueパラメータが指すデータは、代入時または破棄時に解放されません。
これらのメンバー関数は、渡されたTCおよび
Value引数の値に、
Anyに現在格納されているデータおよびTypeCode値を置き換えます。この関数による置換えは型保障ではありません。つまり、TypeCode値と
Value引数が指すストレージのデータ型との一貫性は、呼出し側が維持することになります。
Releaseの値が
CORBA_TRUEの場合、この関数は
Anyオブジェクト内の既存のTypeCode擬似オブジェクトを解放し、
Anyオブジェクト参照が指すストレージを解放します。
•
|
context_nameおよび parent関数の戻り値の所有権はContextが保持します。呼出し側はこれらの戻り値を解放しないでください。
|
有効な操作フラグは、CORBA::CTX_RESTRICT_SCOPEのみです。このフラグを指定すると、オブジェクト実装によってプロパティの検索が現在のスコープのみに制限されます。したがって、一連の親コンテキストのプロパティの検索は再帰的に実行されません。このフラグを指定しない場合は、スコープを広げて一致が見つかるか、または検索対象がすべてのレベルになるまで検索が続行されます。
属性が空の文字列の場合は
CORBA::BAD_PARAM。
一致する属性が見つからなかった場合は
CORBA::BAD_CONTEXT。
動的メモリー割当てに失敗した場合は
CORBA::NO_MEMORY。
AttrNameが空の文字列の場合、または
AttrValueに文字列型が含まれない場合は
CORBA::BAD_PARAM。
動的メモリー割当てに失敗した場合は
CORBA::NO_MEMORY。
•
|
name()および value()関数の戻り値の所有権はNamedValueが保持します。呼出し側はこれらの戻り値を解放しないでください。
|
•
|
add - flagsのみを初期化して、名前の付いていない値を作成します
|
•
|
add、 add_item、 add_value、 add_item_consume、 add_value_consumeおよび item関数の戻り値の所有権はNVListが保持します。呼出し側はこれらの戻り値を解放しないでください。
|
•
|
add_item_consumeおよび add_value_consume関数の char*パラメータと add_value_consume関数の Any*パラメータは、NVListが使用します。NVListはこれらのパラメータをコピーして、元のパラメータをすぐに破棄します。そのため、パラメータが関数に渡された後は、呼出し側がこれらのデータにアクセスすることはできません。基底のNamedValueの value属性を呼出し側が変更する場合は、 NamedValue::value()操作を使用します。
|
•
|
remove関数は、削除済のNamedValueの CORBA::releaseも呼び出します。
|
CORBA::NamedValue_ptr CORBA::NVList::add_value (
const char * Name,
const CORBA::Any & Value,
CORBA::Flags Flags);
class CORBA
{
class Object
{
public:
CORBA::Boolean _is_a(const char *)
CORBA::Boolean _is_equivalent();
CORBA::Boolean _nonexistent(Object_ptr);
static Object_ptr _duplicate(Object_ptr obj);
static Object_ptr _nil();
InterfaceDef_ptr _get_interface();
CORBA::ULong _hass(CORBA::ULong);
void _create_request(
Context_ptr ctx,
const char *operation,
NVList_ptr arg_list,
NamedValue_ptr result,
Request_out request,
Flags req_flags
);
Status _create_request(
Context_ptr ctx,
const char * operation,
NVList_ptr arg_list,
NamedValue_ptr result,
ExceptionList_ptr Except_list,
ContextList_ptr Context_list,
Request_out request,
Flags req_flags
);
Request_ptr _request(const char* operation);
}; //Object
}; // CORBA
Void CORBA::Object::_create_request (
CORBA::Context_ptr Ctx,
const char * Operation,
CORBA::NVList_ptr Arg_list,
CORBA::NamedValue_ptr Result,
CORBA::ExceptionList_ptr Except_list,
CORBA::ContextList_ptr Context_list,
CORBA::Request_out Request,
CORBA::Flags Req_flags,);
このメンバー関数は、指定のObjectオブジェクト参照(Obj)を複製します。指定のオブジェクト参照がnilの場合、
_duplicate関数はnilオブジェクト参照を返します。この呼出しで返されるオブジェクトは、
CORBA::releaseで解放するか、または自動的に破棄されるように
CORBA::Object_varを割り当てる必要があります。
このメンバー関数は、オブジェクトがinterface_idパラメータで指定されたインタフェースのインスタンスであるかどうかを判別するために使用します。この関数を使用すると、ORBのスコープでオブジェクト参照の型保障の維持が容易になります。
オブジェクト参照は、hash()操作を使用してアプリケーションから間接的にアクセスできるORB内部識別子に関連付けられています。この識別子の値は、オブジェクト参照の存続期間は変更されません。したがって、識別子のどのハッシュ関数も変更されません。
hash操作の
maximumパラメータには、ORBが返すハッシュ値の上限を指定します。この値の下限はゼロです。この機能は通常、オブジェクト参照の衝突チェーン状のハッシュ表を作成したり、これにアクセスしたりするために使用します。したがって、その範囲内で値がランダムに分散するほど、計算する値は小さくなり、計算精度も向上します。
identifier文字列に対応する初期オブジェクト参照を返します。
identifier文字列に対応する初期オブジェクト参照を返します。有効な識別子は、
“RootPOA"および
“POACurrent"です。
注意:
|
Oracle Tuxedoシステムが管理しているスレッド内からclear_ctxメソッドを呼び出さないでください。Oracle Tuxedoシステムでは、適切にコンテキストを伝播し、管理しているスレッドを自動的にクリーンアップします。Oracle Tuxedoシステムが管理しているスレッドでこのメソッドを呼び出した場合、 BAD_PARAM例外がスローされます。
|
void CORBA::ORB::create_list (
CORBA::Long NumItem,
CORBA::NVList_out List);
void CORBA::ORB::create_operation_list (
CORBA::OperationDef_ptr Oper,
CORBA::NVList_out List);
この例外は、ORB::create_policy操作に渡されたパラメータ値に問題があることを示す場合に発生します。
表14-1に、具体的な例外と理由を示します。
再利用を許可するには、create_policy操作を使用して、再利用を許可するポリシー・オブジェクトを作成し、POAを作成する際のポリシーのリストの一部としてそのポリシー・オブジェクトを使用します。
前述の例では、bd_policyがその後、
create_poa操作に渡されるPolicyListに挿入されます。
void CORBA::ORB::get_default_context (
CORBA::
Context_out ContextObj);
ORBが停止した後に、work_pendingおよび
perform_work()を呼び出すと、
BAD_INV_ORDER例外が発生します。アプリケーションでは、この例外を検出して、いつポーリング・ループを終了するかを判定します。
work_pending()および
perform_work()操作を使用すると、ORBなどのアクティビティのメイン・スレッドを多重化する単純なポーリング・ループを記述できます。このようなループは主に、シングル・スレッドのサーバーで必要になります。マルチスレッドのサーバーでポーリング・ループが必要になるのは、メイン・スレッドの使用が必要なほかのコードとORBの両方がある場合のみです。このようなポーリング・ループについては、以下の例を参照してください。
ObjectIdは、参照が必要なオブジェクトを識別する文字列です。初期リファレンスを取得するインタフェースの簡素さを維持するには、限定したオブジェクトのセットのみに、上記の方法で見つかったリファレンスを格納します。ORB識別子とは異なり、
ObjectIdネームスペースには慎重な管理が必要になります。これを達成するため、OMGは、将来、このインタフェースを介してアプリケーションで必要になるサービスを定義し、それらのサービスの名前を指定します。
現在、予約されているObjectIdは、
RootPOA、
POACurrent、
InterfaceRepository、NameService、TradingService、SecurityCurrent、TransactionCurrentおよび
DynAnyFactoryです。
アプリケーションでは、resolve_initial_referencesから返されるオブジェクト参照を
ObjectIdでリクエストされた型に限定します。たとえば、
InterfaceRepositoryの場合、返されるオブジェクトは
Repository型に限定されます。
注意:
|
set_ctxメソッドは、Oracle Tuxedoシステムが管理しているスレッドでは呼び出さないでください。Oracle Tuxedoシステムでは、管理しているスレッドに対して適切にコンテキストを自動的に伝達します。Oracle Tuxedoシステムが管理しているスレッドで、このメソッドがアプリケーションによって呼び出された場合、 BAD_PARAM例外がスローされます。
|
CORBA::ORB::object_to_string操作
によって生成された文字列を変換し、対応するオブジェクト参照を返します。
CORBA::ORB::object_to_string操作によって生成された文字列。
この操作は、CORBA::ORB::object_to_string操作
によって生成された文字列を変換するためにアプリケーションで使用され、対応するオブジェクト参照を返します。
準拠するすべてのORBについて、objがオブジェクトへの有効な参照である場合、2つの操作が同じORBで実行されると、
string_to_object(object_to_string(obj))は同じオブジェクトへの有効な参照を返します。ORBがサポートするIOPに完全準拠する場合は、2つの操作が異なるORBで実行されても設定は同じままになります。
結果がTRUEの場合は、サーバー関連の作業を実行するためにORBでメイン・スレッドが必要であることを示します。結果が
FALSEの場合は、ORBでメイン・スレッドが不要であることを示します。
class CORBA {
static CORBA::ORB_ptr ORB_init(int& argc, char** argv,
const char* orb_identifier = 0,
const char* -ORBport nnn);
<appl-name> [-ORBid {BEA_IIOP | BEA_TOBJ} \
[-ORBInitRef <ObjectID>=<ObjectURL> [*]]
[-ORBDefaultInitRef <ObjectURL>]
[-ORBport port-number] \
[-ORBsecurePort port-number] \
[-ORBminCrypto {0 | 40 | 56 | 128}] \
[-ORBmaxCrypto {0 | 40 | 56 | 128}] \
[-ORBmutualAuth] \
[-ORBpeerValidate {detect | warn | none}] \
[appl-options]
static CORBA::ORB_ptr ORB_init(int& argc, char** argv,
const char* orb_identifier = 0);
orb_identifierパラメータを指定する場合、
「Tobj_Bootstrap」という項で定義されているように、
"BEA_IIOP"はリモート・クライアントを明示的に指定し、
"BEA_TOBJ"はネイティブ・クライアントを明示的に指定します。
通常、引数argcと
argvは、メイン・プログラムに渡されたパラメータと同じです。C++での指定のように、これらのパラメータには、クライアントを起動したコマンド行の文字列トークンが格納されます。2つのORBオプションは、以下の例で示すように、トークンのペアをそれぞれ使用してコマンド行で指定できます。
ORB_init関数は、次の手順でORBのクライアント・タイプを判別します。
1.
|
orb_identifier引数が指定されている場合、 ORB_initは、文字列が "BEA_IIOP"か "BEA_TOBJ"かによって、クライアント・タイプがネイティブかリモートかを判別します。 orb_identifier文字列がある場合、 argvの - ORBidパラメータはすべて無視または削除されます。
|
2.
|
orb_identifierが指定されていないか、または明示的にゼロに指定されている場合、 ORB_initは argc/argvのエントリを確認します。 argvに "-ORBid"のエントリがある場合、次のエントリは、リモートまたはネイティブを表す "BEA_IIOP"か "BEA_TOBJ"かのどちらかになります。このエントリのペアが出現するのは、コマンド行に "-ORBid BEA_IIOP"または "-ORBid BEA_TOBJ"のどちらかがある場合です。
|
3.
|
クライアント・タイプがargc/argvで指定されていない場合、 ORB_initは、システム・レジストリ内のデフォルトのクライアント・タイプ( BEA_IIOPまたは BEA_TOBJ)を使用します。システム・レジストリは、Oracle Tuxedoのインストール時に初期化されています。
|
ポート番号を特定するために、ORB_initは、
argvパラメータの
"-ORBport"トークンとそれに続く数値のトークンを検索します。たとえば、クライアントの実行可能ファイルの名前がsherryの場合、コマンド行では次のようにサーバーのポート937に指定します。
C++の場合、argvパラメータの処理順序がアプリケーションで重要になることがあります。アプリケーションで認識されない
argvパラメータをアプリケーションで確実に処理不要にするには、ORB初期化関数を呼び出してから、残りのパラメータを処理する必要があります。したがって、
ORB_initを呼び出した後、
argvおよび
argcパラメータは、ORBで認識された引数を削除するために変更されています。この際に重要なのは、
ORB_init関数が、
argvリストのパラメータの参照の順序変更または削除しかできない点です。この制限が設けられたのは、
argvリストの一部の解放を試行したり、パラメータの
argvリストの拡張を試行したりすることで発生する可能性のあるメモリー管理上の問題を防ぐためです。このような理由から、
argvは、
char**&ではなく
char**として渡されます。
注意:
|
CORBA::ORB_initから返されたポインタに割り当てられたリソースを解放するには、 CORBA::releaseメンバー関数を使用します。
|
値BEA_IIOPは、IIOPまたはIIOP-SSLプロトコルで通信するクライアントまたはサーバー環境をサポートするようにORBを構成することを明示的に指定します。
値BEA_TOBJは、Oracle Tuxedoドメイン内でTGIOPプロトコルのみで通信可能なネイティブ・クライアント環境をサポートするようにORBを構成することを明示的に指定します。
ObjectIDは、CORBA仕様で定義されるサービスの既知のオブジェクトIDを表します。このメカニズムにより、ORBのインストール時に定義しなかった、新しい初期サービスのObject IDでORBを構成できます。
ObjectURLには、CORBA仕様で定義する
CORBA::ORB::string_to_object操作でサポートされている任意のURLスキームを指定できます。URLの構文に誤りがある場合、または実装で定義された方法では無効であると判別された場合、
CORBA::ORB_initによって、
表14-2にリストする
CORBA::BAD_PARAM標準例外が生成されます。
ORBのデフォルト初期参照引数である-ORBDefaultInitRefは、
-ORBInitRefを使用して明示的に指定されていない初期参照の解決を支援します。また、現在の
Tobj_Bootstrapオブジェクトに指定されているIIOPリスナー・アドレスと同様の機能を備えています。
-ORBInitRef引数とは異なり、
-ORBDefaultInitRefでは、スラッシュ(/)文字と文字列化したオブジェクト・キーを追加した後に、初期オブジェクト参照を識別するための新しいURLを形成するURLが必要です。たとえば、デフォルト初期参照引数として次が指定されているとします。
サービスの初期参照を取得するためのORB::resolve_initial_references(“NotificationService”)の呼出しでは、次のような新しいURLが作成されます。
ORB::resolve_initial_references操作の実装は、新しく作成されたURLを受け取り、サービスの初期参照を取得するために
CORBA::ORB::string_to_objectを呼び出します。
-ORBDefaultInitRef引数の値として指定するURLには、複数の場所を含めることができます。これは、
Tobj_Bootstrapオブジェクトで使用される場所のリストに提供されている機能とほぼ同じです。この場合、ORBではURLの構文規則に基づいてURLの場所を処理します。たとえば、デフォルト初期参照引数として次が指定されているとします。
サービスの初期参照を取得するためのORB::resolve_initial_references(“NameService”)の呼出しでは、次のいずれかの新しいURLが作成されます。
-ORBmutualAuthオプションは、国際版または米国/カナダ版のOracle Tuxedoセキュリティ・アドオン・パッケージがインストールされている場合にのみ使用可能です。
値がdetectの場合、Oracle Tuxedo CORBA ORBは、接続に使用されるオブジェクト参照で指定されたホストがピアのデジタル証明書で指定されたドメイン名と一致しているかどうかを検証します。照合に失敗した場合、ORBはピアの認証を拒否し、接続を破棄します。このチェックによって、介在者の攻撃から保護します。
値がwarnの場合、Oracle Tuxedo CORBA ORBは、接続に使用されるオブジェクト参照で指定されたホストがピアのデジタル証明書で指定されたドメイン名と一致しているかどうかを検証します。照合に失敗した場合、ORBはユーザー・ログにメッセージを書き込み、接続処理を続行します。
-ORBpeerValidateオプションは、国際版または米国/カナダ版のOracle Tuxedoセキュリティ・アドオン・パッケージがインストールされている場合にのみ使用可能です。
port-numberは、Oracle Tuxedo CORBA ORBプロセスが受信リクエストをリスニングするTCPポート番号です。
port-numberには、0から65535までの数字を指定します。
port-numberは、Oracle Tuxedo CORBA ORBプロセスが受信リクエストをリスニングするTCPポート番号です。
port-numberには、0から65535までの数字を指定します。
-ORBsecurePortオプションは、国際版または米国/カナダ版のOracle Tuxedoセキュリティ・アドオン・パッケージがインストールされている場合にのみ使用可能です。
注意:
|
次に示すCORBA::Policy操作および構造体は、通常、プログラマにとっては必須ではありません。通常、生成されたインタフェースには、仕様に関連する情報が格納されています。ポリシー・オブジェクトは、特定のファクトリ、または CORBA::create_policy操作を使用することで作成できます。
|
// C++
class PortableServer
{
public:
class LifespanPolicy;
class IdAssignmentPolicy;
class POA::find_POA
class reference_to_id
class POAManager;
class POA;
class Current;
class virtual ObjectId
class ServantBase
};
この操作は、ObjectIdを生成し、
ObjectIdおよび指定のサーバントをアクティブ・オブジェクト・マップに入れることにより、個々のオブジェクトを明示的にアクティブ化します。
指定のObjectIdを持つ個々のオブジェクトをアクティブ化します。
ObjectId値で示されたCORBAオブジェクトがそのPOAですでにアクティブである場合、
ObjectAlreadyActive例外が発生します。
POAにSYSTEM_IDポリシーがあり、ObjectId値がシステムによって生成されていないか、そのPOAについて生成されていないことが検出された場合、BAD_PARAMシステム例外が発生することがあります。こうした無効なObjectId値をすべて検出するために、ORBは必要ありません。ただし、POAについてシステムによって以前に生成されていないObjectId値を持つSYSTEM_IDポリシーがPOAにある場合、または同じPOAの以前のインスタンスについて、PERSISTENTポリシーもPOAにある場合、移植可能なアプリケーションではactivate_object_with_idをPOAで呼び出さないでください。
この操作は、指定のObjectIdと指定のサーバントとの関連付けをアクティブ・オブジェクト・マップに入れます。
IdAssignmentPolicyインタフェースを持つオブジェクトを取得して、ユーザーがPOA::create_POA操作にオブジェクトを渡すことができるようにします。
IdAssignmentPolicy_ptr
PortableServer::POA::
create_id_assignment_policy (
PortableServer::
IdAssignmentPolicyValue value)
ObjectIdがアプリケーションによってのみ割り当てられることを示すPortableServer::USER_ID、または
ObjectIdがシステムによってのみ割り当てられることを示すPortableServer::SYSTEM_IDのいずれかの値。
POA::create_id_assignment_policy操作は、IdAssignmentPolicyインタフェースを持つオブジェクトを取得します。POA::create_POA操作に渡されると、このポリシーは、作成されるPOAのObjectIdがアプリケーションによって生成されるか、ORBによって生成されるかを指定します。指定可能な値は次のとおりです。
•
|
PortableServer::SYSTEM_ID - そのPOAで作成されるオブジェクトには、POAによってのみObjectIdが割り当てられます。 POAにPERSISTENT LifespanPolicyもある場合は、割り当てられたObjectIdが、同じPOAのすべてのインスタンスを通じて一意である必要があります。
|
IdAssignmentPolicyがPOAの作成時に指定されていない場合、デフォルトは
SYSTEM_IDです。
LifespanPolicyインタフェースを持つオブジェクトを取得して、ユーザーがPOA::create_POA操作にオブジェクトを渡すことができるようにします。
LifespanPolicy_ptr
PortableServer::POA::
create_lifespan_policy (
PortableServer::
LifespanPolicyPolicyValue value)
ObjectIdがアプリケーションによってのみ割り当てられることを示すPortableServer::USER_ID、または
ObjectIdがシステムによってのみ割り当てられることを示すPortableServer::SYSTEM_IDのいずれかの値。
POA::create_lifespan_policy操作を使用して
LifespanPolicyインタフェースを持つオブジェクトを取得し、
POA::create_POA操作に渡して、
作成されたPOAで実装されるオブジェクトの有効期間を指定します。指定可能な値は次のとおりです。
•
|
TRANSIENT - POAで実装されるオブジェクトは、それらが最初に作成されたプロセスの後まで存在することはできません。POAが非アクティブ化されると、そのPOAから生成されたオブジェクト参照を使用した場合、 OBJECT_NOT_EXIST例外が発生します。
|
•
|
PERSISTENT - POAで実装されるオブジェクトは、それらが最初に作成されたプロセスの後も存在できます。
|
LifespanPolicyオブジェクトが
POA::create_POAに渡されない場合、有効期間ポリシーのデフォルトは
TRANSIENTです。
POA_ptr PortableServer::
create_POA (
const char * adapter_name,
POAManager_ptr a_POAManager,
const CORBA::PolicyList & policies)
CORBA::ORB_init操作で説明したようにポートを設定せずに、
PERSISTENTのLifespanPolicyでプログラムがPOAを作成しようとした場合に発生します。
a_POAManagerパラメータがNULLである場合、新しい
PortableServer::POAManagerオブジェクトが作成され、新しいPOAに関連付けられます。それ以外の場合は、指定した
POAManagerオブジェクトが新しいPOAに関連付けられます。
POAManagerオブジェクトは、属性名
the_POAManagerを使用して取得できます。
POA生成のObjectId値と指定のインタフェース・リポジトリIDをカプセル化するオブジェクト参照を作成します。
この操作では、LifespanPolicyが値SYSTEM_IDを持っている必要があります。存在しない場合、
PortableServer::WrongPolicy例外が発生します。
このcreate_reference操作は、POA生成の
ObjectId値と指定のインタフェース・リポジトリIDをカプセル化するオブジェクト参照を作成します。この操作は、POAに関連付けられた情報および操作のパラメータからのリファレンスを構成するために必要な情報を収集します。この操作は、リファレンスを作成するだけで、リファレンスとアクティブ化されたサーバントとを関連付けるわけではありません。作成された参照をクライアントに渡して、その参照に対するそれ以降のリクエストが、生成された
ObjectIdを使用するPOAに返るようにすることができます
。生成されたObjectId値を取得するには、作成された参照を指定して
POA::reference_to_idを呼び出します。
指定のObjectIdおよびインタフェース・リポジトリID値をカプセル化するオブジェクト参照を作成します。
POAに値SYSTEM_IDを持つLifespanPolicyがあり、ObjectId値がシステムによって生成されていないか、そのPOAについて生成されていないことが検出された場合、BAD_PARAMシステム例外が発生します。
create_reference操作は、指定のObjectIdおよびインタフェース・リポジトリID値をカプセル化するオブジェクト参照を作成します。この操作は、POAに関連付けられた情報および操作のパラメータからのリファレンスを構成するために必要な情報を収集します。この操作は、参照を作成するのみで、参照とアクティブ化されたサーバントとを関連付けるわけでは
ありません。作成された参照をクライアントに渡して、その参照に対するそれ以降のリクエストで、指定のObjectIdを持つ同じPOAに呼出しが返るようにすることができます。
指定のObjectIdに関連付けられたアクティブなオブジェクトがない場合、
ObjectNotActive例外が発生します。
この操作は、oidパラメータで指定された
ObjectIdとそのサーバントの関連付けをアクティブ・オブジェクト・マップから削除します。
wait_for_completionパラメータがTRUEの場合、destroy操作は、処理中のリクエストがすべて完了し、etherealizeの呼出しがすべて完了した後にのみ戻ります。それ以外の場合、destroy操作は、POAを破棄した後に戻ります。
指定のreferenceによってカプセル化された
ObjectId値を返します。
この操作は、指定のreferenceによってカプセル化された
ObjectId値を返します。この操作を実行中のPOAによってリファレンスが作成された場合にのみ、この操作は有効です。リファレンスで示されたオブジェクトがアクティブ化されているかどうかは、この操作の成否には関係ありません。
指定のreferenceによってカプセル化された
ObjectId値を返します。
C++サーバントはすべて、PortableServer::ServantBaseから継承されるため、それらはすべて
_default_POA関数を継承します。このバージョンのOracle Tuxedoでは、通常、
_default_POAを使用する必要はありません。
CORBA::Currentから派生したPortableServer::Currentインタフェースは、そのメソッドが呼び出されたオブジェクトのIDへのアクセスをメソッド実装に提供します。
各POAオブジェクトには、POAManagerオブジェクトが関連付けられています。POAManagerは、1つまたは複数のPOAオブジェクトと関連付けることができます。POAManagerは、関連付けられたPOAの処理状態をカプセル化します。POAマネージャの操作を使用すると、アプリケーションでPOAのリクエストをキューに登録したり、破棄することも、POAを
非アクティブ化することもできます。
POAManagerには、アクティブ化
、非アクティブ化、保持、破棄の4つの処理状態があります。この処理状態によって、関連付けられたPOAの機能、およびPOAが受け取ったリクエストを破棄するかどうかが決まります。
POAManagerが非アクティブ化状態のときにこの操作を発行すると、
PortableServer::POAManager::AdapterInactive例外が発生します。
この引数がTRUEの場合、deactivate操作は、処理中のリクエストがすべて完了した後にのみ戻ります。この引数が
FALSEの場合、
deactivate操作は、関連付けられたPOAの状態を変更した後に戻ります。
POAマネージャが非アクティブ化状態のときに発行すると、
PortableServer::POAManager::AdapterInactive例外が発生します。
CORBA::Policyから派生したインタフェースは、POAに適用するポリシーを指定するために
POA::create_POA操作で使用されます。ポリシー・オブジェクトは、
ルートPOAなど、既存のPOAのファクトリ操作を使用して作成されます。ポリシー・オブジェクトは、POAの作成時に指定します。既存のPOAではポリシーは変更できません。ポリシーは、親POAから継承されません
。
create_POA操作にオブジェクトの有効期間を指定します。
POA::create_lifespan_policy操作を使用して
LifespanPolicyインタフェースを持つオブジェクトを取得し、
POA::create_POA操作に渡して、
作成されたPOAで実装されるオブジェクトの有効期間を指定します。指定可能な値は次のとおりです。
•
|
TRANSIENT - POAで実装されるオブジェクトは、それらが最初に作成されたプロセスの後まで存在することはできません。
|
•
|
PERSISTENT - POAで実装されるオブジェクトは、それらが最初に作成されたプロセスの後も存在できます。
|
LifespanPolicyオブジェクトが
create_POAに渡されない場合、有効期間ポリシーのデフォルトは
TRANSIENTです。
作成されるPOAのObjectIdがアプリケーションによって生成されるか、ORBによって生成されるかを指定します。
POA::create_id_assignment_policy操作を使用してIdAssignmentPolicyインタフェースを持つオブジェクトを取得し、POA::create_POA操作に渡して、作成されるPOAのObjectIdがアプリケーションによって生成されるか、ORBによって生成されるかを指定します。指定可能な値は次のとおりです。
•
|
USER_ID - そのPOAで作成されるオブジェクトには、アプリケーションによってのみObjectIdが割り当てられます。
|
•
|
SYSTEM_ID - そのPOAで作成されるオブジェクトには、POAによってのみObjectIdが割り当てられます。 POAにPERSISTENTポリシーもある場合は、割り当てられたObjectIdが、同じPOAのすべてのインスタンスを通じて一意である必要があります。
|
IdAssignmentPolicyがPOAの作成時に指定されていない場合、デフォルトは
SYSTEM_IDです。
注意:
|
add_*_arg、 set_return_typeおよび return_valueメンバー関数は、属性ベースのアクセサの使用を簡略化するものとして追加されています。
|
void CORBA::Request::ctx (
CORBA::Context_ptr CtxObject);
このメンバー関数は、特定のリクエストのレスポンスを取り出します。これは、CORBA::Request::send_deferred関数または
CORBA::Request::send_multiple_requests関数の呼出し後に使用されます。リクエストが完了していない場合、
CORBA::Request::get_response関数によってリクエストが完了するまでブロックされます。
注意:
|
C++では、charの静的配列は char*に移行が進んでいます。したがって、 String_varに静的配列を割り当てる際は注意が必要になります。これは、 String_varでは、 string_allocで割り当てられたデータをポインタが指すことを前提としており、最終的には string_freeでデータを解放しようとするためです。 このような動作に対応するために、ANSI/ISO C++では、文字列リテラルが char*から const char*に変更されています。ただし、ほどんどのC++コンパイラではこの変更を実装していないため、移植可能なプログラムを作成する際は、上記の注意事項に留意しなければなりません。
|
このメンバー関数は、CORBA::string_alloc()またはCORBA::string_dup()メンバー
関数を使用して前に文字列に割り当てられたメモリーの割当てを解除します。この関数にnilポインタを渡すと、すべてのアクションが実行されなくなります。
C++では、制限付きワイド文字列型と無制限ワイド文字列型の両方がCORBA::WChar*にマッピングされます。また、CORBAモジュールでは、
WString_varおよび
WString_outクラスを定義します。これらの各クラスは、同じメンバー関数に、対応する文字列として同じセマンティクスを提供します。ただし、これらのクラスがワイド文字列およびワイド文字を扱う場合は例外です。
リスト14-1に、ワイド文字列およびワイド文字を使用したサンプル・コードを示します。
•
|
id関数の戻り値の所有権はTypeCodeが保持します。これらの戻り値を呼出し側で解放しないでください。
|
CORBA::Boolean CORBA::TypeCode::equal (
CORBA::TypeCode_ptr TypeCodeObj) const;
これは、CORBA::SystemExceptionクラスのデフォルトのコンストラクタです。マイナー・コードは0(ゼロ)に初期化され、完了ステータスは
COMPLETED_NOに設定されています。
これは、CORBA::SystemExceptionクラスのコピー・コンストラクタです。
CORBA::SystemExceptionクラスのこのコンストラクタは、マイナー・コードと完了ステータスを設定します。
これは、CORBA::SystemExceptionクラスのデストラクタです。Exceptionオブジェクトが使用していたメモリーを解放します。
削除されたオブジェクトの呼出しが実行されると、常にCORBA::OBJECT_NOT_EXIST例外が発生します。この場合、「困難な」フォルトとして報告されます。この例外を受け取った場合は、このオブジェクト参照のすべてのコピーの削除、およびほかの適切な「最終リカバリ」手順の実行が許可(推奨)されます。
CORBA::TRANSACTION_REQUIRED例外は、リクエストがNULLトランザクション・コンテキストを送信しましたが、アクティブなトランザクションが必要であることを示します。
CORBA::TRANSACTION_ROLLEDBACK例外は、リクエストに関連付けられたトランザクションがすでにロールバックされているか、ロールバックするようにマークされていることを示します。したがって、要求された操作は実行できなかったか、または実行されていません。これは、トランザクションでこれ以降の計算が無意味になるためです。
CORBA::INVALID_TRANSACTIONは、リクエストが無効なトランザクション・コンテキストを送信したことを示します。たとえば、リソースを登録しようとしたときにエラーが発生した場合に、この例外が発生します。
ExceptionListメンバー関数を使用すると、Requestが呼び出されたときに発生する可能性があるユーザー定義例外すべてのTypeCodeのリストをクライアントまたはサーバー・アプリケーションで提供できます。Requestメンバー関数の説明は、
「Requestメンバー関数」という項を参照してください。
flags属性のみを設定して、名前の付いていない項目でExceptionListオブジェクトを作成します。
TypeCode_ptrによって参照されるメモリー位置を定義します。