ネーミングサービスで、以下のようにネーミングコンテキスト配下にオブジェクトが格納されている場合に、ネーミングコンテキスト配下のオブジェクトリファレンスのリストをどのように取得するかについて説明します。
CONTEXT_Aのリストを取得するプログラムの例を以下に示します。
(1)C言語のプログラミング例
まず、オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。
次に、CosNaming_NamingContext_list()を使ってリストを取得します。結果は、第3パラメタCosNaming_BindingListに第2パラメタで指定して個数設定されます。もし、第2パラメタで指定した個数より、含まれるリストの数が多い場合には、残りの検索のためのオブジェクトCosNaming_BindingIteratorにオブジェクトリファレンスが設定されます。第2パラメタで指定した数より含まれるリストの数が少ない場合には、CosNaming_BindingIteratorにはCORBA_OBJECT_NILが、また、CosNaming_BindingListには、そのリストの個数分のデータが設定されます。
CosNaming_BindingIteratorを使って残りのリストを取得するには、CosNaming_BindingIterator_next_one()かCosNaming_BindingIterator_next_n()を使用します。以下のプログラムではまずCosNaming_BindingIterator_next_n()を使って最初の40個のオブジェクトリファレンスを検索し、次に_length 0のシーケンスが返るまで、CosNaming_BindingIterator_next_one()で残りのオブジェクトリファレンスのリストを検索しています。
検索終了後、CosNaming_BindingIterator_destroy()を呼び出してサーバ側の領域を解放する必要があります(クライアント側の領域はCORBA_Object_release()を使用します)。
CosNaming_NamingContext cos_naming, context_obj; CosNaming_Name name; CosNaming_NameComponent name_component; CORBA_ORB orb; CORBA_Environment env; CORBA_Object obj; CosNaming_BindingList *bl, *bl2; CosNaming_BindingIterator bi; CORBA_long how_many; /* ルート(CORBA_ORB_ObjectId_NameService)オブジェクトの取得 */ cos_naming = CORBA_ORB_resolve_initial_references( orb, CORBA_ORB_ObjectId_NameService, &env ); /* "CONTEXT_A"のネーミングコンテキストの取り出し */ name._length = name._maximum = 1; name._buffer = &name_component; name._buffer[0].id = "CONTEXT_A"; name._buffer[0].kind = ""; context_obj = CosNaming_NamingContext_resolve( cos_naming, &name, &env ); /* CONTEXT_A下のオブジェクトリファレンスのリストの取り出し */ name._length = name._maximum = 1; name._buffer = &name_component; name._buffer[0].id = "CONTEXT_A"; name._buffer[0].kind = ""; how_many = 40; CosNaming_NamingContext_list( cos_naming, how_many, &bl, &bi, &env ); /* CONTEXT_A下の残りのオブジェクトリファレンスの取り出し */ if( bi != CORBA_OBJECT_NIL ){ CORBA_free(bl); CosNaming_BindingIterator_next_n( bi, how_many, &bl2, &env ); do { CosNaming_BindingIterator_next_one( bi, &b, &env ); ... /* 結果を処理する処理 */ CORBA_free(b); } while( env._major != CORBA_NO_EXCEPTION && b->binding_name._length != 0 ); CosNaming_BindingIterator_destroy( bi, &env ); }
(2)C++言語のプログラミング例
まず、オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。
次に、CosNaming::NamingContext::list()を使ってリストを取得します。結果は、第2パラメタCosNaming::BindingListに第1パラメタで指定して個数設定されます。もし、第1パラメタで指定した個数より、含まれるリストの数が多い場合には、残りの検索のためのオブジェクトCosNaming::BindingIteratorにオブジェクトリファレンスが設定されます。第2パラメタで指定した数より含まれるリストの数が少ない場合には、CosNaming::BindingIteratorにはNILオブジェクトが、また、CosNaming::BindingListには、そのリストの個数分のデータが設定されます。
CosNaming::BindingIteratorを使って残りのリストを取得するには、CosNaming::BindingIterator::next_one()かCosNaming::BindingIterator::next_n()を使用します。以下のプログラムではまずCosNaming::BindingIterator::next_n()を使って最初の40個のオブジェクトリファレンスを検索し、次に_length 0のシーケンスが返るまで、CosNaming::BindingIterator::next_one()で残りのオブジェクトリファレンスのリストを検索しています。
検索終了後、CosNaming::BindingIterator::destroy()を呼び出してサーバ側の領域を解放する必要があります(クライアント側の領域はCORBA::release()を使用します)。
CORBA::ORB_ptr orb; CosNaming::NamingContext_ptr cos_naming; CosNaming::Name_ptr name; CosNaming::NameComponent_var *name_component; CosNaming::BindingList_ptr bl; CosNaming::BindingIterator bi; CosNaming::Binding_ptr b; CORBA::Object_ptr obj; CosNaming::NamingContext_ptr cos_naming, new_context; CORBA::Long how_many; CORBA::Environment env; CORBA::Long len; 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 ); cos_naming = CosNaming::NamingContext::_narrow(obj); CORBA::release(obj); // ルートからCONTEXT_Aを取得 CosNaming::NameComponent_var *name_component_var = CosNaming::Name::allocbuf(1); name_component[0]->id = (const CORBA::Char *)"CONTEXT_A"; name_component[0]->kind = (const CORBA::Char *)""; name = new CosNaming::Name(1,1,name_component_var,CORBA_TRUE); obj = cos_naming->resolve( *name, env ); delete name; new_context = CosNaming::NamingContext::_narrow(obj); CORBA::release(obj); // CONTEXT_A下のオブジェクトリファレンスのリストの取り出し how_many = 40; cos_naming->list( how_many, bl, bi, env ); ... // 結果を処理する処理 delete bl; // CONTEXT_A下の残りのオブジェクトリファレンスの取り出し if( bi->is_nil(env) != CORBA_TRUE ){ bi->next_n( how_many, bl, env ); ... // 結果を処理する処理 do { bi->next_one(b,env); // 結果を処理する処理 len = b->binding_name->length(); delete b; } while( len != 0 ); } bi->destroy(env); CORBA::release(bi); } catch ( CORBA::Exception &e ){ ... // エラー処理 }
(3)Java言語のプログラミング例
まず、オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。
次に、org.omg.CosNaming.NamingContext.list()を使ってリストを取得します。結果は、第2パラメタorg.omg.CosNaming.BindingListHolder.valueに第1パラメタで指定した個数だけorg.omg.CosNaming.Bindingの配列が設定されます。もし、第1パラメタで指定した個数より、含まれるリストの数が多い場合には、残りの検索のためのオブジェクトorg.omg.CosNaming.BindingIteratorHolder.valueにorg.omg.CosNaming.BindingIteratorのオブジェクトリファレンスが設定されます。第2パラメタで指定した数より含まれるリストの数が少ない場合には、org.omg.CosNaming.BindingIterator.valueにはnullが、またorg.omg.CosNaming.BindingListHolder.valueには、そのリストの個数分のデータが設定されます。
org.omg.CosNaming.BindingIteratorを使って残りのリストを取得するには、org.omg.CosNaming.BindingIterator.next_one()かorg.omg.CosNaming.BindingIterator.next_n()を使用します。以下のプログラムではまずorg.omg.CosNaming.BindingIterator.next_n()を使って最初の40個のオブジェクトリファレンスを検索し、次にlength 0のシーケンスが返るまで、org.omg.CosNaming.BindingIterator.next_one()で残りのオブジェクトリファレンスのリストを検索しています。
public class List { public static void main(String args[]){ try { int i, j; // ルート(CORBA_ORB_ObjectId_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 con_obj = org.omg.CosNaming.NamingContextExtHelper.narrow(obj); // ルートからCONTEXT_Aを取得 org.omg.CosNaming.NameComponent [] name = new org.omg.CosNaming.NameComponent[1]; name[0] = new org.omg.CosNaming.NameComponent("CONTEXT_A", ""); org.omg.CORBA.Object tmp_obj = con_obj.resolve( name ); org.omg.CosNaming.NamingContextExt new_context = org.omg.CosNaming.NamingContextExtHelper.narrow(tmp_obj); // CONTEXT_A下のオブジェクトリファレンスのリストの取り出し int how_many = 40; org.omg.CosNaming.BindingListHolder bl_var = new org.omg.CosNaming.BindingListHolder(); org.omg.CosNaming.BindingIteratorHolder bi_var = new org.omg.CosNaming.BindingIteratorHolder(); new_context.list( how_many, bl_var, bi_var ); ... // 結果を処理する処理 // CONTEXT_A下の残りのオブジェクトリファレンスの取り出し if( bi_var.value != null)) { org.omg.CosNaming.BindingIterator bi_obj = bi_var.value; bi_obj.next_n( how_many, bl_var ); ... // 結果を処理する処理 org.omg.CosNaming.BindingHolder b_var = new org.omg.CosNaming.BindingHolder(); do { bi_obj.next_one( b_var ); ... // 結果を処理する処理 } while( b_var.value.binding_name.length != 0 ); } } catch( Exception e ){ ... // エラー処理 } } }
(4)COBOLのプログラミング例
まず、オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。
次に、COSNAMING-NAMINGCONTEXT-LISTを使ってリストを取得します。結果は、BLで指定されたCOSNAMING-BINDINGLISTにHOW-MANYで指定された個数分設定されます。もし、HOW-MANYで指定された個数より、含まれるリストの数が多い場合、残りの検索のためのオブジェクトCOSNAMING-BINDINGITERATORにオブジェクトリファレンスが設定されます。
COSNAMING-BINDINGITERATORを使って残りのリストを取得するには、COSNAMING-BINDINGITERATOR-NEXT-ONEかCOSNAMING-BINDINGITERATOR-NEXT-Nを使用します。以下のプログラムではまずCOSNAMING-BINDINGITERATOR-NEXT-Nを使って最初の40個のオブジェクトリファレンスを検索し、次にCOSNAMING-BINDINGITERATOR-NEXT-ONEで残りのオブジェクトリファレンスのリストを検索しています。
IDENTIFICATION DIVISION. PROGRAM-ID. "LIST-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 CONTEXT-OBJ. 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. 01 BL USAGE POINTER. 01 BL2 USAGE POINTER. 01 COPY COSNAMING-BINDINGITERATOR IN CORBA REPLACING COSNAMING-BINDINGITERATOR BY BI. 01 B 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(20). 01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY STRING-LENGTH. 01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY ELEMENT-NUMBER. 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY HOW-MANY. 01 COPY BOOLEAN IN CORBA REPLACING CORBA-BOOLEAN BY ROOP-FLAG. 01 COPY BOOLEAN IN CORBA REPLACING CORBA-BOOLEAN BY RET. * LINKAGE SECTION. 01 COPY COSNAMING-BINDING IN CORBA REPLACING COSNAMING-BINDING BY B-VALUE. 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. * "CONTEXT_A"のネーミングコンテキストの取り出し MOVE 1 TO SEQ-LENGTH OF NAME. MOVE 1 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. CALL "COSNAMING-NAMINGCONTEXT-RESOLVE" USING COS-NAMING NAME ENV CONTEXT-OBJ. * CONTEXT_A下のオブジェクトリファレンスのリストの取り出し MOVE 40 TO HOW-MANY. CALL "COSNAMING-NAMINGCONTEXT-LIST" USING CONTEXT-OBJ HOW-MANY BL BI ENV. * CONTEXT_A下の残りのオブジェクトリファレンスの取り出し IF NOT BI = CORBA-OBJECT-NIL THEN CALL "CORBA-FREE" USING BL CALL "COSNAMING-BINDINGITERATOR-NEXT-N" USING BI HOW-MANY BL2 ENV RET MOVE CORBA-TRUE TO ROOP-FLAG PERFORM UNTIL ROOP-FLAG = CORBA-FALSE CALL "COSNAMING-BINDINGITERATOR-NEXT-ONE" USING BI B ENV RET * 結果を処理する処理 EVALUATE TRUE WHEN CORBA-NO-EXCEPTION OF ENV CONTINUE WHEN CORBA-USER-EXCEPTION OF ENV WHEN CORBA-USER-EXCEPTION OF ENV EXIT PROGRAM END-EVALUATE SET ADDRESS OF B-VALUE TO B IF SEQ-LENGTH OF B-VALUE = 0 MOVE CORBA-FALSE TO ROOP-FLAG ELSE CALL "CORBA-FREE" USING B END-IF END-PERFORM CALL "COSNAMING-BINDINGITERATOR-DESTROY" USING BI ENV RET CALL "CORBA-OBJECT-RELEASE" USING BI ENV END-IF. EXIT PROGRAM. END PROGRAM "LIST-TEST".
(5)OOCOBOLのプログラミング例
まず、オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。
次に、COSNAMING-NAMINGCONTEXT-LISTを使ってリストを取得します。結果は、BLで指定されたCOSNAMING-BINDINGLISTにHOW-MANYで指定された個数分設定されます。もし、HOW-MANYで指定された個数より、含まれるリストの数が多い場合、残りの検索のためのオブジェクトCOSNAMING-BINDINGITERATORにオブジェクトリファレンスが設定されます。
COSNAMING-BINDINGITERATORを使って残りのリストを取得するには、COSNAMING-BINDINGITERATOR-NEXT_ONEかCOSNAMING-BINDINGITERATOR-NEXT_Nを使用します。以下のプログラムではまずCOSNAMING-BINDINGITERATOR-NEXT_Nを使って最初の40個のオブジェクトリファレンスを検索し、次にCOSNAMING-BINDINGITERATOR-NEXT_ONEで残りのオブジェクトリファレンスのリストを検索しています。
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 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 NEW-CONTEXT USAGE OBJECT REFERENCE COSNAMING-NAMINGCONTEXT. 01 BL TYPE COSNAMING-BINDINGLIST. 01 BI USAGE OBJECT REFERENCE COSNAMING-BINDINGITERATOR. 01 NAME-ID USAGE OBJECT REFERENCE CORBA-STRING. 01 NAME-KIND USAGE OBJECT REFERENCE CORBA-STRING. 01 HOW-MANY TYPE CORBA-UNSIGNED-LONG. 01 B USAGE OBJECT REFERENCE COSNAMING-BINDING. 01 LEN TYPE CORBA-UNSIGNED-LONG. * 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 1 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. * MOVE "CosNaming::NamingContext::resolve" TO API-NAME. INVOKE NAMING-CONTEXT "RESOLVE" USING NAME RETURNING OBJ. INVOKE COSNAMING-NAMINGCONTEXT "NARROW" USING OBJ RETURNING NEW-CONTEXT. * MOVE 40 TO HOW-MANY. MOVE "CosNaming::NamingContext::list" TO API-NAME. INVOKE NEW-CONTEXT "LIST" USING HOW-MANY BL BI. * IF BI NOT = NULL MOVE "CosNaming::BindingIterator::next_n" TO API-NAME INVOKE BI "NEXT_N" USING HOW-MANY BL MOVE "CosNaming::BindingIterator::next_one" TO API-NAME SET NAME TO BINDING_NAME OF B MOVE SEQ-LENGTH OF NAME TO LEN PERFORM UNTIL LEN = 0 MOVE "CosNaming::BindingIterator::next_one" TO API-NAME SET NAME TO BINDING_NAME OF B MOVE SEQ-LENGTH OF NAME TO LEN END-PERFORM MOVE "CosNaming::BindingIterator::destroy" TO API-NAME INVOKE BI "DESTROY" END-IF. * STOP RUN. * END-MAIN. * END PROGRAM "CLIENT-MAIN".