| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第9章 ネーミングサービスのプログラミング | > 9.7 ネーミングサービスのプログラミング例 |
ネーミングサービスで、以下のようにネーミングコンテキスト配下にオブジェクトが格納されている場合に、オブジェクトリファレンスをどのように登録するかについて説明します。

OBJECT_Bを登録するプログラムの例を以下に示します。
ORBインタフェースのオブジェクトリファレンスを取り出すCORBA_ORB_resolve_initial_references()により、ネーミングサービスのオブジェクトリファレンスを取り出します。パラメタとして、CORBA_ORB_ObjectId_NameServiceを指定します。
次に、シーケンスCosNaming_NameのバッファポインタにCosNaming_NameComponentの配列のポインタを設定し、次に取り出したいオブジェクトリファレンスの名前を指定します。"OBJECT_B"は"CONTEXT_A"の下に配置されるため、獲得する配列の個数を2、名前の[0]番目に"CONTEXT_A"、[1]番目に"OBJECT_B"を指定します。
最後に、ネーミングサービスの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(¤t_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 );
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::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 ){
... // エラー処理
}
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.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 ){
... // エラー処理
}
}
}
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-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".
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-BINDを使って、ネーミングサービスにオブジェクトリファレンスを登録します。
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 REF-ID TYPE CORBA-REFERENCEDATA.
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.
*
MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME.
INVOKE ORB "RESOLVE_INITIAL_REFERENCES"
USING CORBA-OBJECTID_LIGHTINTERF-001
RETURNING OBJ.
INVOKE CORBA-REPOSITORY "NARROW" USING OBJ RETURNING INTF-REP.
*
MOVE "CORBA::Repository::lookup_id" TO API-NAME.
INVOKE INTF-REP "LOOKUP_ID" USING "IDL:OBJECT_B:1.0" RETURNING OBJ.
INVOKE CORBA-INTERFACEDEF "NARROW" USING OBJ RETURNING INTF.
*
MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME.
INVOKE ORB "RESOLVE_INITIAL_REFERENCES"
USING CORBA-OBJECTID_IMPLEMENTAT-001
RETURNING OBJ.
INVOKE FJ-IMPLEMENTATIONREP "NARROW" USING OBJ RETURNING IMPL-REP.
*
MOVE "FJ::ImplementationRep::lookup_id" TO API-NAME.
INVOKE IMPL-REP "LOOKUP_ID" USING "IDL:OBJECT_B:1.0" RETURNING OBJ.
INVOKE CORBA-IMPLEMENTATIONDEF "NARROW" USING OBJ RETURNING IMPL.
*
MOVE "CORBA::BOA::create" TO API-NAME.
INVOKE SEQUENCE-OCTET "NEW" RETURNING REF-ID.
INVOKE BOA "IDL-CREATE" USING REF-ID INTF IMPL RETURNING OBJ.
*
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::bind" TO API-NAME.
INVOKE NAMING-CONTEXT "BIND"
USING NAME
OBJ.
*
STOP RUN.
*
END-MAIN.
*
END PROGRAM "CLIENT-MAIN".
目次
索引
![]()
|