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

第8章 アプリケーションの開発(OOCOBOL)> 8.8 データ型に対するマッピング

8.8.5 共用体

(1) IDLマッピング

 IDL言語で共用体unionを指定した場合、クラス(共用体クラス)でデータ宣言します。
 以降では、以下のIDL定義例をもとに説明します。

IDL言語

[ファイル名: simple.idl]

  module ODsample{
      union samplefix switch(long){    // 共用体(固定長) 
          case 1: long    para1; 
          case 2: long    para2; 
      };
      union samplevar switch(long){    // 共用体(可変長) 
          case 1: long    para1; 
          case 2: string  para2; 
      };
      interface  uniontest{
          samplefix  op2(
              in samplefix uni1, 
              out samplefix uni2, 
              inout samplefix uni3
          ); 
          samplevar  op1(
              in samplevar uni1, 
              out samplevar uni2, 
              inout samplevar uni3
          ); 
      };
  };

OOCOBOL

[ファイル名: ODSAMPLE-SAMPLEFIX.COB]

  * 共用体クラス(共用体(固定長)) 
   CLASS-ID. ODSAMPLE-SAMPLEFIX AS "ODSAMPLE-SAMPLEFIX"
       INHERITS UNIONBASE.
  *
   OBJECT.
    PROCEDURE DIVISION.
  *
  * DISCRIMINATOR PROPERTY : GET
     METHOD-ID. GET PROPERTY DISCRIMINATOR.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--RET-DISCRIMINATOR TYPE CORBA-LONG.
     PROCEDURE DIVISION RETURNING 0--RET-DISCRIMINATOR.
     END METHOD.
  *
  * MEMBER PROPERTY : GET
     METHOD-ID. GET PROPERTY PARA1.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE TYPE CORBA-LONG.
     PROCEDURE DIVISION RETURNING 0--VALUE
       RAISING CORBA-BAD_PARAM.
     END METHOD.
  *
  * MEMBER PROPERTY : SET
     METHOD-ID. SET PROPERTY PARA1.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE TYPE CORBA-LONG.
     PROCEDURE DIVISION USING 0--VALUE.
     END METHOD.
  *
  * MEMBER PROPERTY : GET
     METHOD-ID. GET PROPERTY PARA2.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE TYPE CORBA-LONG.
     PROCEDURE DIVISION RETURNING 0--VALUE
       RAISING CORBA-BAD_PARAM.
     END METHOD.
  *
  * MEMBER PROPERTY : SET
     METHOD-ID. SET PROPERTY PARA2.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE TYPE CORBA-LONG.
     PROCEDURE DIVISION USING 0--VALUE.
     END METHOD.
  *
  * CLONE METHOD
     METHOD-ID. CLONE AS "CLONE".
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--CLONE-OBJ OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
     PROCEDURE DIVISION RETURNING 0--CLONE-OBJ.
     END METHOD CLONE.
  *
   END OBJECT.
   END CLASS ODSAMPLE-SAMPLEFIX.

[ファイル名: ODSAMPLE-SAMPLEVAR.COB]

  * 共用体クラス(共用体(可変長)
   CLASS-ID. ODSAMPLE-SAMPLEVAR AS "ODSAMPLE-SAMPLEVAR"
       INHERITS UNIONBASE.
  *
   OBJECT.
    PROCEDURE DIVISION.
  *
  * DISCRIMINATOR PROPERTY : GET
     METHOD-ID. GET PROPERTY DISCRIMINATOR.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--RET-DISCRIMINATOR TYPE CORBA-LONG.
     PROCEDURE DIVISION RETURNING 0--RET-DISCRIMINATOR.
     END METHOD.
  *
  * MEMBER PROPERTY : GET
     METHOD-ID. GET PROPERTY PARA1.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE TYPE CORBA-LONG.
     PROCEDURE DIVISION RETURNING 0--VALUE
       RAISING CORBA-BAD_PARAM.
     END METHOD.
  *
  * MEMBER PROPERTY : SET
     METHOD-ID. SET PROPERTY PARA1.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE TYPE CORBA-LONG.
     PROCEDURE DIVISION USING 0--VALUE.
     END METHOD.
  *
  * MEMBER PROPERTY : GET
     METHOD-ID. GET PROPERTY PARA2.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE OBJECT REFERENCE CORBA-STRING.
     PROCEDURE DIVISION RETURNING 0--VALUE
       RAISING CORBA-BAD_PARAM.
     END METHOD.
  *
  * MEMBER PROPERTY : SET
     METHOD-ID. SET PROPERTY PARA2.
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--VALUE OBJECT REFERENCE CORBA-STRING.
     PROCEDURE DIVISION USING 0--VALUE.
     END METHOD.
  *
  * CLONE METHOD
     METHOD-ID. CLONE AS "CLONE".
     DATA DIVISION.
     LINKAGE SECTION.
     01  0--CLONE-OBJ OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
     PROCEDURE DIVISION RETURNING 0--CLONE-OBJ.
     END METHOD CLONE.
  *
   END OBJECT.
   END CLASS ODSAMPLE-SAMPLEVAR.

(2)共用体クラスのメソッド/プロパティ

 共用体クラスで定義されているメソッド/プロパティを以下に示します。

メソッド/プロパティ

機能

CLONEメソッド

(オブジェクトメソッド)共用体クラスを複製します。

弁別子プロパティ

弁別子情報を取得します。

メンバプロパティ

メンバの値の取得/設定を行います。

 メソッド/プロパティの使用例を以下に示します。

  * CLONEメソッド
  *   共用体クラスをUNI-CLONとして複製
   01  UNI       USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01  UNI-CLON  USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   INVOKE UNI "CLONE"  RETURNING UNI-CLON.
  * 弁別子プロパティ
  *   弁別子(DISCRIMINATOR)の値をUNI-MEMTに取得
   01  UNI       USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01  UNI-DISC  TYPE  CORBA-LONG.
   MOVE DISCRIMINATOR OF UNI  TO UNI-DISC.
  * メンバプロパティ(クラス以外のデータ型)
  *   メンバPARA1の値をUNI-MEMTに取得
   01  UNI       USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01  UNI-MEMT  TYPE  CORBA-LONG.
   MOVE PARA1 OF UNI  TO UNI-MEMT.

  *   メンバPARA1にUNI-MEMTを設定
   01  UNI       USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01  UNI-MEMT  TYPE  CORBA-LONG.
   MOVE UNI-MEMT  TO PARA1 OF UNI.
  * メンバプロパティ(クラス)
  *   メンバPARA2の値をUNI-MEMCに取得
   01  UNI       USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01  UNI-MEMC  USAGE OBJECT REFERENCE CORBA-STRING.
   SET UNI-MEMC  TO PARA2 OF UNI.

  *   メンバPARA2にUNI-MEMCを設定
   01  UNI       USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01  UNI-MEMC  USAGE OBJECT REFERENCE CORBA-STRING.
   SET PARA2 OF UNI  TO UNI-MEMC.

(3)クライアントアプリケーション例

 クライアントアプリケーション例を以下に示します。

   IDENTIFICATION         DIVISION.
   PROGRAM-ID.            "CLIENT-MAIN".
  *
   ENVIRONMENT            DIVISION.
   CONFIGURATION          SECTION.
   REPOSITORY.
       COPY               CORBA--REP.
       COPY               COSNAMING--REP.
       COPY               SIMPLE--REP.
       .
   SPECIAL-NAMES.
       SYMBOLIC CONSTANT
       COPY               CORBA--CONST.
       COPY               COSNAMING--CONST.
       COPY               SIMPLE--CONST.
       .
  *
   DATA                   DIVISION.
   WORKING-STORAGE        SECTION.
   COPY                   CORBA--COPY.
   COPY                   COSNAMING--COPY.
   COPY                   SIMPLE--COPY.
  *
   01 ORB                 USAGE OBJECT REFERENCE CORBA-ORB.
   01 OBJ                 USAGE OBJECT REFERENCE CORBA-OBJECT.
   01 NAMING-CONTEXT      USAGE OBJECT REFERENCE COSNAMING-NAMINGCONTEXT.
   01 NAME                TYPE                   COSNAMING-NAME.
   01 NAME-COMPONENT      USAGE OBJECT REFERENCE COSNAMING-NAMECOMPONENT.
   01 NAME-ID             USAGE OBJECT REFERENCE CORBA-STRING.
   01 NAME-KIND           USAGE OBJECT REFERENCE CORBA-STRING.
  *
   01 EXCEPTION-ID        USAGE OBJECT REFERENCE CORBA-STRING.
   01 EXCEPTION-ID-VALUE  PIC   X(50).
   01 API-NAME            PIC   X(50).
  *
   01 TARGET-OBJ          USAGE OBJECT REFERENCE ODSAMPLE-UNIONTEST.
   01 FIX0                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
   01 FIX1                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
   01 FIX2                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
   01 FIX3                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
   01 VAR0                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01 VAR1                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01 VAR2                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01 VAR3                USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
   01 STR-WORK            USAGE OBJECT REFERENCE CORBA-STRING.
  *
   PROCEDURE              DIVISION.
  *
   DECLARATIVES.
  *
   OTHER-ERROR SECTION.
       USE EXCEPTION CORBA-EXCEPTION.
       DISPLAY "CORBA::Exception: " API-NAME.
       SET EXCEPTION-ID TO IDL-ID OF EXCEPTION-OBJECT AS CORBA-EXCEPTION.
       INVOKE EXCEPTION-ID "GET-VALUE" RETURNING EXCEPTION-ID-VALUE.
       DISPLAY "   Exception-id: " EXCEPTION-ID-VALUE.
       EXIT PROGRAM.
   END-OTHER-ERR.
  *
   END DECLARATIVES.
  *
   MAIN SECTION.
  *
       MOVE "CORBA::ORB_init" TO API-NAME.
       INVOKE CORBA "ORB_INIT"
                          USING     "simple_c"
                                    FJ-OM_ORBID
                          RETURNING ORB.
  *
       MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME.
       INVOKE ORB "RESOLVE_INITIAL_REFERENCES"
                          USING     CORBA-ORB-OBJECTID_NAMESERVICE
                          RETURNING OBJ.
  *
       INVOKE COSNAMING-NAMINGCONTEXT "NARROW"
                          USING     OBJ
                          RETURNING NAMING-CONTEXT.
  *
       INVOKE CORBA-STRING "NEW-WITH-VALUE"
                          USING     "ODsample::uniontest"
                          RETURNING NAME-ID.
  *
       INVOKE CORBA-STRING "NEW-WITH-VALUE"
                          USING     " "
                          RETURNING NAME-KIND.
  *
       INVOKE COSNAMING-NAMECOMPONENT "NEW"
                          RETURNING NAME-COMPONENT.
  *
       SET IDL-ID OF NAME-COMPONENT TO NAME-ID.
       SET KIND   OF NAME-COMPONENT TO NAME-KIND.
  *
       INVOKE SEQUENCE-NAMECOMPONENT-001 "NEW-WITH-LENGTH"
                          USING     1
                          RETURNING NAME.
  *
       INVOKE NAME "SET-VALUE"
                          USING     1
                                    NAME-COMPONENT.
  *
       MOVE "CosNaming::NamingContext::resolve" TO API-NAME.
       INVOKE NAMING-CONTEXT "RESOLVE"
                          USING     NAME
                          RETURNING OBJ.
  *
       INVOKE ODSAMPLE-UNIONTEST "NARROW"
                          USING     OBJ
                          RETURNING TARGET-OBJ.
  *
  *  ODsample::samplefix
  *
  *  SET IN PARAMETER
       INVOKE ODSAMPLE-SAMPLEFIX "NEW" RETURNING FIX1.
       MOVE 10 TO PARA1 OF FIX1.
  *
  *  SET INOUT PARAMETER
       INVOKE ODSAMPLE-SAMPLEFIX "NEW" RETURNING FIX3.
       MOVE 21 TO PARA2 OF FIX3.
  *
       MOVE "ODsample::uniontest::op2" TO API-NAME.
       INVOKE TARGET-OBJ "OP2"
                          USING     FIX1
                                    FIX2
                                    FIX3
                          RETURNING FIX0.
  *
  *  ODsample::samplevar
  *
  *  SET IN PARAMETER
       INVOKE ODSAMPLE-SAMPLEVAR "NEW" RETURNING VAR1.
       INVOKE CORBA-STRING "NEW" RETURNING STR-WORK.
       INVOKE STR-WORK "SET-VALUE" USING "Z".
       SET PARA2 OF VAR1 TO STR-WORK.
  *
  *  SET INOUT PARAMETER
       INVOKE ODSAMPLE-SAMPLEVAR "NEW" RETURNING VAR3.
       INVOKE CORBA-STRING "NEW" RETURNING STR-WORK.
       INVOKE STR-WORK "SET-VALUE" USING "y".
       SET PARA2 OF VAR3 TO STR-WORK.
  *
       MOVE "ODsample::uniontest::op1" TO API-NAME.
       INVOKE TARGET-OBJ "OP1"
                          USING     VAR1
                                    VAR2
                                    VAR3
                          RETURNING VAR0.
  *
       STOP RUN.
  *
   END-MAIN.
  *
   END PROGRAM "CLIENT-MAIN".

(4)サーバアプリケーション例

 サーバアプリケーション例を以下に示します。

   CLASS-ID.              ODSAMPLE-UNIONTEST-IMPL
       INHERITS           ODSAMPLE-UNIONTEST.
  *
   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.           OP1 OVERRIDE.
     DATA                 DIVISION.
     WORKING-STORAGE      SECTION.
     01 STR-WORK          USAGE OBJECT REFERENCE CORBA-STRING.
     LINKAGE              SECTION.
     01 UNI1              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
     01 UNI2              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
     01 UNI3              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
     01 UNI0              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEVAR.
  *
     PROCEDURE            DIVISION
                          USING     UNI1
                                    UNI2
                                    UNI3
                          RETURNING UNI0
                          RAISING   CORBA-SYSTEMEXCEPTION.
  *
  *  SET OUT PARAMETER
       INVOKE ODSAMPLE-SAMPLEVAR "NEW" RETURNING UNI2.
       INVOKE CORBA-STRING "NEW" RETURNING STR-WORK.
       INVOKE STR-WORK "SET-VALUE" USING "(*uni2)->para2".
       SET PARA2 OF UNI2 TO STR-WORK.
  *
  *  SET INOUT PARAMETER
       INVOKE ODSAMPLE-SAMPLEVAR "NEW" RETURNING UNI3.
       INVOKE CORBA-STRING "NEW" RETURNING STR-WORK.
       INVOKE STR-WORK "SET-VALUE" USING "(*uni3)->para2".
       SET PARA2 OF UNI3 TO STR-WORK.
  *
  *  SET RESULT
       INVOKE ODSAMPLE-SAMPLEVAR "NEW" RETURNING UNI0.
       INVOKE CORBA-STRING "NEW" RETURNING STR-WORK.
       INVOKE STR-WORK "SET-VALUE" USING "(*uni0)->para2".
       SET PARA2 OF UNI0 TO STR-WORK.
  *
     END METHOD OP1.
  *
  *
     METHOD-ID.           OP2 OVERRIDE.
     DATA                 DIVISION.
     LINKAGE              SECTION.
     01 UNI1              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
     01 UNI2              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
     01 UNI3              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
     01 UNI0              USAGE OBJECT REFERENCE ODSAMPLE-SAMPLEFIX.
  *
     PROCEDURE            DIVISION
                          USING     UNI1
                                    UNI2
                                    UNI3
                          RETURNING UNI0
                          RAISING   CORBA-SYSTEMEXCEPTION.
  *
  *  SET OUT PARAMETER
  *
       INVOKE ODSAMPLE-SAMPLEFIX "NEW" RETURNING UNI2.
       MOVE 0 TO PARA1 OF UNI2.
  *
  *  SET INOUT PARAMETER
       INVOKE ODSAMPLE-SAMPLEFIX "NEW" RETURNING UNI3.
       MOVE 3 TO PARA2 OF UNI3.
  *
  *  SET RESULT
       INVOKE ODSAMPLE-SAMPLEFIX "NEW" RETURNING UNI0.
       MOVE 4 TO PARA1 OF UNI0.
  *
     END METHOD OP2.
  *
   END OBJECT.
  *
   END CLASS ODSAMPLE-UNIONTEST-IMPL.

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

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