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

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

9.7.1 コンテキスト配下のオブジェクトの検索

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

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

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

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

  CosNaming_NamingContext cos_naming; 
  CosNaming_Name          name; 
  CosNaming_NameComponent name_component[2]; 
  CORBA_ORB               orb; 
  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 ); 

  /* ルートからOBJECT_Bを取得 */
  name._length = name._maximum = 2; 
  name._buffer = name_component; 
  name._buffer[0].id = "CONTEXT_A"; 
  name._buffer[0].kind = "";
  name._buffer[1].id = "OBJECT_B"; 
  name._buffer[1].kind = "";

  obj = CosNaming_NamingContext_resolve(
          cos_naming, 
          &name, 
          &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::resolve()を用いて、ネーミングサービスからオブジェクトリファレンスを取得します。

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

  try {
     // ルート(CORBA_ORB_ObjectId_NameService)オブジェクトの取得
     orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env ); 
     obj = orb->resolve_initial_references(
             CORBA_ORB_ObjectId_NameService,env ); 
     CosNaming::NamingContext_ptr
         NamingContext_obj = CosNaming::NamingContext::_narrow( obj ); 

     CORBA::release( obj ); 
 
     // ルートからOBJECT_Bを取得
     name_component_var = 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_var,CORBA_TRUE); 
    
     OPNAME("NamingContext::resolve");
     obj = NamingContext_obj->resolve( *name, env ); 
     CORBA::release( NamingContext_obj ); 
     delete name; 
  }
  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.resolve()を使って、ネーミングサービスからオブジェクトリファレンスを取得します。

public class Resolve {
        public static void main(String args[]){
                try {
                        int     i, j; 

                        org.omg.CORBA.ORB orb =  org.omg.CORBA.ORB.init(arg,null);

                        // ルート(NameService)オブジェクトの取得
                        org.omg.CORBA.Object obj =
                                     orb.resolve_initial_references("NameService"); 
                        org.omg.CosNaming.NamingContextExt cos_naming = 
                            org.omg.CosNaming.NamingContextExtHelper.narrow(obj); 

                        // ルートから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", ""); 
                        obj = cos_naming.resolve( name ); 

                }
                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-RESOLVEを使って、ネーミングサービスからオブジェクトリファレンスを取得します。

   IDENTIFICATION DIVISION.
   PROGRAM-ID. "RESOLVE-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-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_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-RESOLVE" USING
             COS-NAMING
             NAME
             ENV
             OBJ. 
       IF OBJ = NULL
             CALL "CORBA-STRING-GET" USING 
                       IDL-ID OF ENV
                       STRING-LENGTH
                       TMP-STRING-BUF
             DISPLAY "ENV-ID : " TMP-STRING-BUF
       END-IF
       EXIT PROGRAM. 
   END PROGRAM "RESOLVE-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-RESOLVEを使って、ネーミングサービスからオブジェクトリファレンスを取得します。

   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 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. 
  *
       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::resolve" TO API-NAME. 
       INVOKE NAMING-CONTEXT "RESOLVE"
                          USING     NAME
                          RETURNING OBJ. 
  *
       STOP RUN. 
  *
   END-MAIN. 
  *
   END PROGRAM "CLIENT-MAIN".

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

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