動的スケルトンインタフェース(DSI)のサーバアプリケーションは、初期化処理部とサーバアプリケーションが実装するゲートウェイから構成されます。
初期化処理部では、以下に示す処理を行います。

注意
COBOLではC言語、C++言語にあるCORBA_BOA_set_impl_dsi関数によるゲートウェイの登録は行わず、OD_impl_instコマンドを使用してインプリメンテーションリポジトリに登録します。登録方法については、“アプリケーションの開発(COBOL)”-“サーバアプリケーションの登録”の“6.4.1 インプリメンテーションリポジトリへの登録”を参照してください。
CORBAの初期化メソッドCORBA-ORB-INITを呼び出して初期化処理を行います。本メソッドの結果として、ORBのオブジェクトリファレンスが返されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。
また、基本オブジェクトアダプタの初期化処理を行います。
サーバアプリケーションの初期化が完了すると、ORBに対してその旨を通知します。ORBは、この命令が発行された時点で、クライアントからの要求をサーバアプリケーションに伝えます。
ゲートウェイでは、以下に示す処理を行います。
メソッドの解析
パラメタの組立て
パラメタの解析
処理部の起動
復帰情報の設定
例外情報の設定
ゲートウェイの実装例を以下に示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. "ODDEMO-CALCULATOR".
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.
01 COPY REPOSITORYID IN CORBA REPLACING
CORBA-REPOSITORYID BY DSI-OP-NAME.
01 TMP-BUF USAGE POINTER.
01 COPY ULONG IN CORBA REPLACING
CORBA-UNSIGNED-LONG BY STRING-LENGTH.
01 COPY ULONG IN CORBA REPLACING
CORBA-UNSIGNED-LONG BY RET-VAL.
01 STR-BUF PIC X(20).
01 COPY SERVERREQUEST IN CORBA REPLACING
CORBA-SERVERREQUEST BY REQUEST-V.
01 COPY ENVIRONMENT IN CORBA REPLACING
CORBA-ENVIRONMENT BY W-ENV.
01 COPY BOOLEAN IN CORBA REPLACING
CORBA-BOOLEAN BY RET.
*
LINKAGE SECTION.
01 COPY OBJECT IN CORBA REPLACING
CORBA-OBJECT BY OBJ.
01 COPY SERVERREQUEST IN CORBA REPLACING
CORBA-SERVERREQUEST BY REQUEST.
01 COPY ENVIRONMENT IN CORBA REPLACING
CORBA-ENVIRONMENT BY ENV.
*
PROCEDURE DIVISION USING OBJ REQUEST ENV.
MAIN.
* (1) メソッドの解析
CALL "CORBA-SERVERREQUEST-OP-NAME" USING
REQUEST
ENV
DSI-OP-NAME.
MOVE FUNCTION LENG (STR-BUF) TO STRING-LENGTH.
CALL "CORBA-STRING-GET" USING
DSI-OP-NAME
STRING-LENGTH
STR-BUF.
IF STR-BUF = "calculate"
CALL "ODDEMO-CALCULATOR-CALCULATE" USING REQUEST ENV
MOVE "CORBA-SERVERREQUEST-OP-NAME" TO MESS
END-IF.
CALL "CORBA-FREE" USING TMP-BUF.
EXIT PROGRAM.
MAIN-END.
END PROGRAM "ODDEMO-CALCULATOR".
IDENTIFICATION DIVISION.
PROGRAM-ID. "ODDEMO-CALCULATOR-CALCULATE".
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 MESS PIC X(30).
01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY STRING-LENGTH.
01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB.
01 COPY BOA IN CORBA REPLACING CORBA-BOA BY BOA.
01 ARG-LIST USAGE POINTER.
01 COPY TYPECODE IN CORBA REPLACING CORBA-TYPECODE BY TC-TYPE.
01 COPY FLAGS IN CORBA REPLACING CORBA-FLAGS BY FLAG.
01 STRING-POINTER USAGE POINTER.
01 PARAM-POINTER USAGE POINTER.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM.
01 STRING-TMP PIC X(10).
01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY FLAGS.
01 TEMP-BUF USAGE POINTER.
01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY RET-VAL.
01 EXC-POINTER USAGE POINTER.
01 COPY EXCEPTION-TYPE IN CORBA REPLACING CORBA-EXCEPTION-TYPE BY ENV-FLAGS.
01 USER-ID USAGE POINTER.
01 EX-ODDEMO-CALCULATOR-ZEROPARAM PIC X(35) VALUE
"IDL:ODdemo/calculator/ZEROPARAM:1.0".
01 TC-ODDEMO-CALCULATOR-RESULT.
03 MEMBER1 PIC X(100) VALUE
"131,131,0,0,0,0,15,4,0,16,0,33,73,68,76,58,79,68,100,101,109,111,47,99,97,108,99,117,108,97,116,111,".
03 MEMBER2 PIC X(100) VALUE
"114,47,114,101,115,117,108,116,58,49,46,48,0,0,7,114,101,115,117,108,116,0,0,4,0,11,97,100,100,95,11".
03 MEMBER3 PIC X(100) VALUE
"4,101,115,117,108,116,0,0,1,3,0,16,115,117,98,116,114,97,99,116,95,114,101,115,117,108,116,0,0,1,3,0".
03 MEMBER4 PIC X(100) VALUE
",16,109,117,108,116,105,112,108,101,95,114,101,115,117,108,116,0,0,1,3,0,14,100,105,118,105,100,101,".
03 MEMBER5 PIC X(100) VALUE "95,114,101,115,117,108,116,0,0,1,6".
01 TC-ODDEMO-CALCULATOR-ZEROPARAM.
03 MEMBER1 PIC X(100) VALUE
"73,73,0,0,0,0,22,4,0,4,0,36,73,68,76,58,79,68,100,101,109,111,47,99,97,108,99,117,108,97,116,111,114".
03 MEMBER2 PIC X(100) VALUE
",47,90,69,82,79,80,65,82,65,77,58,49,46,48,0,0,10,90,69,82,79,80,65,82,65,77,0,0,1,0,8,101,120,99,10".
03 MEMBER3 PIC X(100) VALUE "1,112,95,108,0,0,1,3".
01 COPY EXCEPTION-TYPE IN CORBA REPLACING CORBA-EXCEPTION-TYPE BY EX-STATUS.
01 COPY ANY IN CORBA REPLACING CORBA-ANY BY RESULT.
01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY C-ARG-C.
01 C-ARG-V.
02 FILLER OCCURS 2.
03 ARG-V-VALUE USAGE POINTER.
01 APLI-NAME PIC X(8) VALUE "simple_s".
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY P1.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY P2.
LINKAGE SECTION.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARAM1.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARAM2.
01 A-RESULT.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY ADD-RESULT.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SUBTRACT-RESULT.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY MULTIPLE-RESULT.
02 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY DEVIDE-RESULT.
01 LIST-VALUE.
03 FILLER OCCURS 2.
05 COPY NAMEDVALUE IN CORBA REPLACING CORBA-NAMEDVALUE BY TMP-NAMVAL.
01 EXCEP.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY EXCEP-L.
01 COPY ANY IN CORBA REPLACING CORBA-ANY BY EXC-VALUE.
01 COPY SERVERREQUEST IN CORBA REPLACING
CORBA-SERVERREQUEST BY REQUEST.
01 COPY ENVIRONMENT IN CORBA REPLACING
CORBA-ENVIRONMENT BY ENV.
*
PROCEDURE DIVISION USING REQUEST ENV.
*
MAIN.
COMPUTE C-ARG-C = 1.
MOVE FUNCTION LENG (APLI-NAME) TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
ARG-V-VALUE (1)
STRING-LENGTH
APLI-NAME.
SET ARG-V-VALUE(2) TO NULL.
MOVE 12 TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
TEMP-BUF
STRING-LENGTH
FJ-OM-ORB-ID.
CALL "CORBA-ORB-INIT" USING
C-ARG-C
C-ARG-V
TEMP-BUF
ENV
ORB.
MOVE "CORBA-ORB-INIT" TO MESS.
PERFORM ENV-CHECK
CALL "CORBA-FREE" USING
TEMP-BUF.
MOVE 15 TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
TEMP-BUF
STRING-LENGTH
CORBA-BOA-OA-ID.
CALL "CORBA-ORB-BOA-INIT" USING
ORB
C-ARG-C
C-ARG-V
TEMP-BUF
ENV
BOA.
MOVE "CORBA-ORB-BOA-INIT" TO MESS.
PERFORM ENV-CHECK.
* (2) パラメタの組み立て
* パラメタリストの生成
MOVE 2 TO NUM.
CALL "CORBA-ORB-CREATE-LIST" USING
ORB
NUM
ARG-LIST
ENV
RET-VAL.
MOVE "CORBA-ORB-CREATE-LIST" TO MESS.
PERFORM ENV-CHECK.
* パラメタ情報の登録
MOVE "a" TO STRING-TMP.
MOVE FUNCTION LENG (STRING-TMP) TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
STRING-POINTER
STRING-LENGTH
STRING-TMP.
MOVE FUNCTION LENG (TC-LONG) TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
TEMP-BUF
STRING-LENGTH
TC-LONG.
CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
TEMP-BUF
TC-TYPE.
CALL "CORBA-FREE" USING
TEMP-BUF.
MOVE FUNCTION ADDR( P1 ) TO PARAM-POINTER.
MOVE 0 TO NUM.
SET CORBA-ARG-IN OF FLAG TO TRUE.
CALL "CORBA-NVLIST-ADD-ITEM" USING
ARG-LIST
STRING-POINTER
TC-TYPE
PARAM-POINTER
NUM
FLAG
ENV
RET-VAL.
MOVE "CORBA-NVLIST-ADD-ITEM" TO MESS.
PERFORM ENV-CHECK.
MOVE "b" TO STRING-TMP.
MOVE FUNCTION LENG (STRING-TMP) TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
STRING-POINTER
STRING-LENGTH
STRING-TMP.
MOVE FUNCTION LENG (TC-LONG) TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
TEMP-BUF
STRING-LENGTH
TC-LONG.
CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
TEMP-BUF
TC-TYPE.
CALL "CORBA-FREE" USING
TEMP-BUF.
MOVE FUNCTION ADDR( P2 ) TO PARAM-POINTER.
MOVE 0 TO NUM.
SET CORBA-ARG-IN OF FLAG TO TRUE.
CALL "CORBA-NVLIST-ADD-ITEM" USING
ARG-LIST
STRING-POINTER
TC-TYPE
PARAM-POINTER
NUM
FLAG
ENV
RET-VAL.
MOVE "CORBA-NVLIST-ADD-ITEM" TO MESS.
PERFORM ENV-CHECK.
* (3) パラメタの解析
CALL "CORBA-SERVERREQUEST-PARAMS" USING
REQUEST
ARG-LIST
ENV.
MOVE "CORBA-SERVERREQUEST-PARAMS" TO MESS.
PERFORM ENV-CHECK.
SET ADDRESS OF LIST-VALUE TO ARG-LIST.
SET ADDRESS OF PARAM1 TO ANY-VALUE OF LIST-VALUE(1).
SET ADDRESS OF PARAM2 TO ANY-VALUE OF LIST-VALUE(2).
* 例外判定
IF PARAM2 = 0
* (5) 例外情報の設定
SET CORBA-USER-EXCEPTION OF ENV-FLAGS TO TRUE
MOVE FUNCTION LENG ( EX-ODDEMO-CALCULATOR-ZEROPARAM ) TO STRING-LENGTH
CALL "CORBA-STRING-SET" USING
USER-ID
STRING-LENGTH
EX-ODDEMO-CALCULATOR-ZEROPARAM
CALL "CORBA-ANY-ALLOC" USING EXC-POINTER
SET ADDRESS OF EXC-VALUE TO EXC-POINTER
MOVE FUNCTION LENG (TC-ODDEMO-CALCULATOR-ZEROPARAM) TO STRING-LENGTH
CALL "CORBA-STRING-SET" USING
TEMP-BUF
STRING-LENGTH
TC-ODDEMO-CALCULATOR-ZEROPARAM
CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
TEMP-BUF
ANY-TYPE OF EXC-VALUE
CALL "ODDEMO-CALCULATOR-ZEROPARAM-ALLOC" USING ANY-VALUE OF EXC-VALUE
SET ADDRESS OF EXCEP TO ANY-VALUE OF EXC-VALUE
MOVE 0 TO EXCEP-L OF EXCEP
CALL "CORBA-SERVERREQUEST-EXCEPTION" USING
REQUEST
ENV-FLAGS
USER-ID
EXC-POINTER
ENV
MOVE "CORBA-SERVERREQUEST-EXCEPTION" TO MESS
PERFORM ENV-CHECK
ELSE
* (4) 復帰情報の設定
MOVE FUNCTION LENG (TC-ODDEMO-CALCULATOR-RESULT) TO STRING-LENGTH
CALL "CORBA-STRING-SET" USING
TEMP-BUF
STRING-LENGTH
TC-ODDEMO-CALCULATOR-RESULT
CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
TEMP-BUF
ANY-TYPE OF RESULT
CALL "ODDEMO-CALCULATOR-RESULT-ALLOC" USING ANY-VALUE OF RESULT
SET ADDRESS OF A-RESULT TO ANY-VALUE OF RESULT
COMPUTE ADD-RESULT OF A-RESULT = PARAM1 + PARAM2
COMPUTE SUBTRACT-RESULT OF A-RESULT = PARAM1 - PARAM2
COMPUTE MULTIPLE-RESULT OF A-RESULT = PARAM1 * PARAM2
COMPUTE DEVIDE-RESULT OF A-RESULT = PARAM1 / PARAM2
CALL "CORBA-SERVERREQUEST-RESULT" USING
REQUEST
RESULT
ENV
MOVE "CORBA-SERVERREQUEST-PARAMS" TO MESS
PERFORM ENV-CHECK
END-IF.
EXIT PROGRAM.
MAIN-END.
ENV-CHECK SECTION.
EVALUATE TRUE
WHEN CORBA-NO-EXCEPTION OF MAJOR OF ENV
CONTINUE
WHEN CORBA-USER-EXCEPTION OF MAJOR OF ENV
EXIT PROGRAM
WHEN CORBA-SYSTEM-EXCEPTION OF MAJOR OF ENV
EXIT PROGRAM
END-EVALUATE.
ENV-CHECK-END.
EXIT.
*
END PROGRAM "ODDEMO-CALCULATOR-CALCULATE".(1)メソッドの解析
CORBA-SERVERREQUEST-OP-NAMEメソッドを発行して、メソッド名を解析します。
(2)パラメタの組み立て
CORBA-ORB-CREATE-LISTメソッドにより、サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、パラメタとして、何個のパラメタを格納するかを指定します。その結果、NVListオブジェクトリファレンスが返されます。
CORBA-NVLIST-ADD-ITEMメソッドにより、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタとして、CORBA-NVLISTオブジェクトリファレンス、サーバアプリケーションのパラメタの名前、型、値および長さを設定します。
(3)パラメタの解析
CORBA-SERVERREQUEST-PARAMSメソッドを発行して、パラメタを解析します。
(4)復帰情報の設定
CORBA-SERVERREQUEST-RESULTメソッドを発行して、復帰情報を設定します。
(5)例外情報の設定
CORBA-SERVERREQUEST-EXCEPTIONメソッドを発行して例外情報を設定します。
サーバアプリケーションのメソッドが発生するユーザ例外を設定し、クライアントへ通知します。メソッドが発生するユーザ例外は、IDLのオペレーション定義で記述されます。
サーバアプリケーションは、利用者からの停止要求を受けた場合、クライアントからの要求を以降受け付けない旨をORBに対して通知します。