この章では、Java プログラムから COBOL オブジェクトにアクセスする方法を説明します。この方法は、Java プログラムから手続き型 COBOL にアクセスする方法とはやや異なります (手続き型 COBOL へのアクセス方法については、『Java からの手続き型 COBOL の呼び出し』の章を参照してください)。
オブジェクト指向 COBOL (Object COBOL) で作成したクラスは、あたかも Java クラスであるかのように Java プログラムから呼び出すことが可能です。 そのためには、Object COBOL クラスのラッパークラスを Java で作成し、このラッパークラスを通じて Object COBOL クラス内の各メソッドに対応する関数を提供します。Micro Focus Net Express では、クラスウィザードとメソッドウィザードによって COBOL コードと同時に Java コードを生成できるため、この作業も容易に行うことができます。 生成した Java クラスは UNIX システムにパブリッシュすることができます。
Java ラッパークラス内の関数は、対応するメソッドに渡す各パラメータを Java の配列に格納し、Java クラス com.microfocus.cobol.RuntimeSystem のいずれか 1 つのメンバ関数の呼び出しを通じて Object COBOL 内のメソッドを呼び出し、処理結果を返します。 この処理の流れを次の図 10-1 に示します。

図 10-1 : Java からの Object COBOL の呼び出し
以降の内容では、Object COBOL クラスと対応する Java ラッパーの作成方法を説明し、Net Express のウィザードで生成されるコードの種類を示します。
ここで説明する情報を活用するには、Java 言語に関する基本レベル以上の知識が必要になります。Java 言語の基本的な知識を得るには、Sun の Java Web サイトが役立ちます。
実際の作業に着手する前に、COBOL と Java のランタイムシステムが連携できるように、作業環境をセットアップする必要があります。具体的な手順については、『Java と COBOL の連携』の章にある『Java と COBOL の環境のセットアップ』を参照してください。
Java プログラムから呼び出し可能なクラスを Object COBOL で作成するには、次の手順に従います。
$set ooctrl"+p-f"
.int ファイルや .gnt ファイルにコンパイルすることも可能ですが、これらのファイル形式では、複数のクラスを 1 つのファイルにパッケージ化することができません。
Net Express のクラスウィザードを使用して Object COBOL 内で Java クラスを作成すると、適切な継承と指令を持つ Object COBOL クラスが生成され、 同時に Java ラッパークラスも生成されます。 詳細は、Net Express ヘルプの索引で『クラスウィザード』を検索してください。
Java ラッパークラスが Object COBOL クラスと通信するために必要なサポート機能は、com.microfocus.cobol パッケージに含まれています。したがって、ラッパーには次の文を記述する必要があります。
import com.microfocus.cobol.* ;
さらに、mfcobol.jar ファイルを含むディレクトリを、Java の classpath に必ず登録します。このファイルが見つからないと、Java プログラムはコンパイルできず、実行することもできません。具体的な手順については、『Java と COBOL の連携』の章にある『Java と COBOL の環境のセットアップ』を参照してください。
Java ラッパークラスでは、microfocus.cobol.RuntimeObject または microfocus.cobol.RuntimeSystem を拡張する必要があります。 この拡張は、Java ラッパークラスのインスタンスで表される Object COBOL のインスタンスの存在期間に次のような影響を与えます。
ラッパークラスは、ラッピング対象の COBOL クラスのライブラリとファイル名で初期化される必要があります。この初期化を実行するには、Java ラッパークラスに次のコードを含めます。
static
{
cobloadclass("libname","filename","fullJavaClassName");
}
説明
| libname | Object COBOL クラスを含む .dll ファイルの名前。Object COBOL クラスを .int 形式や .gnt 形式のコードで実行している場合など、.dll ファイルとしてパッケージ化していない場合には、このパラメータの指定は省略できます。 |
| filename | Object COBOL クラスのファイル名。 |
| FullJavaClassName | Object COBOL クラスに対応する Java クラスの名前。 |
このクラスでは 3 種類の cobloadclass() メソッドが定義されています。これらのメソッドは、ライブラリ、COBOL ファイル、および Java ラッパークラスを識別する方法が、互いに少し異なっています。
Java ラッパークラスでは、COBOL クラスに追加した各メソッドに対応する関数を定義する必要があります。 Net Express のメソッドウィザードで COBOL クラスにメソッドを追加すると、対応するメソッドが Java ラッパーに自動的に追加されます。 ただし、いったん追加したメソッドを COBOL クラスから削除した場合は、対応するメソッドを Java ラッパークラスから手作業で削除する必要があります。
ウィザードの詳細については、Net Express ヘルプの索引で『クラスウィザード』を検索してください。
注: メソッドウィザードで String 型または StringBuffer 型のパラメータを受け取るメソッドを追加すると、これらのパラメータ値の格納先として 32 バイト長のデータ項目 (PIC X(32)) が生成されます。 これらのパラメータで渡した文字列が 32 バイトより短い場合、データ項目内では文字列の末尾にヌルバイト (x"00") が付加され、ヌルバイトから 32 番目のバイトまでの内容は未定義になります。渡された文字列を処理する前に、次のようなコードを追加して文字列の長さを特定する必要があります。
move 0 to received-length inspect passed-string tallying received-length for characters before initial x"00" move passed-string(1:received-length) to actual-string
以降の内容では、Java 関数をメソッドウィザードを使用せず、手作業でラッパークラス内に記述する方法を説明します。
Java 関数には、次の処理が必要です。
デフォルトでは、COBOL で例外が発生したときにスローされる Exception と、COBOL ランタイムシステムによってスローされる COBOLException を宣言します。 Java クラスを Enterprise Java Bean としてディプロイするか、Java RMI (Remote Method Invocation; リモートメソッド起動) を使用する場合は、RemoteException も宣言する必要があります。
Java のパラメータは Java 配列で COBOL ランタイムシステムに渡されます。
Java 関数の戻り値の型に応じて、対応する種類の cobinvoke_ または cobinvokestatic_ を使用します (たとえば、戻り値が int 型であれば cobinvoke_int を使用します)。 また、Object COBOL のインスタンスを呼び出すには cobinvoke_ メソッド、 Object COBOL のクラスを呼び出すには cobinvokestatic_ メソッドを使用します。
具体的な cobinvoke_ 関数の種類は、『Java Run-time Class Library Reference』(docs/mfcobol.docs.zip にあります) に一覧されています。
COBOL メソッドの戻り値の型にマッピングする Java データ型を決定し、適切な cobinvoke_ 関数を使用する必要があります。詳細については、『Java データ型』の章を参照してください。
Object COBOL のファクトリメソッドは Java ラッパーの静的関数にマップされます。
COBOL インスタンスのメソッドと、それに対応する Java ラッパーの関数のサンプルコードを次に示します。 まず、COBOL のメソッドのサンプルコードを示します。
method-id. "myMethod".
local-storage section.
*----ユーザコード。次の必要な局所場所項目を追加します。
linkage section.
01 myParameter pic x(4) comp-5.
01 myReturnValue pic x(4) comp-5.
procedure division using by reference myParameter
returning myReturnValue.
*----ユーザコード。 メソッドを実装するコードを追加します。
exit method.
end method "myMethod".
次に Java ラッパーのメソッドのサンプルコードを示します。
public int myMethod (Integer myParameter) throws Exception,
CobolException, RemoteException
{
// パラメータは配列で COBOL に渡されます。
Object[] params = {myParameter};
return ((int) cobinvoke_int ("myMethod", params)); }
通常、Java ラッパークラスのメソッドには、COBOL クラスの対応するメソッドと同じ名前を付けますが、これは必須ではありません。 ただし、同じ名前を使用すれば、Java ラッパー内でのメソッドのオーバーロードが可能になります。
メソッドのオーバーロードでは、パラメータの型や数が異なるメソッドを複数、同じ名前で定義できます。 メソッドのオーバーロードは Java でサポートされている機能であり、COBOL ではサポートされていませんが、 複数のオーバーロード関数を Java ラッパーに追加して、それぞれの関数で COBOL クラス内の異なる名前のメソッドを呼び出すことができます。
たとえば、Java ラッパークラスでは次のようなオーバーロード関数を定義できます。
public int add (int a, int b)
{...}
public int add (int a, int b, int c)
{...}
これらの関数は、それぞれ COBOL クラス内の異なる名前のメソッド (add2 と add3 など) にマッピングすることが可能です。
Net Express のメソッドウィザードで、Java クラスとして生成した COBOL クラスにメソッドを追加する場合は、Java ラッパーと COBOL クラスの対応するメソッドに、互いに異なる名前を付けることができます。
COBOL コードから Java 例外をスローすることができます。 あらゆる Java クラスを例外オブジェクトとして使用できます。 例外をスローするメソッドは javasup クラスで定義されています。詳細については、『 Java Run-time Class Library Reference』(docs/mfcobol.docs.zip にあります) を参照してください。
この用途には、次のいずれかのメソッドを使用できます。
invoke javasup "throwException" using aCOBOLProxy
説明
| aCOBOLProxy | Java の Throwable オブジェクトに対応する COBOL プロキシ |
または
invoke javasup "throwNewException" using
javaclassnamedescription
説明
| javaclassname | スローする Java 例外の名前 |
| description | 例外の説明 |
メソッドに渡すパラメータを BY REFERENCE として宣言すると、デフォルトでは Object COBOL から呼び出し側 Java クラスに制御が戻ったときに、それらのパラメータに加えられたすべての変更が対応する Java オブジェクトに反映されます。
この Java オブジェクトの更新は、次の静的変数を使用することによって回避できます。
static boolean mfcobol.runtimeProperties.updateByRefParams;
この変数のデフォルト値は true です。 false に設定すると、Java オブジェクトは更新されません。
COBOL 開発システムには、BY REFERENCE パラメータの処理方法の違いを示すサンプルプログラムが付属しています。 『デモンストレーションプログラム』の項を参照してください。
COBOL と Java を混在させてプログラムを開発するときには、次の点に注意する必要があります。
COBOL 開発システムには、Java からの Object COBOL 呼び出しのさまざまな側面を示すデモンストレーションプログラムが付属しています。 デモンストレーションプログラムは、製品のインストールディレクトリであるdemo/javademo/cobol ディレクトリに格納されています。これらのディレクトリ内の各ファイルは、いずれもサンプル関連ファイルであり、readme.txt ファイルに詳細情報が記載されています。
サンプルプログラムを格納している各ディレクトリと、格納されているサンプルの機能の概要を次に示します。
| ディレクトリ名 | 概要 |
|---|---|
| array | Object COBOL で Java 配列を受信し、配列内のデータにアクセスする。
Object COBOL で Java 配列を作成して Java クラスに渡す。 |
| record | シンプルな COBOL Java オブジェクトを作成する。
DataType インターフェイスを実装する Java オブジェクト から Object COBOL のメソッドにデータを渡し、構造体に格納する。 パラメータを参照で (BY REFERENCE) 渡す。 |
| simple | シンプルな COBOL Java オブジェクトを作成する。
Object COBOL のクラスとインスタンスのメソッドを Java から呼び出す。 |
| sort | シンプルな COBOL Java オブジェクトを作成する。
Java で Object COBOL メソッドを呼び出す。 Object COBOL で Java メソッドを呼び出す。 Java オブジェクトをパラメータとして処理し、結果を返す。 |
Copyright © 2004 Micro Focus International Limited. All rights reserved.