Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第7章 アプリケーションの開発(OOCOBOL) | > 7.8 データ型に対するマッピング |
IDL言語でシーケンス型sequenceを指定した場合、クラス(シーケンスクラス)でデータ宣言します。
以降では、以下のIDL定義例をもとに説明します。
[ファイル名: simple.idl]
module ODsample{ interface seqtest{ typedef sequence<long> sampleseq; sampleseq op1(in sampleseq seq1, out sampleseq seq2, inout sampleseq seq3 ); }; };
[ファイル名: simple--copy.cbl]
* データ型宣言(typedef) 01 ODSAMPLE-SEQTEST-SAMPLESEQ TYPEDEF OBJECT REFERENCE SEQUENCE-LONG.
[ファイル名: sequence-long.cob]
* シーケンスクラス(sequence<long>) CLASS-ID. sequence-long AS "sequence-long" INHERITS SEQUENCEBASE. * FACTORY. PROCEDURE DIVISION. * * NEW-WITH-LENGTH METHOD METHOD-ID. NEW-WITH-LENGTH AS "NEW-WITH-LENGTH". DATA DIVISION. LINKAGE SECTION. COPY CORBA--COPY. 01 0--SEQ-LENGTH TYPE CORBA-UNSIGNED-LONG. 01 0--SEQ-OBJ OBJECT REFERENCE SELF. PROCEDURE DIVISION USING 0--SEQ-LENGTH RETURNING 0--SEQ-OBJ RAISING CORBA-SYSTEMEXCEPTION. END METHOD NEW-WITH-LENGTH. END FACTORY. * OBJECT. PROCEDURE DIVISION. * * SEQ-MAXIMUM PROPERTY : GET METHOD-ID. GET PROPERTY SEQ-MAXIMUM. DATA DIVISION. LINKAGE SECTION. 01 0--SEQ-MAXIMUM TYPE CORBA-UNSIGNED-LONG. PROCEDURE DIVISION RETURNING 0--SEQ-MAXIMUM. MOVE 0--MAXIMUM TO 0--SEQ-MAXIMUM. END METHOD. * * SEQ-LENGTH PROPERTY : GET METHOD-ID. GET PROPERTY SEQ-LENGTH. DATA DIVISION. LINKAGE SECTION. 01 0--LENGTH-RESULT TYPE CORBA-UNSIGNED-LONG. PROCEDURE DIVISION RETURNING 0--LENGTH-RESULT. MOVE 0--LENGTH TO 0--LENGTH-RESULT. END METHOD. * * SEQ-LENGTH PROPERTY : SET METHOD-ID. SET PROPERTY SEQ-LENGTH. DATA DIVISION. LINKAGE SECTION. 01 0--LENGTH-PARAM TYPE CORBA-UNSIGNED-LONG. PROCEDURE DIVISION USING 0--LENGTH-PARAM RAISING CORBA-SYSTEMEXCEPTION. END METHOD. * * GET-VALUE METHOD METHOD-ID. GET-VALUE AS "GET-VALUE". DATA DIVISION. LINKAGE SECTION. 01 0--ELEMS TYPE CORBA-UNSIGNED-LONG. 01 0--VALUE TYPE CORBA-LONG. PROCEDURE DIVISION USING 0--ELEMS RETURNING 0--VALUE. END METHOD GET-VALUE. * * SET-VALUE METHOD METHOD-ID. SET-VALUE AS "SET-VALUE". DATA DIVISION. LINKAGE SECTION. 01 0--ELEMS TYPE CORBA-UNSIGNED-LONG. 01 0--VALUE TYPE CORBA-LONG. PROCEDURE DIVISION USING 0--ELEMS 0--VALUE. END METHOD SET-VALUE. * * CLONE METHOD METHOD-ID. CLONE AS "CLONE". DATA DIVISION. LINKAGE SECTION. 01 0--CLONE-OBJ OBJECT REFERENCE sequence-long. PROCEDURE DIVISION RETURNING 0--CLONE-OBJ RAISING CORBA-SYSTEMEXCEPTION. END METHOD CLONE. * END OBJECT. END CLASS sequence-long.
シーケンスクラスで定義されているメソッド/プロパティを以下に示します。
メソッド/プロパティ |
機能 |
NEW-WITH-LENGTHメソッド |
(ファクトリメソッド)指定の長さでシーケンスクラスを作成します。 |
GET-VALUEメソッド |
(オブジェクトメソッド)指定番号の要素の値を取得します。 |
SET-VALUEメソッド |
(オブジェクトメソッド)指定番号の要素に値を設定します。 |
CLONEメソッド |
(オブジェクトメソッド)シーケンスクラスを複製します。 |
SEQ-MAXIMUMプロパティ |
シーケンス最大長の値を取得します。 |
SEQ-LENGTHプロパティ |
シーケンス長の値の取得/設定を行います。 |
メソッド/プロパティの使用例を以下に示します。
* NEW-WITH-LENGTHメソッド * シーケンスクラスをSEQとして作成 01 SEQ USAGE OBJECT REFERENCE SEQUENCE-LONG. 01 SEQ-LEN USAGE OBJECT REFERENCE CORBA-UNSIGNED-LONG. INVOKE SEQUENCE-LONG "NEW-WITH-LENGTH" USING SEQ-LEN RETURNING SEQ.
* GET-VALUEメソッド * 1番目の要素の値をSEQ-GVALに取得 01 SEQ USAGE OBJECT REFERENCE SEQUENCE-LONG. 01 SEQ-GVAL TYPE CORBA-LONG. INVOKE SEQ "GET-VALUE" USING 1 RETURNING SEQ-GVAL.
* SET-VALUEメソッド * 1番目の要素にSEQ-SVALを設定 01 SEQ USAGE OBJECT REFERENCE SEQUENCE-LONG. 01 SEQ-SVAL TYPE CORBA-LONG. INVOKE SEQ "SET-VALUE" USING 1 SEQ-SVAL.
* CLONEメソッド * シーケンスクラスをSEQ-CLONEとして複製 01 SEQ USAGE OBJECT REFERENCE SEQUENCE-LONG. 01 SEQ-CLON USAGE OBJECT REFERENCE SEQUENCE-LONG. INVOKE SEQ "CLONE" RETURNING SEQ-CLON.
* SEQ-MAXIMUMプロパティ * シーケンス最大長の値をSEQ-MAXに取得 01 SEQ USAGE OBJECT REFERENCE SEQUENCE-LONG. 01 SEQ-MAX TYPE CORBA-UNSIGNED-LONG. MOVE SEQ-MAXIMUM OF SEQ TO SEQ-MAX.
* SEQ-LENGTHプロパティ * シーケンス長の値をSEQ-LENに取得 01 SEQ USAGE OBJECT REFERENCE SEQUENCE-LONG. 01 SEQ-LEN TYPE CORBA-UNSIGNED-LONG. MOVE SEQ-LENGTH OF SEQ TO SEQ-LEN. * シーケンス長にSEQ-LENを設定 01 SEQ USAGE OBJECT REFERENCE SEQUENCE-LONG. 01 SEQ-LEN TYPE CORBA-UNSIGNED-LONG. MOVE SEQ-LEN TO SEQ-LENGTH OF SEQ.
クライアントアプリケーション例を以下に示します。
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-SEQTEST. 01 RESULT TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. 01 SEQ1 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. 01 SEQ2 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. 01 SEQ3 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. 01 SEQ-VALUE TYPE CORBA-LONG. 01 I TYPE CORBA-UNSIGNED-LONG. * 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::seqtest" 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-SEQTEST "NARROW" USING OBJ RETURNING TARGET-OBJ. * * SET IN PARAMETER INVOKE SEQUENCE-LONG "NEW" RETURNING SEQ1. MOVE 2 TO SEQ-LENGTH OF SEQ1. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2 MOVE I TO SEQ-VALUE INVOKE SEQ1 "SET-VALUE" USING I SEQ-VALUE END-PERFORM. * * SET INOUT PARAMETER INVOKE SEQUENCE-LONG "NEW" RETURNING SEQ3. MOVE 3 TO SEQ-LENGTH OF SEQ3. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3 COMPUTE SEQ-VALUE = I * 10 INVOKE SEQ3 "SET-VALUE" USING I SEQ-VALUE END-PERFORM. * MOVE "ODdemo::seqtest::op1" TO API-NAME. INVOKE TARGET-OBJ "OP1" USING SEQ1 SEQ2 SEQ3 RETURNING RESULT. * STOP RUN. * END-MAIN. * END PROGRAM "CLIENT-MAIN".
以下にサーバアプリケーション例を以下に示します。
CLASS-ID. ODSAMPLE-SEQTEST-IMPL INHERITS ODSAMPLE-SEQTEST. * 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 SEQ-VALUE TYPE CORBA-LONG. 01 I TYPE CORBA-UNSIGNED-LONG. LINKAGE SECTION. 01 SEQ1 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. 01 SEQ2 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. 01 SEQ3 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. 01 RESULT TYPE ODSAMPLE-SEQTEST-SAMPLESEQ. * PROCEDURE DIVISION USING SEQ1 SEQ2 SEQ3 RETURNING RESULT RAISING CORBA-SYSTEMEXCEPTION. * * SET OUT PARAMETER INVOKE SEQUENCE-LONG "NEW" RETURNING SEQ2. MOVE 4 TO SEQ-LENGTH OF SEQ1. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4 COMPUTE SEQ-VALUE = I * 100 INVOKE SEQ2 "SET-VALUE" USING I SEQ-VALUE END-PERFORM. * * SET INOUT PARAMETER INVOKE SEQUENCE-LONG "NEW" RETURNING SEQ3. MOVE 5 TO SEQ-LENGTH OF SEQ3. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5 COMPUTE SEQ-VALUE = I * 1000 INVOKE SEQ3 "SET-VALUE" USING I SEQ-VALUE END-PERFORM. * * SET RESULT INVOKE SEQUENCE-LONG "NEW" RETURNING RESULT. MOVE 6 TO SEQ-LENGTH OF SEQ3. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 6 COMPUTE SEQ-VALUE = I * 10000 INVOKE RESULT "SET-VALUE" USING I SEQ-VALUE END-PERFORM. * END METHOD OP1. * END OBJECT. * END CLASS ODSAMPLE-SEQTEST-IMPL.
目次
索引
![]() ![]() |