レッスン 1: IDL インタフェースの記述


一時ディレクトリを作成して、作業の段階ごとにチュートリアルファイルを保存しておくと良いでしょう。

注: レッスンの課題を実行するためには、idltojava コンパイラをダウンロードする必要があります。レッスンのコマンドとトラブルシューティングの指示は、このバージョンの idltojava にだけ適用されます。

レッスンの概要

このレッスンでは、Hello World プログラム用の簡単な IDL インタフェースを記述します。IDL インタフェースには、アプリケーションのクライアント部分とサーバ部分の間で、どんなオペレーションと属性を利用できるかを指定する規約を定義します。OMG IDL はプログラミング言語に依存しません。実装コードを記述する前に、OMG IDL を Java にマッピングする必要があります (IDL ファイルに対して idltojava を実行すると、自動的にマッピングされる)。

このレッスンでは次のことを行います。

  1. Hello.idl の記述
  2. Hello.idl の IDL から Java へのマッピング
  3. idltojava コンパイラの出力について

完成した Hello.idl ファイルを見るには、Hello.idl をクリックしてください。

Hello.idl の記述

OMG IDL は、分散型アプリケーションでプログラミング言語に依存しないオペレーションインタフェースを指定するために設計された、純粋な宣言型の言語です。OMG では IDL から別の言語へのマッピングを指定します。これらの言語には C、C++、Smalltalk、COBOL、Ada、Java があります。 OMG IDL の文をマッピングすると、選んだプログラム言語の対応する文に翻訳されます。idltojava ツールを使うと、IDL インタフェースを Java にマッピングしてクライアントクラスを実装できます。次に同じ IDL を C++ にマッピングし、C++ でサーバを実装すると、Java クライアントと C++ サーバは ORB を通じて、同一の言語で記述された場合と同様に相互にやりとりができます。

Hello World の IDL は、1 つのインタフェースにオペレーションが 1 つという、とても簡単なものです。次の 3 ステップで完成します。

  1. モジュールの宣言
  2. インタフェースの宣言
  3. オペレーションの宣言

モジュールの宣言

CORBA モジュールは、関連するインタフェースと宣言のコンテナの役割を果たす名前空間です。このモジュールは、Java パッケージと厳密に対応しています。IDL ファイル内の各モジュール文は、それぞれ 1 つの Java パッケージ文にマッピングされます。

  1. 任意のテキストエディタを起動して、Hello.idl という名前のファイルを作成します。

  2. ファイルに次のモジュール文を入力します。
    module HelloApp
    {
        // Add subsequent lines of code here.
    };
    
  3. ファイルを保存します。

この IDL に対して idltojava を実行すると、 Java のコードでパッケージ文が生成されます。

インタフェースの宣言

Java インタフェースと同様に、CORBA インタフェースは、あるオブジェクトが他のオブジェクトに対して持つ API 規約を宣言します。IDL のインタフェース文はそれぞれ Java インタフェース文にマッピングされます。

作成した Hello.idl ファイルに、次のインタフェース文を追加します。

module HelloApp
{
  interface Hello  // Add
  {                // these
                   // four
  };               // lines.
};

ファイルを保存します。IDL をコンパイルすると、この文からインタフェース文が Java コードで生成されます。クライアントクラスとサーバクラスでは、Hello インタフェースの実装方法が異なります。

オペレーションの宣言

CORBA のオペレーションは、サーバが、そのサーバを呼び出したクライアントに代わって実行する動作のことです。IDL の各オペレーション文から、対応する Java インタフェースのメソッド文が生成されます。

Hello.idl ファイルに、次のオペレーション文を追加します。

module HelloApp
{
  interface Hello
  {
    string sayHello();  // Add this line.
  };
};

ファイルを保存します。Hello World はオペレーションが 1 つしかない小さなアプリケーションなので、Hello.idl はこれで完成です。ここでテキストエディタを終了してもかまいません。

Hello.idl の IDL から Java へのマッピング

idltojava ツールは OMG IDL ファイルを読み込んで、必要な Java ファイルを作成します。デフォルトの設定では、idltojava はクライアントとサーバの両方のファイルが必要な場合、ツールの名前と IDL ファイルの名前だけを入力することになっています。Hello World プログラムもこの設定を使用します。

  1. コマンド行プロンプトが表示されている状態にします。

  2. Hello.idl ファイルのあるディレクトリに移動します。

  3. コンパイラのコマンドを入力します。
       
    	idltojava Hello.idl
    

ディレクトリの内容を一覧表示してみてください。HelloApp という名前のディレクトリが作成され、その中に 5 つのファイルが保存されていることが分かります。テキストエディタで Hello.java を開くと、次の内容になっているはずです。

/* Hello.java as generated by idltojava */

package HelloApp;
public interface Hello
    extends org.omg.CORBA.Object {
    String sayHello();
}

このインタフェースは簡単なので、IDL 文が生成された Java 文にどのようにマッピングされているかがよく分かります。

IDL 文 Java 文
module HelloApp package HelloApp;
interface Hello public interface Hello
string sayHello(); String sayHello();

extends 文に注目してください。必要な CORBA 機能を確実に備えるために、すべての CORBA オブジェクトは org.omg.CORBA.Object から派生しています。必要なコードは idltojava により生成されます。ユーザがマッピングを行う必要はありません。

idltojava コンパイラの出力について

idltojava ではコマンド行で指定するオプションに基づき、複数のファイルが生成されます。これらのファイルには標準の機能がありますが、プログラムを配置して実行するまでは無視してもかまいません。次の 5 つのファイルが生成されます。

_HelloImplBase.java
この抽象クラスはサーバスケルトンで、サーバ用に基本的な CORBA 機能を提供します。このクラスで、Hello.java インタフェースが実装されます。サーバクラス HelloServant により _HelloImplBase が拡張されます。
_HelloStub.java
このクラスはクライアントスタブで、クライアント用に基本的な CORBA 機能を提供します。このクラスで、Hello.java インタフェースが実装されます。
Hello.java
このインタフェースには作成した IDL インタフェースの Java 版が含まれます。sayHello() メソッドが含まれます。Hello.java インタフェースは標準の CORBA オブジェクト機能に加え、org.omg.CORBA.Object の機能を拡張します。
HelloHelper.java
この final クラスは補助的な機能を提供します。特に、オブジェクト参照を適切な型にキャストするための narrow() メソッドは重要な役割を果たします。
HelloHolder.java
この final クラスには、Hello 型のパブリックインスタンスメンバが入ります。ここでは、out および inout 引数に対するオペレーションが規定されます。これらの引数は CORBA には存在しますが、Java のセマンティクスには簡単にマッピングできません。

IDL インタフェースを記述するときは、目的の分散型アプリケーションに必要なすべてのファイルが生成されるようにプログラムを記述します。それ以外に必要な作業は、クライアントおよびサーバクラスの実装だけです。以降のレッスンでは、 HelloClient.javaHelloApplet.java の 2 つのクライアントクラス、および HelloServer.java クラスを作成します。

トラブルシューティング

エラーメッセージ: "idltojava" not found

Hello.idl に対して idltojava を実行しようとしたときに、idltojava が見つかりませんでした。ほとんどの場合、誤ったパスを指定していることが原因なので、idltojava の位置を確認してからやり直してください。

エラーメッセージ: preprocessor failed

idltojava では、デフォルトで C/C++ プリプロセッサが使われます。このデフォルトは、CPPCPPARGS の 2 つの環境変数を設定することにより変更できます。プリプロセッサを使わない場合は、idltojava のコマンド行に -fno-cpp を追加するとプリプロセッサを無効にできます。

詳細情報

IDL と Java のマッピングの概要
IDL の構造を、対応する Java の文にマッピングする上での基本事項
OMG CORBA specification の第 3 章
OMG IDL (Interface Definition Language) の完全な仕様


次のレッスン | チュートリアルのホーム | Hello.idl
ホーム


Copyright © 1996, 1997 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA. 94043-1100 USA., All rights reserved.