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


7.2.1 プログラム作成支援ツールの機能範囲

プログラム作成支援ツールの機能範囲について説明します。

〈この項の構成〉

(1) Javaプログラムの解析

プログラム作成支援ツールは,COBOLプログラムを作成する準備としてJava実行ファイルおよびJavaアーカイブファイルを解析し,クラス,メソッドおよびフィールドを抽出します。解析結果は,プログラム作成支援ツールが生成するCOBOLプログラムに反映されます。

Java実行ファイルおよびJavaアーカイブファイルの解析は,プログラム作成支援ツール専用の解析用Javaクラス(以降,解析用クラスと表記します)で行います。解析用クラスは,Javaアーカイブファイルとして提供します。

解析用Javaアーカイブファイル(以降,解析用Jarと表記します)および解析用クラスの概要を次の図に示します。解析用クラスへの解析依頼および解析結果の受け取りはJNI経由で行います。

図7‒2 Javaプログラムの解析の概要

[図データ]

プログラム作成支援ツールの解析対象は,解析するJavaクラスやメソッドなどの公開範囲のほか,プログラム作成支援ツールのコマンドオプションの指定によって変わります。また,解析するJavaクラスのほかに関連するJavaクラスが必要となる場合があります。解析対象の条件を次に示します。

(a) プログラム作成支援ツールの解析対象

プログラム作成支援ツールの解析対象を次の表に示します。

表7‒5 プログラム作成支援ツールの解析対象

項番

対象

属性

public

protected

private

1

クラス

×

×

2

コンストラクタ

×

×

3

メソッド※1

×

×

4

フィールド※1※2

×

×

5

インタフェース

×

×

×

(凡例)

○:解析対象とする。

×:解析対象としない。

注※1

abstract修飾子が指定された抽象クラスの場合,インスタンスメソッドおよびインスタンスフィールドは対象としません。

注※2

先祖クラスから継承されているフィールドは,条件付きで解析対象とします。フィールドの条件については,「(3) フィールドの設定と取得」を参照してください。

(b) オプションの組み合わせによる解析ファイルの違い

-Jarオプションと-Classオプションの組み合わせで,解析するファイルが異なります。

-Jarオプションと-Classオプションの組み合わせと解析するファイルを次の表に示します。

表7‒6 -Jarオプションと-Classオプションの組み合わせと解析するファイル

-Jarオプション

-Classオプション

あり

なし

あり

-Jarオプションに指定したJavaアーカイブファイルの中から,-Classオプションで指定したクラスが定義されているJava実行ファイルが解析対象の候補となる。

-Jarオプションに指定したJavaアーカイブファイルに含まれるすべてのJava実行ファイルが解析対象の候補となる。

なし

検索パスに含まれるすべてのJava実行ファイルおよびJavaアーカイブファイルの中から,-Classオプションで指定したクラスが定義されているファイルが解析対象の候補となる。

エラーメッセージを出力し,処理を中断する。

注※

Java実行ファイルおよびJavaアーカイブファイルの検索パスについては,「(5) 使用するファイルとファイルの入出力」の「(b) ファイルの入力」を参照してください。

(c) 解析に必要となるクラス

プログラム作成支援ツールがJavaプログラムを解析するとき,すべてのフィールド,メソッド,およびコンストラクタの情報を抽出します。そのため,解析対象のクラス以外も参照できる必要があります。

参照できる必要があるクラスを次に示します。

  • 解析対象のクラス

  • 解析対象のクラスのスーパークラス

  • 解析対象のクラスが実装しているインタフェース

  • 解析対象のクラスがimportしているクラス

プログラム作成支援ツールがJavaプログラムを解析する流れを次に示します。

  1. 入力ファイル(Java実行ファイルまたはJavaアーカイブファイル)の各クラスからフィールド,メソッド,およびコンストラクタの情報を抽出する。

  2. 抽出した情報(フィールド,コンストラクタ・メソッドの引数,およびメソッドの戻り値)のデータ型を解析する。

    注意事項
    • 解析に必要なクラスをすべて参照できるように,クラスの検索パスを指定してください。

      例えば,クラスAがクラスSを継承している場合,クラスAを解析するにはクラスSが参照できるように検索パスを設定する必要があります。

      検索パスについては,「(5) 使用するファイルとファイルの入出力」の「(b) ファイルの入力」を参照してください。

    • 解析に必要なクラスが参照できない場合,エラーメッセージを出力し,次の解析対象を解析します。

(2) データ項目のマッピング(共通)

Javaプログラム呼び出し機能でクラス,メソッドまたはフィールドを操作する場合,値を保持するためにCOBOL側でデータ項目を定義する必要があります。

Javaプログラム呼び出し機能で使用するために適切なデータ型で定義し,Javaのどのデータがどのデータ項目に設定されているかを一意に識別できる名前付けをします。

定義する必要があるデータ項目を次に示します。

プログラム作成支援ツールは,これらのデータ項目の定義を自動生成します。プログラム作成支援ツールが自動生成するデータ項目名と定義を次に示します。

データ項目名

クラス名,メソッド名,フィールド名をCOBOLのデータ項目名に使用する場合,原則的にJavaプログラムに定義されている名前をそのまま使用します。ただし,パッケージ名はデータ項目名に反映しません。

また,-Classオプションでクラス名とともに内部名を指定した場合,データ項目名をクラス名ではなく内部名に置き換えます。

注意事項
  • クラス名,メソッド名,フィールド名をCOBOLのデータ項目名に使用する場合,データ項目名が31文字を超えるときは警告メッセージとして該当する内部名と行番号を出力します。このとき,生成物は出力されますが,31文字を超える語はCOBOL2002コンパイラでコンパイルエラーとなります。そのため,出力された警告メッセージを基に生成物を修正する必要があります。

  • -Classオプションで指定した内部名が1〜31文字でない場合,エラーメッセージを出力し,処理を中止します。

  • 同じ名前が複数存在する場合,次に示すように二つ目以降の同じ名前のデータ項目(メソッド名やフィールド名を設定するデータ項目)の定義をコメントとして出力します。

    [図データ]

データ項目の定義(共通)

プログラム作成支援ツールが定義するデータ項目を次の表に示します。

表7‒7 プログラム作成支援ツールが定義するデータ項目

項番

用途

データ項目

1

引数がないコンストラクタおよびメソッドの引数リストを設定する。

01  NO-ARG.
  02  FILLER          USAGE POINTER VALUE NULL.

2

戻り値がないメソッドの型を設定する。

01  RTN-VOID.
  02  RTN-TYPE        PIC X(1) VALUE 'V'.

3

Stringと英数字項目の変換で使用する領域とサイズを設定する。

01  WK-ALNUM          PIC X(STRMAXLEN).
01  WK-ALNUM-LEN      PIC S9(9) USAGE COMP VALUE STRMAXLEN.

4

m次元のCOBOLの繰り返し項目の添字を設定する。

01  ARRAY-INDEX-m     PIC S9(9) USAGE COMP.

5

m次元の配列オブジェクトのポインタを設定する。

01  ARRAY-ADDR-m      USAGE POINTER.

6

m次元の配列オブジェクトの添字を設定する。

01  ARRAY-INDEX-J-m   PIC S9(9) USAGE COMP.

7

配列の最下層の要素を設定する可変長繰り返し項目のアドレスを設定する。

CBLJGETARRAYADDRサービスルーチンやCBLJRELEASEARRAYサービスルーチンの第3引数に指定する。

01  TEMP-ARRAY-ADDR   USAGE POINTER.
注※
  • "STRMAXLEN"の既定値は256です。この値はプログラム作成支援ツールの-StrMaxLenオプションで変更できます。

  • "m"は配列オブジェクトの次元数を示します。

Javaクラス利用サンプルの生成と集団項目データ交換プログラムの生成では,これらのデータ項目に加えて,それぞれの定義で必要なデータ項目を定義します。

Javaクラス利用サンプルの生成でのデータ項目のマッピングについては,「7.2.2 Javaクラス利用サンプルの生成」の「(2) データ項目のマッピング」を参照してください。

集団項目データ交換プログラムの生成でのデータ項目のマッピングについては,「7.2.3 集団項目データ交換プログラムの生成」の「(3) データ項目のマッピング」を参照してください。

(3) フィールドの設定と取得

プログラム作成支援ツールは,Javaのフィールドのアクセスレベルに応じた取得・設定方法でCOBOLプログラムを定義します。

Javaのフィールドのアクセスレベルと取得・設定方法を次の図に示します。

図7‒3 Javaのフィールドのアクセスレベルと取得・設定方法

[図データ]

プログラム作成支援ツールが生成するCOBOLプログラムで取得・設定できるフィールドの条件を次に示します。条件のどちらかに当てはまる場合,取得・設定できます。ただし,対象のフィールドにfinal修飾子が付与されている場合,集団項目データ交換プログラム生成機能で生成するフィールドを一括設定するプログラムには,これらのフィールドに値を設定するコードを生成しません。

取得・設定できるフィールドの条件
  • フィールドのアクセスレベルがpublicであること。

    メソッドを使用しないで,フィールドに直接アクセスして取得・設定します。getterメソッドまたはsetterメソッドが定義されていても,該当のフィールドを取得・設定するときに,それらのメソッドを使用しません。

  • フィールドのアクセスレベルがprivateまたはprotectedで,getterメソッドまたはsetterメソッドが定義されていること。

    フィールドのアクセスレベルがprivateまたはprotectedの場合,getterメソッドまたはsetterメソッドを使用してフィールドを取得・設定します。getterメソッドまたはsetterメソッドが定義されていない場合,プログラム作成支援ツールが生成するCOBOLプログラムでは,privateまたはprotectedフィールドを取得・設定できません。

    プログラム作成支援ツールが,getterメソッドまたはsetterメソッドが定義されているとみなす条件を次に示します。

getterメソッドまたはsetterメソッドが定義されているとみなす条件
  • 該当のフィールドと同じクラスに定義されていること。

  • メソッド名が次の命名規則にあてはまること。

    ・getterの命名規則:"get"+フィールド名(先頭は英大文字)

    ・setterの命名規則:"set"+フィールド名(先頭は英大文字)

    (例:フィールド名がvariableIntの場合 → getVariableInt,setVariableInt)

  • メソッドのアクセスレベルがpublicであること。

  • (この条件はsetterメソッドだけ適用)引数が一つで,該当のフィールドと同じ型であること。

  • (この条件はsetterメソッドだけ適用)戻り値がないこと。

  • (この条件はgetterメソッドだけ適用)引数がないこと。

  • (この条件はgetterメソッドだけ適用)戻り値の型が該当のフィールドと同じであること。

  • (この条件はprivateフィールドだけ適用)対象のクラスでフィールドが定義されていること。

  • (この条件はprotectedフィールドだけ適用)対象のクラスおよび,その先祖クラスでフィールドが定義されていること。

注※

プログラム作成支援ツールは,これらの条件をすべて満たしている場合だけ,getterメソッドまたはsetterメソッドが定義されていると見なします。getterメソッドまたはsetterメソッドとして定義されているメソッドがある場合も,満たさない条件がある場合,getterメソッドまたはsetterメソッドが定義されているとは見なしません。

(4) 配列オブジェクトのマッピング

解析対象のクラスで,次に示す場所に配列が使用されている場合,プログラム作成支援ツールはJavaの配列とCOBOLの繰り返し項目をマッピングするプログラムを生成します。

注※

対象となるフィールドについては,「(3) フィールドの設定と取得」を参照してください。

注意事項

プログラム作成支援ツールがCOBOLのデータ項目にマッピングできる配列オブジェクトの次元数の上限は7次元です。7次元を超える次元の配列要素は展開しないで,ポインタ項目のままとします。

(a) マッピングによるJavaの配列の取得・設定の流れ

  1. 配列オブジェクトのオブジェクト参照を取得する

    配列がJavaプログラムのどの場所に定義されているかでオブジェクト参照の取得方法が異なります。

    フィールドとして定義されている場合

    フィールドのオブジェクト参照を取得します。ただし,集団項目データ交換プログラムで配列フィールドを設定する場合は,CBLJNEWサービスルーチンで新規作成した配列オブジェクトを使用します。対象となるフィールドについては,「(3) フィールドの設定と取得」を参照してください。

    publicコンストラクタまたはpublicメソッドの引数として定義されている場合

    引数用に用意したCOBOLのデータ項目に新しい配列オブジェクトを作成します。ただし,すでに他の処理で引数用に用意したCOBOLのデータ項目に配列オブジェクトが作成されている場合は,新しく作成しないで流用します。

    publicメソッドの戻り値として定義されている場合

    戻り値用に用意したCOBOLのデータ項目からオブジェクト参照を取得します。

  2. 配列の要素のオブジェクト参照を取得する

    CBLJGETOBJARRAYサービスルーチンで,1.で取得したオブジェクト参照から配列要素のオブジェクト参照を取得します。このとき,PERFORM文で配列の上層の要素から順次取り出すように添字を設定します。COBOLの繰り返し項目の添字とJavaの配列の添字は別のデータ項目として保持します。

    Javaの配列の定義が2次元配列の例を次に示します。

    例)

    Javaの配列の定義が2次元配列a[x][y]の場合(x, yは1以上の整数)

    [図データ]

    配列J-1(最上位次元の配列オブジェクト)は,1.で取得した配列オブジェクトを使用します。

    多次元配列の場合,PERFORM文を入れ子にすることで各要素を取り出します。例えば,Javaの配列の定義がa[2][2]の場合,a[0][0]→a[0][1]→a[1][0]→a[1][1]の順でアクセスします。添字を設定するデータ項目は各次元に一つ定義します。

  3. 配列の要素を取得・設定する

    配列要素の取得・設定は配列が基本型配列かオブジェクト型配列かによって方法が異なります。

    • 基本型配列の場合

      基本型配列の取得・設定は,Javaプログラム呼び出し機能のCBLJGETARRAYADDRサービスルーチンおよびCBLJRELEASEARRAYサービスルーチンでJavaの配列とCOBOLの繰り返し項目を対応づけて,配列要素を取得・設定します。これらのサービスルーチンには繰り返し項目を持つ01レベルの集団項目のアドレスを渡す必要があるため,次に示すような1次元の可変長繰り返し項目を作業用に定義します。

      [図データ]

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

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

    • オブジェクト型配列の場合

      オブジェクト型配列の取得・設定は,Javaプログラム呼び出し機能のCBLJGETOBJARRAYサービスルーチンおよびCBLJSETOBJARRAYサービスルーチンでJavaの配列とCOBOLの繰り返し項目を対応付けることで実現します。基本型配列の場合に定義した作業用の一次元可変長繰り返し項目は使用しないため,定義しません。

(b) マッピングによる要素の取得の処理フロー,およびCOBOLプログラム

配列オブジェクトのマッピングによる要素の取得の処理フロー,および擬似的なCOBOLプログラムを次に示します。

基本型配列の要素を取得する場合

[図データ]

オブジェクト型配列の要素を取得する場合

[図データ]

(c) マッピングによる要素の設定の処理フロー,およびCOBOLプログラム

配列オブジェクトのマッピングによる要素の設定の処理フロー,および擬似的なCOBOLプログラムを次に示します。

基本型配列の要素を設定する場合

[図データ]

[図データ]

オブジェクト型配列の要素を設定する場合

[図データ]

[図データ]

(5) 使用するファイルとファイルの入出力

プログラム作成支援ツールが使用するファイルとファイルの入出力について説明します。

(a) 使用するファイル

プログラム作成支援ツールが使用するファイルを次の表に示します。

表7‒8 プログラム作成支援ツールが使用するファイル

項番

種別

拡張子

1

入力ファイル(Javaプログラム)

実行ファイル

.class

2

アーカイブファイル

.jar

3

出力ファイル(COBOLプログラム)

固定形式正書法

.cbl

4

自由形式正書法

.cbf

(b) ファイルの入力

プログラム作成支援ツールが入力ファイル(Java実行ファイルおよびJavaアーカイブファイル)を検索するフォルダと条件を次の表に示します。

表7‒9 Java実行ファイルおよびJavaアーカイブファイルを検索するフォルダと条件

項番

検索パス

条件

1

-ClassPathオプションに指定したフォルダ

-ClassPathオプションが指定されている。

2

環境変数CLASSPATHに指定したフォルダ

-ClassPathオプションが指定されていない。

3

カレントフォルダ

-ClassPathオプションが指定されていないで,かつ環境変数CLASSPATHが定義されていない。

-ClassPathオプションや環境変数CLASSPATHに複数のフォルダを指定した場合,先頭のフォルダから順に検索します。

フォルダA→フォルダBの順にクラスを検索する例を次に示します。

例)
  • -ClassPathオプションにフォルダAとフォルダBを指定した。

  • 環境変数CLASSPATHにフォルダCを指定した。

注意事項

-Classオプションで指定したクラス名が完全修飾クラス名でない場合,検索パスの中にパッケージ名が異なる同名のクラスが存在するときは,最初に見つかったクラスだけが解析対象となります。

検索パスの中にパッケージ名が異なる同名のクラスが存在するときの例を次の図に示します。

図7‒4 検索パスの中にパッケージ名が異なる同名のクラスが存在するとき

[図データ]

上記の図では,sample1の下のsample.classが先に見つかるため,sample2の下のsample.classは検索結果に含まれません。

-Classオプションに完全修飾クラス名を指定するか,重複するクラス名がないように検索パスを再設定してから,ファイルを再生成してください。

(c) ファイルの出力

ファイルの出力先の標準値はカレントフォルダです。出力先はプログラム作成支援ツールの-OutDirオプションで変更できます。

出力ファイルのファイル名は,解析対象のクラス名を基に設定します。出力ファイル名の命名規則を次に示します。

出力ファイル名の命名規則
  • Javaクラス利用サンプルの生成で生成する出力ファイルの名前(拡張子除く)は,解析対象のクラス名をそのまま使用します。

  • 集団項目データ変換プログラムの生成で生成する出力ファイルの名前(拡張子除く)は,次に示すとおりです。

集団項目データ交換用データ定義
解析対象のクラス名_Map_COPY
集団項目データ交換プログラム
解析対象のクラス名_Map
  • 出力ファイルの正書法によって拡張子を次のとおりに変更します。

    固定形式正書法:.cbl

    自由形式正書法:.cbf

出力ファイル名の例を次に示します。

表7‒10 クラス名と出力ファイル名の対応例

項番

クラス名

出力ファイル名

備考

1

sample.sampleClass

sample.sampleClass.cbl

Javaクラス利用サンプルを生成する場合の出力ファイルです。

2

sample.sampleClass_Map_COPY.cbl

集団項目データ交換プログラムを生成する場合の出力ファイル(集団項目データ交換用データ定義)です。

3

sample.sampleClass_Map.cbl

集団項目データ交換プログラムを生成する場合の出力ファイル(集団項目データ交換プログラム)です。

4

SampleClass

(-Formatオプションにfreeを指定する)

SampleClass.cbf

正書法に自由形式正書法を指定した場合,拡張子を.cbfとします。

注意事項

COBOLコード生成中にエラーが発生した場合,出力途中のCOBOLファイルは削除します。