ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

9.7.3 コンテキスト配下のオブジェクトのリストの取得

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



CONTEXT_Aのリストを取得するプログラムの例を以下に示します。


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

  1. オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。

  2. 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()を使用します。
    本プログラムでは、以下のように処理しています。

    1. CosNaming_BindingIterator_next_n()により最初の40個のオブジェクトリファレンスを検索します。

    2. _length 0のシーケンスが返るまで、CosNaming_BindingIterator_next_one()で残りのオブジェクトリファレンスのリストを検索します。

  3. 検索終了後、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++言語のプログラミング例

  1. オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。

  2. 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()を使用します。
    本プログラムでは、以下のように処理しています。

    1. CosNaming::BindingIterator::next_n()により最初の40個のオブジェクトリファレンスを検索します。

    2. _length 0のシーケンスが返るまで、CosNaming::BindingIterator::next_one()で残りのオブジェクトリファレンスのリストを検索します。

  3. 検索終了後、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言語のプログラミング例

  1. オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。

  2. 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()を使用します。
    本プログラムでは、以下のように処理しています。

    1. org.omg.CosNaming.BindingIterator.next_n()を使って最初の40個のオブジェクトリファレンスを検索します。

    2. 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のプログラミング例

  1. オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。

  2. COSNAMING-NAMINGCONTEXT-LISTを使ってリストを取得します。
    結果は、BLで指定されたCOSNAMING-BINDINGLISTにHOW-MANYで指定された個数分設定されます。もし、HOW-MANYで指定された個数より含まれるリストの数が多い場合は、残りの検索のためのオブジェクトCOSNAMING-BINDINGITERATORにオブジェクトリファレンスが設定されます。
    COSNAMING-BINDINGITERATORを使って残りのリストを取得するには、COSNAMING-BINDINGITERATOR-NEXT-ONE/COSNAMING-BINDINGITERATOR-NEXT-Nを使用します。
    本プログラムでは、以下のように処理しています。

    1. COSNAMING-BINDINGITERATOR-NEXT-Nを使って最初の40個のオブジェクトリファレンスを検索します。

    2. 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のプログラミング例

  1. オブジェクトリファレンスの検索と同じ方法で、リストを取得したいネーミングコンテキストのオブジェクトリファレンスを取得します。

  2. COSNAMING-NAMINGCONTEXT-LISTを使ってリストを取得します。
    結果は、BLで指定されたCOSNAMING-BINDINGLISTにHOW-MANYで指定された個数分設定されます。もし、HOW-MANYで指定された個数より含まれるリストの数が多い場合は、残りの検索のためのオブジェクトCOSNAMING-BINDINGITERATORにオブジェクトリファレンスが設定されます。
    COSNAMING-BINDINGITERATORを使って残りのリストを取得するには、COSNAMING-BINDINGITERATOR-NEXT_ONE/COSNAMING-BINDINGITERATOR-NEXT_Nを使用します。
    本プログラムでは、以下のように処理しています。

    1. COSNAMING-BINDINGITERATOR-NEXT_Nを使って最初の40個のオブジェクトリファレンスを検索します。

    2. 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".