(1)IDL定義
module ODsample{
interface intf{
long add( in long a, in long b );
};
};(2)ネーミングサービスの登録
動的登録
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <stdlib.h>
#include <iostream>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::Object_var obj;
static CORBA::ORB_var orb;
static CORBA::Environment env;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
int main( int argc, char *argv[] )
{
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_NameService, env );
cos_naming = CosNaming::NamingContext::_narrow( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = (const CORBA::Char *)"ODsample::POAsample1";
name[0]->kind = (const CORBA::Char *)"";
obj = cos_naming->resolve( name, env );
// サーバアプリケーションのオブジェクトリファレンス獲得
ODsample::intf* obj2 = ODsample::intf::_narrow( obj );
// サーバアプリケーションのメソッド呼出し
CORBA::Long ret = obj2->add( 1, 2, env );
CORBA::release( obj2 );
}catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
}catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "poa.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
static PortableServer::POA_var rootPOA;
static PortableServer::POA_var childPOA;
static CORBA::PolicyList policies( 4 );
static PortableServer::POAManager_var poa_manager;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char*argv[] )
{
int current_argc = argc;
try{
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// インタフェース用のPOA作成
// ポリシリスト作成
policies.length( 4 );
policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
// Default Servant用のPOAオブジェクトの作成
childPOA = rootPOA->create_POA( "childPOA",
PortableServer::POAManager::_nil(), policies, env );
// Servantの生成
ODsample_intf_impl* svt = new ODsample_intf_impl();
// Default Servantに設定
childPOA->set_servant( svt, env );
CORBA::Object_var _bind_obj = childPOA->create_reference(
"IDL:ODsample/intf:1.0", env );
// ネーミングサービスのオブジェクトリファレンスの取得
CORBA::Object_var _tmpObj = orb->resolve_initial_references(
"NameService", env );
cos_naming = CosNaming::NamingContext::_narrow( _tmpObj );
// ネーミングサービスのresolveメソッドを発行し、サーバアプリケーションの
// オブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample1";
name[0]->kind = ( const CORBA::Char* )"";
try {
cos_naming->unbind( name, env );
} catch( CORBA::Exception& e ) {
;
}
cos_naming->bind( name, _bind_obj, env );
// POAマネージャの獲得
poa_manager = childPOA->the_POAManager( env );
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
// Servant:メソッド実装
CORBA::Long ODsample_intf_impl::add(
CORBA::Long a,
CORBA::Long b,
CORBA::Environment& env)
throw( CORBA::Exception ){
CORBA::Long result;
cout << "ODsample::intf::add()" << endl;
cout << " a : " << a << endl;
cout << " b : " << b << endl;
result = a + b;
cout << " result: " << result << endl;
return result;
};(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。
(1)IDL定義
module ODsample{
interface intf{
readonly attribute long value1;
void add( in long a );
void sub( in long b );
};
interface Factory {
intf create();
void destroy( in intf obj );
};
};(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/Factory:1.0 -a Imple_POAsample3 -n ODsample::POAsample3
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <stdlib.h>
#include <iostream>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::Object_var obj;
static CORBA::Environment env;
static CORBA::ORB_var orb;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
int main( int argc, char *argv[] )
{
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_NameService, env );
cos_naming = CosNaming::NamingContext::_narrow( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample3";
name[0]->kind = ( const CORBA::Char* )"";
obj = cos_naming->resolve( name, env );
// Factoryのオブジェクトリファレンス獲得
ODsample::Factory* target = ODsample::Factory::_narrow( obj );
// Factoryでインタフェース用オブジェクトリファレンス作成
ODsample::intf* obj2 = target->create( env );
CORBA::Long a = 10; // inパラメタ用変数
CORBA::Long b = 5;
// サーバアプリケーションのメソッド呼出し
CORBA::Long ret = obj2->value1( env );
printf( "value = %d\n", ret );
obj2->add( a, env );
printf( "add( %d )\n", a );
ret = obj2->value1( env );
printf( "value = %d\n", ret );
obj2->sub( b, env );
printf( "sub( %d )\n", b );
ret = obj2->value1( env );
printf( "value = %d\n", ret );
// インスタンスの解放
target->destroy( obj2, env );
CORBA::release( target );
CORBA::release( obj2 );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <stdlib.h>
#include <iostream>
#include "orb_cplus.h"
#include "simple.h"
#include "poa.h"
#include "CosNaming_cplus.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static PortableServer::POA_var rootPOA;
static PortableServer::POA_var factoryPOA;
static CORBA::PolicyList factory_policies( 4 );
static PortableServer::POAManager_var poa_manager;
static long val = 10;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char*argv[] )
{
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// Factoryインタフェース用のPOA作成
// ポリシリスト作成
factory_policies.length( 4 );
factory_policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
factory_policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
factory_policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
factory_policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
factoryPOA = rootPOA->create_POA( "IDL:ODsample/Factory:1.0",
PortableServer::POAManager::_nil(), factory_policies ,env);
// FactoryServantの生成
ODsample_Factory_impl* svt = new ODsample_Factory_impl();
// Factoryインタフェース用POAのDefault Servantに設定
factoryPOA->set_servant( svt, env );
// POAマネージャの獲得
poa_manager = rootPOA->the_POAManager( env );
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
// Factory_impl::create:Factoryメソッドの実装
ODsample::intf_ptr ODsample_Factory_impl::create(
CORBA::Environment& env )
throw( CORBA::Exception )
try{
// Servantの生成
ODsample_intf_impl* svt = new ODsample_intf_impl();
// Servantからオブジェクトリファレンスの生成
// IMPLICIT_ACTIVATIONポリシなので、AOMへ自動登録される
CORBA::Object_var _tmpObj = rootPOA->servant_to_reference( svt, env );
ODsample::intf_ptr ior = ODsample::intf::_narrow( _tmpObj );
return ior;
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// Factory_impl::destroy:Factoryメソッドの実装
void ODsample_Factory_impl::destroy(
ODsample::intf_ptr obj,
CORBA::Environment& env )
throw( CORBA::Exception )
{
try{
// オブジェクトリファレンスからオブジェクトIDを求める
PortableServer::ObjectId_var oid = rootPOA->reference_to_id( obj, env );
// Servantオブジェクトの取得
PortableServer::Servant svt = id_to_servant( *oid, env );
// Servantをdeactiveにする
rootPOA->deactivate_object( *oid, env );
// Servantの削除
svt->servant_delete();
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// ODsample::intf:メソッド実装クラス
void ODsample_intf_impl::add(
CORBA::Long a,
CORBA::Environment& env)
throw( CORBA::Exception ){
cout << "ODsample::intf::add()" << endl;
cout << " val : " << val << endl;
cout << " a : " << a << endl;
val = val + a;
cout << " result: " << val << endl;
};
void ODsample_intf_impl::sub(
CORBA::Long b,
CORBA::Environment& env)
throw( CORBA::Exception ){
cout << "ODsample::intf::sub()" << endl;
cout << " val : " << val << endl;
cout << " b : " << b << endl;
val = val - b;
cout << " result: " << val << endl;
};
CORBA::Long ODsample_intf_impl::value1(
CORBA::Environment& env)
throw( CORBA::Exception ){
return val;
};(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。
(1)IDL定義
module ODsample{
interface intf{
readonly attribute long value1;
void add( in long a );
void sub( in long b );
};
interface Factory {
intf create();
void destroy( in intf obj );
};
};(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/Factory:1.0 -a Imple_POAsample3 -n ODsample::POAsample3
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <stdlib.h>
#include <iostream>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::Object_var obj;
static CORBA::Environment env;
static CORBA::ORB_var orb;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
int main( int argc, char *argv[] )
{
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_NameService, env );
cos_naming = CosNaming::NamingContext::_narrow( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample3";
name[0]->kind = ( const CORBA::Char* )"";
obj = cos_naming->resolve( name, env );
// Factoryのオブジェクトリファレンス獲得
ODsample::Factory* target = ODsample::Factory::_narrow( obj );
// Factoryでインタフェース用オブジェクトリファレンスを作成する
ODsample::intf* obj2 = target->create( env );
CORBA::Long a = 10; // inパラメタ用変数
CORBA::Long b = 5;
// サーバアプリケーションのメソッド呼出し
CORBA::Long ret = obj2->value1( env );
printf( "value = %d\n", ret );
obj2->add( a, env );
printf( "add( %d )\n", a );
ret = obj2->value1( env );
printf( "value = %d\n", ret );
obj2->sub( b, env );
printf( "sub( %d )\n", b );
ret = obj2->value1( env );
printf( "value = %d\n", ret );
// インスタンスの解放
target->destroy( obj2, env );
CORBA::release( target );
CORBA::release( obj2 );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <iostream>
#include <stdlib.h>
#include "poa.h"
#include "CosNaming_cplus.h"
#include "orb_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static PortableServer::POA_var rootPOA;
static PortableServer::POA_var factoryPOA;
static PortableServer::POA_var childPOA;
static CORBA::PolicyList factory_policies( 4 );
static CORBA::PolicyList intf_policies( 4 );
static PortableServer::POAManager_var poa_manager;
static long val = 10;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char*argv[] )
{
int current_argc = argc;
try{
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// Factoryインタフェース用のPOA作成
// ポリシリスト作成
factory_policies.length( 4 );
factory_policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
factory_policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
factory_policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
factory_policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
factoryPOA = rootPOA->create_POA( "IDL:ODsample/Factory:1.0",
PortableServer::POAManager::_nil(), factory_policies ,env);
// インタフェース用のPOA作成
// ポリシリスト作成
intf_policies.length( 4 );
intf_policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::RETAIN, env );
intf_policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_SERVANT_MANAGER, env );
intf_policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
intf_policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
childPOA = rootPOA->create_POA( "childPOA",
PortableServer::POAManager::_nil(), intf_policies ,env );
// FactoryServantの生成
ODsample_Factory_impl* svt = new ODsample_Factory_impl();
// Factoryインタフェース用POAのDefault Servantに設定
factoryPOA->set_servant( svt, env );
// ServantActivatorの生成
PortableServer::ServantActivator_var svtact = new UserServantActivator();
// インタフェース用POAのServantManagerとして登録
childPOA->set_servant_manager( svtact, env );
// POAマネージャの獲得
poa_manager = rootPOA->the_POAManager( env );
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
// ODsample_Factory_impl::create:Factoryメソッド実装クラス
ODsample::intf_ptr ODsample_Factory_impl::create(
CORBA::Environment& env )
throw( CORBA::Exception )
{
try{
// オブジェクトリファレンスの生成
CORBA::Object_var _tmpObj
= childPOA->create_reference( "IDL:ODsample/intf:1.0", env );
ODsample::intf_ptr ior = ODsample::intf::_narrow( _tmpObj );
return ior;
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw( e );
}
};
// ODsample_Factory_impl::destroy:Factoryメソッド実装クラス
void ODsample_Factory_impl::destroy(
ODsample::intf_ptr obj,
CORBA::Environment& env )
throw( CORBA::Exception )
{
try{
// オブジェクトリファレンスからオブジェクトIDを求める
PortableServer::ObjectId_var oid = childPOA->reference_to_id( obj, env );
// Servantをdeactiveにする
childPOA->deactivate_object( *oid, env );
} catch( CORBA::Exception& e ) {
cout << "Exception: " << opname << endl;
cout << "exception-id: " << e.id() << endl;
throw( e );
}
};
// ServantActivator:Servant生成クラス(ServantActivatorを継承)
class UserServantActivator: public PortableServer::ServantActivator
{
public:
UserServantActivator() {};
~UserServantActivator() {};
PortableServer::Servant incarnate(
const PortableServer::ObjectId& oid,
PortableServer::POA_ptr adapter,
CORBA::Environment& env )
throw( CORBA::Exception )
{
// Servantの生成
PortableServer::Servant svt = new ODsample_intf_impl();
return( svt );
};
void etherealize( const PortableServer::ObjectId& oid,
PortableServer::POA_ptr adapter,
PortableServer::Servant serv,
CORBA::Boolean cleanup_in_progress,
CORBA::Boolean remaining_activations,
CORBA::Environment& env )
throw( CORBA::Exception )
{
// Servantオブジェクトの削除。
serv->servant_delete();
}
};
// ODsample_intf_impl:メソッド実装クラス
void ODsample_intf_impl::add(
CORBA::Long a,
CORBA::Environment& env)
throw( CORBA::Exception ){
cout << "ODsample::intf::add()" << endl;
cout << " val : " << val << endl;
cout << " a : " << a << endl;
val = val + a;
cout << " result: " << val << endl;
};
void ODsample_intf_impl::sub(
CORBA::Long b,
CORBA::Environment& env)
throw( CORBA::Exception ){
cout << "ODsample::intf::sub()" << endl;
cout << " val : " << val << endl;
cout << " b : " << b << endl;
val = val - b;
cout << " result: " << val << endl;
};
CORBA::Long ODsample_intf_impl::value1(
CORBA::Environment& env)
throw( CORBA::Exception ){
return val;
};(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。
(1)IDL定義
module ODsample{
interface intf{
readonly attribute long value1;
void add( in long a );
void sub( in long b );
};
interface Factory{
intf create( in string userid );
void destroy( in intf obj );
};
};(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/Factory:1.0 -a Imple_POAsample4 -n ODsample::POAsample4
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::Object_var obj;
static CORBA::Environment env;
static CORBA::ORB_var orb;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
int main( int argc, char* argv[] )
{
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_NameService, env );
cos_naming = CosNaming::NamingContext::_narrow( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample4";
name[0]->kind = ( const CORBA::Char* )"";
obj = cos_naming->resolve( name, env );
// サーバアプリケーションのインタフェースクラスの獲得
ODsample::Factory* target = ODsample::Factory::_narrow( obj );
char userid[1024];
printf( "USERID -> " );
userid[0] = 0;
scanf( "%s", userid );
if( strlen( userid ) < 1 ){
return 255;
}
// FactoryでインタフェースアプリのIORを作成する
ODsample::intf* obj2 = target->create( userid, env );
CORBA::Long a = 10;
CORBA::Long b = 5;
// サーバアプリケーションのメソッド呼出し
CORBA::Long ret = obj2->value1( env );
printf( "value = %d\n", ret );
obj2->add( a, env );
printf( "add( %d )\n", a );
ret = obj2->value1( env );
printf( "value = %d\n", ret );
obj2->sub( b, env );
printf( "sub( %d )\n", b );
ret = obj2->value1( env );
printf( "value = %d\n", ret );
target->destroy( obj2, env );
CORBA::release( target );
CORBA::release( obj2 );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "poa.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static PortableServer::POA_var rootPOA;
static PortableServer::POA_var factory_poa;
static PortableServer::POA_var childPOA;
static CORBA::PolicyList policies( 4 );
static CORBA::PolicyList inf_policies( 4 );
static PortableServer::POAManager_var poa_manager;
static CORBA::Long val = 10;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char*argv[] )
{
int current_argc = argc;
try{
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// Factoryインタフェース用のPOA作成
// ポリシリスト作成
policies.length( 4 );
policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
factory_poa = rootPOA->create_POA( "IDL:ODsample/Factory:1.0",
PortableServer::POAManager::_nil(), policies ,env);
// インタフェース用のPOA作成
// ポリシリスト作成
inf_policies.length( 4 );
inf_policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
inf_policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_SERVANT_MANAGER, env );
inf_policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::USER_ID, env );
inf_policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::UNIQUE_ID, env );
childPOA = rootPOA->create_POA( "childPOA",
PortableServer::POAManager::_nil(), inf_policies ,env);
// FactoryServantの生成
ODsample_Factory_impl* svt = new ODsample_Factory_impl();
// Factoryインタフェース用POAのDefault Servantに設定
factory_poa->set_servant( svt, env );
// ServantLocatorの生成
PortableServer::ServantLocator* svtloc = new UserServantLocator();
// インタフェース用POAにServantManagerとして登録
childPOA->set_servant_manager( svtloc, env );
// POAマネージャの獲得
poa_manager = rootPOA->the_POAManager( env );
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
// 管理テーブル
class ServantList
{
public:
ServantList() {
_next = NULL;
_svr = NULL;
_oid = NULL;
};
~ServantList() {
if( _svr != NULL ) {
_svr->servant_delete();
}
if( _oid != NULL ) {
delete _oid;
}
};
PortableServer::ObjectId* getObjectId() {
return _oid;
};
ServantList* getNext() {
return _next;
};
// 管理テーブルから検索
PortableServer::ServantBase* getServant( const PortableServer::ObjectId* oid ) {
if( _svr == NULL ) {
if( _next == NULL ) {
return NULL;
}
return _next->getServant( oid );
}
if( equal( oid ) ) {
return _svr;
}
if( _next ) {
return _next->getServant( oid );
}
return NULL;
};
long equal( const PortableServer::ObjectId* oid ) {
if( _oid == NULL ) {
return 0;
}
if( oid->length() == oid->length() ) {
long len = oid->length();
long i;
for( i = 0 ; i < len ; i++ ) {
if( oid->operator[](i) != _oid->operator[](i) ) {
return 0;
}
}
return 1;
}
return 0;
};
// 管理テーブルから削除
void remove( PortableServer::ObjectId* oid ) {
if( _next != NULL ) {
if( _next->equal( oid ) ) {
ServantList* del = _next;
_next = _next->getNext();
delete del;
}
}
};
// 管理テーブルへ追加
void put( const PortableServer::ObjectId* oid, PortableServer::ServantBase* svr ) {
if( _next != NULL ) {
_next->put( oid, svr );
} else {
_next = new ServantList();
_next->_svr = svr;
_next->_oid = new PortableServer::ObjectId( *oid );
}
};
private :
PortableServer::ObjectId* _oid;
PortableServer::ServantBase* _svr;
ServantList* _next;
};
// 管理テーブルのインスタンス
ServantList servant_list;
// ODsample_Factory_impl::create:メソッドの実装
ODsample::intf_ptr ODsample_Factory_impl::create(
const CORBA::Char* str,
CORBA::Environment& env)
throw( CORBA::Exception ){
try{
long len = strlen( str );
CORBA::Octet* buf = PortableServer::ObjectId::allocbuf( len );
memcpy( buf, str, len );
PortableServer::ObjectId_var userid = new PortableServer::ObjectId(
len, len, buf, CORBA_TRUE );
// オブジェクトリファレンスの生成
CORBA::Object_var _tmpObj = childPOA->create_reference_with_id( *userid,
"IDL:ODsample/intf:1.0",env );
ODsample::intf_ptr ior = ODsample::intf::_narrow( _tmpObj );
return ior;
} catch(CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// ODsample_Factory_impl::destroy:メソッドの実装
void ODsample_Factory_impl::destroy(
ODsample::intf_ptr obj,
CORBA::Environment& env)
throw( CORBA::Exception ){
try{
// オブジェクトリファレンスからオブジェクトIDを求める
PortableServer::ObjectId_var oid = childPOA->reference_to_id( obj, env );
// Servantを管理テーブルから削除
servant_list.remove( oid );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// ServantLocator:Servant生成クラス(ServantLocatorを継承)
class UserServantLocator: public PortableServer::ServantLocator
{
public:
UserServantLocator() {};
~UserServantLocator() {};
PortableServer::Servant preinvoke(
const PortableServer::ObjectId& oid,
PortableServer::POA_ptr adapter,
const CORBA::Identifier operation,
PortableServer::ServantLocator::Cookie& cookie,
CORBA::Environment& = CORBA::Environment() )
throw( CORBA::Exception )
{
// Servantを検索する。みつからなければnewで生成する。
PortableServer::Servant svt = servant_list.getServant( &oid );
if( svt == NULL ) {
svt = new ODsample_intf_impl();
servant_list.put( &oid, svt );
}
// Cookieの作成
cookie = ( CORBA::ULong )svt;
return svt;
};
void postinvoke(
const PortableServer::ObjectId& oid,
PortableServer::POA_ptr adapter,
const CORBA::Identifier operation,
PortableServer::ServantLocator::Cookie cookie,
PortableServer::Servant the_servant,
CORBA::Environment& = CORBA::Environment() )
throw( CORBA::Exception )
{
};
};
// ODsample_intf_implクラスのメソッド実装
void ODsample_intf_impl::add(
CORBA::Long a,
CORBA::Environment& env )
throw( CORBA::Exception )
{
cout << "ODsample::intf::add()" << endl;
cout << " value : " << val << endl;
cout << " a : " << a << endl;
val = val + a;
cout << " result: " << val << endl;
};
void ODsample_intf_impl::sub(
CORBA::Long b,
CORBA::Environment& env )
throw( CORBA::Exception )
{
cout << "ODsample::intf::sub()" << endl;
cout << " value : " << val << endl;
cout << " b : " << b << endl;
val = val - b;
cout << " result: " << val << endl;
};
CORBA::Long ODsample_intf_impl::value1(
CORBA::Environment& env )
throw( CORBA::Exception )
{
return val;
};(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。
(1)IDL定義
module ODsample{
interface intf1{
attribute string value1;
};
interface intf2{
readonly attribute long value1;
void add( in long a );
void sub( in long b );
};
interface Factory {
intf1 create1 ();
intf2 create2 ();
void destroy1( in intf1 obj );
void destroy2( in intf2 obj );
};
};(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/Factory:1.0 -a Imple_POAsample9 -n ODsample::POAsample9
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <stdlib.h>
#include <iostream>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::Object_var obj;
static CORBA::Environment env;
static CORBA::ORB_var orb;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
int main( int argc, char* argv[] )
{
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( CORBA_ORB_ObjectId_NameService, env );
cos_naming = CosNaming::NamingContext::_narrow( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample9";
name[0]->kind = ( const CORBA::Char* )"";
obj = cos_naming->resolve( name, env );
// Factoryのオブジェクトリファレンス獲得
ODsample::Factory* target = ODsample::Factory::_narrow( obj );
// Factoryでインタフェース1用オブジェクトリファレンスを作成する
ODsample::intf1* obj2 = target->create1( env );
printf( "String = " );
char buffer[1024];
buffer[0] = 0;
scanf( "%s", buffer );
// サーバアプリケーションのメソッド呼出し
obj2->value1( buffer, env );
printf( "String = %s\n", obj2->value1( env ) );
// インスタンスの解放
target->destroy1( obj2, env );
// Factoryでインタフェース2用オブジェクトリファレンスを作成する
ODsample::intf2* obj3 = target->create2( env );
// サーバアプリケーションのメソッド呼出し
printf( "value = %d\n", obj3->value1( env ) );
CORBA::Long val;
printf( "add =>" );
scanf( "%d", &val );
obj3->add( val, env );
printf( " value = %d\n", obj3->value1( env ) );
printf( "sub =>");
scanf( "%d", &val );
obj3->sub( val, env );
printf( " value = %d\n", obj3->value1( env ) );
// インスタンスの解放
target->destroy2( obj3, env );
CORBA::release( target );
CORBA::release( obj2 );
CORBA::release( obj3 );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "poa.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static PortableServer::POA_var rootPOA;
static PortableServer::POA_var factoryPOA;
static CORBA::PolicyList policies( 4 );
static PortableServer::POAManager_var poa_manager;
static CORBA::Char* Str_value = NULL;
static CORBA::Long Ln_value = 20;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char* argv[] )
{
int current_argc = argc;
try{
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// Factoryインタフェース用のPOA作成
// ポリシリスト作成
policies.length( 4 );
policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
factoryPOA = rootPOA->create_POA(
"IDL:ODsample/Factory:1.0",
PortableServer::POAManager::_nil(),
policies,
env );
// FactoryServantの生成(コンストラクタにインプリ用POAを渡す)
ODsample_Factory_impl* svt = new ODsample_Factory_impl();
// Factoryインタフェース用POAのDefault Servantに設定
factoryPOA->set_servant( svt, env );
// AdapterActivatorの生成
PortableServer::AdapterActivator_var adp = new UserAdapterActivator();
// インプリ用POAのAdapterActivatorに設定
rootPOA->the_activator( adp, env );
// POAマネージャの獲得
poa_manager = factoryPOA->the_POAManager( env );
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
// ODsample_Factory_impl::create1:メソッドの実装
ODsample::intf1_ptr ODsample_Factory_impl::create1(
CORBA::Environment& env )
throw( CORBA::Exception )
{
try{
// インタフェースリポジトリIDに対応するのPOAオブジェクト獲得
PortableServer::POA_var poa = rootPOA->find_POA( "intf1", CORBA_TRUE, env );
// オブジェクトリファレンスの生成
CORBA::Object_var _tmpObj = poa->create_reference( "IDL:ODsample/intf1:1.0", env );
ODsample::intf1_ptr ior = ODsample::intf1::_narrow( _tmpObj );
return ior;
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// ODsample_Factory_impl::create2:メソッドの実装
ODsample::intf2_ptr ODsample_Factory_impl::create2(
CORBA::Environment& env )
throw( CORBA::Exception )
{
try{
// インタフェースリポジトリIDに対応するのPOAオブジェクト獲得
PortableServer::POA_var poa = rootPOA->find_POA( "intf2", CORBA_TRUE, env );
// オブジェクトリファレンスの生成
CORBA::Object_var _tmpObj = poa->create_reference( "IDL:ODsample/intf2:1.0", env );
ODsample::intf2_ptr ior = ODsample::intf2::_narrow( _tmpObj );
return ior;
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// ODsample_Factory_impl::destroy1:メソッドの実装
void ODsample_Factory_impl::destroy1(
ODsample::intf1_ptr obj,
CORBA::Environment& env )
throw( CORBA::Exception )
{
try{
// インタフェースIDに対応するのPOAオブジェクト獲得
PortableServer::POA_var poa = rootPOA->find_POA( "intf1", CORBA_TRUE, env );
// オブジェクトリファレンスからオブジェクトIDを求める
PortableServer::ObjectId_var oid = poa->reference_to_id( obj, env );
// Servantをdeactiveにする
poa->deactivate_object( *oid, env );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// ODsample_Factory_impl::destroy2:メソッドの実装
void ODsample_Factory_impl::destroy2(
ODsample::intf2_ptr obj,
CORBA::Environment& env )
throw( CORBA::Exception )
{
try{
// インタフェースIDに対応するのPOAオブジェクト獲得
PortableServer::POA_var poa = rootPOA->find_POA( "intf2", CORBA_TRUE, env );
// オブジェクトリファレンスからオブジェクトIDを求める
PortableServer::ObjectId_var oid = poa->reference_to_id( obj, env );
// Servantをdeactiveにする
poa->deactivate_object( *oid, env );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
// AdapterActivator:POA生成クラス(AdapterActivatorを継承)
class UserAdapterActivator : public PortableServer::AdapterActivator
{
public:
UserAdapterActivator() {};
~UserAdapterActivator() {};
CORBA::Boolean unknown_adapter(
PortableServer::POA_ptr parent,
const CORBA::Char* name,
CORBA::Environment& env )
throw( CORBA::Exception )
{
// ポリシリスト作成
CORBA::PolicyList policies( 4 );
policies.length( 4 );
policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::RETAIN, env );
policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_SERVANT_MANAGER, env );
policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer:: MULTIPLE_ID, env );
// ServantActivatorの生成
PortableServer::ServantActivator_ptr svtact = new UserServantActivator();
try {
if( !strcmp( name, "intf1" ) ) {
// intf1用のPOA作成
PortableServer::POA_ptr intf1POA
= parent->create_POA( name, NULL, policies, env );
// ServantManager登録
intf1POA->set_servant_manager( svtact , env );
return( CORBA_TRUE );
}
else if( !strcmp( name, "intf2" ) ) {
// intf2用のPOA作成
PortableServer::POA_ptr intf2POA
= parent->create_POA( name, NULL, policies, env );
// ServantManager登録
intf2POA->set_servant_manager( svtact , env );
return( CORBA_TRUE );
}
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
return( CORBA_FALSE );
} catch( CORBA::UserException& ue ) {
cout << "exception-id: " << ue.id() << endl;
return( CORBA_FALSE );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
return( CORBA_FALSE );
}
return CORBA_TRUE;
};
};
// ServantActivator:Servant生成クラス(ServantActivatorを継承)
class UserServantActivator : public PortableServer::ServantActivator
{
public:
UserServantActivator() {};
~UserServantActivator() {};
PortableServer::Servant incarnate(
const PortableServer::ObjectId& oid,
PortableServer::POA_ptr adapter,
CORBA::Environment& env )
throw( CORBA::Exception )
{
PortableServer::Servant svt = NULL;
CORBA::Char* name = adapter->the_name( env );
if( !strcmp( name, "intf1" ) ) {
svt = new ODsample_intf1_impl();
} else if( !strcmp( name, "intf2" ) ) {
svt = new ODsample_intf2_impl();
} else {
CORBA::StExcep::BAD_PARAM ex;
throw ex;
}
CORBA::string_free( name );
return( svt );
};
void etherealize(
const PortableServer::ObjectId& oid,
PortableServer::POA_ptr adapter,
PortableServer::Servant serv,
CORBA::Boolean cleanup_in_progress,
CORBA::Boolean remaining_activations,
CORBA::Environment& env )
throw( CORBA::Exception )
{
serv->servant_delete();
}
};
// メソッドの実装
void ODsample_intf1_impl::value1(
const CORBA::Char* a,
CORBA::Environment& env )
throw( CORBA::Exception )
{
cout << "ODsample::intf1::value(Char*)" << endl;
cout << " value : " << a << endl;
if( Str_value != NULL ) {
CORBA::string_free( Str_value );
}
Str_value = CORBA::string_alloc( strlen( a ) + 1 );
strcpy( Str_value, a );
};
CORBA::Char* ODsample_intf1_impl::value1(
CORBA::Environment& env )
throw( CORBA::Exception )
{
if( Str_value == NULL ) {
Str_value = CORBA::string_alloc( 1 );
Str_value[0] = 0;
}
CORBA::Char* ret = CORBA::string_alloc( strlen( Str_value ) + 1 );
strcpy( ret, Str_value );
return ret;
};
CORBA::Long ODsample_intf2_impl::value1(
CORBA::Environment& env )
throw( CORBA::Exception )
{
return Ln_value;
};
void ODsample_intf2_impl::add(
CORBA::Long a,
CORBA::Environment& env )
throw( CORBA::Exception )
{
cout << "ODsample::intf2::add()" << endl;
cout << " value : " << Ln_value << endl;
cout << " a : " << a << endl;
Ln_value = Ln_value + a;
cout << " result: " << Ln_value << endl;
};
void ODsample_intf2_impl::sub(
CORBA::Long b,
CORBA::Environment& env )
throw( CORBA::Exception )
{
cout << "ODsample::intf2::sub()" << endl;
cout << " value : " << Ln_value << endl;
cout << " b : " << b << endl;
Ln_value = Ln_value - b;
cout << " result: " << Ln_value << endl;
};(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。
(1)IDL定義
module ODsample{
interface intf1{
long add( in long a, in long b );
};
interface intf2{
long sub( in long a, in long b );
};
};(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/intf1:1.0 -a Imple_POAsample10 -n ODsample::POAsample10-1 OD_or_adm -c IDL:ODsample/intf2:1.0 -a Imple_POAsample10 -n ODsample::POAsample10-2
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <stdlib.h>
#include <iostream>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::Object_var obj;
static CORBA::Environment env;
static CORBA::ORB_var orb;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
static CosNaming::Name name2;
int main( int argc, char* argv[] )
{
CORBA::Long val1 = 0; // inパラメタ用変数
CORBA::Long val2 = 0; // inパラメタ用変数
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( CORBA_ORB_ObjectId_NameService, env );
cos_naming = CosNaming::NamingContext::_narrow( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample10-1";
name[0]->kind = ( const CORBA::Char* )"";
obj = cos_naming->resolve( name, env );
// サーバアプリケーションのオブジェクトリファレンス獲得
ODsample::intf1* target1 = ODsample::intf1::_narrow( obj );
printf( "val1=>" );
scanf( "%d", &val1 );
printf( "val2=>" );
scanf( "%d", &val2 );
// サーバアプリケーションのメソッド呼出し
CORBA::Long ret1 = target1->add( val1, val2, env );
// メソッドの結果表示
printf( "val1 + val2 = %d\n", ret1 );
CORBA::release( target1 );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name2.length( 1 );
name2[0]->id = ( const CORBA::Char* )"ODsample::POAsample10-2";
name2[0]->kind = ( const CORBA::Char* )"";
obj = cos_naming->resolve( name2, env );
// サーバアプリケーションのオブジェクトリファレンス獲得
ODsample::intf2* target2 = ODsample::intf2::_narrow( obj );
printf( "val1=>" );
scanf( "%d", &val1 );
printf( "val2=>" );
scanf( "%d", &val2 );
// サーバアプリケーションのメソッド呼出し
CORBA::Long ret2 = target2->sub( val1, val2, env );
// メソッドの結果表示
printf( "val1 - val2 = %d\n", ret2 );
CORBA::release( target2 );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "poa.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static PortableServer::POA_var rootPOA;
static CORBA::PolicyList policies( 4 );
static PortableServer::POAManager_var poa_manager;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char* argv[] )
{
int current_argc = argc;
try{
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// AdapterActivatorの生成
PortableServer::AdapterActivator_var adp = new UserAdapterActivator();
// インプリ用POAのAdapterActivatorに設定
rootPOA->the_activator( adp, env );
// POAマネージャの獲得
poa_manager = rootPOA->the_POAManager( env );
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
// AdapterActivator:POA生成クラス(AdapterActivatorを継承)
class UserAdapterActivator : public PortableServer::AdapterActivator
{
public:
UserAdapterActivator() {};
~UserAdapterActivator() {};
CORBA::Boolean unknown_adapter(
PortableServer::POA_ptr parent,
const CORBA::Char* name,
CORBA::Environment& env )
throw( CORBA::Exception )
{
// ポリシリスト作成
CORBA::PolicyList policies( 4 );
policies.length( 4 );
policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
try {
if( !strcmp( name, "IDL:ODsample/intf1:1.0" ) ) {
// intf1用のPOA作成
PortableServer::POA_ptr intf_POA
= parent->create_POA( name, NULL, policies, env );
// Servantの生成
ODsample_intf1_impl* svt = new ODsample_intf1_impl();
// Default Servantに設定
intf_POA->set_servant( svt, env );
return( CORBA_TRUE );
}
else if( !strcmp( name, "IDL:ODsample/intf2:1.0" ) ) {
// intf2用のPOA作成
PortableServer::POA_ptr intf_POA
= parent->create_POA( name, NULL, policies, env );
// Servantの生成
ODsample_intf2_impl* svt = new ODsample_intf2_impl();
// Default Servantに設定
intf_POA->set_servant( svt, env );
return( CORBA_TRUE );
}
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
return( CORBA_FALSE );
} catch( CORBA::UserException& ue ) {
cout << "exception-id: " << ue.id() << endl;
return( CORBA_FALSE );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
return( CORBA_FALSE );
}
return CORBA_TRUE;
};
};
// メソッド実装
CORBA::Long ODsample_intf1_impl::add(
CORBA::Long a,
CORBA::Long b,
CORBA::Environment& env )
throw( CORBA::Exception )
{
return a + b;
};
CORBA::Long ODsample_intf2_impl::sub(
CORBA::Long a,
CORBA::Long b,
CORBA::Environment& env )
throw( CORBA::Exception )
{
return a - b;
};(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。
(1)IDL定義
module ODsample{
interface intf{
long add( in long a, in long b );
};
};(2)ネーミングサービスの登録
動的登録
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <stdlib.h>
#include <iostream>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::Object_var obj;
static CORBA::ORB_var orb;
static CORBA::Environment env;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
int main( int argc, char* argv[] )
{
try {
// ORBの生成と初期化
orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_NameService, env );
cos_naming = CosNaming::NamingContext::_narrow( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample1";
name[0]->kind = ( const CORBA::Char* )"";
obj = cos_naming->resolve( name, env );
// サーバアプリケーションのオブジェクトリファレンス獲得
ODsample::intf* obj2 = ODsample::intf::_narrow( obj );
CORBA::Long a; // inパラメタ用変数
CORBA::Long b; // inパラメタ用変数
CORBA::Long ret; // 復帰値用変数
printf( " a => " );
scanf( "%d", &a );
printf( " b => " );
scanf( "%d", &b );
// サーバアプリケーションのメソッド呼出し
ret = obj2->add( a, b, env );
// メソッドの結果表示
printf( " a + b = %d", ret );
CORBA::release( obj2 );
}catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
}catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "poa.h"
#include "CosNaming_cplus.h"
#include "simple.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static CosNaming::NamingContext_var cos_naming;
static CosNaming::Name name;
static PortableServer::POA_var rootPOA;
static PortableServer::POA_var childPOA;
static CORBA::PolicyList policies( 4 );
static PortableServer::POAManager_var poa_manager;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char*argv[] )
{
int current_argc = argc;
try{
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// インタフェース用のPOA作成
// ポリシリスト作成
policies.length( 4 );
policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
// Default Servant用のPOAオブジェクトの作成
childPOA = rootPOA->create_POA( "childPOA",
PortableServer::POAManager::_nil(), policies, env );
// tieオブジェクト作成とユーザクラスの登録
PortableServer::Servant svt = _ct_ODsample_intf();
// POAのDefault Servantに設定
childPOA->set_servant( svt, env );
CORBA::Object_var _bind_obj = childPOA->create_reference( "IDL:ODsample/intf:1.0", env );
// ネーミングサービスのオブジェクトリファレンスの取得
CORBA::Object_var _tmpObj = orb->resolve_initial_references( "NameService", env );
cos_naming = CosNaming::NamingContext::_narrow( _tmpObj );
// サーバアプリケーションのオブジェクトリファレンスの獲得
name.length( 1 );
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample1";
name[0]->kind = ( const CORBA::Char* )"";
try{
cos_naming->unbind( name, env );
} catch( CORBA::Exception& e ) {
;
}
cos_naming->bind( name, _bind_obj, env );
// POAマネージャの獲得
poa_manager = childPOA->the_POAManager( env );
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
//ユーザクラス(インタフェース実装クラス)
class UserServant
{
public:
UserServant(){};
~UserServant(){};
CORBA::Long add(
CORBA::Long a,
CORBA::Long b,
CORBA::Environment& env )
throw( CORBA::Exception )
{
CORBA::Long result;
cout << "ODsample::intf::add()" << endl;
cout << " a : " << a << endl;
cout << " b : " << b << endl;
result = a + b;
cout << " result: " << result << endl;
return result;
};
};
POA_ODsample_intf* _ct_ODsample_intf()
{
// ユーザクラスのインスタンス生成
UserServant* impl = new UserServant();
// tieオブジェクト作成とユーザクラスの登録
POA_ODsample_intf_tie<UserServant>* tie =
new POA_ODsample_intf_tie<UserServant>( impl );
return tie;
};(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。
(1)IDL定義
module ODsample{
interface intf{
readonly attribute long value1;
void add( in long a );
void sub( in long b );
};
interface Factory {
intf create( in string username );
void destroy( in intf obj );
};
};(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/Factory:1.0 -a Imple_POAsample5 -n ODsample::POAsample5
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "CosNaming_cplus.h"
#include "simple.h"
#include <string.h>
using std::cin;
using std::cout;
using std::endl;
int main( int argc, char *argv[] )
{
CORBA::Environment env;
try {
// ORBの生成と初期化
CORBA::ORB_ptr orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env );
// ネーミングサービスのオブジェクトリファレンスの取得
CORBA::Object_ptr obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_NameService, env );
CosNaming::NamingContext_ptr ctx = CosNaming::NamingContext::_narrow( obj );
CORBA::release( obj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
CosNaming::Name name;
name.length(1);
name[0]->id = ( const CORBA::Char* )"ODsample::POAsample5";
name[0]->kind = ( const CORBA::Char* )"";
obj = ctx->resolve( name, env );
// Factoryのオブジェクトリファレンスの獲得
ODsample::Factory_ptr factory = ODsample::Factory::_narrow( obj );
CORBA::release( obj );
// ユーザIDの入力
char _username[128];
cout << "input your name => ";
cin >> _username;
// Factoryでインタフェース用オブジェクトリファレンス作成
ODsample::intf_ptr target = factory->create( _username );
// サーバアプリケーションのメソッド呼出し
cout << "value = " << target->value1() << endl;
cout << "add => ";
CORBA::Long a;
cin >> a;
target->add( a );
cout << "value = " << target->value1() << endl;
cout << "sub => ";
CORBA::Long b;
cin >> b;
target->sub( b );
cout << "value = " << target->value1() << endl;
CORBA::release( factory );
CORBA::release( target );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}(5)サーバアプリケーション
#include <iostream>
#include <stdlib.h>
#include "orb_cplus.h"
#include "simple.h"
#include "poa.h"
#include "CosNaming_cplus.h"
using std::cout;
using std::endl;
static CORBA::ORB_var orb;
static CORBA::Object_var obj;
static CORBA::Environment env;
static PortableServer::POA_var rootPOA;
static PortableServer::POA_var factoryPOA;
static CORBA::PolicyList factory_policies;
static PortableServer::POAManager_var poa_manager;
// ユーザアプリケーション:メイン処理クラス
int main( int argc, char*argv[] )
{
int current_argc = argc;
try{
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAのPOAオブジェクト獲得
rootPOA = PortableServer::POA::_narrow( obj );
// Factoryインタフェース用のPOA作成
// ポリシリスト作成
factory_policies.length( 4 );
factory_policies[0] = rootPOA->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
factory_policies[1] = rootPOA->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
factory_policies[2] = rootPOA->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
factory_policies[3] = rootPOA->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
factoryPOA = rootPOA->create_POA( "IDL:ODsample/Factory:1.0",
PortableServer::POAManager::_nil(), factory_policies ,env);
// FactoryServantの生成
PortableServer::Servant svt = _ct_ODsample_Factory( rootPOA );
// Factoryインタフェース用POAをDefault Servantに設定
factoryPOA->set_servant( svt, env );
// POAマネージャの獲得
poa_manager = rootPOA->the_POAManager( env );
// インスタンス解放処理の登録
PortableServer::POAdiconnect::setDisconnect(new instrelease());
// POAマネージャのactivate
poa_manager->activate( env );
orb->run( env );
} catch( CORBA::SystemException& se ) {
cout << "exception-id: " << se.id() << endl;
exit(1);
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
exit(1);
}
return 0;
}
// FactoryServant:Factoryメソッド実装クラス
class FactoryServant
{
public :
// コンストラクタ
FactoryServant(
PortableServer::POA_ptr poa )
{
_poa = poa;
}
~FactoryServant()
{
CORBA::release( _poa );
}
ODsample::intf_ptr create(
const CORBA::Char *username,
CORBA::Environment& env )
throw( CORBA::Exception )
{
if( !_poa ) return NULL;
ODsample::intf_ptr _ior = NULL;
try{
if( servant_list == NULL ){
servant_list = new ServantList();
}
// Servantの検索
PortableServer::ServantBase *_svt = servant_list->get( username );
// みつからない場合、Servantを作成(guestは毎回作成)
if( !_svt ){
_svt = _ct_ODsample_intf( username );
servant_list->put( username, _svt );
if( 100 < servant_list->length()){
PortableServer::POAdisconnect::setDisconnect(new ALLinstrelease());
}
}
// Servantからオブジェクトリファレンスの生成
// IMPLICIT_ACTIVATIONポリシを指定しているので、AOMへ自動登録される
CORBA::Object_ptr _obj = _poa->servant_to_reference( _svt, env );
_ior = ODsample::intf::_narrow( _obj );
CORBA::release( _obj );
} catch( CORBA::Exception &e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
return _ior;
};
void destroy(
ODsample::intf_ptr obj,
CORBA::Environment& env )
throw( CORBA::Exception )
{
if( !_poa ) return;
try{
// オブジェクトリファレンスからオブジェクトIDを求める
PortableServer::ObjectId_var _oid = _poa->reference_to_id( obj, env );
// オブジェクトIDからServantを求める
PortableServer::Servant _svt = _poa->id_to_servant( *_oid, env );
// Servantをdeactiveにする
_poa->deactivate_object( *_oid, env );
// Servantの削除
_svt->servant_delete();
} catch( CORBA::Exception& e ) {
cout << "exception-id: " << e.id() << endl;
throw e;
}
};
private :
FactoryServant() {}
PortableServer::POA_ptr _poa;
};
// FactoryServantをtieオブジェクトに関連付けるためのメソッド(delegate方式の場合)
POA_ODsample_Factory* _ct_ODsample_Factory(
PortableServer::POA_ptr poa )
{
FactoryServant* impl = new FactoryServant( poa );
POA_ODsample_Factory_tie< FactoryServant >* tie
= new POA_ODsample_Factory_tie< FactoryServant >( impl );
return tie;
}
// Servant:メソッド実装クラス(スケルトンを継承)
class UserServant
{
public :
UserServant(
const CORBA::Char *username )
{
_username = new char[ strlen(username) + 1 ];
strcpy( _username, username );
_val = 10;
}
~UserServant()
{
if( _username )
delete [] _username;
}
void add(
CORBA::Long a,
CORBA::Environment& env)
throw( CORBA::Exception )
{
cout << "ODsample::intf::add()" << endl;
cout << " val : " << _val << endl;
cout << " a : " << a << endl;
_val = _val + a;
cout << " result: " << _val << endl;
}
void sub(
CORBA::Long b,
CORBA::Environment& env)
throw( CORBA::Exception )
{
cout << "ODsample::intf::sub()" << endl;
cout << " val : " << _val << endl;
cout << " b : " << b << endl;
_val = _val - b;
cout << " result: " << _val << endl;
}
CORBA::Long value1(
CORBA::Environment& env)
throw( CORBA::Exception )
{
return _val;
}
const char *name()
{
return _username;
}
private :
UserServant() {}
char *_username;
long _val;
};
// UserServantをtieオブジェクトに関連付けるためのメソッド(delegate方式の場合)
POA_ODsample_intf *_ct_ODsample_intf(
const CORBA::Char *username )
{
UserServant* impl = new UserServant( username );
POA_ODsample_intf_tie< UserServant >* tie
= new POA_ODsample_intf_tie< UserServant >( impl );
return tie;
}
// 条件付きインスタンス解放クラス(POAdisconnectを継承)
class instrelease : public virtual PortableServer::POAdisconnect
{
public :
instrelease() {}
~instrelease() {}
CORBA::Boolean release_instance(
PortableServer::POA_ptr poa,
PortableServer::ServantBase *svt,
PortableServer::ObjectId& oid,
CORBA::Environment& env )
{
cout << "instrelease::release_instance called..." << endl;
POA_ODsample_intf_tie< UserServant >* _tie
= dynamic_cast< POA_ODsample_intf_tie< UserServant >* >( svt );
UserServant* _svt = _tie->_tied_object();
cout << " servant->name : " << _svt->name() << endl;
if( !strcmp( _svt->name(), "guest" )){
ServantList::remove( servant_list, "guest" );
return true;
}
return false;
}
};
// 無条件インスタンス解放クラス(POAdisconnectを継承)
class ALLinstrelease : public virtual PortableServer::POAdisconnect
{
public :
ALLinstrelease() {}
~ALLinstrelease() {}
CORBA::Boolean release_instance(
PortableServer::POA_ptr poa,
PortableServer::ServantBase *svt,
PortableServer::ObjectId& oid,
CORBA::Environment& env )
{
cout << "ALLinstrelease::release_instance called..." << endl;
POA_ODsample_intf_tie< UserServant >* _tie
= dynamic_cast< POA_ODsample_intf_tie< UserServant >* >( svt );
UserServant* _svt = _tie->_tied_object();
cout << " servant->name : " << _svt->name() << endl;
ServantList::remove( servant_list, _svt->name());
return true;
}
};
// Servant管理テーブル
class ServantList
{
public:
ServantList()
{
_svt = NULL;
_username = NULL;
_next = NULL;
};
ServantList(
const CORBA::Char *username,
PortableServer::ServantBase *svt )
{
_username = new char[ strlen(username) + 1];
strcpy( _username, username );
_svt = svt;
_next = NULL;
};
~ServantList()
{
if( _username )
delete [] _username;
if( _next )
delete _next;
};
PortableServer::ServantBase *get(
const CORBA::Char *username )
{
if( !username || !_username )
return NULL;
if( !strcmp( username, _username )){
return _svt;
}
if( _next )
return _next->get(username);
return NULL;
}
void put(
const CORBA::Char *username,
PortableServer::ServantBase *svt )
{
if( _next != NULL ){
_next->put( username, svt );
}
else{
if( _svt == NULL ){
_svt = svt;
_username = new char[ strlen(username) + 1];
strcpy( _username, username );
}
else{
_next = new ServantList( username, svt );
}
}
}
static void remove(
ServantList *&list,
const CORBA::Char *username )
{
ServantList *_back = NULL;
for( ServantList *_list = list; _list; _list = _list->_next ){
if( !strcmp( _list->_username, username )){
if( _back ){
_back->_next = _list->_next;
}
else{
list = _list->_next;
}
_list->_next = NULL;
delete _list;
break;
}
_back = _list;
}
return;
}
int length()
{
ServantList *_p = _next;
int _count = 1;
while( _p ){
_p = _p->_next;
++_count;
}
return _count;
}
private :
PortableServer::ServantBase *_svt;
char *_username;
ServantList *_next;
};
// 管理テーブルのインスタンス
ServantList *servant_list = NULL;(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法の詳細については、“4.2.2 サーバアプリケーションの例外処理”を参照してください。