Javaからメインフレームへのアクセス

     前  次    新規ウィンドウで目次を開く    PDFとして表示 - 新規ウィンドウ  Adobe Readerを入手 - 新規ウィンドウ
コンテンツはここから始まります

eGenアプリケーション・ジェネレータによるJavaアプリケーションの生成

このドキュメントは、以下のトピックで構成されています。

 


概要

Oracle Tuxedoでは、J2EEアプリケーション・サーバーおよびJCAベースで実行されるCICS Transaction Gateway (CTG)アプリケーションの、シームレスな統合がサポートされています。

この機能に基づいて、Oracle Tuxedoは次の操作を行うツールを提供しています。

したがって、ユーザーはそのクラスをCCI (またはECIでラップされる)インタフェースに渡して、ARTでホストされるCICS呼出しを実行できます。

 


eGenスクリプトの記述

メインフレーム・アプリケーションのCOBOLコピーブックを取得すると、eGenスクリプトを記述する準備が整います。このeGenスクリプトと、データ構造体を説明するCOBOLコピーブックがeGenユーティリティによって処理され、データビューとアプリケーション・コードが生成されます。これが、カスタムJavaアプリケーションの基本として機能します。

eGenスクリプトには、2つのセクションがあります。これらは次のとおりです。

eGenスクリプトのデータビュー・セクションの記述

eGenユーティリティはCOBOLコピーブックを解析し、コピーブックで宣言されているデータ・レコードをカプセル化するJavaデータビュー・コードを生成します。この処理は、リスト1 (キーワードは太字)の例のようなデータビュー定義が含まれる、eGenスクリプト・ファイルを解析することによって行われます。データビュー定義が含まれるセクションは、eGenスクリプトの先頭のセクションです。アプリケーション・コードは2番目のセクションによって生成されます。

リスト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が使用されます。

リスト2 コードページが指定されているデータビュー・セクションの例
 generate view examples.CICS.outbound.gateway.EmployeeRecord from emprec.cpy codepage cp500

次のスクリプトは、XMLデータでデータビュー・クラスの使用をサポートする追加の出力を生成します。

リスト3 XMLをサポートするデータビュー・セクションの例
 generate view sample.EmployeeRecord from emprec.cpy support xml

XMLサポートで生成される追加ファイルを、表1に示します。

表1 データビューのXMLサポート用の追加ファイル
ファイル名
ファイルの目的
classname.dtd
このデータビューが受け付け、このデータビューで生成されるXMLメッセージのXML DTD。
classname.xsd
このデータビューが受け付け、このデータビューで生成されるXMLメッセージのXMLスキーマ。

 


フィールド名のマッピング・ルール

フィールド名が含まれるCOBOLコピーブックを処理すると、eGenユーティリティによってこれらがJava名にマップされます。英字はすべて小文字にマップされます。ただし、次の2つの場合は例外です。

ダッシュはすべて削除され、ダッシュに続く文字は大文字にマップされます。

名前に接頭辞が追加されると(フィールド・アクセッサ関数名を作成する場合など)、ベース名の先頭の文字が大文字にマップされます。

表2に、いくつかのマッピングの例を示します。

表2 COBOLからJavaおよびアクセッサへのフィールド名マッピングの例
COBOLフィールド名
Javaベース名
アクセッサ名の例
EMP-REC
empRec
setEmpRec
500-REC-CNT
500RecCnt
set500RecCnt

 


フィールド・タイプのマッピング

COBOLコピーブックを処理すると、フィールドのデータ型はJavaのデータ型にマップされます。マッピングは、次のルールに従ってeGenユーティリティによって実行されます。

  1. グループは、データビューのサブクラスにマップされます。
  2. 英数字フィールドは、すべて文字列型にマップされます。
  3. 編集済数値フィールドは、すべて文字列型にマップされます。
  4. SIGN SEPARATE、BLANK WHEN ZEROまたはJUSTIFIED RIGHTフィールドは、すべて文字列型にマップされます。
  5. SIGN IS LEADINGはサポートされません。
  6. COMP-1、COMP-2、COMP-5、COMP-XおよびPROCEDURE-POINTER型フィールドはサポートされません(エラー・メッセージが生成されます)。
  7. INDEXフィールドは、すべてJavaのint型にマップされます。
  8. POINTERは、Javaのint型にマップされます。
  9. 小数点以下桁数を持つ数値フィールドは、すべてBigDecimal型にマップされます。
  10. COMP-3 (パック10進数)フィールドは、すべてBigDecimal型にマップされます。
  11. 他のすべての数値フィールドは、表3に示すようにマップされます。
  12. 表3 数値フィールドのマッピング
    桁数
    Java型
    <= 4
    short
    > 4および<= 9
    int
    > 9および<= 18
    long
    > 18
    BigDecimal

 


アクセッサ

ここでは、次の内容について説明します。

グループ・フィールド・アクセッサ

COBOLコピーブック内でネストしている各グループは、対応するDataViewサブクラスにマップされます。生成されるサブクラスは、コピーブック内のCOBOLグループと同じようにネストされます。また、eGenユーティリティによって、このクラス・タイプのprivateインスタンス変数およびgetアクセッサが生成されます。

たとえば、次のようなコピーブックがあるとします。

10 MY-RECORD.
	20  MY-GRP.
		30  ALNUM-FIELD				PIC X(20).
Produces code similar to the following:
 public MyGrp2V getMyGrp();
public static class MyGrp2V extends DataView
{
		// Class definition
}

基本フィールド・アクセッサ

各基本フィールドは、生成されたデータビュー・サブクラス内でprivateインスタンス変数にマップされます。この変数へのアクセスは、生成された2つのアクセッサ(setおよびget)によって実現されます。

このアクセッサの形式は、次のとおりです。

 public void setFieldName(FieldType value);
 public FieldType getFieldName();

説明:

FieldType

詳細は、「フィールド・タイプのマッピング」を参照してください。

FieldName

詳細は、「フィールド名のマッピング・ルール」を参照してください。

たとえば、次のようなコピーブックがあるとします。

 10 MY-RECORD.
	20  NUMERIC-FIELD					PIC S9(5).
	20  ALNUM-FIELD					PIC X(20).

次のアクセッサが生成されます。

public void setNumericField(int value);
public int getNumericField();
public void setAlnumField(String value);
public String getAlnumField();

配列フィールド・アクセッサ

配列フィールドは、「グループ・フィールド・アクセッサ」および「基本フィールド・アクセッサ」に記載されているフィールド・アクセッサ・ルールに従って処理されます。それに加えて、各アクセッサは、アクセスする配列エントリを指定する追加のint引数を使用します。次に例を示します。

public void			setFieldName(int index, FieldType value);
public FieldType			getFieldName(int index);

DEPENDING ON句で指定される配列フィールドは、固定サイズの配列と同じように処理されますが、次の特別なルールが適用されます。

REDEFINES句で指定されるフィールド

REDEFINESセットに関係するフィールドは、1つの単位として処理されます。private byte[]変数は、基礎となるメインフレーム・データを保持するように宣言されます。private DataView変数も同様です。再定義された各フィールドには、アクセッサがあります。これらのアクセッサは、基礎となるbyte[]データとの間で変換を実行するため、通常のアクセッサより多くのCPUオーバーヘッドが生じます。

たとえば、次のようなコピーブックがあるとします。

 10 MY-RECORD.
	20 INPUT-DATA.
		30 INPUT-A						PIC X(4).
		30 INPUT-B                						PIC X(4).
	20 OUTPUT-DATA REDEFINES INPUT-DATA 							PIC X(8).

次のようなJavaコードが生成されます。

private byte[] m_redef23;
private DataView m_redef23DV;
public InputDataV   getInputData();
public String		getOutputData();
public void		setOutputData(String value);
public static class InputDataV extends DataView
{
// Class definition.
}

 


COBOLデータ型

この項では、WebLogic JAMソフトウェアでサポートされるCOBOLデータ型の要約を示します。表4に、eGenユーティリティで認識されるCOBOLのデータ項目定義を示します。表5に、eGenユーティリティで認識される構文機能およびデータ型を示します。COBOL機能がサポート対象外で、表内で「無視」と表記されていない場合は、エラー・メッセージが生成されます。

表4 主要なCOBOL機能
COBOL機能
サポート
IDENTIFICATION DIVISION
サポート対象外
ENVIRONMENT DIVISION
サポート対象外
DATA DIVISION
一部サポート対象
WORKING-STORAGE SECTION
一部サポート対象
データ・レコード定義
サポート対象
PROCEDURE DIVISION
サポート対象外
COPY
サポート対象外
COPY REPLACING
サポート対象外
EJECT、SKIP1、SKIP2、SKIP3
サポート対象

表5 COBOLのデータ型
COBOLのデータ型
Java型
COMP、COMP-4、バイナリ(整数)
Short/Int/Long
COMP、COMP-4、バイナリ(固定長)
BigDecimal
COMP-3、PACKED-DECIMAL
BigDecimal
COMP-5
サポート対象外
COMP-X
サポート対象外
DISPLAY数値(ゾーン10進数)
BigDecimal
BLANK WHEN ZERO (ゾーン10進数)
文字列
SIGN IS LEADING (ゾーン10進数)
サポート対象外
SIGN IS LEADING SEPARATE (ゾーン10進数)
文字列
SIGN IS TRAILING (ゾーン10進数)
文字列
SIGN IS TRAILING SEPARATE (ゾーン10進数)
文字列
編集済数値
文字列
COMP-1、COMP-2 (浮動小数点)
サポート対象外
編集済浮動小数点値
文字列
DISPLAY (英数字)
文字列
編集済英数字
文字列
INDEX
Int
POINTER
Int
PROCEDURE-POINTER
サポート対象外
JUSTIFIED RIGHT
サポート対象外(無視)
SYNCHRONIZED
サポート対象外(無視)
REDEFINES
サポート対象
66 RENAMES
サポート対象外
66 RENAMES THRU
サポート対象外
77レベル
サポート対象
88レベル(条件付き)
サポート対象外(無視)
グループ・レコード
内部クラス
OCCURS (固定配列)
配列
OCCURS DEPENDING (可変長配列)
配列
OCCURS INDEXED BY
サポート対象外(無視)
OCCURS KEY IS
サポート対象外(無視)

 


プログラム開発

プログラム開発は、リスト4に示されるようなプログラム・スニペットと、ここでその概要が示されるクラスのネーミング・ルールに従って行われます。ただし、顧客の要件に応じて調整可能です。

リスト4 プログラム・スニペット
try
     {
        InitialContext context = new InitialContext();
        
       ECIConnectionSpec connSpec = new ECIConnectionSpec();
       connSpec.setUserName("TESOP01");
       connSpec.setPassword("");               
       Connection connection = connectionFactory.getConnection(connSpec);
       
        Interaction interaction = connection.createInteraction();
        
        // Create inputBean
                K294Bean inRec = new K294Bean();
                inRec.setI__Entete__TranId("K294");
                inRec.setI__Entete__Vers("0101");
                inRec.setI__Entete__Statut("99");
                inRec.setI__Entete__Nb__Enreg((short)40); 
                inRec.setI__Entete__User("TESOP01"); 
                inRec.setI__Entete__Date("2012-01-16");
                               
       // Data
                inRec.setI__restea__nupy(1);
                inRec.setI__restea__cdea(2);
                inRec.setI__restea__cdea1(1); 
                                                                                                                                                                                                                                                          
                K294Bean outRec = new K294Bean();
        
      // Create InteractionSpec 
        InteractionSpec interactionSpec = new ECIInteractionSpec();
        ((ECIInteractionSpec)interactionSpec).setFunctionName("COMPT294");
        ((ECIInteractionSpec)interactionSpec).setTranName("K294");
        ((ECIInteractionSpec)interactionSpec).setCommareaLength(7132);
        ((ECIInteractionSpec)interactionSpec).setInteractionVerb(ECIInteractionSpec.SYNC_SEND_RECEIVE);                      
                 
        // execute transaction
        interaction.execute((ECIInteractionSpec)interactionSpec, inRec, outRec);
                                
        // Close all 
                interaction.close();
                connection.close();            
        
       // List Data 
           K294bean_output__message_t__o__data__data  data[] = outRec.getT__o__data__data(); 
                               
      // Load List
      for (int i=0; i<data.length;i++)
      {
                if (data[i].getT__o__data__data__o__restea__cdea()!=0)      
                 {                                
                   out.println(data[i]);
                }
      }                                                          
  }
catch (Exception e)
      {
        System.out.println("Error : " + e.getMessage());
        e.printStackTrace();
      }

重要な分野

次のリストに、プログラム開発における重要な分野を示します。フィールド名のマッピングは異なる場合があります。


  先頭に戻る       前  次