| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 付録F 動的スケルトンインタフェースのプログラミング | > F.5 OOCOBOLの開発 |
ゲートウェイでは、以下に示す処理を行います。
(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.
渡されたServerRequestクラスに登録されているオペレーション名をCORBA-SERVERREQUEST-OPERATIONメソッドにより取得します。
CORBA-ORB-CREATE_LISTメソッドにより、アプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、引数として何個のパラメタを格納するかを指定します。結果としてCORBA-NVLISTオブジェクトが返されます。
生成したNVLISTオブジェクトを引数としてCORBA-SERVERREQUEST-ARGUMENTSメソッドを呼び出します。この結果、アプリケーションに渡すパラメタ値が取得されます。
CORBA-SERVERREQUEST-SET_RESULTメソッドを発行して復帰情報の設定を行います。
ゲートウェイを実装するIMPLオブジェクトは、DSIBASEを継承するものとして作成します。また、クライアントからのリクエストに対して起動されるメソッドとしてCORBA-SERVERREQUEST-INVOKE-METHODメソッドを実装します。起動の際、CORBA-SERVERREQUEST-INVOKE-METHODの引数としてServerRequestクラスのオブジェクト(上記例ではANY-RESULT)が渡されます。
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.
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.
目次
索引
![]()
|