Oracle Tuxedoでは、J2EEアプリケーション・サーバーおよびJCAベースで実行されるCICS Transaction Gateway (CTG)アプリケーションの、シームレスな統合がサポートされています。
この機能に基づいて、Oracle Tuxedoは次の操作を行うツールを提供しています。
したがって、ユーザーはそのクラスをCCI (またはECIでラップされる)インタフェースに渡して、ARTでホストされるCICS呼出しを実行できます。
メインフレーム・アプリケーションのCOBOLコピーブックを取得すると、eGenスクリプトを記述する準備が整います。このeGenスクリプトと、データ構造体を説明するCOBOLコピーブックがeGenユーティリティによって処理され、データビューとアプリケーション・コードが生成されます。これが、カスタムJavaアプリケーションの基本として機能します。
eGenスクリプトには、2つのセクションがあります。これらは次のとおりです。
注意: | eGenスクリプトの目的が、WebLogic JAMで使用するデータビューをJMS EJBに対して生成すること、またはWebLogicの統合イベントを起動することである場合、作成する必要があるのはスクリプトのデータビュー・セクションのみです。 |
eGenユーティリティはCOBOLコピーブックを解析し、コピーブックで宣言されているデータ・レコードをカプセル化するJavaデータビュー・コードを生成します。この処理は、リスト1 (キーワードは太字)の例のようなデータビュー定義が含まれる、eGenスクリプト・ファイルを解析することによって行われます。データビュー定義が含まれるセクションは、eGenスクリプトの先頭のセクションです。アプリケーション・コードは2番目のセクションによって生成されます。
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
が使用されます。
generate view examples.CICS.outbound.gateway.EmployeeRecord from emprec.cpy codepage cp500
次のスクリプトは、XMLデータでデータビュー・クラスの使用をサポートする追加の出力を生成します。
generate view sample.EmployeeRecord from emprec.cpy support xml
XMLサポートで生成される追加ファイルを、表1に示します。
フィールド名が含まれるCOBOLコピーブックを処理すると、eGenユーティリティによってこれらがJava名にマップされます。英字はすべて小文字にマップされます。ただし、次の2つの場合は例外です。
ダッシュはすべて削除され、ダッシュに続く文字は大文字にマップされます。
名前に接頭辞が追加されると(フィールド・アクセッサ関数名を作成する場合など)、ベース名の先頭の文字が大文字にマップされます。
表2に、いくつかのマッピングの例を示します。
COBOLコピーブックを処理すると、フィールドのデータ型はJavaのデータ型にマップされます。マッピングは、次のルールに従ってeGenユーティリティによって実行されます。
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
セットに関係するフィールドは、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).
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.
}
この項では、WebLogic JAMソフトウェアでサポートされるCOBOLデータ型の要約を示します。表4に、eGenユーティリティで認識されるCOBOLのデータ項目定義を示します。表5に、eGenユーティリティで認識される構文機能およびデータ型を示します。COBOL機能がサポート対象外で、表内で「無視」と表記されていない場合は、エラー・メッセージが生成されます。
プログラム開発は、リスト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();
}
次のリストに、プログラム開発における重要な分野を示します。フィールド名のマッピングは異なる場合があります。
ECIConnectionSpec connSpec = new ECIConnectionSpec();
connSpec.setUserName("TESOP01");
connSpec.setPassword("");
Connection connection = connectionFactory.getConnection(connSpec);
Interaction interaction = connection.createInteraction();
// 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);
// Create inputBean
K294Bean inRec = new K294Bean();
inRec.getDfhcommarea().
getInputMessage().
getIEntete().setIEnteteTranId("K294");
inRec.getDfhcommarea().
getInputMessage().
getIEntete().setIEnteteVers("0101");
inRec.getDfhcommarea().
getInputMessage().
getIEntete().setIEnteteStatut("99");
inRec.getDfhcommarea().
getInputMessage().
getIEntete().setIEnteteNbEnreg((short)40);
// reserve outputBean
K294Bean outRec = new K294Bean();
// execute transaction
interaction.execute((ECIInteractionSpec)interactionSpec, inRec, outRec);
K294bean_output__message_t__o__data__data data[] = outRec.getDfhcommarea().getOutputMessage().getTODataData();