| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第8章 アプリケーションの開発(OOCOBOL) | > 8.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 );
typedef sequence<string> sampleseq2;
sampleseq2 op2(in sampleseq2 seq1, out sampleseq2 seq2, inout sampleseq2 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.
* シーケンスクラス(sequence<string>)
CLASS-ID. sequence-string AS "sequence-string" 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 USAGE OBJECT REFERENCE CORBA-STRING.
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 USAGE OBJECT REFERENCE CORBA-STRING.
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-string.
PROCEDURE DIVISION RETURNING 0--CLONE-OBJ
RAISING CORBA-SYSTEMEXCEPTION.
END METHOD CLONE.
*
END OBJECT.
END CLASS sequence-string.
シーケンスクラスで定義されているメソッド/プロパティを以下に示します。
|
メソッド/プロパティ |
機能 |
|
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 OP2-RESULT TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
01 OP2-SEQ1 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
01 OP2-SEQ2 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
01 OP2-SEQ3 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
01 OP2-SEQ-VALUE USAGE OBJECT REFERENCE CORBA-STRING.
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.
*
* sequence<long>
*
* 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.
*
* sequence<string>
*
* SET IN PARAMETER
INVOKE SEQUENCE-CORBA-STRING "NEW" RETURNING OP2-SEQ1.
MOVE 2 TO SEQ-LENGTH OF OP2-SEQ1.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "TEST"
RETURNING OP2-SEQ-VALUE
INVOKE OP2-SEQ1 "SET-VALUE" USING I OP2-SEQ-VALUE
END-PERFORM.
*
* SET INOUT PARAMETER
INVOKE SEQUENCE-CORBA-STRING "NEW" RETURNING OP2-SEQ3.
MOVE 3 TO SEQ-LENGTH OF OP2-SEQ3.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "TEST"
RETURNING OP2-SEQ-VALUE
INVOKE OP2-SEQ3 "SET-VALUE" USING I OP2-SEQ-VALUE
END-PERFORM.
*
MOVE "ODdemo::seqtest::op2" TO API-NAME.
INVOKE TARGET-OBJ "OP2"
USING OP2-SEQ1
OP2-SEQ2
OP2-SEQ3
RETURNING OP2-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.
*
*
*
METHOD-ID. OP2 OVERRIDE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SEQ-VALUE USAGE OBJECT REFERENCE CORBA-STRING.
01 I TYPE CORBA-UNSIGNED-LONG.
LINKAGE SECTION.
01 SEQ1 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
01 SEQ2 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
01 SEQ3 TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
01 RESULT TYPE ODSAMPLE-SEQTEST-SAMPLESEQ2.
*
PROCEDURE DIVISION
USING SEQ1
SEQ2
SEQ3
RETURNING RESULT
RAISING CORBA-SYSTEMEXCEPTION.
*
* SET OUT PARAMETER
INVOKE SEQUENCE-CORBA-STRING "NEW" RETURNING SEQ2.
MOVE 4 TO SEQ-LENGTH OF SEQ2.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "TEST"
RETURNING SEQ-VALUE
INVOKE SEQ2 "SET-VALUE" USING I SEQ-VALUE
END-PERFORM.
*
* SET INOUT PARAMETER
INVOKE SEQUENCE-CORBA-STRING "NEW" RETURNING SEQ3.
MOVE 5 TO SEQ-LENGTH OF SEQ3.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "TEST"
RETURNING SEQ-VALUE
INVOKE SEQ3 "SET-VALUE" USING I SEQ-VALUE
END-PERFORM.
*
* SET RESULT
INVOKE SEQUENCE-CORBA-STRING "NEW" RETURNING RESULT.
MOVE 6 TO SEQ-LENGTH OF RESULT.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 6
INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "TEST"
RETURNING SEQ-VALUE
INVOKE RESULT "SET-VALUE" USING I SEQ-VALUE
END-PERFORM.
*
END METHOD OP2.
*
END OBJECT.
*
END CLASS ODSAMPLE-SEQTEST-IMPL.
目次
索引
![]()
|