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

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

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



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


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

  1. ORBインタフェースのオブジェクトリファレンスを取り出すCORBA_ORB_resolve_initial_references()により、ネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、CORBA_ORB_ObjectId_NameServiceを指定します。

  2. シーケンスCosNaming_NameのバッファポインタにCosNaming_NameComponentの配列のポインタを設定し、次に取り出したいオブジェクトリファレンスの名前を指定します。“OBJECT_B”は“CONTEXT_A”の下に配置されるため、獲得する配列の個数を2、名前の[0]番目に“CONTEXT_A”、[1]番目に“OBJECT_B”を指定します。

  3. ネーミングサービスの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++言語のプログラミング例

  1. ORBインタフェースのオブジェクトリファレンスを取り出すCORBA::ORB::resolve_initial_references()によりネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとしてCORBA_ORB_ObjectId_NameServiceを指定します。

  2. シーケンスCosNaming::Nameのバッファポインタ(CosNaming::NameComponent_varの配列)の領域をCosNaming::Name::allocbuf()を使って獲得し、次に取り出したいオブジェクトリファレンスの名前を指定します。“OBJECT_B”は“CONTEXT_A”の下に配置されるため、獲得する配列の個数を2、名前の[0]番目に“CONTEXT_A”、[1]番目に“OBJECT_B”を指定します。

  3. 2.のポインタをパラメタに指定し、演算子newを使ってシーケンスを作成します。

  4. ネーミングサービスの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言語でのプログラミング例

  1. ORBインタフェースのオブジェクトリファレンスを取り出すorg.omg.CORBA.ORB.resolve_initial_references()によりネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、“NameService”を指定します。

  2. org.omg.CosNaming.NameComponent[]の領域を、newを使用して獲得します。

  3. 名前を指定します。“OBJECT_B”は“CONTEXT_A”の下に配置されているため、[0]番目に“CONTEXT_A”、[1]番目に“OBJECT_B”を指定します。

  4. ネーミングサービスの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でのプログラミング例

  1. ORBインタフェースのオブジェクトリファレンスを取り出すCORBA-ORB-RESOLVE-INITIAL-REFERENCESによりネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、“CORBA-ORB-OBJECTID-NAMESERVICE”を指定します。

  2. COSNAMING-NAMEおよびCOSNAMING-NAMECOMPONENTに取り出したいオブジェクトリファレンスの名前を以下のプログラムのように指定します。“OBJECT_B”は“CONTEXT_A”の下に配置されているため、1番目に“CONTEXT_A”、2番目に“OBJECT_B”を指定します。

  3. ネーミングサービスの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".