サービス インターフェイス操作の定義

BookDemo アプリケーションのサービス インターフェイスの詳細を定義する手順について説明します。
制限事項:本トピックは、Windows 環境 (ローカル開発) にのみ該当します。

サービス インターフェイスは、一連の操作として定義します。各操作では、COBOL プログラムのエントリ ポイント フィールドに対応するサービス インターフェイス フィールドを作成します。実行時には、これらのフィールドを使用してサービスとプログラムの間でデータが送信されます。

COBOL では、データ項目のデータ型は PICTURE 句で厳密に定義します。Java は固有のデータ型を使用します。インターフェイス マッパーを使用すると、既存の COBOL プログラムのデータ型を Java のデータ型にマップすることができます。

ここでは、このプログラムで実行できる 4 つのアクション (レコードの読み取り、レコードの追加、レコードの削除、次のレコードの取得) のそれぞれに対応する操作をインターフェイス マッパーで定義して、プログラムに効率的にアクセスできるようにします。各操作では、その操作に必要なデータのみを送信する必要があります。

Add 操作

サービス インターフェイスに対して定義する最初の論理操作は、レコードを追加するための操作です。このプロセスには、Add アクションを含む COBOL プログラムの特定、そのプログラムの COBOL エントリ ポイント コードの特定、情報を送受信するフィールドの決定、およびプログラムとやり取りする操作の定義が含まれます。これにより、Add アクションが指定されます。

Add 操作の作成
まず操作を作成し、名前を付けて、やり取りするプログラムおよびエントリ ポイントを指定します。この例では、レコードを追加するための操作を作成します。
  1. Team Developer Tree View で、[ProgramEJB > Java Interfaces] を展開します。
  2. [ProgramEJB] Java インターフェイスを右クリックし、コンテキスト メニューで [新規作成 > オペレーション] を選択します。
  3. [Operation name] フィールドにAddと入力します。

    アプリケーションの COBOL コードを調べると、レコードの追加アクションを実行するのは book.cbl プログラムであることがわかります。

  4. [Entry point] ドロップダウン リストから、[BOOK] を選択します。
  5. [OK] をクリックします。
インターフェイス フィールドの定義
book.cbl のソースを参照すると、lnk-file-status フィールドによって前回のファイル入出力アクションの状態が返されることがわかります。ここでは、その値を格納するインターフェイス フィールドを作成して、クライアントがその値をアプリケーションに送信できるようにします。
  1. Team Developer Tree View で [Java Interfaces > ProgramEJB] を展開し、[Add] をダブルクリックします。Add 操作がインターフェイス マッパーに表示されます。
  2. [連絡節] ペインの [lnk-file-status] を [Add Operation - Interface Fields] ペインにドラッグします。

    lnk_file_status というインターフェイス フィールドが作成されます。新しいフィールドと、そのフィールドの作成に使用したエントリ ポイント フィールドの間のマッピングは自動作成されます。このフィールドの目的はユーザーに情報を返すことであるため、方向を[入力]から[出力]に変更する必要があります。

  3. [Add Operation - Interface Fields] ペインで [lnk_file_status] をダブルクリックします。
  4. [出力] をクリックし、[OK] をクリックします。
インターフェイス フィールドのグループの定義
COBOL ソースを参照すると、レコードを追加するには、索引ファイルに新しいレコードを追加するために必要なすべてのデータを提供する必要があることがわかります。Book プログラムはそのデータを集団項目 lnk-b-details で受け取ります。この操作では、このデータを保持するためのインターフェイス フィールドのセットを定義する必要があります。
  1. [連絡節] ペインの [lnk-b-details] を [Add Operation - Interface Fields] ペインにドラッグします。

    デフォルトの方向は [入力] です。このフィールド グループは、データを受け取って lnk-b-details のデータ項目に渡すため、デフォルトのままでかまいません。

    デフォルトでは、作成される新しいインターフェイス フィールド グループの名前が lnk_b_details になりますが、ここでは、このデフォルトの名前を変更する必要があります。この同じソース フィールドのグループを使用して、この同じサービス インターフェイスの他の操作で同様のインターフェイス フィールド グループを作成する必要があるからです。インターフェイス マッパーでは、インターフェイス フィールド グループの名前がサービス インターフェイスのすべての操作の間で一意である必要がありますが、デフォルトのままでは各操作のインターフェイス フィールド グループの名前が同じになってしまうため、各操作で名前を変更して、他の操作で使用されているものとは別の名前になるようにする必要があります。

  2. [Add Operation - Interface Fields] ペインで [lnk_b_details] をダブルクリックして、名前をaddop_detailsに変更して、[OK] をクリックします。
型の変更
サービス インターフェイスを定義する際には、アプリケーションの内容と使用方法を理解しておくと、より高度なインターフェイスを作成できます。たとえば、[連絡節] ペインで小売価格フィールド lnk-b-retail が「9(2)V9(2)」として定義されていることに注目してください。[Add Operation - Interface Fields] ペインで [addop_details] のツリーをすべて展開すると、このために lnk_b_retail がデフォルトで BigDecimal になっていることがわかります。もし、このアプリケーションに関する経験から、すべての小売価格が整数単位のドルであることがわかっている場合は、lnk_b_retailint に設定することができます。ここでは、このような状況を想定して、lnk-b-retail インターフェイス フィールドの型を変更します。
  1. まだ展開していない場合は、[Add Operation - Interface Fields] ペインで [addop_details] のツリーをすべて展開します。
  2. [lnk_b_retail] フィールドをダブルクリックします。
  3. [タイプ] ドロップダウン リストから [int] を選択し、[OK] をクリックします。
COBOL 割り当ての定義
Book プログラムは、実行時に lnk-function フィールドの値を使用して、実行するアクションを決定します。この例のように、アクションの初期化に必要な値がわかっている場合は、インターフェイス フィールドではなく COBOL 割り当てフィールドを作成して、プログラムで特定のアクションを実行するために必要な値を割り当てます。

Add 操作の場合は、プログラムでレコードの追加アクションが実行されるようにする必要があります。ソース コードを参照すると、lnk-function フィールドの値が 2 のときにプログラムでレコードの追加アクションが実行されることがわかります。

  1. [連絡節] ペインで [lnk-function] フィールドを右クリックし、コンテキスト メニューで [New Assignment] を選択します。
  2. [Value] フィールドに2と入力して、[OK] をクリックします。
  3. [ファイル > 保存] をクリックしてサービス インターフェイスを保存します。
完成した Add 操作

Add オペレーション (EJB)

上記の図の詳細を説明します。

COBOL エントリ ポイント フィールドとインターフェイス フィールドの対応関係は、ドラッグ アンド ドロップ操作の実行時に設定されます。基本のインターフェイス フィールド ([lnk_file_status] など) を右クリックし、[マッピング] をクリックすると、ダイアログ ボックスが開き、関連付けられた COBOL エントリ ポイント フィールドが表示されます。この対応関係は、インターフェイス フィールドの名前や順序とは関係ありません。必要に応じて、このダイアログ ボックスでマッピングを変更できます。

サービスとクライアントの間で渡されるメッセージでは、キーワードでインターフェイス フィールドが識別されます。キーワードには、[インターフェイス フィールド] ペイン内の名前が使用されます。ただし、[インターフェイス フィールド] ペインに表示されるインターフェイス フィールドの名前は、クライアントでも同じ順序で表示されるので、この順序に注意を払うことをお奨めします。フィールドの順序を変更するには、フィールドをドラッグします。

Next 操作

ここで使用する索引ファイルの主キーは、在庫番号です。次のレコードを取得するプログラム アクションでは、在庫番号を入力として受け付け、その在庫番号を持つレコードをデータ ファイルで検索して、見つかった次のレコードを返します。

このプログラムでは、COBOL エントリ ポイント フィールドの lnk-b-details を入出力フィールドとして使用します。ただし、入力時に実際に使用されるのは、lnk-b-detailslnk-b-stockno 部分のみです。この操作では、この同じフィールドを使用して、データ ファイルの次のレコードを取得するプログラム アクションにアクセスします。

Next 操作の作成および定義
  1. [ProgramEJB] Java インターフェイスを右クリックし、コンテキスト メニューで [新規作成 > オペレーション] を選択します。
  2. [Operation name] フィールドにNextと入力します。

    [Entry point] リストに表示されるのは book プログラムのみで、すでに選択されています。これは、各サービス インターフェイスで使用できるプログラムは 1 つだけであり、前にこの同じサービス インターフェイスに対して Add 操作を定義したときに book プログラムを指定したからです。

  3. [OK] をクリックします。

    Team Developer Tree View の Java インターフェイスのリストに [Next] 操作が追加されます。

  4. [Next] 操作をクリックして、インターフェイス マッパーの画面を更新します。

    [Next Operation - Interface Fields] ペインは、この操作の新しい定義を入力できるように空白になっています。

  5. Add 操作の手順に従って lnk-function フィールドの COBOL 割り当てを定義し、値を4に設定します。これは、プログラムに次のレコードを取得するように命令する値です。
  6. COBOL エントリ ポイント フィールドの link-file-status から lnk_file_status という名前のインターフェイス フィールドを作成して、方向を [出力] に設定します。

    次のレコードを取得するプログラム アクションは、必要なレコードをデータ ファイルから取得して返します。そのため、このレコードのフィールドを返す出力フィールドのセットを定義する必要があります。

  7. [連絡節] ペインの [lnk-b-details] を [Next Operation - Interface Fields] ペインにドラッグします。

    新しく作成されたインターフェイス フィールドは「lnk_b_details」という名前になります。Add 操作の定義のときと同じようにフィールド名を変更して、このインターフェイスの別の操作で似たようなグループ化に使用された名前と重複しないようにします。

  8. [Next Operation - Interface Fields] で、フィールド名 [lnk_b_details] をダブルクリックします。
  9. 名前をnextop_detailsに変更し、方向を[出力]に変更して、[OK] をクリックします。
  10. [nextop_details] のツリーをすべて展開して、Add 操作のときと同じように、[lnk_b_retail] の型を [BigDecimal] から [int] に変更します。

    このアプリケーションの lnk_b_stockno フィールドは、出力フィールドとしてだけでなく、必要なレコードを識別するキーを入力するためのフィールドとしても使用されます。これに対処するために、このキーを受け入れる入力インターフェイス フィールドを作成します。

  11. [連絡節] ペインで、[lnk_b_details] をすべて展開します。
  12. [連絡節] ペインの [lnk-b-stockno] を [Next Operation - Interface Fields] ペインにドラッグ アンド ドロップします。[Next Operation - Interface Fields] ペインでフィールドを並べ替えて、[lnk-b-stockno] をリストの一番上に移動します。これにより、この新しいインターフェイス フィールドがリストの最初のフィールドになるため、このフィールドの値が最初にプログラムに渡されるようになります。
  13. [ファイル > 保存] をクリックしてサービス インターフェイスを保存します。
完成した Next 操作

Next オペレーション (EJB)

Read 操作

レコードを読み取るプログラム アクションでは、呼び出し元によって、書籍の在庫参照番号、タイトル、または作者が lnk-b-details グループ内の適切なフィールドに与えられます。プログラムにより、索引ファイル内でデータが検索され、lnk-b-details に返されます。そのため、lnk-b-details グループに含まれているフィールドは、入力および出力の両方に使用されます。入力時には、在庫番号、タイトル、または作者が入力されて、lnk-b-details の他のデータ項目は無視されます。出力時、lnk-b-details には、入力された在庫番号、タイトル、または作者を示すレコードが出力されます。

Read 操作の作成および定義
  1. Readという名前の新しい操作を、BOOK エントリ ポイントを使用して作成します。
  2. lnk-function フィールドの COBOL 割り当てを作成し、値を1に設定します。これは、プログラムにレコードを読み取るように命令する値です。
  3. COBOL エントリ ポイント フィールドの lnk-file-status から lnk_file_status という名前のインターフェイス フィールドを作成して、方向を [出力] に設定します。

    レコードを読み取るプログラム機能は、必要なレコードをデータ ファイルから取得して返します。そのため、このレコードのフィールドを返す出力フィールドのセットを定義する必要があります。

  4. [連絡節] ペインの [lnk-b-details] を [Read Operation - Interface Fields] ペインにドラッグします。
  5. lnk_b_details インターフェイス フィールドの名前をreadop_detailsに変更し、方向を [出力] に変更します。
  6. [readop_details]のツリーを展開して、[lnk_b_retail] の型を [BigDecimal] から [int] に変更します。
  7. サービス インターフェイスを保存します。
再利用可能なフィールドの定義
ここで、入力フィールドを定義する必要があります。この操作の中で、インターフェイス マッパーの別の機能を説明します。それは、再利用可能なフィールドです。再利用可能なフィールドは、複数の操作に使用するために COBOL エントリ ポイント フィールドから作成されます。Java の用語では、Sun の Common Client Interface (CCI) で定義される CustomRecord インターフェイスに基づくカスタム レコードに相当します。Java ベースのサービス インターフェイスでは、インターフェイス マッパーにより、再利用可能なフィールドから作成されたインターフェイス フィールドに CCI に基づくカスタム データ型が割り当てられます。ここでは、このサービス インターフェイスで使用するフィールドのみを含む、再利用可能なフィールドのグループを作成します。その他のフィールドは除外します。
  1. [lnk-b-details] を [再利用フィールド] ペインにドラッグします。
  2. [再利用フィールド] ペインの [lnk_b_details] 以下のツリーをすべて展開します。
  3. [lnk_b_text_details] のグループ化を解除し、すべての項目を同じレベルにします。これを行うには、[lnk_b_text_details] の下の各フィールドを右クリックし、それぞれに対して [グループ解除] をクリックします。
  4. [再利用フィールド] ペインで、lnk_b_titlelnk_b_author、および lnk_b_stockno を除き、各基本フィールドを削除します。フィールドを削除するには、フィールドをクリックして Delete キーを押すか、フィールドを右クリックしてコンテキスト メニューで [削除] を選択します。ツリー ビューが縮小された場合は展開して、作成した内容を確認します。

    次のような、再利用可能なフィールドのグループが定義されました。
    EJB に対して作成された再利用マッピング

  5. [再利用フィールド] ペインの [lnk_b_details] を [インターフェイス フィールド] ペインにドラッグします。このときは、readop_details に従属するフィールドの間にドロップしないように注意してください。

    lnk_b_details タイプのインターフェイス フィールドが作成されます。デフォルトでは、名前も lnk_b_details になります。

    注:新しいインターフェイス フィールドが自動的に表示されない場合は、COBOL エクスプローラーで Read 操作のエントリをダブルクリックします。これにより、インターフェイス マッパーのペインが最新の情報に更新されます。
  6. Java では、グループ フィールドの名前がすべての操作の間で一意である必要があるため、lnk_b_details インターフェイス フィールドの名前を readop_input に変更します。
  7. サービス インターフェイスを保存します。
完成した Read 操作

Read オペレーション (EJB)

Delete 操作

レコードを削除するプログラム アクションでは、レコードを読み取るアクションと同様に、在庫番号、タイトル、または作者を入力として受け付けます。lnk-b-details の他のデータ項目は無視されます。この操作では、入力された在庫番号、タイトル、または作者を示すレコードを削除します。

Delete 操作の作成および定義
  1. [Delete]という名前の新しい操作を、BOOK エントリ ポイントを使用して作成します。
    注:インターフェイス マッパーでは、別の操作で作成した再利用可能なフィールドがすべての操作で表示されます。
  2. lnk-function フィールドの COBOL 割り当てを作成し、値を3に設定します。これは、プログラムにレコードを削除するように命令する値です。
  3. COBOL エントリ ポイント フィールドの link-file-status から lnk_file_status という名前のインターフェイス フィールドを作成して、方向を [出力] に設定します。必要な出力フィールドはこれだけです。
  4. [再利用フィールド] ペインの [lnk_b_details] を [インターフェイス フィールド] ペインにドラッグし、新しいインターフェイス フィールドの名前を delete_input に変更します。
  5. サービス インターフェイスを保存して、インターフェイス マッパーを閉じます。
完成した Delete 操作

Delete オペレーション (EJB)