COBOL2002 Javaプログラム呼び出し機能ガイド


7.2.3 集団項目データ交換プログラムの生成

プログラム作成支援ツールの-TypeオプションにGroupMapperを指定すると,次に示す二つのCOBOLソースファイルをJavaクラスごとに作成します。

生成されたCOBOLプログラムを呼び出すUAPを作成して,フィールドの値をCOBOL集団項目に一括して取得・設定するプログラムを完成させます。

cbl2kjgen -Type GroupMapper 〔オプション〕 Javaプログラム指定オプション
Javaプログラム指定オプションは,次の2種類の組み合わせで指定します。
  • -Class Javaクラス名

  • -Jar Javaアーカイブファイル名

-Classオプションに指定したJavaクラスをJava実行ファイル(.class)またはJavaアーカイブファイル(.jar)から検索して解析対象とします。-Jarオプションだけを指定すると,アーカイブファイルの中からプログラム作成支援ツールが解析対象とするすべてのクラスを解析します。

-Classオプションおよび-Jarオプションについては,「7.2 プログラム作成支援ツールの機能」および「7.2.1 プログラム作成支援ツールの機能範囲」の「(5) 使用するファイルとファイルの入出力」を参照してください。

集団項目データ交換プログラムの生成の概要を次の図に示します。

図7‒7 集団項目データ交換プログラムの生成の概要

[図データ]

〈この項の構成〉

(1) 集団項目データ交換用データ定義の構造

集団項目データ交換用データ定義は,Javaのフィールドに対応するCOBOLのデータ項目を集団項目で定義した登録集原文です。

対象とするフィールドについては,「7.2.1 プログラム作成支援ツールの機能範囲」の「(3) フィールドの設定と取得」を参照してください。

集団項目データ交換用データ定義の構造を次の図に示します。

図7‒8 集団項目データ交換用データ定義の構造

[図データ]

(a) プログラムの概要(コメント)

プログラムの概要を先頭のコメントとして記載します。記載する内容を次に示します。

項番

項目

内容(引用符(")で囲んだ文字列は固定)

1

タイトル

次の内容を記載します。

"COBOL2002 Javaプログラム呼び出し機能↓"

"集団項目データ交換用データ定義"

(凡例)

 ↓:改行

2

利用クラス

対象のクラス名を記載します。

3

cbl2kjgenのバージョン

cbl2kjgenのバージョンを記載します。

例:"03-02"

4

オプション

cbl2kjgenに指定されたオプションを記載します。1行につき1オプションを記載します。

5

生成日時

集団項目データ交換プログラムの生成日時を記載します。

形式はYYYY/mm/dd HH:MM:SSです。

(b) データ項目の定義

Javaのフィールドと対応づけるCOBOLのデータ項目を定義します。記載内容については,「(3) データ項目のマッピング」を参照してください。

(2) 集団項目データ交換プログラムの構造

集団項目データ交換プログラムは,Javaのフィールドを,Javaプログラム呼び出し機能を使用して,一括して取得・設定するCOBOLプログラムです。各フィールドの値は集団項目データ交換用データ定義に定義したデータ項目にマッピングします。

一括取得するCOBOLプログラムと一括設定するCOBOLプログラムを一つのCOBOLソースファイルに生成します。

集団項目データ交換プログラムの構造を次の図に示します。

図7‒9 集団項目データ交換プログラムの構造

[図データ]

(a) プログラムの概要(コメント)

プログラムの概要を先頭のコメントとして記載します。記載する内容を次に示します。

項番

項目

内容(引用符(")で囲んだ文字列は固定)

1

タイトル

次の内容を記載します。

"COBOL2002 Javaプログラム呼び出し機能↓"

"集団項目データ交換用データ定義"

(凡例)

 ↓:改行

2

利用クラス

対象のクラス名を記載します。

3

cbl2kjgenのバージョン

cbl2kjgenのバージョンを記載します。

例:"03-02"

4

オプション

cbl2kjgenに指定されたオプションを記載します。1行につき1オプションを記載します。

5

生成日時

集団項目データ交換プログラムの生成日時を記載します。

形式はYYYY/mm/dd HH:MM:SSです。

(b) 見出し部

各プログラム名を次に示します。

用途

プログラム名

フィールドを一括取得する。

CBLJGET_classname

フィールドを一括設定する。

CBLJSET_classname

注※

"classname"はクラス名または-Classオプションに指定した内部名を示します。クラス名または-Classオプションについては,「7.2.1 プログラム作成支援ツールの機能範囲」の「(2) データ項目のマッピング(共通)」を参照してください。

(c) 環境部

動的長基本項目を使用するため,次に示すように構成節を記載します。

[図データ]

(d) データ部

データ項目の定義とCOPY文による集団項目データ交換用データ定義の取り込みを行います。作業場所節および連絡節にデータ項目を定義します。ただし,使用しないデータ項目は定義しません。

作業場所節には次に示す順番でデータ項目を定義します。

  1. クラス名,フィールド名,およびメソッド名

  2. パラメタ

  3. 引数リスト

  4. String⇔英数字項目の変換領域の長さ

  5. 配列オブジェクト⇔可変長繰り返し項目変換領域

  6. インスタンス生成フラグ

連絡節には次に示す順番でデータ項目を定義します。

  1. CBLJENV集団項目

  2. クラス参照とオブジェクト参照

  3. COPY文による集団項目データ交換用データ定義の取り込み

  4. プログラムの戻り値

作業場所節に定義するデータ項目について説明します。データ項目のマッピングについては,「7.2.1 プログラム作成支援ツールの機能範囲」の「(2) データ項目のマッピング(共通)」および「7.2.2 Javaクラス利用サンプルの生成」の「(2) データ項目のマッピング」を参照してください。

  1. クラス名,フィールド名,およびメソッド名

    クラス名,フィールド名,およびメソッド名を設定する英数字の動的長基本項目を定義します。初期値には該当するクラス名,フィールド名またはメソッド名を設定します。

    [図データ]

  2. パラメタ

    次に示す値を設定するデータ項目を定義します。

    • フィールド

    • コンストラクタおよびメソッド(フィールドを一括設定するプログラムだけ)に渡す各引数

    • メソッドの戻り値(フィールドを一括取得するプログラムだけ)

    注※

    対象となるフィールドについては,「7.2.1 プログラム作成支援ツールの機能範囲」の「(3) フィールドの設定と取得」を参照してください。

    パラメタの定義例を次に示します。

    [図データ]

  3. 引数リスト

    Javaプログラム呼び出し機能のサービスルーチンに渡す引数リストを定義します。フィールドを一括取得するプログラムは「引数なし」の引数リストだけを作成します。フィールドを一括設定するプログラムは「引数なし」の引数リストと,引数を一つ持つ引数リストを作成します。

    フィールドを一括取得するプログラムの場合

    [図データ]

    フィールドを一括設定するプログラムの場合

    [図データ]

  4. String⇔英数字項目の変換領域の長さ

    Javaプログラム呼び出し機能のサービスルーチンでString⇔英数字項目の変換を行う際,変換結果を受け取るための領域の長さを定義します。

    [図データ]

  5. 配列オブジェクト⇔可変長繰り返し項目変換領域

    Javaプログラム呼び出し機能のサービスルーチンで配列オブジェクト⇔可変長繰り返し項目を変換するとき,変換結果を受け取るための領域として使用します。

    [図データ]

  6. インスタンス生成フラグ

    入力ファイルのクラスのインスタンスを生成した場合,1を設定します。

    [図データ]

連絡節に定義するデータ項目について説明します。

  1. CBLJENV集団項目

    CBLJENV集団項目を定義します。

    [図データ]

  2. クラス参照とオブジェクト参照

    クラス参照とオブジェクト参照を定義します。クラス参照とオブジェクト参照は1クラスにつき一つずつ定義します。

    [図データ]

  3. COPY文による集団項目データ交換用データ定義の取り込み

    集団項目データ交換用データ定義をCOPY文で取り込みます。

    [図データ]

  4. プログラムの戻り値

    各プログラムの戻り値として,Javaプログラム呼び出し機能のサービスルーチンでエラーが発生した際に,サービスルーチンの戻り値を設定します。

    [図データ]

(e) 手続き部

手続き部の内容について説明します。

各プログラムに次に示すような手続き部見出しを定義します。

[図データ]

クラス参照とオブジェクト参照の取得

クラスおよびそのインスタンス(オブジェクト参照)を取得する処理です。

クラス参照とオブジェクト参照の取得の例を次に示します。

[図データ]

フィールド値の取得・設定処理

フィールド値の取得と設定を行う処理です。フィールドに直接アクセスするか,getterメソッドとsetterメソッドを呼びます。getterメソッドとsetterメソッドについては,「7.2.1 プログラム作成支援ツールの機能範囲」の「(3) フィールドの設定と取得」を参照してください。

フィールド値の設定処理

フィールド値の設定処理の例を次に示します。

[図データ]

[図データ]

集団項目データ交換プログラムで配列オブジェクトに値を設定する場合,次に示すように配列の長さを表すデータ項目(上記の例では,memberList-1-LENおよびmemberList-2-LEN)に各次元の配列長を事前に設定する必要があります。

[図データ]

フィールド値の取得処理

フィールド値の取得処理の例を次に示します。

[図データ]

[図データ]

オブジェクト参照の解放処理

フィールドを一括取得するプログラムでは,インスタンス生成フラグが立っている場合,クラス参照とオブジェクト参照の取得で取得したオブジェクト参照(インスタンス)を解放する処理です。手続きEND-PROCに含みます。

フィールドを一括設定するプログラムでは,この解放処理を生成しません。手続き名だけを生成します。このプログラムから戻ったあとに取得したフィールドに値を設定したオブジェクト参照を使用できます。

オブジェクト参照の解放処理の例を次に示します。

[図データ]

(f) プログラムの終了

プログラムを終了します。

[図データ]

(3) データ項目のマッピング

集団項目データ交換用データ定義および集団項目データ交換プログラムに,各データ項目を定義する際に使用するルールを示します。

(a) 集団項目データ交換用データ定義

集団項目データ交換用データ定義に,各データ項目を定義する際に使用するルールを示します。

集団項目データ交換用データ定義

集団項目データ交換用データ定義のデータ項目を次に示します。

用途

データ項目

JavaのフィールドをCOBOLの集団項目にマッピングする。

01 classname.
  02 fieldname TYPE-DEF.
 
     :

(これ以降は配列オブジェクトをマッピングするための定義)

  02  fieldname.
    03  fieldname-1-LEN  PIC S9(9) USAGE COMP.
 
     :
 
    03  fieldname-m-LEN  PIC S9(9) USAGE COMP.
    03  fieldname-ROOT.
      04  fieldname-1 OCCURS ARRAYMAXLEN TIMES.
 
     :
 
      10  fieldname-m OCCURS ARRAYMAXLEN TIMES.
      11  fieldname-ELEM TYPE-DEF.
注※

(b) 集団項目データ交換プログラム

集団項目データ交換プログラムに,各データ項目を定義する際に使用するルールを示します。

JNIに関するデータ項目

JNIに関するデータ項目を次に示します。

用途

データ項目

Java VMに渡すオプションを1個受け取るCBLJENV集団項目を定義する。

01  CBLJENV.
   02  CBLJENVCORE     USAGE POINTER.
   02  CBLJEXCEPTION   USAGE POINTER.
   02  CBLJFLAGS       PIC 1(32) USAGE BIT.
   02  CBLJSTRMAXLEN   PIC S9(9) USAGE COMP.
   02  CBLJVMOPTIONS.
     03  CBLJOPTCOUNT  PIC S9(9) USAGE COMP.
     03  CBLJOPTION-1  PIC X.
クラスやオブジェクトに関するデータ項目

クラスやオブジェクトに関するデータ項目を次に示します。

項番

用途

データ項目

1

クラス名を設定する。

01 CLASS-NAME PIC X DYNAMIC C-STRING VALUE 'classnameOrg'.

2

クラス参照のアドレスを受け取る。

01 CLASSREF USAGE POINTER.

3

オブジェクト参照のアドレスを受け取る。

01 OBJREF USAGE POINTER.

4

インスタンスを生成したことを記憶させる。

01 FLAG-NEW PIC S9(9) USAGE COMP VALUE 0.
注※

"classnameOrg"はクラス名を示します。クラス名に含まれるピリオドはスラントに置換します。

メソッド(クラスメソッド,インスタンスメソッド)に関するデータ項目

メソッド(クラスメソッド,インスタンスメソッド)に関するデータ項目を次に示します。

項番

用途

データ項目

1

n番目のフィールドのgetterメソッド名を設定する。

01  FLDn-GETTER PIC X DYNAMIC C-STRING VALUE 'methodname'.

2

n番目のフィールドのsetterメソッド名を設定する。

01  FLDn-SETTER PIC X DYNAMIC C-STRING VALUE 'methodname'.

3

n番目のフィールドのsetterメソッドの第1引数を設定する。

または,n番目のフィールドのgetterメソッドの戻り値を設定する。

(基本型の場合)

01  FLDn.
  02  FLDn-TYPE PIC X(1) VALUE 'SIGNATURE'.
  02  FILLER    PIC X(7) VALUE ALL LOW-VALUE.
  02  FLDn-AREA TYPE-DEF.

(基本型以外の場合)

01  FLDn.
  02  FLDn-TYPE     PIC X(STRMAXLEN) VALUE 'SIGNATURE'.
  02  FLDn-AREA     TYPE-DEF.

4

n番目のフィールドがStringの場合,フィールドの長さを設定する。

01  FLDn-LEN  PIC S9(9) USAGE COMP VALUE STRMAXLEN.
注※
  • "n"は集団項目データ交換用データ定義中の02レベルのデータ項目を定義する順番と一致します。

  • "methodname"はメソッド名を示します。

  • "SIGNATURE"はJavaの型を表す文字列を示します。ただし,引数の型がClassインスタンスの場合,型にはjava/lang/Classではなく,実体のクラス名となるように修正してください。指定したJavaの型と実体のクラス名が一致しない場合,実行時エラーとなることがあります。Javaの型を表す文字列については,「6.1.1 サービスルーチンで使用する引数」の「(3) パラメタ型集団項目」を参照してください。

  • "TYPE-DEF"はJavaの型に対応するCOBOLの型を示します。Javaの型に対応するCOBOLの型については,「6.1.1 サービスルーチンで使用する引数」の「(3) パラメタ型集団項目」を参照してください。

  • "STRMAXLEN"の既定値は256です。この値はプログラム作成支援ツールの-StrMaxLenオプションで変更できます。

フィールド(クラスフィールド,インスタンスフィールド)に関するデータ項目

フィールド(クラスフィールド,インスタンスフィールド)に関するデータ項目を次に示します。

項番

用途

データ項目

1

n番目のフィールド名を設定する。

01 FLDn-NAME PIC X DYNAMIC C-STRING VALUE 'fieldname'.

2

集団項目データ交換用データ定義を取り込む。

COPY 'copyfilename'.

3

n番目のフィールドが配列オブジェクトの場合,その最下層要素とCOBOLの繰り返し項目をマッピングするための集団項目およびサイズを定義する。

01  TEMP-MAP-n-LEN  PIC S9(9) USAGE COMP VALUE ARRAYMAXLEN.
01  TEMP-MAP-n ADDRESSED BY TEMP-MAP-n-P.
  02  TEMP-MAP-n-ELEM TYPE-DEF OCCURS ARRAYMAXLEN TIMES
                    DEPENDING ON TEMP-MAP-n-LEN.
注※
その他

その他のデータ項目を次に示します。

用途

データ項目

プログラムの戻り値を設定する。

01  CBLJ-RETURN-CODE  PIC S9(9) USAGE COMP.

(4) 生成後の使用方法

集団項目データ交換プログラムを呼び出すCOBOLプログラムを作成します。

(a) 作成手順

  1. 集団項目データ交換プログラムの呼び出し元プログラムの作業場所節に集団項目データ交換用データ定義を読み込むCOPY文を記述します。

       :
    WORKING-STORAGE SECTION.
     COPY '集団項目データ交換用データ定義のファイル名'.
       :

    集団項目データ交換用データ定義のファイル名については,「7.2.1 プログラム作成支援ツールの機能範囲」の「(5) 使用するファイルとファイルの入出力」を参照してください。

  2. 集団項目データ交換プログラムを呼び出すコードを記述します。

    集団項目データ交換プログラムを呼び出す前に,CBLJINITIALIZEサービスルーチンを呼び出して,Javaプログラム呼び出し機能の実行環境を初期化してください。

    集団項目データ交換プログラムの形式については,「(b) 集団項目データ交換プログラムの形式」を参照してください。

  3. フィールドを一括取得する場合,集団項目データ交換プログラムを呼び出したあとで,集団項目データ交換用データ定義の各データ項目を参照するプログラムを記述します。

    注意事項

    集団項目データ交換プログラムの戻り値が0以外の場合,正しい値を取得できないことがあります。

  4. フィールドを一括設定する場合,集団項目データ交換プログラムを呼び出す前に,集団項目データ交換用データ定義の各データ項目に値を設定するプログラムを記述します。

    注意事項

集団項目データ交換用データ定義および集団項目データ交換プログラムのデータ項目名やデータ項目の長さは,用途に従って変更できます。

                :
       WORKING-STORAGE SECTION.
      *>----------------------------------------------------------------
      *> データ定義(mylib.sample.SampleClass)
      *>----------------------------------------------------------------
       COPY 'mylib.sample.SampleClass_Map_COPY.cbl'.
 
       PROCEDURE DIVISION.
 
      *> Javaプログラム呼び出し機能の実行環境を初期化
          CALL 'CBLJINITIALIZE' USING CBLJENV.
 
               :
 
      *> クラス参照の取得
          CALL 'CBLJNEW' USING CBLJENV
                               CLASSREF
                               NO-ARG
                               OBJECTREF.
 
      *> フィールドデータの一括取得(mylib.sample.SampleClass)
          CALL 'CBLJGET_SampleClass' USING CBLJENV
                                             CLASSREF
                                             OBJECTREF
                                             SampleClass
                                     RETURNING RETURN-VAL.
                 :

(b) 集団項目データ交換プログラムの形式

フィールドを一括取得するプログラムとフィールドを一括設定するプログラムの形式を説明します。

フィールドを一括取得するプログラム
形式
CALL 'CBLJGET_classname' USING 引数1 引数2 引数3 引数4
                         〔 RETURNING 返却項目 〕.
注意事項

"classname"は,クラス名または-Classオプションに指定した内部名を示します。詳細については,「7.2.1 プログラム作成支援ツールの機能範囲」の「(2) データ項目のマッピング(共通)」を参照してください。

引数
戻り値

RETURNINGに指定したデータ項目に戻り値を返します。

0:正常終了した。

0以外:Javaオブジェクト参照の取得,またはgetterメソッドの呼び出しで例外が発生した。

注意事項
  • 引数2および引数3には,NULLを設定できます。NULLを設定した場合,集団項目データ交換プログラムがJavaクラス参照およびJavaオブジェクト参照を取得して,値を設定します。ただし,集団項目データ交換プログラムが取得したJavaオブジェクト参照は一括取得するプログラムの終了時に解放するため,呼び出し元では使用できません。

    なお,対象のJavaクラスに引数がないpublicコンストラクタが定義されていない場合,呼び出し元プログラムまたは集団項目データ交換プログラムを修正する必要があります。詳細については,「7.4.1 使用上の注意事項」の「(5) 引数があるコンストラクタの使用について」を参照してください。

  • 一括取得するプログラムは,引数4に指定した集団項目を初期化しません。また,取得できないフィールドの値は更新しません。

  • 戻り値が0以外の場合,CBLJENV集団項目のCBLJEXCEPTION項目に例外オブジェクトが設定されます。

フィールドを一括設定するプログラム
形式
CALL 'CBLJSET_classname' USING 引数1 引数2 引数3 引数4
                         〔 RETURNING 返却項目 〕.
注意事項

"classname"は,クラス名または-Classオプションに指定した内部名を示します。詳細については,「7.2.1 プログラム作成支援ツールの機能範囲」の「(2) データ項目のマッピング(共通)」を参照してください。

引数
戻り値

RETURNINGに指定したデータ項目に戻り値を返します。

0:正常終了した。

0以外:Javaオブジェクト参照の取得,またはsetterメソッドの呼び出しで例外が発生した。

注意事項
  • 引数2および引数3には,NULLを設定できます。NULLを設定した場合,集団項目データ交換プログラムがJavaクラス参照およびJavaオブジェクト参照を取得して,値を設定します。集団項目データ交換プログラムが取得したJavaオブジェクト参照は一括設定するプログラムの終了時に解放されません。呼び出し元で不要になったときにCBLJRELEASEサービスルーチンまたはCBLJSETNULLサービスルーチンを呼び出して解放してください。

    なお,対象のJavaクラスに引数がないpublicコンストラクタが定義されていない場合,呼び出し元プログラムまたは集団項目データ交換プログラムを修正する必要があります。詳細については,「7.4.1 使用上の注意事項」の「(5) 引数があるコンストラクタの使用について」を参照してください。

  • 引数4には,一括設定するプログラムで設定するすべてのフィールドに対応するデータ項目に,呼び出し元で値を設定してください。値を更新しないことが明らかなフィールドは,一括設定するプログラムで,該当するフィールドの設定処理を削除してください。

  • 戻り値が0以外の場合,CBLJENV集団項目のCBLJEXCEPTION項目に例外オブジェクトが設定されます。

(c) 集団項目データ交換プログラムの例

集団項目データ交換プログラムの例を次に示します。

コマンド
cbl2kjgen -Type GroupMapper -StrMaxLen 256 -Class mylib.sample.SampleClass
mylib¥sample¥SampleClass.javaの内容

[図データ]

mylib.sample.SampleClass_Map_COPY.cblの内容(集団項目データ交換用データ定義)

[図データ]

mylib.sample.SampleClass_Map.cblの内容(集団項目データ交換プログラム)

[図データ]

[図データ]

[図データ]

[図データ]

[図データ]

[図データ]