Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第11章 CORBAアプリケーションの高度な使い方> 11.1 Factory

11.1.1 サーバアプリケーションのプログラミング

 Factoryインタフェースによるオブジェクトリファレンスの作成方法について説明します。

(1) サーバの初期化/活性化

 インタフェース情報およびインプリメンテーション情報を獲得し、オブジェクトリファレンスを作成します。

  1. 初期化
     CORBA::ORB_init()、CORBA::ORB::BOA_init()によりサーバの初期化を行います。
  2. インプリメンテーション情報の獲得
     Factoryインタフェースのインプリメンテーション情報を獲得します。FJ::ImplementationRep::lookup_id()でFactoryインタフェースのインプリメンテーションリポジトリID("_IMPL_モジュール名_factory")を指定します。
  3. インタフェース情報の獲得
     Factory以外のインタフェース情報を獲得します。
  4. サーバの活性化
     2.で獲得したインプリメンテーション情報を指定してCORBA::BOA::impl_is_ready()またはCORBA::BOA::obj_is_ready()を発行します。これにより、IDLに定義されたすべてのインタフェースが活性化されます。
    boa->impl_is_ready( impl, env );

 ここでは、main関数でインプリメンテーション情報/インタフェース情報を獲得する例を示します。

  static  CORBA::ORB_ptr                orb; 
  static  CORBA::BOA_ptr                boa; 
  static  CORBA::Repository_ptr         intf_rep; 
  static  FJ::ImplementationRep_ptr     impl_rep; 
  static  CORBA::InterfaceDef_ptr       intf1; 
  static  CORBA::ImplementationDef_ptr  impl; 
  static  CORBA::Object_ptr             o; 
  static  CORBA::Environment            env; 
  CORBA::ReferenceData                  id; 

  int
  main( int argc, char *argv[] ) 
  {
        int        current_argc = argc; 
        char       buf[128]; 

        // 初期化処理
        orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env ); 
        boa = orb->BOA_init( current_argc, argv, CORBA_BOA_OAid, env ); 

        // インプリメンテーション情報の獲得
        o = orb->resolve_initial_references(
                CORBA_ORB_ObjectId_ImplementationRepository, env ); 
        impl_rep = FJ::ImplementationRep::_narrow( o ); 
        o = impl_rep->lookup_id( _IMPL_ODsample_factory, env ); 
        impl = CORBA::ImplementationDef::_narrow( o ); 

        // インタフェース情報の獲得
        o = orb->resolve_initial_references(
                CORBA_ORB_ObjectId_LightInterfaceRepository, env ); 
        intf_rep = CORBA::Repository::_narrow( o ); 
        o = intf_rep->lookup_id( _INTF_ODsample_intf1, env ); 
        intf1 = CORBA::InterfaceDef::_narrow( o ); 

        // サーバの活性化
        boa->impl_is_ready( impl, env ); 
  }

(2) Factoryインタフェースの実装関数

 前項で獲得したインプリメンテーション情報およびインタフェース情報を使用して、CORBA::BOA::create()でオブジェクトリファレンスを作成します。

  // create_obj メソッドの実装
  ODsample::intf1_ptr 
  ODsample_factory_impl::create_obj( CORBA::Environment &env ) 
        throw( CORBA::Exception ) 
  {
        // BOA::create関数を使用して、オブジェクトリファレンスを作成します。
        CORBA::Object_ptr new_obj = boa->create( id, intf1,  impl, env ); 
        ODsample::intf1_ptr fac = ODsample::intf1::_narrow( new_obj ); 
        CORBA::release( new_obj ); 
        return( fac ); 
  }

(3) ネーミングサービスへの登録

 ネーミングサービスにはFactoryインタフェースのオブジェクトリファレンスを登録するため、OD_or_admコマンドを実行します。-cオプションではFactoryインタフェースのインタフェースリポジトリIDを指定します。

  OD_or_adm -c IDL:ODsample/factory:1.0 -n ODsample::factory

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005