前ページへ COBOL からの Java の呼び出し Java データ型 次ページへ

第 4 章 Java からのオブジェクト COBOL の呼び出し

この章では、Java プログラムから COBOL オブジェクトへアクセスする方法について説明します。これは、Java プログラムから手続き型 COBOL にアクセスするメソッドとは少し異なります (詳細は、『Java からの手続き型 COBOL の呼び出し』 を参照してください)。また、COBOL を使用して Enterprise Java Beans を作成する方法についても説明します。

4.1 概要

Java プログラムから Java クラスと同様に呼び出すことができるクラスを オブジェクト COBOL に作成することができます。これは、オブジェクト COBOL クラスの各メソッドに対して関数を与える Java ラッパークラスを使用して行います。

Java ラッパークラス内の関数は、メソッドのパラメータをすべて Java 配列に渡し、次に Java クラス、 mfcobol.runtime のメンバー関数の 1 つを呼び出し、オブジェクト COBOL クラスのメソッドを呼び出して結果を戻します。図 4-1 にこの流れを示します。

Java から COBOL の呼び出しへの関数呼び出しパス

図 4-1: Java から COBOL のメソッド呼び出しへの関数呼び出しのパス

この章では オブジェクト COBOL クラスとその Java ラッパーの書き方を説明します。最後の項では、Enterprise Java Beans (EJB) として使用するのに適切な オブジェクト COBOL クラスを作成する場合に行う必要がある追加事項について説明します。

このテクノロジを使用する前に、 COBOL および Java 環境をセットアップする必要があります。詳しくは 『始める前に』 を参照してください。

4.2 オブジェクト 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 つのファイル内で複数のクラスをパッケージ化することができません。

4.2.1 COBOL サポートのインポート

Java ラッパークラスが オブジェクト COBOL クラスと通信するために必要なサポートは mfcobol パッケージにあります。ラッパーには、次の文が含まれている必要があります。

import mfcobol.* ;

また、mfcobol.jar が Java クラスパス上にあることを確認してください。クラスパス上にない場合は、Java プログラムのコンパイルや実行を行うことができません(この説明は、 『始める前に』にあります)。

4.2.2 ラッパークラス

Java ラッパークラスは、mfcobol.runtimeObject または mfcobol.runtime を拡張します。これは、次のように、Java ラッパークラスのインスタンスによって表現される オブジェクト COBOL インスタンスの存在期間に影響を与えます。

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

 static
 {
    cobloadclass("shared-obj-name", "filename", "fullJavaClassName") ; 
 }

各パラメータの説明は以下のとおりです。

shared-obj-name オブジェクト COBOL クラスを含む共有オブジェクトの名前を指定します。クラスが共有オブジェクトにパッケージ化されていない場合は、このパラメータをヌルのままにできます。たとえば、 .int または .gnt コードとして実行されている場合です。
filename オブジェクト COBOL クラスのファイル名を指定します。
FullJavaClassName オブジェクト COBOL に対応する Java クラス名を指定します。

mfcobol.runtime には、cobloadclass() メソッドが全部で 3 つあり、これらはそれぞれ少し異なる方法でライブラリ、COBOL ファイル、および Java ラッパークラスを識別します。

4.2.3 メソッドの追加と削除

COBOL クラスに追加するすべてのメソッドには、対応する関数が Java ラッパークラスに存在する必要があります。

Java 関数は、次の操作を行う必要があります。

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

    デフォルトでは、例外は Exception (COBOL で例外を挙げる場合に発生) と COBOLException (COBOL ランタイム システムから発生) です。作成するクラスが Enterprise Java Bean として実装される場合や、Java RMI (リモート メソッド 起動) を使用して実装される場合は、RemoteException も追加する必要があります。

  2. Java から COBOL メソッドへ渡されるパラメータを含む Java 配列を構築します。

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

  3. クラス runtime.java にある cobinvoke_ メソッドまたは cobinvokestatic_ メソッドのいずれかを呼び出します。

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

    すべての cobinvoke_ 関数のリストについては『Class Library Reference』『Java Classes for COBOL Support』の項を参照してください。

    どの Java データ型が COBOL メソッドからの戻り値の種類にマップされるかを判断して、適切な cobinvoke_ 関数を選択する必要があります。詳細は、『Java データ型』 の章を参照してください。

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

次の 2 つのコード サンプルは、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 へマップします。

4.2.4 COBOL からの例外の発生

COBOL コードから Java 例外を発生させることができます。例外オブジェクトは任意の Java クラスにすることができます。例外を発生させるメソッドは javasup クラスにあり、Class Library Referenceマニュアルの『Java Domain Class Library』の項に説明されています。

次のいずれかのメソッドを使用することができます。

invoke javasup "throwException" using aCOBOLProxy

ここで、

aCOBOLProxy には、Throwable 型の Java オブジェクトに対する COBOL プロキシを指定します。

または、

invoke javasup "throwNewException" using javaclassname description

ここで、

javaclassname には、発生させる Java 例外のクラスの名前を指定します。
description テキストによる例外の説明です。

4.3 COBOL Enterprise JavaBean

Server Express で提供されている機能を使用して、COBOL Enterprise JavaBean を手動で作成することができます。作成方法については、Micro Focus アンサーラインにお問い合わせください。

Enterprise JavaBean は、アプリケーション サーバーで稼動するソフトウェア コンポーネントです。 セキュリティ、トランザクションの完全性と永続性など、Bean で必要なサービスはすべてアプリケーション サーバーが行うので、EJB はビジネス ロジックを実装する必要があるだけです。 本項を読むためにははじめに EJB について理解することが必要です。 EJB についての詳細は、Sun Microsystems の Java サイトを参照してください。

COBOLクラスを EJB として作成するためには、次のファイルを作成します。

Enterprise JavaBean を生成ためには、次の 5 つのメソッドもクラス名.cbl に追加して記述する必要があります。

これらのメソッドは、すべての Enterprise JavaBeans によって実装されている SessionBean インターフェイスの一部です。これらのメソッドのうち、最初の 3 つにはコードを追加する必要があります。SetSessionContext へは、Java コンテキスト オブジェクトが COBOL クラスのインスタンス データの一部として格納されるようにします。

ejbCreate は EJB でオーバーロードが可能なメソッドであり、異なるパラメータを指定して、インスタンス化時に Java bean を初期化することができます。パラメータを受け取らない ejbCreate メソッドを EJB に追加し、対応する create メソッドをリモート インターフェイス クラス (クラス名Remote.java) に追加します。クラス名Remote.java の create メソッドは、リモート インターフェイス オブジェクトを戻します。

COBOL クラスに追加するメソッドは、Java ラッパークラスとリモート インターフェイス クラスへも追加する必要があります。

4.3.1 COBOL EJB テンプレートの利用

Net Express 製品とともに提供されている、COBOL EJBテンプレートプロジェクトをテンプレートとしてプロジェクトのクローンを作成することによって、容易に COBOL Enterprise JavaBeans を作成することができます。

COBOL Enterprise JavaBeans テンプレートプロジェクトは、\NetExpress\BASE\SOURCE\TEMPLATE\EJB\EJBTPLT.APP にあります。使用方法の詳細は、同プロジェクト中の README.TXT を参照して下さい。

4.4 デモプログラム

Server Express には、Java からのオブジェクト COBOL の呼び出しのいくつかの方法を説明するデモプログラムが付属しています。これらのデモプログラムは、$COBDIR/demo/java/oocobol の下のサブディレクトリにあります。各サブディレクトリには、該当するすべてのプログラムファイルと、プログラムを詳しく説明した、各デモ用のテキストファイルが含まれています。テキストファイルの名前は、demonstration-name.txt という形式です(demonstration-name はデモプログラムの名前を示します)。これらのデモプログラムは、Net Express にも付属しており、\Program Files\Micro Focus\Net Express\Base\Demo\Javademo\Oocobol ディレクトリの下のサブディレクトリにあります。

以下の表は、デモプログラムを含むディレクトリと、そのデモの目的の概要です。

ディレクトリ
デモの目的
array オブジェクト COBOL 中の Java 配列の受領とアクセス
Creating a Java array in オブジェクト COBOL 中への Java 配列の作成と、その Java への転送
simple 単純な COBOL Java オブジェクトの作成.
Java を使用した、クラスおよびインスタンスオブジェクト COBOL の呼び出し
sort 単純な COBOL Java オブジェクトの作成.
Java を使用したオブジェクト COBOL メソッドの呼び出し
オブジェクト COBOL を使用した Java メソッドの呼び出し
Java オブジェクトの、パラメータおよび返された値としての処理


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前ページへ COBOL からの Java の呼び出し Java データ型 次ページへ