第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイルの作成方法 コンパイル方法について説明します IDL ファイルの作成にあたっては INTERSTAGE APWORKS を使用します IDL APWORKS での設定方法 < 補足 > Java COBOL 以外の言語で IDL コンパイルを行う場合は INTERSTAGE で提供される IDL コンパイラを使用してコンパイルを行います 詳細な利用方法については INTERSTAGE Application Server リファレンスマニュアル ( コマンド編 ) をご参照ください 13
第 2 章 インタフェース定義言語 (IDL) 2.1 IDL IDL(Interface Definition Language: インタフェース定義言語 ) は オブジェクトのインタフェースを定義する言語です IDL により サーバアプリケーションが提供するインタフェースを定義することができます インタフェースを定義した IDL ファイルを IDL コンパイラでコンパイルすることにより 指定した言語にマッピングされたクライアントアプリケーション サーバアプリケーション用のソースコードが生成されます このソースコードを それぞれスタブ スケルトンといいます クライアントアプリケーションからは スタブ / スケルトンを通して IDL で定義したサーバアプリケーションを呼び出すことができます IDL インタフェースの概念 14
2.1 IDL 2.1.1 IDL の書式 IDL の構造は以下のようになっています IDL の構造 15
第 2 章 インタフェース定義言語 (IDL) 次に IDL の定義例を示します // モジュール宣言 module sample { // 定数宣言 const string MSG1 = "item1 is zero" ; const string MSG2 = "item2 is zero" ; // 型宣言 // 構造体宣言 struct S1 { long item1; long item2; long result; // 例外宣言 exception CDException{ string CDExceptionMsg; long CDExceptionCode; // ユーザインタフェース宣言 interface calcsv { void addop(inout S1 param1); void subop(inout S1 param1); void mltop(inout S1 param1) raises (CDException); void divop(inout S1 param1) raises (CDException); IDL の定義例 それぞれの詳細については 2.2.1 IDL 宣言 で説明します 16
2.1 IDL 2.1.2 サポートしているデータ型 IDL でサポートしているデータ型は次のとおりです IDL でサポートしているデータ型 これらのデータ型には固定長と可変長があります 文字列型 シーケンス型 固定小数点型 文字列型 シーケンス型 固定小数点型を含む構造体および共用体 オブジェクトリファレンスは可変長です それ以外のデータ型は固定長です 17
第 2 章 インタフェース定義言語 (IDL) 2.2 IDL 構文 IDL は 7 つの宣言で構成されています 各宣言で使用する名前 ( 識別子 ) は 先頭が英文字で 英文字 数字 およびアンダースコア ("_") で指定します 英大文字と英小文字は同じものとして扱われます また すべての IDL ファイル内に設定した識別子は一意でなければなりません 例えば 異なる IDL ファイルでも定数とインタフェースに同じ識別名を使用すると コンパイルエラーとなります 2.2.1 モジュール宣言 モジュールは IDL のメソッド名や型名などが他の IDL と重複しないように オブジェクトのグループ化宣言を行うものです モジュール宣言では モジュールとモジュールを束ねて さらに大きなモジュールを宣言することができます 次に モジュール宣言の書式を示します module モジュール名 { IDL の繰り返し ここで指定したモジュール名は IDL をコンパイルしたときに生成される Java コード内に保持されます モジュール名を変更する場合は IDL の再コンパイルが必要です 静的インタフェースの場合 再コンパイルによって生成されたスタブ スケルトンを使用するか 再コンパイル時にインタフェース情報のインタフェースリポジトリへの登録のみを行い 既存のスタブ スケルトンを修正する必要があります 次に モジュール宣言の定義例を示します module sample { IDL の繰り返し 18
2.2 IDL 構文 2.2.2 インタフェース宣言 インタフェース宣言では インタフェースの実体を定義します インタフェース宣言は C++ 言語のクラス宣言と同様に他のインタフェース宣言を継承して 新しいインタフェース宣言を行うことができます 他のインタフェース宣言を継承すると その継承したインタフェース宣言のオペレーション宣言や型宣言などを あたかも自分で宣言したと同じに扱えるようになります インタフェースの継承では 新しいインタフェースを宣言する際に 他のインタフェース宣言を使用して 差分だけを定義することができます また 複数のインタフェースを継承することができます これを多重継承と呼びます すべてのインタフェース定義は 明示的に記述しなくても Object インタフェースを継承します そのため オブジェクト自身にインタフェース情報を問い合わせるメソッド get_interfacedef などの Object インタフェースを使用できます 次に インタフェース宣言の書式を示します interface インタフェース名 ; // フォワード宣言 interface インタフェース名 [: 継承するインタフェース ] { // ヘッダオペレーション宣言 ; // 本体属性宣言 ; 定数宣言 ; 型宣言 ; 例外宣言 ; ここで指定したインタフェース名は IDL をコンパイルしたときに生成される Java コード内に保持されます インタフェース名を変更する場合は IDL の再コンパイルが必要です 静的インタフェースの場合 再コンパイルによって生成されたスタブ スケルトンを使用するか 再コンパイル時にインタフェース情報のインタフェースリポジトリへの登録のみを行い 既存のスタブ スケルトンを修正する必要があります 次に インタフェース宣言の定義例を示します interface calcsv { // ヘッダオペレーション宣言 ; // 本体属性宣言 ; 定数宣言 ; 型宣言 ; 例外宣言 ; 19
第 2 章 インタフェース定義言語 (IDL) 2.2.3 オペレーション宣言 オペレーション宣言は メソッド名 復帰値の型 パラメタのデータ型 メッセージ呼び出し時に返される例外 コンテキスト情報 ( サーバアプリケーションとクライアントアプリケーションの間で共通に持つ環境変数に相当 ) を含みます 次に オペレーション宣言の書式を示します ([ ] 内は省略可能 ) [ oneway ] 復帰値のデータ型メソッド名 ( // メソッド名定義 [ パラメタタイプデータ型パラメタ名 [,..] ] // パラメタ ) [ raises ( 例外構造体名 [,..] ) ] [ context ( コンテキスト名 [,..] ) ]; ここで指定したメソッド名は クライアントアプリケーションから呼び出すことができます サーバアプリケーションではメソッドごとにクライアントアプリケーションから呼び出されたときの処理を記述します 次に オペレーション宣言の定義例を示します interface calcsv { void addop(inout S1 param1); void subop(inout S1 param1); void mltop(inout S1 param1) raises (CDException); void divop(inout S1 param1) raises (CDException); 2.2.4 属性宣言 インタフェースが持つデータを宣言します 次に 属性宣言の形式を示します ([ ] 内は省略可能 ) [readonly] attribute データ型変数名 ; Java 言語では IDL で定義された変数名と同じ名前のメンバ変数 およびその変数に対するデータ設定 / 取得用のメソッド ( 変数名と同じ名前 ) にマッピングされます 次に 属性宣言の定義例を示します attribute string Name; readonly attribute long Id; 20
2.2 IDL 構文 2.2.5 定数宣言 次に 定数宣言の書式を示します const データ型定数名 = 定数式 ; IDL 言語で定数 (const) を interface 宣言の中で指定した場合 Java 言語ではインタフェース名と同じ名前の public interface 内で 定数名と同じ名前の public static final メンバ ( 定数メンバ ) としてマッピングされます また interface 宣言の外で指定した場合 定数名と同じ名前の public interface とその内部に value という名前で public static final メンバが定義されます 次に 定数宣言の定義例を示します // 定数宣言 const string MSG1 = "item1 is zero" ; const string MSG2 = "item2 is zero" ; 2.2.6 型宣言 型宣言は 型によって指定方法が異なります 次に それぞれの型宣言の書式を示します 基本データ型 ( 文字列型 列挙型以外 ) の場合 typedef long データ型名 ; typedef short データ型名 ; typedef unsigned long データ型名 ; typedef unsigned short データ型名 ; typedef long long データ型名 ; typedef float データ型名 ; typedef double データ型名 ; typedef long double データ型名 ; typedef char データ型名 ; typedef wchar データ型名 ; typedef octet データ型名 ; typedef boolean データ型名 ; typedef any データ型名 ; 基本データ型 ( 文字列型 ) の場合 typedef string< サイズ > データ型名 ; typedef string データ型名 ; typedef wstring< サイズ > データ型名 ; typedef wstring データ型名 ; 基本データ型 ( 列挙型 ) の場合 enum データ型名 { 要素,.. 21
第 2 章 インタフェース定義言語 (IDL) シーケンス型の場合 typedef sequence< データ型, サイズ > データ型名 ; typedef sequence< データ型 > データ型名 ; 構造体の場合 struct データ型名 { 構造体メンバの宣言 基本データ型 メンバ名 ; シーケンス型 メンバ名 ; 構造体 メンバ名 ; 共用体 メンバ名 ; 固定小数点型 メンバ名 ; 共用体の場合 union データ型名 switch ( データ型 ) { case 定数式 ; 要素 [,..] : default; 要素 [,..] : 基本データ型 メンバ名 ; シーケンス型 メンバ名 ; 構造体 メンバ名 ; 共用体 メンバ名 ; スコープ名 メンバ名 ; オブジェクトリファレンス typedef Object データ型名 ; タイプコード typedef TypeCode データ型名 ; 配列 typedef データ型識別子 [ 配列サイズ ],..; 22
2.2 IDL 構文 IDL で定義されている基本データ型を Java プログラムで使用する場合 対応するデータ型は次のように定義されます CORBA データ型 Java long int unsigned long int 整数型 short short unsigned short short 浮動小数点型 long long float double long float double 文字型 char wchar char オクテッド型 octet byte ブーリアン型 boolean boolean 文字列型 string wstring java.lang.string 列挙型 enum <enum 名 > クラス any 型 any org.omg.corba.any オブジェクトリファレンス Object org.omg.corba.object タイプコード TypeCode org.omg.corba.typecode 23
第 2 章 インタフェース定義言語 (IDL) 2.2.7 例外宣言 例外宣言では オペレーション実行中に例外が発生したときに例外情報を受け渡すための識別子 ( または例外構造体名 ) を定義します オペレーション宣言の raises 式を定義する場合は この構造体名を指定します 次に 例外宣言の書式を示します exception 例外識別子 ( 例外構造体名 ) { データ型メンバ名 ; // 構造体メンバを宣言 : ここで指定した例外宣言は アプリケーションではユーザ例外として使用します 次に 例外宣言の定義例を示します // 例外宣言 exception CDException{ string CDExceptionMsg; long CDExceptionCode; 24
2.3 コンパイル 2.3 コンパイル IDL の翻訳方法には 以下の 2 種類があります IDLc コマンドで翻訳する APWORKS 上で翻訳する APWORKS 上で翻訳する方法については 第 4 章 Java プログラミング ( サーバ ) および第 5 章 Java プログラミング ( クライアント ) で説明します 以下に IDLc コマンドのリファレンス (Java 関連のみ ) を示します IDLc java [-a [-create -update -delete] -R [-create -update -delete]] [-Tdir] [-f] [-nolog] [IDLfile] - Java:Java 言語にマッピングされたスタブ スケルトンを生成します Java 言語では必須です -a: スタブ スケルトンを生成し インタフェース情報をインタフェースリポジトリに登録します -create,-update,-delete のいずれかと組み合わせて指定します -R: インタフェース情報のインタフェースリポジトリへの登録だけを行い スタブ スケルトンの生成は行いません -create,-update,-delete のいずれかと組み合わせて指定します -create: インタフェース情報をインタフェースリポジトリに登録します すでに同じ識別子が登録されているとエラーとなり 現在の作業を無効にします -update: インタフェース情報をインタフェースリポジトリに登録します すでに同じ識別子が登録されていると インタフェース情報を更新します IDL ファイルを変更した場合には このオプションを指定する必要があります -delete: インタフェース情報をインタフェースリポジトリから削除します 登録されていない識別子があるとエラーとなります -Tdir: コンパイラの作業用ファイルの作成位置を指定します ( 省略時 : 環境変数 TEMP または TMP の設定値 ) -f: インタフェース情報とスタブの不一致検出機能を有効とします -nolog:corba サービスのトレース採取機能を無効とします IDLfile:IDL ファイルを記述したファイル名を指定します 25
第 2 章 インタフェース定義言語 (IDL) 次のような IDL 定義を作成し IDLc コマンドを実行します IDL ファイルのファイル名や 格納ディレクトリについては 講師の指示にしたがってください // モジュール宣言 module modcalcratesv { // 定数宣言 const string MSG1 = "balance is zero" ; const string MSG2 = "rate is zero" ; const string MSG3 = "span is zero" ; const string MSG4 = "You can not payout" ; // 型宣言 // 構造体宣言 struct Structure1 { long pay; long balance; double rate; long span; long expectation; // 例外宣言 exception CDException{ string CDExceptionMsg; long CDExceptionCode; // ユーザインタフェース宣言 interface CalcRateSv { void initbal(inout Structure1 param1); void addbal(inout Structure1 param1); void subbal(inout Structure1 param1) raises (CDException); void calcbal(inout Structure1 param1) raises (CDException); IDLc コマンドの実行例を以下に示します IDLc コマンドは [ スタート ]-[ プログラム ]-[ アクセサリ ]-[ コマンドプロンプト ] より行います IDLc -java -a -update IDLfile.idl 26