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

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

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

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

・メソッドの解析

・パラメタの組立て

・パラメタの解析

・処理部の起動

・復帰情報の設定

・例外情報の設定

ゲートウェイの実装例を以下に示します。

   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.
  
       MOVE12 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)パラメタの組み立て

  1. CORBA-ORB-CREATE-LISTメソッドにより、サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、パラメタとして、何個のパラメタを格納するかを指定します。その結果、NVListオブジェクトリファレンスが返されます。
  2. CORBA-NVLIST-ADD-ITEMメソッドにより、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタとして、CORBA-NVLISTオブジェクトリファレンス、サーバアプリケーションのパラメタの名前、型、値および長さを設定します。

(3)パラメタの解析

 CORBA-SERVERREQUEST-PARAMSメソッドを発行して、パラメタの解析を行います。

(4)復帰情報の設定

 CORBA-SERVERREQUEST-RESULTメソッドを発行して、復帰情報の設定を行います。

(5)例外情報の設定

 CORBA-SERVERREQUEST-EXCEPTIONメソッドを発行して例外情報の設定を行います。
 サーバアプリケーションのメソッドが発生するユーザ例外を設定し、クライアントへ通知します(メソッドが発生するユーザ例外は、IDLのオペレーション定義で記述されます)。


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

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