Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

付録F 動的スケルトンインタフェースのプログラミング> F.5 OOCOBOLの開発

F.5.4 ゲートウェイの処理

 ゲートウェイでは、以下に示す処理を行います。

  (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.

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005