AdapterActivatorオブジェクトは、リクエストを受信時にPOAオブジェクトを生成するために使用します。POAオブジェクトが生成したオブジェクトリファレンスには、オブジェクトIDに加え、生成元POAオブジェクトを示すPOAidが埋め込まれています。クライアントからのリクエストが送られてきた際、POA idに対応するPOAオブジェクトが検索され、そのPOAオブジェクトがリクエストに対する処理を行います。もし、みつからない場合、検索対象のPOAの親POAオブジェクトにAdapterActivatorオブジェクトが設定されているならば、そのAdapterActivatorオブジェクトに子POAオブジェクトの生成を依頼します。親POAにAdapterActivatorオブジェクトが設定されていない場合は、org.omg.CORBA.OBJ_ADAPTER例外がクライアントに通知されます。
AdapterActivatorオブジェクトは、ユーザが作成しPOAに登録する必要があります。
作成するAdapterActivatorクラスは、org.omg.PortableServer.AdapterActivatorクラスを継承させる必要があります。また、メソッドとしてunknown_adapter()を実装している必要があります。
【AdapterActivatorクラスの実装形式】
class UserAdapterActivator extends org.omg.CORBA.LocalObject implements org.omg.PortableServer.AdapterActivator { public boolean unknown_adapter(...){...} }
unknown_adapter
POAidに対応するPOAが検出できなかった場合は、AdapterActivatorオブジェクトのunknown_adapter()メソッドが呼び出されます。unknown_adapter()には、パラメタとしてPOAオブジェクトとStringオブジェクトが渡されます。
unknown_adapter()内では、渡されたPOAオブジェクトの子POAをcreate_POA()を使用して生成します。その際のアダプタ名として、渡されたStringオブジェクトを使用します。
子POAに対するポリシ設定や、その他の必要な処理(ServantやServantManagerの生成・登録など)もこのメソッド内に記述することが可能です。
子POAの生成およびその他の実装した処理が成功した場合は、戻り値としてtrueを返します。そうでない場合は、falseを返します。trueを返した場合は、生成した子POAからServantのオペレーションが起動されます。falseを返した場合は、org.omg.CORBA.OBJECT_NOT_EXIST例外がクライアントに通知されます。
public boolean unknown_adapter( POA parent, String name ) parent : 生成するPOAの親POA name : 生成するPOAのアダプタ名
AdapterActivatorオブジェクトのunknown_adapterメソッドは、org.omg.PortableServer.POA.find_POAメソッド発行時に呼び出すことも可能です。
AdapterActivatorの処理の流れを以下に示します。
クライアントからのリクエストを受信します。リクエストの対象となるオブジェクトリファレンスは、POAidを内包しています。
POAidに対応するPOAオブジェクトを検索します。存在しない場合は、既存のPOAから対象のPOAの親POAを検索します。
親POAオブジェクトに設定されているAdapterActivatorクラスのインスタンスに対し、unknown_adapeter()メソッドが発行されます。
unknown_adapeter()の実装部では、パラメタで渡されたPOA(親POA)の子POAオブジェクトを生成します。以降、同じオブジェクトリファレンスに対するリクエストは、このPOAが処理します。
生成した子POAに対する設定などを行います。ここでは、直接Servantを生成して子POAに登録することも可能であり、ServantManagerを生成し登録しておくことも可能です。
子POAの生成に成功した場合は、trueを返します。
Servantの生成、登録を行います(ServantManager使用時)。
Servantのオペレーションを起動します。
オペレーションの実行結果を返します。