ページの先頭行へ戻る
J アダプタクラスジェネレータ V12.1 ユーザーズガイド
FUJITSU Software

3.2.1 プログラムの書き方

ここでは、アダプタクラスを使用するプログラムの書き方について説明します。

アダプタクラスを使用するプログラムの処理の流れは、以下のようになります。

シングルスレッドアプリケーションの場合
  1. Java VMの初期化(JVM-INITメソッドの呼出し)

  2. オブジェクトの生成

  3. メソッドの呼出し

  4. Java VMの終了(JVM-TERMINATEメソッドの呼出し)

マルチスレッドアプリケーションの場合
  1. Java VMの初期化およびカレントスレッドのJava VMへの接続(JVM-ATTACHメソッドの呼出し)

  2. オブジェクトの生成

  3. メソッドの呼出し

  4. カレントスレッドのJava VMからの分離(JVM-DETACHメソッドの呼出し)

また、以下の処理をする場合は、注意が必要です。

3.2.1.1 Java VMの初期化

アダプタクラスを使用する場合、最初にJava VM(Virtual Machine)を初期化する必要があります。Java VMの初期化は、FJ-JAVA-CONTROLクラスのJVM-INITメソッドまたはJVM-ATTACHメソッドで行います。

以下にコーディング例を示します。

  …
REPOSITORY.
    CLASS FJ-JAVA-CONTROL
  …
PROCEDURE DIVISION.
  …
    INVOKE FJ-JAVA-CONTROL "JVM-INIT".
  …

注意

Java VMを初期化せずにアダプタクラスを使用した場合、アプリケーションエラーが発生します。

3.2.1.2 Java VMの終了

アダプタクラスを使用しなくなった場合、Java VM(Virtual Machine)を終了させます。Java VMの終了は、FJ-JAVA-CONTROLクラスのJVM-TERMINATEメッドで行います。

以下にコーディング例を示します。

  …
REPOSITORY.
    CLASS FJ-JAVA-CONTROL
  …
PROCEDURE DIVISION.
  …
    INVOKE FJ-JAVA-CONTROL "JVM-TERMINATE".
  …

3.2.1.3 マルチスレッドアプリケーションの開発

アダプタクラスを使用したマルチスレッドのアプリケーションでは、スレッドごとにカレントスレッドをJava VM(Virtual Machine)に接続する必要があります。また、スレッドを終了する前に、カレントスレッドをJava VMから分離する必要があります。

カレントスレッドのJava VMへの接続は、FJ-JAVA-CONTROLクラスのJVM-ATTACHメッドで行います。Java VMへの接続は、スレッド内でアダプタクラスを使用する前に必ず実行しなければなりません。

また、カレントスレッドのJava VMからの分離は、FJ-JAVA-CONTROLクラスのJVM-DETACHメソで行います。Java VMからの分離は、スレッド内でアダプタクラスを使わなくなった場合に必ず実行しなければなりません。

以下に、マルチスレッドアプリケーションの例を示します。

3.2.1.4 オブジェクトの生成

オブジェクトの生成は、アダプタクラスの、コンストラに対応するファクトリメソッドを呼び出すことにより行います。ファクトリメソッドは、以下の名前で生成します。

Create-Javaクラス名-nnnnは01~99の番号)

以下にDateクラスのオブジェクトを生成する例を示します。

  …
REPOSITORY.
    CLASS J-Date AS "java-util-Date"
  …
WORKING-STORAGE SECTION.
01  anDate OBJECT REFERENCE J-Date.
  …
PROCEDURE DIVISION.
  …
    INVOKE J-Date "Create-Date-01" RETURNING anDate.
  …

ポイント

アダプタクラスの名前は長いので、REPOSITORY段落でASを指定して別名をつけると便利です。

3.2.1.5 メソッド呼出し

インスタンスメソの呼出しは、アダプタクラスの対応するオブジェクトメソッドを呼び出すことにより行います。メソッド名は、Javaのメソッド名と同じです。ただし、同名のメソッドを複数定義している場合、区別のために後ろに番号を付加します。

以下にDateクラスのgetTimeメソッドを呼び出す例を示します。

  …
REPOSITORY.
    CLASS J-Date AS "java-util-Date"
  …
WORKING-STORAGE SECTION.
01  anDate OBJECT REFERENCE J-Date.
01  currentTime PIC S9(9) COMP-5.
  …
PROCEDURE DIVISION.
  …
    INVOKE anDate "getTime" RETURNING currentTime.
  …

3.2.1.6 変数の操作

変数の操作は、アダプタクラスの対応するプロパティを通して行います。プロパティ名はJavaのフィールド名に“JF-”をつけた名前です。ただし、同名のフィールドを複数定義している場合は、区別のために後ろに番号を付加します。

以下にDateFormatクラスのクラ変数AM_PM_FIELD(スタティックフィールド)を参照する例を示します。

  …
REPOSITORY.
    CLASS J-DateFormat AS "java-text-DateFormat"
  …
WORKING-STORAGE SECTION.
01  FMT-Type PIC S9(9) COMP-5.
  …
PROCEDURE DIVISION.
  …
    MOVE JF-AM_PM_FIELD OF J-DateFormat TO FMT-Type.
  …

3.2.1.7 オブジェクト参照の比較

COBOLでは、複数のオブジェクト参照が同じオブジェクトを指しているか検査する場合、“=”を使います。しかし、アダプタオブジェクトが指すJavaオブジェクトが同じであるか検査する場合は、“=”の代わりにアダプタクラスのJ-EQUALSを使用します。アダプタクラスは、必ずJ-EQUALSメソッドを持っています。

以下に、2つのDateオブジェクトを比較する例を示します。Date-1とDate-2が同じJavaオブジェクトを指している場合に条件が成立します。

  …
REPOSITORY.
    CLASS J-Date AS "java-util-Date"
  …
WORKING-STORAGE SECTION.
01  Date-1 OBJECT REFERENCE J-Date.
01  Date-2 OBJECT REFERENCE J-Date.
01  rst    PIC 1. 
  …
PROCEDURE DIVISION.
  …
    INVOKE Date-1 "J-EQUALS" USING CONTENT Date-2 RETURNING rst.
    IF rst = B"1" THEN
        条件成立
  …

3.2.1.8 サブクラスへの代入

COBOLでは、オブジェクトをサブクラスに代入する場合、ASを使用します。しかし、アダプタオブジェクトの場合は、ASの代わりにJ-NARROWを使用します。アダプタクラスは、必ずJ-NARROWメソッドを持っています。

以下に、Objectクラスのデータで参照していたオブジェクトをDateクラスのデータに代入する例を示します。

  …
REPOSITORY.
    CLASS J-Object AS "java-lang-Object"
    CLASS J-Date AS "java-util-Date"
  …
WORKING-STORAGE SECTION.
01  anDate OBJECT REFERENCE J-Date.
01  anObject OBJECT REFERENCE J-Object.
  …
PROCEDURE DIVISION.
  …
    INVOKE J-Date "J-NARROW" USING CONTENT anObject RETURNING anDate.
  …

3.2.1.9 文字列の受け渡し

アダプタクラスに文字列を受け渡すには、以下の方法があります。

3.2.1.9.1 Stringオブジェクトで受け渡す

通常のアダプタクラスでの文字列受け渡し方法です。

JavaのString型はアダプタクラスのjava-lang-Stringにマッピングされるため、ユーザアプリケーションではjava-lang-Stringクラスのメソッド(NEW-STRING-X、GET-STRING-Xなど)を使用してStringオブジェクトとCOBOLデータ項目間の変換をする必要があります。このため、ユーザアプリケーションの作成が繁雑になります。

以下に、Stringオブジェクトで受け渡す場合の例を示します。NEW-STRING-Xメソッドを使用して文字列からStringオブジェクトを生成した後、parseメソッドに渡しています。また、GET-STRING-Xメソッドを使用して、toStringメソッドで受け取ったStringオブジェクトから文字列を取り出しています。

  …
REPOSITORY.
    CLASS J-Date AS "java-util-Date"
    CLASS J-String AS "java-lang-String"
    CLASS J-DateFormat AS "java-text-DateFormat"
  …
WORKING-STORAGE SECTION.
01  aDateFormat  OBJECT REFERENCE J-DateFormat.
01  aDate        OBJECT REFERENCE J-Date.
01  dateString   OBJECT REFERENCE J-String.
01  dateValue    PIC X(30).
  …
PROCEDURE DIVISION.
  …
    MOVE "2000/01/01" & X"00" TO dateValue.
    INVOKE J-String "NEW-STRING-X" USING dateValue RETURNING dateString.
    INVOKE aDateFormat "parse" USING dateString RETURNING aDate. 
    …
    INVOKE aDate "toString" RETURNING dateString. 
    INVOKE dateString "GET-STRING-X" RETURNING dateValue. 
  …
3.2.1.9.2 COBOLの英数字項目を直接受け渡す

-sオプションまたは“Option String”パラメタを指定してアダプタクラスを生成することにより可能となる文字列受け渡し方法です。

JavaのString型はPIC X ANY LENGTHにマッピングされるため、ユーザアプリケーションでは英数字項目を直接受け渡すことができるようになります。このため、ユーザアプリケーションの作成が簡単になります。

英数字項目として直接受け渡すことができるのは、以下の項目です。

以下に、英数字項目を直接受け渡す場合の例を示します。String型の引数および復帰値に英数字項目を指定できるため、StringオブジェクトとCOBOLデータ項目間の変換をする必要がありません。

  …
REPOSITORY.
    CLASS J-Date AS "java-util-Date"
    CLASS J-DateFormat AS "java-text-DateFormat"
  …
WORKING-STORAGE SECTION.
01  aDateFormat  OBJECT REFERENCE J-DateFormat.
01  aDate        OBJECT REFERENCE J-Date.
01  dateValue    PIC X(30).
  …
PROCEDURE DIVISION.
  …
    MOVE "2000/01/01" & X"00" TO dateValue.
    INVOKE aDateFormat "parse" USING dateValue RETURNING aDate. 
    …
    INVOKE aDate "toString" RETURNING dateValue. 
  …

注意

-sオプションまたは“Option String”パラメタを指定してアダプタクラスを生成する場合の注意事項を以下に示します。

  • java.lang.Stringクラスのコンストラクタの復帰値はjava.lang.String型です。

  • Stringオブジェクトのメソッドを使用する場合は、オブジェクトの生成(Stringコンストラクタの呼出しまたはNEW-STRING-Xメソッドの呼出し)が必要です。

  • java.lang.String型のフィールド(“5.5.4 クラス変数”、“5.5.6 インスタンス変数”参照)を参照/設定する場合は、-sオプションまたは“Option String”パラメタでサイズを指定します。

  • String型NULLオブジェクトを扱いたい場合は、-sオプションおよび“Option String”パラメタを使用しないでください。

3.2.1.10 文字列の終端制御

String型をパラメタとするメソッドおよびString型のフィールドに対し、データ項目長より短い英数字項目および日本語項目の文字列を渡す場合、通常のアプリケーション開発では、Java側のデータと整合性を取るために、文字列の終端(X"00")を意識して設定する必要があります。

以下に、長さ50文字の英数字項目initialValueに“ABC”を転記してNEW-STRING-Xメソッドに渡す例を示します。

    …
REPOSITORY.
    CLASS J-String AS "java-lang-String"
    …
WORKING-STORAGE SECTION.
01  initialValue  PIC X(50). 
01  aString       OBJECT REFERENCE J-String.
    …
PROCEDURE DIVISION.
    …
    MOVE "ABC" & X"00" TO initialValue.
    INVOKE J-String "NEW-STRING-X" USING initialValue RETURNING aString.

これに対し、-tオプションまたは“Option Terminal”パラメタを指定してアダプタクラスを生成することにより、アダプタクラスで文字列の終端を設定するため、ユーザアプリケーションでは文字列の終端を意識しないでデータ項目長より短い文字列をメソッドに渡せるようになります。

以下に、長さ50文字の英数字項目initialValueに“ABC”を転記してNEW-STRING-Xメソッドに渡す例を示します。

    …
REPOSITORY.
    CLASS J-String AS "java-lang-String"
    …
WORKING-STORAGE SECTION.
01  initialValue  PIC X(50). 
01  aString       OBJECT REFERENCE J-String.
    …
PROCEDURE DIVISION.
    …
    MOVE "ABC" TO initialValue.
    INVOKE J-String "NEW-STRING-X" USING initialValue RETURNING aString.

注意

  • -tオプションまたは“Option Terminal”パラメタを指定してアダプタクラスを生成した場合、文字列の終端の空白文字列は削除されてメソッドに渡されます。

  • -tオプションまたは“Option Terminal”パラメタを指定してアダプタクラスを生成した場合、空白だけの文字列をメソッドに渡せません。

3.2.1.11 Unicode使用時の日本語の表現形式

COBOLがUnicodeデータを扱う場合、日本語項目を使用します。このとき、表現形式はUTF-16になります。なお、UTF-16はビッグエンディアンとリトルエンディアンに細分化されます。上の例がビッグエンディアンで、下の例はリトルエンディアンです。

このシステムのCOBOLではシステムや他言語との相性を考慮してリトルエンディアンを採用しています。ただし、翻訳オプションENCODE(UTF8,UTF16,BE)を指定することで、日本語字類の表現形式をUTF-16(ビッグエンディアン)にすることもできます。オプションの詳細は“NetCOBOL ユーザーズガイド”を参照してください。

日本語字類の表現形式をUTF-16(ビッグエンディアン)にするプログラムでアダプタクラスを使用する場合、次のようにする必要があります。

注意

  • アダプタクラスでは、日本語字類の表現形式として、UTF-32のUnicodeデータを扱うことはできません。UTF-32エンコードのプログラムからアダプタクラスを利用する場合には、MOVE文(書き方3)を使用してUTF-16エンコードによる日本語項目データの受け渡しをしてください。MOVE文の詳細は、“COBOL 文法書”の“6.4.28 MOVE文(中核)”を参照してください。

  • 日本語字類の表現形式をUTF-16(ビッグエンディアン)で扱うことを指定して生成アダプタクラスの使用時に、環境変数COBJIN_UCS2_ENCORDINGの指定が不適切である場合、その動作は保証されません。

3.2.1.12 エラー処理

アダプタクラスは、実行時にエラーを検出した場合、以下の例外オブジェクトを発生させます。

アプリケーションがアダプタクラスで発生した例外オブジェクトを検出するには、手続き部の宣言節部分にUSE文を使った例外処理を記述する必要があります。USE文を使った例外処理の詳細については“NetCOBOL ユーザーズガイド”の“例外オブジェクト”を参照してください。

以下に例外処理のコーディング例を示します。

  …
REPOSITORY.
    CLASS FJ-JAVA-ERROR
    CLASS J-String AS "java-lang-String"
    CLASS J-Exception AS "java-lang-Exception"
  …
WORKING-STORAGE SECTION.
01 msgString      OBJECT REFERENCE J-String.
01 errMessage     PIC X(256).
01 expMessage     PIC X(1024).
01 expClass       PIC X(256).
01 errCode        PIC S9(9) COMP-5.
01 errMessageLen  PIC S9(9) COMP-5.
01 expMessageLen  PIC S9(9) COMP-5.
01 expClassLen    PIC S9(9) COMP-5.
01 rc             PIC S9(9) COMP-5.
  …
PROCEDURE DIVISION.
DECLARATIVES.
JAVA-ERR SECTION.
  USE AFTER EXCEPTION J-Exception.
  INVOKE EXCEPTION-OBJECT "GET-MESSAGE" RETURNING msgString.
  …
JADP-ERR SECTION.
  USE AFTER EXCEPTION FJ-JAVA-ERROR.
  INVOKE EXCEPTION-OBJECT "GET-CODE" RETURNING errCode.
  INVOKE EXCEPTION-OBJECT "GET-MESSAGE"
         USING errMessage RETURNING errMessageLen.
  INVOKE EXCEPTION-OBJECT "GET-EXCEPTION"
         USING expMessage expMessageLen expClass expClassLen
         RETURNING rc.
  DISPLAY "Error Code:    " errCode.
  DISPLAY "Error Message: " errMessage(1:errMessageLen).
  IF rc NOT = -1 THEN
    DISPLAY "Java Class Name:        " expClass(1:expClassLen)
    DISPLAY "Java Exception Message: " expMessage(1:expMessageLen)
  END-IF.
  …
END DECLARATIVES.
  …

注意

プログラムで例外処理を記述しなかった場合は、例外オブジェクトの発生によりプログラムで実行時エラー(JMP0104I-U)が発生します。