Java ラッパー・クラス

プログラム・パーツを Java™ ラッパーとして生成することを要求すると、EGL は、次のそれぞれについて、ラッパー・クラスを生成します。

プログラム・ラッパー・クラスパラメーター・ラッパー・クラス動的配列ラッパー・クラス、 および副構造体項目付き配列ラッパー・クラスとしてのプログラムのラッパー・クラスについては、 後に説明します。

EGL により、各パラメーター・ラッパー・クラス、動的配列ラッパー・クラス、 または副構造体項目付き配列ラッパー・クラスごとに BeanInfo クラスが生成されます。BeanInfo クラスは、関連ラッパー・クラスを Java 準拠の Java Bean として使用できるようにします。 通常、BeanInfo クラスと対話することはありません。

ラッパーを生成すると、呼び出し先プログラムのパラメーター・リストは、BLOB、CLOB、STRING、Dictionary、ArrayDictionary、または非固定レコード型のパラメーターをインクルードできません。

ラッパー・クラスの使用方法の概要

ラッパー・クラスを使用して VisualAge® Generator または EGL で生成されたプログラムと通信するには、ネイティブ Java プログラムで次のことを行います。
  • ネイティブ Java コードと生成済みプログラム間でデータ変換を行うようなミドルウェア・サービスを提供するクラス (CSOPowerServer のサブクラス) をインスタンス化します。
      import com.ibm.javart.v6.cso.*;
    
      public class MyNativeClass
      {
        /* ミドルウェアの変数を宣言します */
        CSOPowerServer powerServer = null;
        
        try
        {
      	   powerServer = new CSOLocalPowerServerProxy();
        }
        catch (CSOException exception)
        {
          System.out.println("Error initializing middleware"
            + exception.getMessage());
          System.exit(8);
        }
      }
  • 次のことを行うプログラム・ラッパー・クラスをインスタンス化します。
    • データ構造を割り振り、動的配列がある場合にはそれを組み込む
    • 生成されたプログラムにアクセスするメソッドへのアクセスを提供する
    コンストラクターを呼び出すには、ミドルウェア・オブジェクトが必要です。
      myProgram = new MyprogramWrapper(powerServer);
  • パラメーター・ラッパー・クラスに基づく変数を宣言します。
      Mypart  myParm = myProgram.getMyParm();
      Mypart2 myParm2 = myProgram.getMyParm2(); 
    プログラムに動的配列のパラメーターがある場合は、 次のように、動的配列ラッパー・クラスを基にして、それぞれ追加変数を宣言します。
      myRecArrayVar myParm3 = myProgram.getMyParm3();

    動的配列との対話の詳細については、『動的配列ラッパー・クラス』を参照してください。

  • 通常 (直前のステップで示したように)、プログラム・ラッパー・オブジェクトに割り振られたメモリーを参照および変更するには、パラメーター変数を使用します。
  • ユーザー ID およびパスワードを設定しますが、次の場合に限ります。
    • Java ラッパーが、iSeries™ Toolbox for Java を介して iSeries ベース・プログラムにアクセスする場合
    • リモート・アクセスを認証する CICS® for z/OS® 領域上で生成プログラムが実行される場合

    データベースへのアクセスでは、ユーザー ID とパスワードは使用されません。

    ユーザー ID とパスワードを設定および確認するには、プログラム・オブジェクトの callOptions 変数を使用します。例を次に示します。
      myProgram.callOptions.setUserID("myID");
      myProgram.callOptions.setPassword("myWord");
      myUserID = myProgram.callOptions.getUserID();
      myPassword = myProgram.callOptions.getPassword();
  • 生成されたプログラムにアクセスします。通常は、プログラム・ラッパー・オブジェクトの execute メソッドを呼び出します。
      myProgram.execute();
  • ミドルウェア・オブジェクトを使用して、データベース・トランザクションの制御を設定します。ただし、これは、次の場合に限ります。
    • プログラム・ラッパー・オブジェクトが CICS for z/OS 上の生成プログラムにアクセスしているか、IBM® Toolbox for Java を介して iSeries ベース COBOL プログラムにアクセスしている場合 後者のケースでは、呼び出しの remoteComType の値は JAVA400 です。
    • ラッパー・クラスの生成に使用するリンケージ・オプション・パーツで、データベース作業単位をクライアント (この場合はラッパー) で制御するように指定した。詳細については、『callLink エレメント』の luwControl の説明を参照してください。
    データベース作業単位をクライアントで制御する場合、処理では、ミドルウェア・オブジェクトの commit メソッドと rollback メソッドを使用する必要があります。
      powerServer.commit();
        powerServer.rollback();
  • ミドルウェア・オブジェクトを閉じ、ガーベッジ・コレクションの準備をします。
      if (powerServer != null)
      {
        try
        {
          powerServer.close();
          powerServer = null;
        }
    
        catch(CSOException error)
        {
          System.out.println("Error closing middleware"
            + error.getMessage());
          System.exit(8);
        }
      }

プログラム・ラッパー・クラス

プログラム・ラッパー・クラスには、生成済みプログラムの各パラメーター用のプライベート・インスタンス変数が含まれています。パラメーターがレコードまたは書式の場合、変数は、関連するパラメーター・ラッパー・クラスのインスタンスを参照します。 パラメーターがデータ項目の場合、変数は、Java プリミティブ型です。

EGL と Java 型の間の変換については、このヘルプ・ページの最後に表でまとめています。

プログラム・ラッパー・オブジェクトには、次の public メソッドが含まれます。
  • 各パラメーター用の get メソッドと set メソッド。名前の形式は次のとおりです。
      purposeParmname()
    purpose
    ワード get または set
    Parmname
    データ項目、レコード、または書式の名前。名前の先頭は大文字で表し、 残りの文字は、『Java ラッパー・クラスの命名規則』で説明されている命名規則により決定されます。
  • プログラム呼び出し用の execute メソッド。このメソッドが使用されるのは、呼び出し時に引き数として渡されるデータが、プログラム・ラッパー・オブジェクトに割り振られたメモリー内に存在する場合です。
インスタンス変数に値を割り当てる代わりに、次のことが可能です。
  • パラメーター・ラッパー・オブジェクト、動的配列ラッパー・オブジェクト、およびプリミティブ型用にメモリーを割り振る。
  • 割り振ったメモリーに値を割り当てる。
  • プログラム・ラッパー・オブジェクトの call メソッド (execute メソッドではなく) を呼び出し、プログラムにこれらの値を渡す。
プログラム・ラッパー・オブジェクトには、callOptions 変数も含まれます。callOptions 変数は、次の目的を持ちます。
  • 呼び出しのリンケージ・オプションが生成時に設定されるように Java ラッパーを生成した場合、callOptions 変数にはリンケージ情報が含まれます。リンケージ・オプションをいつ設定するかについては、『callLink エレメント』の remoteBind を参照してください。
  • 呼び出しのリンケージ・オプションが実行時に設定されるように Java ラッパーを生成した場合、callOptions 変数にはリンケージ・プロパティー・ファイルの名前が含まれます。ファイルの名前は LO.properties です。LO は生成で使用されるリンケージ・オプション・パーツ名です。
  • いずれの場合も、callOptions 変数によって、ユーザー ID およびパスワードを設定または取得する以下のメソッドが提供されます。
      setPassword(passWord)
      setUserid(userid) 
      getPassword()
      getUserid()
    このユーザー ID およびパスワードは、以下のいずれかの値に callLink エレメントの remoteComType プロパティーを設定するときに使用します。
    • CICSECI
    • CICSJ2C
    • JAVA400
最後に、プリミティブ型のパラメーターが変更されたときに、ネイティブ Java コードが通知を必要とする状況を考えましょう。 このような通知を可能にするには、プログラム・ラッパー・オブジェクトの addPropertyChangeListener メソッドを呼び出して、ネイティブ・コードを listener として登録する必要があります。そうした場合、次の状況のいずれかによって PropertyChange イベントが起動されると、実行時、ネイティブ・コードが通知を受け取ることができるようになります。
  • ネイティブ・コードにより、プリミティブ型のパラメーター上で set メソッドを呼び出す。
  • 生成されたプログラムにより、変更されたデータがプリミティブ型のパラメーターに戻される。

PropertyChange イベントについては、Sun Microsystems, Inc. の JavaBean 仕様に記述されています。

パラメーター・ラッパー・クラスのセット

パラメーター・ラッパー・クラスは、生成されるプログラム内のパラメーターとして宣言されるレコードごとに作成されます。通常、 パラメーター・ラッパー・クラスは、パラメーターを参照する変数を宣言するためにのみ使用します。 例を次に示します。
  Mypart myRecWrapperObject = myProgram.getMyrecord();

この場合は、プログラム・ラッパー・オブジェクトによって割り振られたメモリーが使用されます。

パラメーター・ラッパー・クラスを使用すると、プログラム・オブジェクトの call メソッド (execute メソッドではなく) を呼び出す場合に必要なメモリーを宣言することもできます。

パラメーター・ラッパー・クラスには、次に示すように、一連のプライベート・インスタンス変数が含まれます。
  • パラメーターの各低レベル構造体項目用の Java プリミティブ型の変数 (ただし、配列でもなく副構造付き配列内にも存在しない構造体項目の場合に限る)。
  • 配列ではあるが副構造は持たない各 EGL 構造体項目用の Java プリミティブ型の配列。
  • それ自体は副構造付き配列内に存在しない各副構造付き配列用の内部の配列クラスのオブジェクト。インナー・クラスは、ネストされたインナー・クラスを持つことで、従属副構造付き配列を表すことができます。
パラメーター・ラッパー・クラスには、public メソッドがいくつか含まれます。
  • 一連の get メソッドと set メソッドを使用すると、各インスタンス変数を取得および設定できます。各メソッド名の形式を次に示します。
      purposesiName()
    purpose
    ワード get または set
    siName
    構造体項目の名前。名前の先頭は大文字で表し、 残りの文字は、『Java ラッパー・クラスの命名規則』で説明されている命名規則により決定されます。
    注: 充てん文字として宣言した構造体項目は、プログラム呼び出し内に含まれます。ただし、これらの構造体項目の public get メソッドまたは set メソッドは、配列ラッパー・クラスには含まれません。
  • メソッド equals を使用すると、同一クラスの別のオブジェクトに格納されている変数が、パラメーター・ラッパー・オブジェクト内に格納されている値と同じであるかどうかを確認できます。このメソッドが true を戻すのは、クラスと値が同じ場合に限ります。
  • メソッド addPropertyChangeListener が呼び出されるのは、Java プリミティブ型の変数の変更通知をプログラムが必要としている場合です。
  • get メソッドと set メソッドの 2 番目のセットを使用すると、SQL レコード・パラメーター内の各構造体項目ごとに NULL 標識を取得および設定できます。 これらのメソッド名の形式を次に示します。
      purposesiNameNullIndicator()
    purpose
    ワード get または set
    siName
    構造体項目の名前。名前の先頭は大文字で表し、 残りの文字は、『Java ラッパー・クラスの命名規則』で説明されている命名規則により決定されます。

副構造体項目付き配列ラッパー・クラスのセット

副構造体項目付き配列ラッパー・クラスは、 パラメーター・クラスのインナー・クラスであり、関連するパラメーター内の副構造付き配列を表します。副構造体項目付き配列ラッパー・クラスには、 配列自体の構造体項目および配列以下の構造体項目を参照する一連のプライベート・インスタンス変数が含まれています。
  • 配列の各低レベル構造体項目用の Java プリミティブ型の変数 (ただし、配列でもなく副構造付き配列内にも存在しない構造体項目の場合に限る)。
  • 配列ではあるが副構造は持たない各 EGL 構造体項目用の Java プリミティブ型の配列。
  • それ自体は副構造付き配列内に存在しない各副構造付き配列用の内部の副構造体項目付き配列ラッパー・クラスのオブジェクト。 インナー・クラスは、ネストされたインナー・クラスを持つことで、従属副構造付き配列を表すことができます。
副構造体項目付き配列ラッパー・クラスには、次のメソッドが含まれます。
  • 各インスタンス変数用の一連の get メソッドと set メソッド。
    注: 名前のない充てん文字として宣言した構造体項目は プログラム呼び出し内で使用されますが、これらの構造体項目の public get または set メソッドは副構造体項目付き配列ラッパー・クラスに含まれません。
  • メソッド equals を使用すると、 同一クラスの別のオブジェクトに格納されている変数が、 副構造体項目付き配列ラッパー・オブジェクト内に格納されている値と同じであるかどうかを確認できます。このメソッドが true を戻すのは、クラスと値が同じ場合に限ります。
  • メソッド addPropertyChangeListener。Java プリミティブ型の変数の変更を通知する必要がある場合に使用します。
通常、パラメーター・ラッパー・クラス内にある最上位の副構造体項目付き配列ラッパー・クラスの名前は、 次のような書式で表現されます。
  ParameterClassname.ArrayClassName
例えば、次のレコードについて考えましょう。
  Record CompanyPart type basicRecord
  10 Departments CHAR(20)[5];
     20 CountryCode CHAR(10);
     20 FunctionCode CHAR(10)[3];
        30 FunctionCategory CHAR(4);
        30 FunctionDetail CHAR(6);
  end

パラメーター CompanyCompanyPart に基づいている場合は、 インナー・クラスの名前として、ストリング CompanyPart.Departments を使用します。

インナー・クラスのインナー・クラスにより、ドット構文の使用が拡張されます。この例では、Departments のインナー・クラス名として、 シンボル CompanyPart.Departments.Functioncode を使用します。

副構造体項目付き配列ラッパー・クラスの命名の詳細については、『Java ラッパー生成の出力』を参照してください。

動的配列ラッパー・クラス

動的配列ラッパー・クラスは、生成されるプログラム内のパラメーターとして宣言される動的配列ごとに作成されます。 次の EGL プログラム・シグニチャーについて考えます。
  Program myProgram(intParms int[], recParms MyRec[])

動的配列ラッパー・クラス名は IntParmsArray and MyRecArray です。

動的配列ラッパー・クラスを使用して、次の例のように、 動的配列を参照する変数を宣言します。
  IntParmsArray myIntArrayVar = myProgram.getIntParms();
  MyRecArray    myRecArrayVar = myProgram.getRecParms();

動的配列ごとに変数を宣言した後、次のように、要素を追加する場合があります。

  // Java プリミティブの配列への追加は
  // 1 ステップ・プロセスです。
  myIntArrayVar.add(new Integer(5));

  // レコードの配列または書式への追加には、
  // 複数のステップが必要です。この場合、
  // 新規レコード・オブジェクトを割り振ることから始めます。
  MyRec myLocalRec = (MyRec)myRecArrayVar.makeNewElement();
  
  // 値を割り当てるステップは、この例では表示されていません。
  // ただし、値を割り当てた後、
  // レコードを配列に追加します。
  myRecArrayVar.add(myLocalRec);

  // 次に、プログラムを実行します。
  myProgram.execute();

  // プログラムが戻ったときに、
  // 配列の要素数を決定できます。
  int myIntArrayVarSize = myIntArrayVar.size();

  // 整数配列の最初の要素を得て、
  // Integer オブジェクトにキャストします。
  Integer firstIntElement = (Integer)myIntArrayVar.get(0);

  // レコード配列の 2 番目の要素を得て、
  // MyRec オブジェクトにキャストします。
  MyRec secondRecElement = (MyRec)myRecArrayVar.get(1);

例で示されるように、EGL では、宣言した変数を操作する方法がいくつか提供されます。

動的配列クラスのメソッド 用途
add(int, Object) int により指定される位置にオブジェクトを挿入し、 現行および後続の要素を右方にシフトします。
add(Object) オブジェクトを動的配列の最後に追加します。
addAll(ArrayList) ArrayList を動的配列の最後に追加します。
get() 配列内のすべての要素を含む ArrayList オブジェクトを検索します。
get(int) int により指定される位置にある要素を検索します。
makeNewElement() 配列に特有のタイプの新規要素を割り振り、 その要素を検索しますが、動的配列には追加しません。
maxSize() 動的配列内の要素の最大数 (実際の数ではない) を示す整数を検索します。
remove(int) int により指定される位置にある要素を除去します。
set(ArrayList) 動的配列の代替として、指定の ArrayList を使用します。
set(int, Object) int により指定される位置にある要素の代替として、 指定のオブジェクトを使用します。
size() 動的配列にある要素の数を検索します。
主に、次のような場合に例外が発生します。
  • get または set メソッドに、無効な指標を指定した場合
  • 配列の各要素クラスに非互換のクラスの要素を追加 (または設定) した場合
  • それ以上の増加をサポートできない最大サイズに動的配列が到達しているときに、要素を追加した場合。 つまり、メソッド addAll がこの理由により失敗した場合は、メソッドにより要素は追加されません。

Java ラッパー・クラスの命名規則

EGL では、次の規則に従い名前が作成されます。
  • 名前がすべて大文字の場合、すべて小文字にします。
  • 名前がキーワードの場合、その前にアンダーラインを付けます。
  • 名前にハイフンまたはアンダーラインが含まれる場合は除去し、その後ろの文字を大文字にします。
  • ドル記号 ($)、アットマーク (@)、またはポンド記号 (#) が名前に含まれる場合は ダブル・アンダースコアー (__) に置き換え、名前の前にアンダースコアー (_) をつけます。
  • 名前がクラス名として使用されている場合、最初の文字を大文字にします。
動的配列ラッパー・クラスには、以下の規則が適用されます。
  • 通常、クラス名は、 配列の各要素の基本であるパーツ宣言名 (データ項目、書式、またはレコード) に基づきます。 例えば、レコード・パーツが MyRec と呼ばれ、 配列宣言が recParms myRec[] である場合、 関連動的配列ラッパー・クラスは MyRecArray と呼ばれます。
  • 配列が関連パーツ宣言を持たない項目宣言に基づいている場合、 動的配列クラス名は配列名に基づきます。 例えば、配列宣言が intParms int[] である場合、 関連動的配列ラッパー・クラスは IntParmsArray と呼ばれます。

データ型の相互参照

次の表は、生成されたプログラム内の EGL プリミティブ型、および生成されたラッパー内の Java データ型の関係をまとめたものです。

EGL プリミティブ型

文字または
桁の長さ

長さ
(バイト)

小数部 Java データ型 Java の最大精度
CHAR 1 から 32767 2 から 32766 NA String NA
DBCHAR 1 から 16383 1 から 32767 NA String NA
MBCHAR 1 から 32767 1 から 32767 NA String NA
UNICODE 1 から 16383 2 から 32766 NA String NA
HEX 2 から 75534 1 から 32767 NA byte[] NA
BIN、SMALLINT 4 2 0 short 4
BIN、INT 9 4 0 int 9
BIN、BIGINT 18 8 0 long 18
BIN 4 2 >0 float 4
BIN 9 4 >0 double 15
BIN 18 8 >0 double 15
DECIMAL、PACF 1 から 3 1 から 2 0 short 4
DECIMAL、PACF 4 から 9 3 から 5 0 int 9
DECIMAL、PACF 10 から 18 6 から 10 0 long 18
DECIMAL、PACF 1 から 5 1 から 3 >0 float 6
DECIMAL、PACF 7 から 18 4 から 10 >0 double 15
NUM、NUMC 1 から 4 1 から 4 0 short 4
NUM、NUMC 5 から 9 5 から 9 0 int 9
NUM、NUMC 10 から 18 10 から 18 0 long 18
NUM、NUMC 1 から 6 1 から 6 >0 float 6
NUM、NUMC 7 から 18 7 から 18 >0 double 15

関連するタスク
Java ラッパーの生成

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.(C) Copyright IBM Japan 2005.