ここでは、アダプタクラスを使用するプログラムの書き方について説明します。
アダプタクラスを使用するプログラムの処理の流れは、以下のようになります。
Java VMの初期化(JVM-INITメソッドの呼出し)
オブジェクトの生成
メソッドの呼出し
Java VMの終了(JVM-TERMINATEメソッドの呼出し)
Java VMの初期化およびカレントスレッドのJava VMへの接続(JVM-ATTACHメソッドの呼出し)
オブジェクトの生成
メソッドの呼出し
カレントスレッドのJava VMからの分離(JVM-DETACHメソッドの呼出し)
また、以下の処理をする場合は、注意が必要です。
変数の操作
オブジェクト参照の比較
サブクラスへの代入
文字列の受け渡し
文字列の終端制御
エラー処理
アダプタクラスを使用する場合、最初に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を初期化せずにアダプタクラスを使用した場合、アプリケーションエラーが発生します。
アダプタクラスを使用しなくなった場合、Java VM(Virtual Machine)を終了させます。Java VMの終了は、FJ-JAVA-CONTROLクラスのJVM-TERMINATEメソッドで行います。
以下にコーディング例を示します。
… REPOSITORY. CLASS FJ-JAVA-CONTROL … PROCEDURE DIVISION. … INVOKE FJ-JAVA-CONTROL "JVM-TERMINATE". …
アダプタクラスを使用したマルチスレッドのアプリケーションでは、スレッドごとにカレントスレッドをJava VM(Virtual Machine)に接続する必要があります。また、スレッドを終了する前に、カレントスレッドをJava VMから分離する必要があります。
カレントスレッドのJava VMへの接続は、FJ-JAVA-CONTROLクラスのJVM-ATTACHメソッドで行います。Java VMへの接続は、スレッド内でアダプタクラスを使用する前に必ず実行しなければなりません。
また、カレントスレッドのJava VMからの分離は、FJ-JAVA-CONTROLクラスのJVM-DETACHメソッドで行います。Java VMからの分離は、スレッド内でアダプタクラスを使わなくなった場合に必ず実行しなければなりません。
以下に、マルチスレッドアプリケーションの例を示します。
オブジェクトの生成は、アダプタクラスの、コンストラクタに対応するファクトリメソッドを呼び出すことにより行います。ファクトリメソッドは、以下の名前で生成します。
Create-Javaクラス名-nn(nnは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を指定して別名をつけると便利です。
インスタンスメソッドの呼出しは、アダプタクラスの対応するオブジェクトメソッドを呼び出すことにより行います。メソッド名は、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. …
変数の操作は、アダプタクラスの対応するプロパティを通して行います。プロパティ名は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. …
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 条件成立 …
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. …
アダプタクラスに文字列を受け渡すには、以下の方法があります。
Stringオブジェクトで受け渡す
COBOLの英数字項目を直接受け渡す
通常のアダプタクラスでの文字列受け渡し方法です。
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. …
-sオプションまたは“Option String”パラメタを指定してアダプタクラスを生成することにより可能となる文字列受け渡し方法です。
JavaのString型はPIC X ANY LENGTHにマッピングされるため、ユーザアプリケーションでは英数字項目を直接受け渡すことができるようになります。このため、ユーザアプリケーションの作成が簡単になります。
英数字項目として直接受け渡すことができるのは、以下の項目です。
メソッドでのjava.lang.String型の復帰値
コンストラクタおよびメソッドでのjava.lang.String型の引数
java.lang.String型のフィールド
(“5.5.4 クラス変数”、“5.5.6 インスタンス変数”参照)
以下に、英数字項目を直接受け渡す場合の例を示します。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”パラメタを使用しないでください。
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”パラメタを指定してアダプタクラスを生成した場合、空白だけの文字列をメソッドに渡せません。
COBOLがUnicodeデータを扱う場合、日本語項目を使用します。このとき、表現形式はUTF-16になります。なお、UTF-16はビッグエンディアンとリトルエンディアンに細分化されます。上の例がビッグエンディアンで、下の例はリトルエンディアンです。
ビッグエンディアン
”富士通” → X"5BCC 58EB 901A"
”AB12” → X"0041 0042 0031 0032"
リトルエンディアン
”富士通” → X"CC5B EB58 1A90"
”AB12” → X"4100 4200 3100 3200"
このシステムのCOBOLではシステムや他言語との相性を考慮してリトルエンディアンを採用しています。ただし、翻訳オプションENCODE(UTF8,UTF16,BE)を指定することで、日本語字類の表現形式をUTF-16(ビッグエンディアン)にすることもできます。オプションの詳細は“NetCOBOL ユーザーズガイド”を参照してください。
日本語字類の表現形式をUTF-16(ビッグエンディアン)にするプログラムでアダプタクラスを使用する場合、次のようにする必要があります。
日本語字類の表現形式をUTF-16(ビッグエンディアン)で扱うアダプタクラスを生成する。
環境変数COBJIN_UCS2_ENCORDINGを次のように指定する。なお、環境変数COBJIN_UCS2_ENCORDINGに“Big”以外の値を指定しても意味を持ちません。
$ COBJIN_UCS2_ENCORDING=Big; export COBJIN_UCS2_ENCORDING
注意
アダプタクラスでは、日本語字類の表現形式として、UTF-32のUnicodeデータを扱うことはできません。UTF-32エンコードのプログラムからアダプタクラスを利用する場合には、MOVE文(書き方3)を使用してUTF-16エンコードによる日本語項目データの受け渡しをしてください。MOVE文の詳細は、“COBOL 文法書”の“6.4.28 MOVE文(中核)”を参照してください。
日本語字類の表現形式をUTF-16(ビッグエンディアン)で扱うことを指定して生成アダプタクラスの使用時に、環境変数COBJIN_UCS2_ENCORDINGの指定が不適切である場合、その動作は保証されません。
アダプタクラスは、実行時にエラーを検出した場合、以下の例外オブジェクトを発生させます。
Javaの例外クラスに対応する例外オブジェクト(Javaクラスで例外が発生した場合)
FJ-JAVA-ERRORクラスの例外オブジェクト(Jアダプタクラスジェネレータのランタイムでエラーが発生した場合)
アプリケーションがアダプタクラスで発生した例外オブジェクトを検出するには、手続き部の宣言節部分に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)が発生します。