Java からのオブジェクト COBOL の呼出し

ここでは、Java プログラムから COBOL オブジェクトにアクセスする方法を説明します。この方法は、Java プログラムから手続き型 COBOL にアクセスする方法とはやや異なります (手続き型 COBOL へのアクセス方法は、『Java からの手続き型 COBOL の呼出し』の章を参照)。

概要

オブジェクト指向 COBOL (オブジェクト COBOL) で作成したクラスは、Java クラスであるかのように Java プログラムから呼び出すことが可能です。そのためには、オブジェクト COBOL クラスのラッパークラスを Java で作成し、このラッパークラスを通じてオブジェクト COBOL クラス内の各メソッドに対応する関数を提供します。クラスウィザードとメソッドウィザードによって COBOL コードと同時に Java コードを生成できるため、この作業も容易に行うことができます。

Java ラッパークラス内の関数は、対応するメソッドに渡す各パラメータを Java の配列に格納し、Java クラス com.microfocus.cobol.RuntimeSystem のどれか 1 つのメンバ関数の呼出しを通じてオブジェクト COBOL 内のメソッドを呼び出し、処理結果を返します。この処理の流れを図 5-1 に示します。

Java からのオブジェクト COBOL の呼出し

図 5-1: Java からのオブジェクト COBOL の呼出し

以降の内容では、オブジェクト COBOL クラスと対応する Java ラッパーの作成方法を説明し、Net Express のウィザードで生成されるコードの種類を示します。

ここで説明する情報を活用するには、Java 言語に関する基本レベル以上の知識が必要になります。Java 言語の基本的な知識を得るには、Micro Focus Links のリンク先にある Sun 社の Java Web サイトが役立ちます。

作業環境の設定

実際の作業に着手する前に、COBOL と Java のランタイムシステムが連携できるように、作業環境を設定する必要があります。詳細は、『Java と COBOL の連携』の章の『Java と COBOL の環境の設定』の節を参照してください。

オブジェクト COBOL での Java クラスの作成

Java プログラムから呼出し可能なクラスをオブジェクト COBOL で作成するには、次の手順を行う必要があります。

  1. プログラム内で次の指令を設定します。
    $set ooctrl(+p-f)
  2. オブジェクト COBOL クラスは javabase を継承することを確認します。
  3. オブジェクト COBOL クラスの Java ラッパークラスを作成します。ラッパークラスには、オブジェクト COBOL クラスのファイル名と同じ名前を付けます。
  4. オブジェクト COBOL クラス内に作成した各メソッドに対して、対応するメソッドを Java ラッパークラスに作成します。
  5. 作成したクラスを Windows プラットフォームにディプロイする場合は、.dll ファイルにパッケージ化します。

    .int ファイルや .gnt ファイルにコンパイルすることも可能ですが、これらのファイル形式では、複数のクラスを 1 つのファイルにパッケージ化できません。

Net Express のクラスウィザードを使用してオブジェクト COBOL 内で Java クラスを作成すると、適切な継承と指令を持つオブジェクト COBOL クラスが生成され、同時に Java ラッパークラスも生成されます。詳細は、『クラスウィザード』を参照してください。

COBOL サポートのインポート

Java ラッパークラスがオブジェクト 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 ラッパークラスのインスタンスで表されるオブジェクト COBOL のインスタンスの存在期間に次のような影響を与えます。

ラッパークラスは、ラッピング対象の COBOL クラスのライブラリとファイル名で初期化される必要があります。この初期化を実行するには、Java ラッパークラスに次のコードを含めます。

static 
{
  cobloadclass("libname","filename","fullJavaClassName");  
}

詳細は、次のとおりです。

libname オブジェクト COBOL クラスを含む .dll ファイルの名前。オブジェクト COBOL クラスを .int 形式や .gnt 形式のコードで実行している場合など、.dll ファイルとしてパッケージ化していない場合には、このパラメータの指定は省略できます。
filename オブジェクト COBOL クラスのファイル名。
FullJavaClassName オブジェクト COBOL クラスに対応する Java クラスの名前。

3 種類の cobloadclass() メソッドが定義されています。これらのメソッドは、ライブラリ、COBOL ファイル、および Java ラッパークラスを識別する方法が、互いに少し異なっています。

メソッドの追加と削除

Java ラッパークラスでは、COBOL クラスに追加した各メソッドに対応する関数を定義する必要があります。Net Express のメソッドウィザードで COBOL クラスにメソッドを追加すると、対応するメソッドが Java ラッパーに自動的に追加されます。ただし、いったん追加したメソッドを COBOL クラスから削除した場合は、対応するメソッドを Java ラッパークラスから手動で削除する必要があります。

Java 関数には、次の処理が必要です。

  1. COBOL メソッドの呼出しで発生する可能性がある例外を宣言します。

    デフォルトでは、COBOL で例外が発生したときにスローされる Exception と、COBOL ランタイムシステムによってスローされる COBOLException を宣言します。Java クラスを Enterprise Java Bean としてディプロイするか、Java RMI (java remote method invocation; リモートメソッド起動) を使用する場合は、RemoteException も宣言する必要があります。

  2. Java から COBOL メソッドに渡すパラメータを格納する Java 配列を作成します。

    Java のパラメータは Java 配列で COBOL ランタイムシステムに渡されます。

  3. RuntimeSystem.java クラスの cobinvoke_ メソッドまたは cobinvokestatic_ メソッドを呼び出します。

    Java 関数の戻り値の型に応じて、対応する種類の cobinvoke_ または cobinvokestatic_ を使用します (たとえば、戻り値が int 型であれば cobinvoke_int を使用します)。また、オブジェクト COBOL のインスタンスを呼び出すには cobinvoke_ メソッド、オブジェクト COBOL のクラスを呼び出すには cobinvokestatic_ メソッドを使用します。

    具体的な  cobinvoke_ 関数の完全なリストは、『Java Run-time Class Library』を参照してください。

    COBOL メソッドの戻り値の型にマップする Java データ型を決定し、適切な cobinvoke_ 関数を使用する必要があります。詳細は、『Java データ型』の章を参照してください。

オブジェクト COBOL ファクトリのメソッドは、Java ラッパーの静的関数にマップされます。

COBOL インスタンスのメソッドと、それに対応する Java ラッパーの関数のサンプルコードを次に示します。まず、COBOL のメソッドのサンプルコードを示します。

 method-id. "myMethod".
 local-storage section.
*>---USER-CODE。次に、必要な局所場所項目を追加します。
 linkage Section.
 01 myParameter            pic x(4) comp-5.
 01 myReturnValue          pic x(4) comp-5.
 procedure division using by reference myParameter
                    returning myReturnValue.
*>---USER-CODE。次に、メソッドを実装するコードを記述します。
     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 からの例外のスロー

COBOL コードから Java 例外をスローできます。あらゆる Java クラスを例外オブジェクトとして使用できます。例外をスローするメソッドは javasup クラスで定義されています。詳細は、 『Java Run-time Class Library』を参照してください。

次のどちらかのメソッドを使用できます。

invoke javasup "throwException" using aCOBOLProxy
        

詳細は、次のとおりです。

aCOBOLProxy Java の Throwable オブジェクトに対応する COBOL プロキシ

または

invoke javasup "throwNewException" using 
	             javaclassnamedescription
        

詳細は、次のとおりです。

javaclassname スローする Java 例外の名前
description 例外の説明

BY REFERENCE パラメータの使用方法

メソッドに渡すパラメータを BY REFERENCE として宣言すると、デフォルトではオブジェクト COBOL から呼出し側 Java クラスに制御が戻ったときに、それらのパラメータに加えられたすべての変更が対応する Java オブジェクトに反映されます。

この Java オブジェクトの更新は、次の静的変数を使用することによって回避できます。

static boolean mfcobol.runtimeProperties.updateByRefParams;

この変数のデフォルト値は true です。false に設定すると、Java オブジェクトは更新されません。

注:Net Express の以前のバージョンでは、BY REFERENCE で定義されたパラメータが更新されても、デフォルトでは呼出し側 Java オブジェクトには反映されません。以前のバージョンの動作を前提としている Java コードがある場合には、mfcobol.runtimeProperties.updateByRefParams を false に設定するように、コードを変更する必要があります。

本 COBOL 開発システムには、BY REFERENCE パラメータの異なる処理方法のサンプルプログラムが付属しています。 『サンプルプログラム』を参照してください。

Java プログラムを扱う際の留意点

COBOL と Java プログラムを混在させてプログラムを開発する場合は、次の点に注意する必要があります。

JAR ファイルの作成

JAR (java archive) 形式のファイルは、Java アプリケーションを配布する手段として広く使用されています。Net Express で作成した Java クラスは、Zip ファイルや実行形式ファイルへのパッケージ化と同じ方法で JAR ファイルにして配布できます。

Net Express では、JAR ファイルの作成時に使用する設定を変更できます。Net Express が JAR ファイルを作成するときには、デフォルトでは Jar コマンドで次のオプションが使用されます。

デフォルト以外のオプションを指定する必要があるときには、他のビルド設定と同じ方法でオプションを変更できます。

サンプルプログラム

COBOL 開発システムには、Java からのオブジェクト COBOL 呼出しのさまざまな側面を示すサンプルプログラムが付属しています。サンプルプログラムは、製品のインストール先の $COBDIR/demo/javademo/cobol ディレクトリにあります。これらのディレクトリ内の各ファイルは、いずれもサンプル関連ファイルであり、readme.txt ファイルに詳細情報が記載されています。

サンプルプログラムを格納している各ディレクトリと、格納されているサンプルの機能の概要を次に示します。

ディレクトリ名 概要
array オブジェクト COBOL で Java 配列を受信し、配列内のデータにアクセスします。

オブジェクト COBOL で Java 配列を作成して Java クラスに渡します。

record 簡単な COBOL Java オブジェクトを作成します。

DataType インターフェイスを実装する Java オブジェクト からオブジェクト COBOL のメソッドにデータを渡し、構造体に格納します。

パラメータを参照で (BY REFERENCE) 渡します。

simple 簡単な COBOL Java オブジェクトを作成します。

オブジェクト COBOL のクラスとインスタンスのメソッドを Java から呼び出します。

sort 簡単な COBOL Java オブジェクトを作成します。

Java でオブジェクト COBOL メソッドを呼び出します。

オブジェクト COBOL で Java メソッドを呼び出します。

Java オブジェクトをパラメータとして処理し、結果を返します。