インタフェースリポジトリには、ドメイン全体のサーバアプリケーションの情報が格納されています。また、IDLで定義されたモジュール名、インタフェース名、メソッド名、およびパラメタが階層構造で格納されます。
サーバアプリケーションの情報を獲得するために、以下のような(1)から(3)の手順で検索します。
(1)InterfaceDefオブジェクトリファレンスの獲得
インタフェースリポジトリからサーバアプリケーションの情報を獲得するためには、INTERFACEDEFオブジェクトのオブジェクトリファレンスが必要となります。このため、サーバアプリケーションのオブジェクト名をパラメタとして、ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを求め、その後、CORBA-OBJECT-GET-INTERFACEメソッドによりInterfaceDefオブジェクトリファレンスを獲得します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 STR-BUF PIC X(30). 01 COPY COSNAMING-NAMECOMPONENT IN CORBA REPLACING COSNAMING-NAMECOMPONENT BY NAME-COMPONENT. 01 NAME-COMPONENT-A USAGE POINTER. 01 COPY COSNAMING-NAME IN CORBA REPLACING COSNAMING-NAME BY NAME. 01 NAME-A USAGE POINTER. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY INTF-INTF. PROCEDURE DIVISION. * オブジェクト名 MOVE FUNCTION LENG (STR-BUF) TO STRING-LENGTH. MOVE "ODdemo::calculator" TO STR-BUF. CALL "CORBA-STRING-SET" USING IDL-ID OF NAME-COMPONENT STRING-LENGTH STR-BUF. * オブジェクトのタイプ MOVE " " TO STR-BUF. CALL "CORBA-STRING-SET" USING KIND OF NAME-COMPONENT STRING-LENGTH STR-BUF. * オブジェクト名の数 MOVE 1 TO SEQ-LENGTH OF NAME. MOVE 1 TO SEQ-MAXIMUM OF NAME. * Sequenceの要素数 MOVE 1 TO NUM. * CosNamingのアクセス情報格納用のSequence領域獲得 CALL "CORBA-SEQUENCE-COSNAMING-NAMECOMPONENT-ALLOCBUF" USING SEQ-MAXIMUM OF NAME SEQ-BUFFER OF NAME. MOVE FUNCTION ADDR ( NAME ) TO NAME-A. MOVE FUNCTION ADDR ( NAME-COMPONENT ) TO NAME-COMPONENT-A. * CosNamingの要素設定 CALL "CORBA-SEQUENCE-ELEMENT-SET" USING NAME-A NUM NAME-COMPONENT-A. * サーバアプリケーションのオブジェクトリファレンスを獲得 CALL "COSNAMING-NAMINGCONTEXT-RESOLVE" USING COS-NAMING NAME ENV OBJ. MOVE "COSNAMING-NAMINGCONTEXT-RESOLVE" TO MESS. PERFORM ENV-CHECK. * サーバアプリケーションのInterfaceDefを獲得 * CALL "CORBA-OBJECT-GET-INTERFACE" USING OBJ ENV INTF-INTF.
(2)OperationDef オブジェクトリファレンスの獲得
CORBA-INTERFACEDEF-LOOKUP-NAMEメソッドにより、サーバアプリケーションが複数もっているメソッドから指定されたメソッドをインタフェースリポジトリから検索します。パラメタとしてサーバアプリケーションのメソッド名を指定します。結果として、指定したメソッド情報が格納されているOPERATIONDEFオブジェクトのオブジェクトリファレンスが返されます。
DATA DIVISION. WORKING-STORAGE SECTION. 01 BUF USAGE POINTER. 01 COPY DEFINITIONKIND IN CORBA REPLACING CORBA-DEFINITIONKIND BY DK-FLAG. 01 COPY BOOLEAN IN CORBA REPLACING CORBA-BOOLEAN BY BL. 01 INTF-OPR USAGE POINTER. PROCEDURE DIVISION. * メソッド名の入力 DISPLAY " Please input method name==>". ACCEPT BUF. * オブジェクトリファレンスの取得 : Operation情報の取得 SET CORBA-DK-OPERATION OF DK-FLAG TO TRUE. MOVE -1 TO NUM. MOVE CORBA-FALSE TO BL. CALL "CORBA-INTERFACEDEF-LOOKUP-NAME" USING INTF-INTF BUF NUM DK-FLAG BL ENV INTF-OPR.
(3)パラメタ情報の獲得
CORBA-OPERATIONDEF-DESCRIBEメソッドにより、サーバアプリケーションがもっているメソッドのパラメタの情報(パラメタの名前、個数、パラメタの型など)をインタフェースリポジトリから検索します。パラメタとして、OPERATIONDEFオブジェクトリファレンスを指定します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 WORK-POINTER USAGE POINTER. 01 DESCRIPTION USAGE POINTER. LINKAGE SECTION. 01 COPY CONTAINED IN CORBA REPLACING CORBA-CONTAINED BY TMP-CONT. PROCEDURE DIVISION. * パラメタ情報の構造体の取得 MOVE 1 TO NUM. CALL "CORBA-SEQUENCE-ELEMENT-GET" USING INTF-OPR NUM WORK-POINTER. SET ADDRESS OF TMP-CONT TO WORK-POINTER. CALL "CORBA-OPERATIONDEF-DESCRIBE" USING TMP-CONT ENV DESCRIPTION.