ネーミングサービスで、以下のようにネーミングコンテキスト配下にオブジェクトが格納されている場合に、オブジェクトリファレンスをどのように検索するかについて説明します。
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(¤t_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".