•
•
•
• eGenユーティリティでは、作成したeGenスクリプトと呼ばれるスクリプトを処理してJavaアプリケーションを生成できます。Javaデータビューは、スクリプトの最初のセクションで定義されます。このデータビューはアプリケーション・コードでデータ・アクセスとデータ変換、およびその他の様々な機能を提供するために使用されます。実際のアプリケーション・コードは、スクリプトの2つ目のセクションで定義されます。図1に、eGenユーティリティのしくみを示します。この図は、eGenユーティリティの入力として使用されているeGenスクリプトとCOBOLコピーブック・ファイルを示しています。生成される出力はデータビューです。COBOL CICSまたはIMSメインフレーム・アプリケーションは、通常はコピーブック・ソース・ファイルを使用してデータ・レイアウトを定義します。このファイルは、CICSアプリケーションのソース・プログラムのLINKAGE SECTION内にあるCOPYディレクティブまたはIMSプログラムのWORKING-STORAGE SECTIONで指定されます。CICSまたはIMSアプリケーションがコピーブック・ファイルを使用していない場合は、プログラム・ソースに含まれるデータ定義からコピーブック・ファイルを作成する必要があります。各コピーブックの内容がeGenユーティリティで解析されて、次を実行する機能を提供するデータビュー・サブクラスを生成します。メインフレーム上で新しいアプリケーションを作成するか変更する場合は、1つ以上の新しいコピーブックが必要になることがあります。これらのコピーブックを作成するときは、eGenでサポートされているCOBOL機能とデータ型に注意してください。詳細は、「データビュー・プログラミング・リファレンス」を参照してください。メインフレーム・アプリケーションに既存のDPLまたはAPPCインタフェースがある場合、そのインタフェースのデータは、通常はCOBOLコピーブックで記述されています。既存のCOBOLコピーブックを使用する前に、インタフェースが、eGenでサポートされていないCOBOL機能やデータ型を使用していないことを確認します(「eGenユーティリティの制限」を参照)。COBOLコピーブックのソース・ファイルの例は、図2を参照してください。eGenユーティリティでは、ほとんどのCOBOLコピーブック・データ型とデータ句をJavaの相当するデータ型とデータ句に変換できます。ただし、一部の古い構造体および浮動小数点データ型は変換できません。eGenユーティリティで変換できるCOBOLデータ型の詳細は、「データビュー・プログラミング・リファレンス」を参照してください。eGenユーティリティが構造体またはデータ型を完全にサポートできない場合は、次のようになります。
• メインフレーム・アプリケーションのCOBOLコピーブックを取得すると、eGenスクリプトを作成できるようになります。このeGenスクリプトと、データ構造体を記述するCOBOLコピーブックがeGenユーティリティによって処理され、データビューが生成されます。これが、カスタムJavaアプリケーションの基本として機能します。
• データビュー。スクリプトのデータビュー・セクションでは、COBOLコピーブックからJava データビューを生成します。生成されたコードからコンパイルされるクラス・ファイルによって、Javaデータビュー・クラスが拡張されます。データビューの生成については、以降の項で詳しく説明します。詳細は、「eGenスクリプトのデータビュー・セクションの記述」を参照してください。eGenユーティリティはCOBOLコピーブックを解析し、コピーブックで宣言されているデータ・レコードをカプセル化するJavaデータビュー・コードを生成します。この処理は、リスト1 (キーワードは太字)の例のようなデータビュー定義が含まれる、eGenスクリプト・ファイルを解析することによって行われます。generate view examples.CICS.outbound.gateway.EmployeeRecord from emprec.cpyこのコード行の各部分を見てみると、generate viewは、Javaデータビュー・コード・ファイルの生成をeGenユーティリティに指示しています。examples.CICS.outbound.gateway.EmployeeRecordは、データビュー・ファイルEmployeeRecord.javaの呼出しをeGenユーティリティに指示しています。パッケージの名前はexamples.CICS.outbound.gatewayです。EmployeeRecord.javaで定義されているEmployeeRecordクラスは、データビュー・クラスのサブクラスです。from emprec.cpyという語句は、COBOLコピーブックemprec.cpyからEmployeeRecordデータビュー・ファイルを形成することをeGenに指示しています。アプリケーションで必要なすべてのデータビューを生成するために、別のgenerate view文がeGenスクリプトに追加される可能性があります。また、eGenスクリプトに追加オプションを指定して、データビュー生成の詳細を変更することもあります。たとえば、次のスクリプトは、メインフレーム形式への変換およびメインフレーム形式からの変換で、コードページcp500を使用するデータビュー・クラスを生成します。codepage句が指定されていない場合は、デフォルトのコードページcp037が使用されます。
注意: JoltクライアントがLinux X86-64マシンのTuxedoでCOBOLサービスを呼び出す場合は、リスト4でパラメータcodepage ASCIIとendian littleを指定してeGenで生成されたJavaコードでJoltクライアントをコンパイルする必要があります。XMLサポートで生成される追加ファイルを、表1に示します。
このデータビューが受け付け、このデータビューで生成されるXMLメッセージのXML DTD。 このデータビューが受け付け、このデータビューで生成されるXMLメッセージのXMLスキーマ。eGenスクリプトを処理し、Javaコードを生成する場合は、コード生成およびコンパイル・プロセスで使用されるJavaクラスとアプリケーションへのアクセス権が必要です。CLASSPATHおよびPATH環境変数に正しい要素を追加すると、このアクセス権が得られます。
• データビュー・クラス・ファイルのパスをCLASSPATHに追加します。Javaアプリケーション・コードをコンパイルするときにこれらのクラスへのアクセス権が必要です。
注意: UNIXユーザーは、上で指定したディレクトリ・パスを追加するときに"\"ではなく"/"を使用する必要があります。リスト1に示されているeGenスクリプトでは、次のシェル・コマンドでコピーブック・ファイルを解析し(図2を参照)、現在のディレクトリにEmployeeRecord.javaソース・ファイルを生成します。リスト6 サンプルのコピーブック解析コマンドエラーまたは警告メッセージが発行されない場合、コピーブックにはeGenとの互換性があり、ソース・ファイルが作成されます。emprec.egenスクリプトを処理しても、アプリケーション・ソース・ファイルは生成されません。これは、このスクリプトにコマンドを生成するアプリケーションがないためです。次の例は、生成されたJavaソース・ファイルEmployeeRecord.javaを示しています。この例ではわかりやすくするためにコメントと実装の詳細を一部削除しています。eGenユーティリティによって生成されたJavaコードはコンパイルする必要があります。ただし、考慮が必要となる特別な状況があります。アプリケーション・コードはデータビュー・コードに依存しているため、データビュー・コードをコンパイルし、アプリケーション・コードをコンパイルする前に結果のデータビュー・クラス・ファイルが環境のCLASSPATH内にあるかどうかを確認する必要があります。すべてのデータビュー・クラス・ファイルがアプリケーション・コードのコンパイルで参照可能であることを確認する必要があります。メインフレームとの間のデータ変換用にシンプルなインタフェースが用意されています。また、メインフレーム・サービス・リクエストを作成できるシンプルなcallService()メソッドがあります。メインフレーム・サービスへの入力用バッファを作成するためのサポートは、com.bea.base.io.MainframeWriterクラスで提供されます。このクラスは、Java java.io.DataOutputStreamオブジェクトと同じように機能します。Javaデータ型とすべてのメインフレーム固有のデータ型を変換します。数値データ型の場合、この変換サービスではJavaネイティブ数値型をメインフレームで使用できる数値型に変換できます。文字列データ型の場合は、デフォルトでUNICODEからEBCDICへの変換が行われますが、使用される出力コードページは構成可能です。リスト7に、MainframeWriterクラスが提供するパブリック・メソッドを示します。
文字フィールドの変換に指定されたコードページを使用してMainframeWriterを構築します。 データをバイト配列としてMainframeWriterクラスに書き込んで構築された変換済バッファを返します。 浮動小数点数をIEEE Java浮動小数点データ型からIBM 4バイト浮動小数点形式に変換します。同等のCOBOL picture句はPIC S9V9 COMP-1です。 浮動小数点数をIEEE Java doubleデータ型からIBM 8バイト浮動小数点形式に変換します。同等のCOBOL picture句はPIC S9V9 COMP-2です。 文字列を変換し、固定長の文字フィールドに書き込みます。渡された文字列の長さがlen未満の場合、渡されたパッド文字が使用されます。渡された文字列の長さがlenを超えると、len文字まで切り捨てられます。同等のCOBOL句はPIC X(len)です。 符号付きの16ビットの2進整数を出力バッファに書き込みます。同等のCOBOL picture句はPIC S9(4) COMPです。 符号なしの16ビットの2進整数を出力バッファに書き込みます。同等のCOBOL picture句はPIC 9(4) COMPです。 暗黙の小数点を左にscale桁移動した後に、符号付き16ビット整数を出力バッファに書き込みます。たとえば、write16bit(100, 1)を呼び出すと、値10が書込まれます。同等のCOBOL picture句はPIC S9(4) COMPです。 暗黙の小数点を左にscale桁移動した後に、符号なし16ビット整数を出力バッファに書き込みます。たとえば、write16bitUnsigned(100, 1)を呼び出すと、値10が書込まれます。同等のCOBOL picture句はPIC 9(4) COMPです。 符号付きの32ビットの2進整数を出力バッファに書き込みます。同等のCOBOL picture句はPIC S9(8) COMPです。 符号なしの32ビットの2進整数を出力バッファに書き込みます。同等のCOBOL picture句はPIC 9(8) COMPです。 暗黙の小数点を左にscale桁移動した後に、符号付き32ビット整数を出力バッファに書き込みます。たとえば、write32bit(100L, 1)を呼び出すと、値10が書き込まれます。同等のCOBOL picture句はPIC S9(8) COMPです。 暗黙の小数点を左にscale桁移動した後に、符号なし32ビット整数を出力バッファに書き込みます。たとえば、write32bitUnsigned(100L, 1)を呼び出すと、値10が書込まれます。同等のCOBOL picture句はPIC 9(8) COMPです。 符号付きの64ビットの2進整数を出力バッファに書き込みます。同等のCOBOL picture句はPIC S9(15) COMPです。 符号なしの64ビットの2進整数を出力バッファに書き込みます。同等のCOBOL picture句はPIC 9(15) COMPです。 暗黙の小数点を左にscale桁移動した後に、符号付き64ビット整数を出力バッファに書き込みます。たとえば、write64bit(100L, 1)を呼び出すと、値10が書込まれます。同等のCOBOL picture句はPIC S9(15) COMPです。 暗黙の小数点を左にscale桁移動した後に、符号なし64ビット整数を出力バッファに書き込みます。たとえば、write64bitUnsigned(100L, 1)を呼び出すと、値10が書込まれます。同等のCOBOL picture句はPIC 9(15) COMPです。 IBM符号付きパック・データ型として、10進の合計桁数がdigits、小数点以下はprec桁の10進数を書き込みます。変換前に、数値が左側scale桁までスケーリングされます。同等のCOBOL picture句はPIC S9(digits-prec)V9(prec) COMP-3です。 IBM符号なしパック・データ型として、10進の合計桁数がdigits、小数点以下はprec桁の10進数を書き込みます。変換前に、数値が左のscale桁までスケーリングされます。同等のCOBOL picture句はPIC 9(digits-prec)V9(prec) COMP-3です。リスト8 データ・レコード05 LAST-NAME PIC X(10).05 HOURLY-RATE PIC S9(3)V9(2) COMP-3.リスト9に、MainframeWriter変換クラスを使用してこのレコード・レイアウトと一致するバッファを作成するJavaテスト・プログラムを示します。リスト9 Javaテスト・プログラムメインフレームから受信されたデータをJavaデータ型に変換するためのサポートは、com.bea.base.io.MainframeReaderクラスにより提供されます。このクラスはJava jam.io.DataInputStreamと同様に動作し、メインフレーム・データ型からJavaプログラムで使用可能な同等のデータ型への変換を実行します。MainframeWriterクラスと同様に、文字列変換に使用されるコードページは構成可能で、EBCDICにデフォルト設定されます。リスト10に、MainframeReaderクラスが提供するパブリック・メソッドを示します。
cp037 (EBCDIC)のデフォルト・コード・ページを使用して渡されたバッファのMainframeReaderを構築します。 文字フィールドの変換に指定されたコードページを使用して、渡されたバッファのMainframeReaderを構築します。 固定長の文字フィールドを読み取り、変換して、Java文字列として返します。フィールドの長さはlenとして渡されて、フィールドのパッド文字がpadとして渡されます。pad文字の最後のインスタンスが削除されてから、データが返されます。 16ビットの2進整数を読み取り、値を10^スケール分スケーリングします。たとえば、値10がread16bit(1)で読み取られた場合、返される値は100になります。 符号なし64ビット整数を読み取り、Java BigDecimalとして返します。 符号付き64ビット整数を読み取り、値を10^スケール分スケーリングします。値はJava BigDecimalとして返されます。 MainframeReaderクラスを使用した例として、上で作成したメインフレーム・バッファのフィールドを変換および表示するプログラムを次に示します。入力バッファは次のバイナリ・データで構成されます。リスト11に、このバッファを処理するために使用されるサンプル・プログラムを示します。リスト11 サンプル・プログラムeGenユーティリティはCOBOLコピーブックをJavaクラスにマップします。COBOLコピーブックには、データ・レコードの説明が含まれています。eGenユーティリティは、生成されたJavaクラスをcom.bea.dmd.dataview.DataViewクラス(以降はデータビュー)から派生します。表4に、いくつかのマッピングの例を示します。
1. グループはデータビュー・サブクラスにマップされます。
2. 英数字フィールドは、すべて文字列型にマップされます。
3. 編集済数値フィールドは、すべて文字列型にマップされます。
5. SIGN IS LEADINGはサポートされません。
8. POINTERはJavaのint型にマップされます。
9. 小数点以下の桁を持つ数値フィールドは、すべてBigDecimal型にマップされます。
11. 他のすべての数値フィールドは、表5に示すようにマップされます。
COBOLコピーブック内でネストしている各グループは、対応するデータビュー・サブクラスにマップされます。生成されるサブクラスは、コピーブック内のCOBOLグループと同じようにネストされます。また、eGenユーティリティによって、このクラス・タイプのprivateインスタンス変数およびgetアクセッサが生成されます。リスト12 サンプルのコピーブック各基本フィールドは、生成されたデータビュー・サブクラス内でprivateインスタンス変数にマップされます。この変数へのアクセスは、生成された2つのアクセッサ(setおよびget)によって実現されます。FieldTypeの詳細は、「フィールド・タイプのマッピング」という項を参照してください。FieldNameの詳細は、「フィールド名のマッピング・ルール」という項を参照してください。配列フィールドは、「グループ・フィールド・アクセッサ」および「基本フィールド・アクセッサ」に記載されているフィールド・アクセッサ・ルールに従って処理されます。それに加えて、各アクセッサは、アクセスする配列エントリを指定する追加のint引数を使用します。次に例を示します。
•
• REDEFINESセットに参加するフィールドは、1つの単位として処理されます。private byte[]変数は、基礎となるメインフレーム・データを保持するように宣言されます。private DataView変数も同様です。再定義された各フィールドには、アクセッサがあります。これらのアクセッサは、基礎となるbyte[]データとの間で変換を実行するため、通常のアクセッサより多くのCPUオーバーヘッドが生じます。リスト13 サンプルのコピーブックこの項では、TuxedoでサポートされているCOBOLデータ型をまとめています。表6に、eGenユーティリティで認識されるCOBOLデータ項目の定義を示します。表7に、eGenユーティリティで認識される構文機能およびデータ型を示します。COBOL機能がサポート対象外で、表内で「無視」と表記されていない場合は、エラー・メッセージが生成されます。
表6 主要なCOBOL機能
表7 COBOLのデータ型 eGenでは、次の各項で説明する複数の方法でデータビュー・クラスにアクセスできます。データビューが生成されたときに指定したコードページをオーバーライドする場合は、リスト15のコメントに示されているように、別のコードページをMainframeWriterコンストラクタのString引数として指定できます。メインフレーム・データのデータビューへのロードも同様のプロセスですが、この場合はMainframeReaderクラスを使用する必要があります。リスト15に、ロードの実行に使用できるコードのサンプルを示します。次のリストに、データビューをXMLにアンロードするために使用されるコードの例を示します。リスト18に、COBOLコピーブックのサンプルを示します。8 04 emp-ssn pic 9(9) comp-3.11 06 emp-name-last pic x(15).12 06 emp-name-first pic x(15).13 06 emp-name-mi pic x.16 06 emp-addr-street pic x(30).17 06 emp-addr-st pic x(2).18 06 emp-addr-zip pic x(9).
次に、データビューをハッシュ表にアンロードするために使用されるコードの例を示します。次に、ハッシュ表を既存のデータビューにロードするために使用されるコードの例を示します。
•
• 配列は、"["と"]"のペアで囲まれたインデックスとして、キーの適切なレベルで示されます。たとえば、empAddrが配列である場合、ハッシュ表への1つのキーはempRecord.empAddr[2].empAddrStreetになります。
• 誤った型のハッシュ表メンバーがあると、ClassCastExceptionがスローされます。名前変換インタフェース機能を使用して、ハッシュ表名前マッピングを実行できます。HashtableLoaderとHashtableUnloaderの両方に、com.bea.dmd.dataview.NameTranslator型の引数を受け入れるコンストラクタが用意されています。表9に、実装する必要があるパブリック・インタフェース・メソッドの説明を示します。
表9 名前変換インタフェース 次に、egen.jarに含まれている有用な実装を示します。
表10 名前変換インタフェース
• 継続行はCOBOLコピーブックで認識されません。これは、VALUES句内に長い文字リテラルが存在する場合にのみ発生する問題です。この問題を修正するには、関連の句をコメント・アウトします。
•
• COBOLコピーブック内のグループ・データ項目のUSAGE句は、その下位メンバー・データ項目に正しく伝播されません。リスト19 プログラム・スニペットリスト20 接続の設定リスト21 入力Beanの使用方法リスト22 サービスの呼出しリスト23 出力Beanの使用方法次にCOBOLコピーブックemprec.cpyを示します。04 emp-ssn pic 9(9) comp-3.06 emp-name-last pic x(15).06 emp-name-first pic x(15).06 emp-name-mi pic x.06 emp-addr-street pic x(30).06 emp-addr-st pic x(2).06 emp-addr-zip pic x(9).
•
• 次に、EmployeeRecord.javaをコンパイルすると、4つのJavaクラス・ファイルが生成されます。
• 次に、JoltクライアントJavaコードをEmployeeRecord.javaを使用して作成できます。簡単な例は以下を参照してください。リスト25 Javaコードのサンプル
• Tuxedoサーバー・サイトで、同じコピーブックemprec.cpyを使用するTuxedo COBOLサーバーを作成できます。簡単な例は以下を参照してください。リスト26 Tuxedoサーバー・サイトのサンプル