動的スケルトンインタフェース(DSI)のサーバアプリケーションは、初期化処理部とサーバアプリケーションが実装するゲートウェイから構成されます。
初期化処理部では、以下に示す処理を行います。
CORBAの初期化メソッドCORBA-ORB_INITを呼び出して初期化処理を行います。本関数の結果として、ORBのオブジェクトリファレンスが通知されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。
IDENTIFICATION DIVISION. PROGRAM-ID. "SERVER-MAIN". * ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. COPY CORBA--REP. COPY SIMPLE--REP. CLASS ODDEMO-CALCULATOR-IMPL. . SPECIAL-NAMES. SYMBOLIC CONSTANT COPY CORBA--CONST. COPY SIMPLE--CONST. . * DATA DIVISION. WORKING-STORAGE SECTION. COPY CORBA--COPY. COPY SIMPLE--COPY. 01 API-NAME PIC X(50). 01 APL-NAME PIC X(8) VALUE "Simple_s". 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 REP-ID PIC X(25) VALUE "IDL:ODdemo/calculator:1.0". 01 OBJ USAGE OBJECT REFERENCE CORBA-OBJECT. 01 EXCEPT-ID USAGE OBJECT REFERENCE CORBA-STRING. 01 EXCEPT-ID-VALUE PIC X(50). 01 L-DSIBASE USAGE OBJECT REFERENCE DSIBASE. * PROCEDURE DIVISION. * DECLARATIVES. ERR SECTION. USE EXCEPTION CORBA-EXCEPTION. SET EXCEPT-ID TO IDL-ID OF EXCEPTION-OBJECT AS CORBA-EXCEPTION. INVOKE EXCEPT-ID "GET-VALUE" RETURNING EXCEPT-ID-VALUE. DISPLAY API-NAME " is failed.". DISPLAY "Exception-id is " EXCEPT-ID-VALUE. EXIT PROGRAM. END-ERR. END DECLARATIVES. * MOVE "CORBA::ORB_init" TO API-NAME. INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB. * MOVE "CORBA::ORB::BOA_init" TO API-NAME. INVOKE ORB "BOA_INIT" USING APL-NAME CORBA-BOA_OAID RETURNING BOA.
サーバアプリケーションが実装するゲートウェイをORBに対して通知します。このため、以下の手順で処理を行います。
CORBA-ORB-RESOLVE_INITIAL_REFERENCESメソッドによりインプリメンテーションリポジトリのオブジェクトリファレンスを取り出します。メソッドのパラメタとしてCORBA-OBJECTID_IMPLEMENTAT-001(値は“ImplementationRepository”)を指定します。
サーバアプリケーションのImplementationRepオブジェクトのオブジェクトリファレンスを求めるため、CORBA-IMPLEMENTATIONDEF-LOOKUP_IDを発行します。
サーバアプリケーションが実装するゲートウェイを登録するために、CORBA-BOA-SET_IMPL_DSIを発行します。
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 REP-ID RETURNING OBJ. INVOKE CORBA-IMPLEMENTATIONDEF "NARROW" USING OBJ RETURNING IMPL. * INVOKE ODDEMO-CALCULATOR-IMPL "NEW" RETURNING L-DSIBASE. INVOKE BOA "SET_IMPL_DSI" USING L-DSIBASE.
サーバアプリケーションの初期化が完了すると、ORBに対してその旨を通知します。ORBは、この命令が発行された時点で、クライアントからの要求をサーバアプリケーションに伝えます。
ゲートウェイでは、以下に示す処理を行います。
(1)メソッドの取得と解析
(2)パラメタの組立て
(3)パラメタの解析
(4)復帰情報の設定
(5)例外情報の設定
ゲートウェイの実装例を以下に示します。
【ゲートウェイ実装例】
CLASS-ID. ODDEMO-CALCULATOR-IMPL INHERITS DSIBASE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. COPY CORBA--REP. COPY SIMPLE--REP. . SPECIAL-NAMES. SYMBOLIC CONSTANT COPY CORBA--CONST. COPY SIMPLE--CONST. . * OBJECT. DATA DIVISION. WORKING-STORAGE SECTION. COPY CORBA--COPY. COPY SIMPLE--COPY. PROCEDURE DIVISION. * METHOD-ID. INVOKE-METHOD OVERRIDE. DATA DIVISION. WORKING-STORAGE SECTION. 01 EXCEP OBJECT REFERENCE CORBA-SYSTEMEXCEPTION. 01 L-OP-NAME OBJECT REFERENCE CORBA-STRING. 01 L-BUF PIC X(30). 01 L-NVLIST OBJECT REFERENCE CORBA-NVLIST. 01 NV-A OBJECT REFERENCE CORBA-NAMEDVALUE. 01 NV-B OBJECT REFERENCE CORBA-NAMEDVALUE. 01 NV-RESULT OBJECT REFERENCE CORBA-NAMEDVALUE. 01 ANY-A OBJECT REFERENCE CORBA-ANY. 01 ANY-B OBJECT REFERENCE CORBA-ANY. 01 ANY-RESULT OBJECT REFERENCE CORBA-ANY. 01 CALCULATE-A TYPE CORBA-LONG. 01 CALCULATE-B TYPE CORBA-LONG. 01 CALCULATE-RESULT TYPE ODDEMO-CALCULATOR-RESULT. 01 RET TYPE CORBA-STATUS. 01 API-NAME PIC X(50). 01 APL-NAME PIC X(8) VALUE "SIMPLE_S". 01 ORB OBJECT REFERENCE CORBA-ORB. 01 TMP_TC OBJECT REFERENCE CORBA-TYPECODE. 01 TMP-TCK TYPE CORBA-TCKIND. 01 FLAG TYPE CORBA-FLAGS. * LINKAGE SECTION. 01 L-SVREQ OBJECT REFERENCE CORBA-SERVERREQUEST. * PROCEDURE DIVISION USING L-SVREQ RAISING CORBA-SystemException. * メソッド名の取得 INVOKE L-SVREQ "OPERATION" RETURNING L-OP-NAME. INVOKE L-OP-NAME "GET-VALUE" RETURNING L-BUF. * (1) メソッド名の解析 IF NOT L-BUF = "calculate" INVOKE CORBA-BAD_OPERATION "NEW" RETURNING EXCEP EXIT METHOD RAISING EXCEP END-IF. MOVE "CORBA::ORB_init" TO API-NAME. INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB. * (2) パラメタリストの作成 INVOKE ORB "CREATE_LIST" USING 2 L-NVLIST. INVOKE CORBA-ANY "NEW" RETURNING ANY-A. INVOKE CORBA-ANY "NEW" RETURNING ANY-B. INVOKE CORBA-ANY "NEW" RETURNING ANY-RESULT. SET CORBA-TK_LONG OF TMP-TCK TO TRUE. INVOKE ORB "GET_PRIMITIVE_TC" USING TMP-TCK RETURNING TMP_TC. INVOKE ANY-A "SET-TYPE" USING TMP_TC. INVOKE ANY-B "SET-TYPE" USING TMP_TC. INVOKE ODDEMO-CALCULATOR-RESULT--H "TYPE" RETURNING TMP_TC. INVOKE ANY-RESULT "SET-TYPE" USING TMP_TC. MOVE "A" TO L-BUF. SET CORBA-ARG_IN OF FLAG TO TRUE. INVOKE L-NVLIST "ADD_VALUE" USING L-BUF ANY-A FLAG RETURNING NV-A. MOVE "B" TO L-BUF INVOKE L-NVLIST "ADD_VALUE" USING L-BUF ANY-B FLAG RETURNING NV-B. * (3) パラメタの解析 INVOKE L-SVREQ "ARGUMENTS" USING L-NVLIST. INVOKE ANY-A "EXTRACT_LONG" RETURNING CALCULATE-A. INVOKE ANY-B "EXTRACT_LONG" RETURNING CALCULATE-B. * 処理部の起動 INVOKE SELF "CALCULATE" USING CALCULATE-A CALCULATE-B RETURNING CALCULATE-RESULT. * (4) 復帰情報の起動 INVOKE ODDEMO-CALCULATOR-RESULT--H "INSERT" USING ANY-RESULT CALCULATE-RESULT. INVOKE L-SVREQ "SET_RESULT" USING ANY-RESULT. * END METHOD INVOKE-METHOD. *** 処理部 METHOD-ID. CALCULATE. DATA DIVISION. WORKING-STORAGE SECTION. 01 CALCULATE-ZEROPARAM USAGE OBJECT REFERENCE ODDEMO-CALCULATOR-ZEROPARAM. LINKAGE SECTION. 01 CALCULATE-A TYPE CORBA-LONG. 01 CALCULATE-B TYPE CORBA-LONG. 01 CALCULATE-RESULT TYPE ODDEMO-CALCULATOR-RESULT. * PROCEDURE DIVISION USING CALCULATE-A CALCULATE-B RETURNING CALCULATE-RESULT RAISING CORBA-SystemException ODDEMO-CALCULATOR-ZEROPARAM. * IF CALCULATE-B = 0 INVOKE ODDEMO-CALCULATOR-ZEROPARAM "NEW" RETURNING CALCULATE-ZEROPARAM EXIT METHOD RAISING CALCULATE-ZEROPARAM END-IF. * COMPUTE ADD_RESULT OF CALCULATE-RESULT = CALCULATE-A + CALCULATE-B. COMPUTE SUBTRACT_RESULT OF CALCULATE-RESULT = CALCULATE-A - CALCULATE-B. COMPUTE MULTIPLE_RESULT OF CALCULATE-RESULT = CALCULATE-A * CALCULATE-B. COMPUTE DIVIDE_RESULT OF CALCULATE-RESULT = CALCULATE-A / CALCULATE-B. END METHOD CALCULATE. * END OBJECT. * END CLASS ODDEMO-CALCULATOR-IMPL.
(1)メソッドの取得と解析
渡されたServerRequestクラスに登録されているオペレーション名をCORBA-SERVERREQUEST-OPERATIONメソッドにより取得します。
(2)パラメタの組立て
CORBA-ORB-CREATE_LISTメソッドにより、アプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、引数として何個のパラメタを格納するかを指定します。結果としてCORBA-NVLISTオブジェクトが返されます。
(3)パラメタの解析
生成したNVLISTオブジェクトを引数としてCORBA-SERVERREQUEST-ARGUMENTSメソッドを呼び出します。この結果、アプリケーションに渡すパラメタ値が取得されます。
(4)復帰情報の設定
CORBA-SERVERREQUEST-SET_RESULTメソッドを発行して復帰情報を設定します。
ゲートウェイを実装するIMPLオブジェクトは、DSIBASEを継承するものとして作成します。また、クライアントからのリクエストに対して起動されるメソッドとしてCORBA-SERVERREQUEST-INVOKE-METHODメソッドを実装します。起動の際、CORBA-SERVERREQUEST-INVOKE-METHODの引数としてServerRequestクラスのオブジェクト(上記例ではANY-RESULT)が渡されます。
(5)例外情報の設定
CORBA-SERVERREQUEST-SET_EXCEPTIONメソッドを発行して例外情報を設定します。
サーバアプリケーションのメソッドが発生するユーザ例外を設定し、クライアントへ通知します。メソッドが発生するユーザ例外は、IDLのオペレーション定義で記述されます。
REPOSITORY. CLASS CORBA-ANY CLASS ODDEMO-CALCULATOR-ZEROPARAM—HELPER CLASS ODDEMO-CALCULATOR-ZEROPARAM DATA DIVISION. WORKING-STORAGE SECTION. 01 DSI-REQUEST USAGE OBJECT REFERENCE CORBA-SEQRVERREQUEST. 01 EX USAGE OBJECT REFERENCE CORBA-ANY. 01 EX-TYPE USAGE OBJECT REFERENCE CORBA-TYPECODE. PROCEDURE DIVISION. INVOKE ODDEMO-CALCULATOR-ZEROPARAM--HELPER "TYPE" RETURNING EX-TYPE. INVOKE CORBA-ANY "NEW" RETURNING EX. INVOKE EX "SET-TYPE" USING EX-TYPE. INVOKE DSI-REQUEST "SET_EXCEPTION" USING EX.
【ゲートウェイIMPLクラスの必須メソッド】
METHOD-ID. INVOKE-METHOD OVERRIDE. DATA DIVISION. LINKAGE SECTION. 01 L-SVREQ USAGE OBJECT REFERENCE CORBA-SERVERREQUEST. PROCEDURE DIVISION USING L-SVREQ RAISING CORBA-SystemException.