Java IDLを使用する前に、Javaプラットフォームのバージョン1.4以降をインストールする必要があります。バージョン1.4以降には、idljコンパイラと同様に、CORBAベースの分散オブジェクトの対話を可能にするために必要なApplication Programming Interface (API)およびObject Request Broker (ORB)があります。idljコンパイラは、IDLからJava言語へのマッピングを使用してIDLインタフェース定義を対応するJavaインタフェース、クラスおよびメソッドに変換します。次に、それを使用してクライアントとサーバー・コードを実装できます。
ここでは、簡単なIDLインタフェース定義の記述方法と、IDLインタフェースをJavaへ翻訳する方法を学びます。また、idljコンパイラにより生成される各ファイルの目的も説明します。
ここでは、次の項目について説明します。
module HelloApp { interface Hello { string sayHello(); oneway void shutdown(); }; };
OMG IDLは、クライアント・オブジェクトによって呼び出されオブジェクト実装によって提供される、インタフェースの記述に使用される言語です。インタフェース定義をOMG IDLで記述すると、インタフェースを完全に定義し、各オペレーションのパラメータを完全に指定することができます。OMG IDLインタフェースには、そのインタフェースのオペレーションを使用するクライアントを開発するために必要な情報がすべて用意されています。
クライアントは、OMG IDLからのマッピングが定義されている言語で記述されます。OMG IDLからクライアントの言語構造へのマッピングは、クライアントの言語に用意されている機能によって異なります。OMGではIDLから別のプログラミング言語へのマッピングを指定しています。これらの言語にはC、C++、Smalltalk、COBOL、Ada、Lisp、PythonおよびJavaがあります。OMG IDLの構文をマッピングすると、選んだプログラミング言語の対応する構文に翻訳されます。
たとえば、idljツールを使うと、IDLインタフェースをJavaにマッピングしてクライアント・クラスを実装できます。次に同じIDLをC++にマッピングし、C++でサーバーを実装すると、Javaクライアント(Java ORBを介して)とC++サーバー(C++ORBを介して)は、同一の言語で記述された場合と同様に相互にやり取りができます。
「Hello World」のIDLは、1つのインタフェースにオペレーションが2つだけという、とても簡単なものです。次の3ステップで完成します。
CORBAモジュールは、関連するインタフェースと宣言のコンテナの役割を果たす名前空間です。このモジュールは、Javaパッケージと厳密に対応しています。IDLファイル内の各モジュール文は、それぞれ1つのJavaパッケージ文にマッピングされます。
モジュール文の例を示します。
module HelloApp { // Subsequent lines of code here. };
IDLをコンパイルすると、このモジュール文からpackage文がJavaコードで生成されます。
Javaインタフェースと同様に、CORBAインタフェースは、あるオブジェクトがほかのオブジェクトに対して持つAPI規約を宣言します。IDLのインタフェース文はそれぞれJavaインタフェース文にマッピングされます。
Hello.idlファイルでは、インタフェース文は次のようになります。
module HelloApp { interface Hello // These lines { // declare the // interface }; // statement. };
IDLをコンパイルすると、この文からインタフェース文がJavaコードで生成されます。
CORBAのオペレーションは、サーバーが、そのサーバーを呼び出したクライアントに代わって実行する動作のことです。IDLの各オペレーション文から、対応するJavaインタフェースのメソッド文が生成されます。
Hello.idlファイルでは、オペレーション文は次のようになります。
module HelloApp { interface Hello { string sayHello(); // This line is an operation statement. oneway void shutdown(); // This line is another }; };これで、小さな「Hello World」アプリケーションのインタフェース宣言が完成しました。
idlj
ツールはOMG IDLファイルを読み込んで、必要なJavaファイルを作成します。idljコンパイラは、デフォルトでクライアント側のバインディングだけを生成します。クライアント側のバインディングとサーバー側のスケルトンの両方が必要な場合(「Hello World」プログラムと同様)、idljコンパイラを実行するときに、-fallオプションを使用する必要があります。コンパイラ・オプションの詳細は、idljのマニュアル・ページ(Solaris、Linux、Mac OS XまたはWindows)を参照してください。
-fallまたは-fserverのどちらかの引数が使用されるときに生成されるデフォルトのサーバー側マッピングは、CORBA 2.3.1仕様の第11章「POA (Portable Object Adapter)」(formal/99-10-07)に準拠しています。POAの詳細については、ポータブル・オブジェクト・アダプタを参照してください。
POA (Portable Object Adaptor)を使用する利点は、次のとおりです。
idlj -fall Hello.idl
ディレクトリの内容を一覧表示してみてください。HelloAppという名前のディレクトリが作成され、その中に6つのファイルが保存されていることがわかります。テキスト・エディタでHello.javaを開きます。Hello.javaはシグネチャ・インタフェースで、指定された型のインタフェースが他のインタフェースで使用される場合に、メソッド宣言でシグネチャ型として使用されます。次のようになります。
//Hello.java package HelloApp; /** * HelloApp/Hello.java * Generated by the IDL-to-Java compiler (portable), version "3.0" * from Hello.idl */ public interface Hello extends HelloOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity { } // interface Hello
このインタフェースは簡単なので、IDL文が生成されたJava文にどのようにマッピングされているかがよくわかります。
IDL文 | Java文 | |
---|---|---|
module HelloApp | package HelloApp; | |
interface Hello | public interface Hello |
extends文に注目してください。必要なCORBA機能を確実に備えるために、すべてのCORBAオブジェクトはorg.omg.CORBA.Objectから派生しています。必要なコードはidljにより生成されます。ユーザーがマッピングを行う必要はありません。
以前のバージョンのidljコンパイラ(idltojavaとも呼ばれる)では、IDLインタフェースで定義されるオペレーションもこのファイルにあります。J2SDK v1.3.0から、IDLとJavaのマッピングは、CORBA 2.3.1仕様(formal/99-10-07)に従って、IDLインタフェースで定義されるすべてのオペレーションをオペレーション・インタフェースのHelloOperations.javaに記述しています。オペレーション・インタフェースは、サーバー側マッピングで使用され、同じ場所にあるクライアントとサーバーに最適化された呼出しを提供するメカニズムとして使用されます。Hello.idlでは、このファイルは次のようになります。
//HelloOperations.java package HelloApp; /** * HelloApp/HelloOperations.java * Generated by the IDL-to-Java compiler (portable), version "3.0" * from Hello.idl */ public interface HelloOperations { String sayHello (); void Shutdown (); } // interface HelloOperations
このインタフェースに定義されているオペレーションは2つだけなので、生成されたJava文にどのようにIDL文がマッピングされているのかが簡単にわかります。
IDL文 | Java文 | |
---|---|---|
string sayHello(); | String sayHello(); | |
oneway void shutdown(); | void Shutdown (); |
idljコンパイラではいくつかのファイルが生成されます。実際に生成されるファイルの数は、IDLファイルのコンパイル時に選択されたオプションによって異なります。生成されたファイルには標準の機能があるので、プログラムを配置して実行するまでは無視してもかまいません。J2SE v1.4では、Hello.idlのidljコンパイラで、-fallコマンド行オプションを使って生成されるファイルは次のとおりです。
このabstractクラスは、ストリーム・ベースのサーバー・スケルトンで、サーバー用に基本的なCORBA機能を提供します。これはorg.omg.PortableServer.Servantを拡張し、InvokeHandlerインタフェースとHelloOperationsインタフェースを実装します。サーバー・クラスHelloServantはHelloPOAを拡張します。
このクラスはクライアント・スタブで、クライアント用にCORBA機能を提供します。これはorg.omg.CORBA.portable.ObjectImplを拡張し、Hello.javaインタフェースを実装します。
このインタフェースには作成したIDLインタフェースのJava版が含まれます。Hello.javaインタフェースは、標準的なCORBAオブジェクト機能を提供するorg.omg.CORBA.Objectを拡張します。またHelloOperationsインタフェースおよびorg.omg.CORBA.portable.IDLEntityも拡張します。
このクラスは補助的な機能を提供します。特に、CORBAオブジェクト参照を適切な型にキャストするためのnarrow()メソッドは重要な役割を果たします。Helperクラスは、CORBAストリームへのデータ型の読取りと書込み、およびAnyからのデータ型の挿入および抽出を扱います。HolderクラスはHelperクラスのメソッドに入出力を委譲します。
このfinalクラスは、Hello型のpublicインスタンス・メンバーを保持します。IDL型のパラメータがoutまたはinoutであればHolderクラスが使用されます。これは、org.omg.CORBA.portable.OutputStreamおよびorg.omg.CORBA.portable.InputStream引数(CORBAは許可しますが、Javaのセマンティックスには簡単にマッピングできません)に対するオペレーションを提供します。HolderクラスはHelperクラスのメソッドに入出力を委譲します。これはorg.omg.CORBA.portable.Streamableを実装します。
このインタフェースにはsayHello()メソッドおよびshutdown()メソッドが含まれます。IDL-to-Javaマッピングは、IDLインタフェースで定義されたオペレーションをすべてこのファイルに組込み、スタブとスケルトンで共有します。
IDLインタフェースを記述するときは、目的の分散型アプリケーションに必要なすべてのファイルが生成されるようにプログラムを記述します。次のステップでは、クライアント・クラスおよびサーバー・クラスを実装します。その後のステップでは、HelloClient.javaクライアント・クラスおよびHelloServer.javaサーバー・クラスを作成します。
Hello.idlファイルに対してidljを実行しようとしたときに、idljが見つかりませんでした。ほとんどの場合、実行パスに存在しないことが原因です。idlj (JDK binディレクトリ)が実行パスに含まれていることを確認してからやり直してください。
IDLの構造を対応するJava文にマッピングする処理の基本情報について説明しています。
OMGインタフェース定義言語の完全な仕様を規定しています。仕様はformal/99-10-07からダウンロードできます。