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

第9章 ネーミングサービスのプログラミング> 9.7 ネーミングサービスのプログラミング例

9.7.2 コンテキスト配下のオブジェクトの登録

 ネーミングサービスで、以下のようにネーミングコンテキスト配下にオブジェクトが格納されている場合に、オブジェクトリファレンスをどのように登録するかについて説明します

 OBJECT_Bを登録するプログラムの例を以下に示します。

(1)C言語のプログラミング例

 ORBインタフェースのオブジェクトリファレンスを取り出すCORBA_ORB_resolve_initial_references()により、ネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、CORBA_ORB_ObjectId_NameServiceを指定します。
 次に、シーケンスCosNaming_NameのバッファポインタにCosNaming_NameComponentの配列のポインタを設定し、次に取り出したいオブジェクトリファレンスの名前を指定します。"OBJECT_B"は"CONTEXT_A"の下に配置されるため、獲得する配列の個数を2、名前の[0]番目に"CONTEXT_A"、[1]番目に"OBJECT_B"を指定します。
 最後に、ネーミングサービスのCosNaming_NamingContext_bind()を用いて、ネーミングサービスにオブジェクトリファレンスを登録します。

  CORBA_ORB                      orb; 
  CosNaming_NamingContext        cos_naming; 
  CosNaming_Name                 name; 
  CosNaming_NameComponent        name_component[2]; 
  CORBA_Environment              env; 

  CORBA_Object                   obj; 

  /* ルート(CORBA_ORB_ObjectId_NameService)オブジェクトの取得 */
  orb = CORBA_ORB_init(&current_argc, argv, FJ_OM_ORBid, &env ); 
  cos_naming = CORBA_ORB_resolve_initial_references(
                 orb, 
                 CORBA_ORB_ObjectId_NameService, 
                 &env ); 

  obj = ...; /* 何らかの方法でObjectを作成し、取得します。*/

  /* OBJECT_Bのシーケンス領域の設定 */
  name._length = name._maximum = 2; 
  name._buffer = name_component; 
  name_component[0].id = "CONTEXT_A";
  name_component[0].kind = "";
  name_component[1].id = "OBJECT_B";
  name_component[1].kind = "";

  /* ネーミングサービスにオブジェクトリファレンスを登録 */
  CosNaming_NamingContext_bind(
      cos_naming, 
      &name, 
      obj, 
      &env );

(2)C++言語のプログラミング例

 ORBインタフェースのオブジェクトリファレンスを取り出すCORBA::ORB::resolve_initial_references()によりネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとしてCORBA_ORB_ObjectId_NameServiceを指定します。
 次に、シーケンスCosNaming::Nameのバッファポインタ(CosNaming::NameComponent_varの配列)の領域をCosNaming::Name::allocbuf()を使って獲得し、次に取り出したいオブジェクトリファレンスの名前を指定します。"OBJECT_B"は"CONTEXT_A"の下に配置されるため、獲得する配列の個数を2、名前の[0]番目に"CONTEXT_A"、[1]番目に"OBJECT_B"を指定します。その後、上記ポインタをパラメタに指定し、演算子newを使ってシーケンスを作成します。
 最後に、ネーミングサービスのCosNaming::NamingContext::bind()を用いて、ネーミングサービスにオブジェクトリファレンスを登録します。

  CORBA::ORB_ptr                 orb; 
  CosNaming::Name_ptr            name; 
  CosNaming::NameComponent_var   *name_component; 
  CORBA::Environment             env; 

  CORBA::Object_ptr              obj; 

  try {
      // ルート(CORBA_ORB_ObjectId_NameService)オブジェクトの取得
      orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env ); 

      OPNAME("resolve_initial_references");
      CORBA::Object_ptr
      obj = orb->resolve_initial_references(
                  CORBA_ORB_ObjectId_NameService, env ); 

      CosNaming::NamingContext_ptr
      NamingContext_obj = CosNaming::NamingContext::_narrow( obj ); 
      CORBA::release( obj ); 

      obj = ...;  // 何らかの方法でObjectを作成し、取得します。

      // OBJECT_Bのシーケンス領域の設定
      name_component = CosNaming::Name::allocbuf(2); 
      name_component[0]->id = (const CORBA::Char *)"CONTEXT_A";
      name_component[0]->kind = (const CORBA::Char *)"";
      name_component[1]->id = (const CORBA::Char *)"OBJECT_B";
      name_component[1]->kind = (const CORBA::Char *)"";
      name = new CosNaming::Name(2, 2, name_component,CORBA_TRUE); 

      // ネーミングサービスにオブジェクトリファレンスを登録
      OPNAME("NamingContext::bind");
      NamingContext_obj->bind( *name, obj, env ); 
      delete name; 

      CORBA::release( NamingContext_obj ); 
  }
  catch ( CORBA::Exception &e ){
      ...  // エラー処理
  }

(3)Java言語でのプログラミング例

 ORBインタフェースのオブジェクトリファレンスを取り出すorg.omg.CORBA.ORB.resolve_initial_references()によりネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、"NameService"を指定します。
 次に、org.omg.CosNaming.NameComponent[]の領域をnewを使って獲得します。
 次に、名前を指定します。"OBJECT_B"は"CONTEXT_A"の下に配置されているため、[0]番目に"CONTEXT_A"、[1]番目に"OBJECT_B"を指定します。
 最後に、ネーミングサービスのorg.omg.CosNaming.NamingContext.bind()を使って、ネーミングサービスにオブジェクトリファレンスを登録します。

  public class Bind {
        public static void main(String args[]){
                try {
                       // ルート(NameService)オブジェクトの取得
                       org.omg.CORBA.ORB orb =  org.omg.CORBA.ORB.init(arg,null);

                       org.omg.CORBA.Object obj =
                                orb.resolve_initial_references("NameService"); 
                       org.omg.CosNaming.NamingContextExt cos_naming =
                                org.omg.CosNaming.NamingContextExtHelper.narrow(obj); 

                       obj = ...; // 何らかの方法でObjectを作成し、取得します。

                       // OBJECT_Bのシーケンス領域の設定
                        org.omg.CosNaming.NameComponent [] name =
                                   new org.omg.CosNaming.NameComponent[2];
                        name[0] = new org.omg.CosNaming.NameComponent( "CONTEXT_A", ""); 
                        name[1] = new org.omg.CosNaming.NameComponent( "OBJECT_B", ""); 

                        // ネーミングサービスにオブジェクトリファレンスを登録
                       cos_naming.bind( name, obj ); 

                }
                catch( Exception e ){
                       ...  // エラー処理
                }
        }
  }

(4)COBOLでのプログラミング例

 ORBインタフェースのオブジェクトリファレンスを取り出すCORBA-ORB-RESOLVE-INITIAL-REFERENCESによりネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、"CORBA-ORB-OBJECTID-NAMESERVICE"を指定します。
 次に、COSNAMING-NAMEおよびCOSNAMING-NAMECOMPONENTに取り出したいオブジェクトリファレンスの名前を以下のプログラムのように指定します。"OBJECT_B"は"CONTEXT_A"の下に配置されているため、1番目に"CONTEXT_A"、2番目に"OBJECT_B"を指定します。
 最後に、ネーミングサービスのCOSNAMING-NAMINGCONTEXT-BINDを使って、ネーミングサービスにオブジェクトリファレンスを登録します。

   IDENTIFICATION DIVISION.
   PROGRAM-ID. "BIND-TEST".
   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SPECIAL-NAMES. 
        ARGUMENT-NUMBER      IS  ARG-C
        ARGUMENT-VALUE       IS  ARG-V
        SYMBOLIC CONSTANT
        COPY SYMBOL-CONST IN CORBA. 
        . 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   COPY CONST  IN CORBA. 
   01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB. 
   01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
   01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
   
  *########## NAMING SETTING PARAMETER #########
   01 COPY COSNAMING-NAMINGCONTEXT IN CORBA REPLACING COSNAMING-NAMINGCONTEXT
                                                                  BY COS-NAMING. 
   01 COPY COSNAMING-NAMINGCONTEXT IN CORBA REPLACING COSNAMING-NAMINGCONTEXT
                                                                  BY COS-NAMING2. 
   01 COPY COSNAMING-NAME IN CORBA REPLACING COSNAMING-NAME BY NAME. 
   01 NAME-A USAGE POINTER. 
   01 COPY COSNAMING-NAMECOMPONENT IN CORBA REPLACING COSNAMING-NAMECOMPONENT
                                                                  BY NAME-COMPONENT. 
   01 NAME-COMPONENT-A USAGE POINTER. 
  
  *########## ORB SETTING PARAMETER #########
   01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY CURRENT-ARG-C. 
   01 CURRENT-ARG-V. 
      02 FILLER OCCURS 6. 
         03 CURRENT-ARG-V-VALUE USAGE POINTER. 
   01 APLI-NAME PIC X(8) VALUE "simple_c".
   01 COPY LONG IN CORBA REPLACING CORBA-LONG BY ARG-COUNT. 
   01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM. 
   
   01 TMP-STRING       USAGE POINTER. 
   01 TMP-STRING-BUF  PIC X(50). 
   01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY STRING-LENGTH. 
   01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY ELEMENT-NUMBER. 
  *
   PROCEDURE DIVISION. 
      
  * ObjectDirector初期化
       ACCEPT CURRENT-ARG-C FROM ARG-C. 
       COMPUTE CURRENT-ARG-C = CURRENT-ARG-C + 1. 
       PERFORM VARYING ARG-COUNT FROM 1 BY 1 UNTIL ARG-COUNT > CURRENT-ARG-C
          IF ARG-COUNT = 1
             MOVE APLI-NAME TO TMP-STRING-BUF
          ELSE
             ACCEPT TMP-STRING-BUF FROM ARG-V
          END-IF
          MOVE FUNCTION LENG (TMP-STRING-BUF) TO STRING-LENGTH
          CALL "CORBA-STRING-SET" USING
                CURRENT-ARG-V-VALUE (ARG-COUNT) 
                STRING-LENGTH
                TMP-STRING-BUF
       END-PERFORM. 
       SET CURRENT-ARG-V-VALUE (ARG-COUNT) TO NULL. 
      
       MOVE FUNCTION LENG(FJ-OM-ORB-ID) TO STRING-LENGTH. 
       CALL  "CORBA-STRING-SET" USING
             TMP-STRING
             STRING-LENGTH
             FJ-OM-ORB-ID. 
       CALL "CORBA-ORB-INIT" USING
             CURRENT-ARG-C
             CURRENT-ARG-V
             TMP-STRING
             ENV
             ORB. 
       CALL "CORBA-FREE" USING TMP-STRING. 
     
  * ルート(CORBA-ORB-OBJECTID-NAMESERVICE)オブジェクトの取得
       MOVE FUNCTION LENG ( CORBA-ORB-OBJECTID-NAMESERVICE ) TO STRING-LENGTH. 
       CALL "CORBA-STRING-SET" USING
             TMP-STRING
             STRING-LENGTH
             CORBA-ORB-OBJECTID-NAMESERVICE. 
       CALL "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" USING
             ORB
             TMP-STRING
             ENV
             COS-NAMING. 
       CALL "CORBA-FREE" USING TMP-STRING. 
     
  * 何らかの方法でObjectを作成し、取得します。
       MOVE  COS-NAMING TO OBJ. 
     
  
  * OBJECT_Bのシーケンス領域の設定
       MOVE 2 TO SEQ-LENGTH OF NAME. 
       MOVE 2 TO SEQ-MAXIMUM OF NAME. 
       CALL "CORBA-SEQUENCE-COSNAMING-NAMECOMPONENT-ALLOCBUF" USING
             SEQ-MAXIMUM OF NAME
             SEQ-BUFFER OF NAME. 
     
       MOVE "CONTEXT_A" TO TMP-STRING-BUF. 
       MOVE FUNCTION LENG (TMP-STRING-BUF) TO STRING-LENGTH. 
       CALL "CORBA-STRING-SET" USING
             IDL-ID OF NAME-COMPONENT
             STRING-LENGTH
             TMP-STRING-BUF
             . 
       MOVE " " TO TMP-STRING-BUF. 
       CALL "CORBA-STRING-SET" USING
             KIND OF NAME-COMPONENT
             STRING-LENGTH
             TMP-STRING-BUF. 
       MOVE FUNCTION ADDR ( NAME ) TO NAME-A. 
       MOVE 1 TO ELEMENT-NUMBER. 
       MOVE FUNCTION ADDR ( NAME-COMPONENT ) TO NAME-COMPONENT-A. 
       CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
             NAME-A
             ELEMENT-NUMBER
             NAME-COMPONENT-A. 
  
       MOVE "OBJECT_B" TO TMP-STRING-BUF. 
       MOVE FUNCTION LENG (TMP-STRING-BUF) TO STRING-LENGTH. 
       CALL "CORBA-STRING-SET" USING
             IDL-ID OF NAME-COMPONENT
             STRING-LENGTH
             TMP-STRING-BUF. 
      
       MOVE " " TO TMP-STRING-BUF. 
       CALL "CORBA-STRING-SET" USING
             KIND OF NAME-COMPONENT
             STRING-LENGTH
             TMP-STRING-BUF. 
    
       MOVE FUNCTION ADDR ( NAME ) TO NAME-A. 
       MOVE 2 TO ELEMENT-NUMBER. 
       MOVE FUNCTION ADDR ( NAME-COMPONENT ) TO NAME-COMPONENT-A. 
       CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
             NAME-A
             ELEMENT-NUMBER
             NAME-COMPONENT-A. 
  *ネーミングサービスにオブジェクトリファレンスを登録
       CALL "COSNAMING-NAMINGCONTEXT-BIND" USING
             COS-NAMING
             NAME
             OBJ
             ENV. 
       EXIT PROGRAM. 
   END PROGRAM "BIND-TEST".

(5)OOCOBOLでのプログラミング例

 ORBインタフェースのオブジェクトリファレンスを取り出すCORBA-ORB-RESOLVE_INITIAL_REFERENCESによりネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、"CORBA-ORB-OBJECTID_NAMESERVICE"を指定します。
 次に、COSNAMING-NAMEおよびCOSNAMING-NAMECOMPONENTに取り出したいオブジェクトリファレンスの名前を以下のプログラムのように指定します。"OBJECT_B"は"CONTEXT_A"の下に配置されているため、1番目に"CONTEXT_A"、2番目に"OBJECT_B"を指定します。
 最後に、ネーミングサービスのCOSNAMING-NAMINGCONTEXT-BINDを使って、ネーミングサービスにオブジェクトリファレンスを登録します。

   IDENTIFICATION         DIVISION.
   PROGRAM-ID.            "CLIENT-MAIN".
  *
   ENVIRONMENT            DIVISION. 
   CONFIGURATION          SECTION. 
   REPOSITORY. 
       COPY               CORBA--REP. 
       COPY               COSNAMING--REP. 
       . 
   SPECIAL-NAMES. 
       SYMBOLIC CONSTANT
       COPY               CORBA--CONST. 
       COPY               COSNAMING--CONST. 
       . 
  *
   DATA                   DIVISION. 
   WORKING-STORAGE        SECTION. 
   COPY                   CORBA--COPY. 
   COPY                   COSNAMING--COPY. 
  *
   01 ORB                 USAGE OBJECT REFERENCE CORBA-ORB. 
   01 BOA                 USAGE OBJECT REFERENCE CORBA-BOA. 
   01 IMPL-REP            USAGE OBJECT REFERENCE FJ-IMPLEMENTATIONREP. 
   01 IMPL                USAGE OBJECT REFERENCE CORBA-IMPLEMENTATIONDEF. 
   01 INTF-REP            USAGE OBJECT REFERENCE CORBA-REPOSITORY. 
   01 INTF                USAGE OBJECT REFERENCE CORBA-INTERFACEDEF. 
   01 REF-ID              TYPE                   CORBA-REFERENCEDATA. 
   01 OBJ                 USAGE OBJECT REFERENCE CORBA-OBJECT. 
   01 NAMING-CONTEXT      USAGE OBJECT REFERENCE COSNAMING-NAMINGCONTEXT. 
   01 NAME                TYPE                   COSNAMING-NAME. 
   01 NAME-COMPONENT      USAGE OBJECT REFERENCE COSNAMING-NAMECOMPONENT. 
   01 NAME-ID             USAGE OBJECT REFERENCE CORBA-STRING. 
   01 NAME-KIND           USAGE OBJECT REFERENCE CORBA-STRING. 
  *
   01 EXCEPTION-ID        USAGE OBJECT REFERENCE CORBA-STRING. 
   01 EXCEPTION-ID-VALUE  PIC   X(50). 
   01 API-NAME            PIC   X(50). 
  *
   01 I                   TYPE                   CORBA-UNSIGNED-LONG. 
  *
   PROCEDURE              DIVISION. 
  *
   DECLARATIVES. 
  *
   OTHER-ERROR SECTION. 
       USE EXCEPTION CORBA-EXCEPTION. 
       DISPLAY "CORBA::Exception: " API-NAME. 
       SET EXCEPTION-ID TO IDL-ID OF EXCEPTION-OBJECT AS CORBA-EXCEPTION. 
       INVOKE EXCEPTION-ID "GET-VALUE" RETURNING EXCEPTION-ID-VALUE. 
       DISPLAY "   Exception-id: " EXCEPTION-ID-VALUE. 
       EXIT PROGRAM. 
   END-OTHER-ERR. 
  *
   END DECLARATIVES. 
  *
   MAIN SECTION. 
  *
       MOVE "CORBA::ORB_init" TO API-NAME. 
       INVOKE CORBA "ORB_INIT"
                          USING     "Naming"
                                    FJ-OM_ORBID
                          RETURNING ORB. 
  *
       MOVE "CORBA::ORB::BOA_init" TO API-NAME. 
       INVOKE ORB "BOA_INIT"
                          USING     "Naming"
                                    CORBA-BOA_OAID
                          RETURNING BOA. 
  *
       MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME. 
       INVOKE ORB "RESOLVE_INITIAL_REFERENCES"
                          USING     CORBA-ORB-OBJECTID_NAMESERVICE
                          RETURNING OBJ. 
  *
       INVOKE COSNAMING-NAMINGCONTEXT "NARROW"
                          USING     OBJ
                          RETURNING NAMING-CONTEXT. 
  *
       MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME. 
       INVOKE ORB "RESOLVE_INITIAL_REFERENCES"
                          USING     CORBA-OBJECTID_LIGHTINTERF-001
                          RETURNING OBJ. 
       INVOKE CORBA-REPOSITORY "NARROW" USING OBJ RETURNING INTF-REP. 
  *
       MOVE "CORBA::Repository::lookup_id" TO API-NAME. 
       INVOKE INTF-REP "LOOKUP_ID" USING "IDL:OBJECT_B:1.0" RETURNING OBJ. 
       INVOKE CORBA-INTERFACEDEF "NARROW" USING OBJ RETURNING INTF. 
  *
       MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME. 
       INVOKE ORB "RESOLVE_INITIAL_REFERENCES"
                          USING     CORBA-OBJECTID_IMPLEMENTAT-001
                          RETURNING OBJ. 
       INVOKE FJ-IMPLEMENTATIONREP "NARROW" USING OBJ RETURNING IMPL-REP. 
  *
       MOVE "FJ::ImplementationRep::lookup_id" TO API-NAME. 
       INVOKE IMPL-REP "LOOKUP_ID" USING "IDL:OBJECT_B:1.0" RETURNING OBJ. 
       INVOKE CORBA-IMPLEMENTATIONDEF "NARROW" USING OBJ RETURNING IMPL. 
  *
       MOVE "CORBA::BOA::create" TO API-NAME. 
       INVOKE SEQUENCE-OCTET "NEW" RETURNING REF-ID. 
       INVOKE BOA "IDL-CREATE" USING REF-ID INTF IMPL RETURNING OBJ. 
  *
       INVOKE SEQUENCE-NAMECOMPONENT-001 "NEW-WITH-LENGTH" USING 2 RETURNING NAME. 
       INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "CONTEXT_A" RETURNING NAME-ID
       INVOKE CORBA-STRING "NEW-WITH-VALUE" USING " " RETURNING NAME-KIND
       INVOKE COSNAMING-NAMECOMPONENT "NEW" RETURNING NAME-COMPONENT
       SET IDL-ID OF NAME-COMPONENT TO NAME-ID
       SET KIND OF NAME-COMPONENT TO NAME-KIND
       INVOKE NAME "SET-VALUE" USING 1 NAME-COMPONENT
  *
       INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "OBJECT_B" RETURNING NAME-ID
       INVOKE CORBA-STRING "NEW-WITH-VALUE" USING " " RETURNING NAME-KIND
       INVOKE COSNAMING-NAMECOMPONENT "NEW" RETURNING NAME-COMPONENT
       SET IDL-ID OF NAME-COMPONENT TO NAME-ID
       SET KIND OF NAME-COMPONENT TO NAME-KIND
       INVOKE NAME "SET-VALUE" USING 2 NAME-COMPONENT
  *
       MOVE "CosNaming::NamingContext::bind" TO API-NAME. 
       INVOKE NAMING-CONTEXT "BIND"
                          USING     NAME
                                    OBJ. 
  *
       STOP RUN. 
  *
   END-MAIN. 
  *
   END PROGRAM "CLIENT-MAIN".

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

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