Java IDL 入門:
インタフェース定義の記述


注: すべてのコマンドとトラブルシューティングの指示は、Java 2 Platform, Standard Edition バージョン 1.4 およびそのバージョンの idlj にだけ適用されます。

Java IDL を使用する前に、バージョン 1.4 の J2SE をインストールする必要があります。 J2SE v.1.4 には、idlj コンパイラと同様に、CORBA ベースの分散オブジェクトの開発を可能にするために必要な Application Programming Interface (API) および Object Request Broker (ORB) があります。 idlj コンパイラは、IDL-to-Java 言語マッピングを使って IDL インタフェース定義を対応する Java インタフェース、クラス、メソッドに変換します。次に、これらを使ってクライアントとサーバコードを実装することができます。

ここでは、簡単な IDL インタフェース定義の記述方法と、IDL インタフェースを Java へ翻訳する方法を学びます。 また、idlj コンパイラにより生成される各ファイルの目的も説明します。

ここでは、次の項目について説明します。

  1. Hello.idl の記述
  2. IDL ファイルの理解
  3. Hello.idl の IDL から Java へのマッピング
  4. idlj コンパイラの出力の理解

Hello.idl の記述

Hello.idl ファイルを作成するには、次のようにします。
  1. このアプリケーション用に Hello という名前の新しいディレクトリを作成します。

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

  3. 作成したファイル Hello.idl に、インターフェースの定義のために次のコードを入力します。

    module HelloApp
    {
      interface Hello
      {
        string sayHello();
        oneway void shutdown();
      };
    };
    
  4. ファイルを保存します。

IDL ファイルの理解

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 ステップで完成します。

  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」アプリケーションのインタフェース宣言が完成しました。

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

idlj ツールは OMG IDL ファイルを読み込んで、必要な Java ファイルを作成します。 idlj コンパイラは、デフォルトでクライアント側のバインディングだけを生成します。 クライアント側のバインディングとサーバ側のスケルトンの両方が必要な場合 (「Hello World」プログラムと同様)、idlj コンパイラを実行するときに、-fall オプションを使用する必要があります。 IDL-to-Java コンパイラのオプションの詳細は、リンクを参照してください。

J2SE v1.4 の新機能: -fall または -fserver のどちらかの引数が使用されるときに生成されるデフォルトのサーバ側マッピングは、第 11 章 CORBA 2.3.1 仕様の POA (Portable Object Adapter) (formal/99-10-07) に準拠しています。 POA の詳細については、「Portable Object Adapter」を参照してください。

POA (Portable Object Adaptor) を使用する利点は、次のとおりです。

  1. j2sdk/bin ディレクトリ (または idljjavajavac、および orbd を含んでいるディレクトリ) が実行パスに含まれていることを確認します。

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

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

  4. コンパイラのコマンドを入力します。
    	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-to-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 コンパイラの出力の理解

idlj コンパイラでは多数のファイルが生成されます。 実際に生成されるファイルの数は、IDL ファイルのコンパイル時に選択されたオプションによって異なります。 生成されたファイルには標準の機能があるので、プログラムを配置して実行するまでは無視してもかまいません。 J2SE v.1.4 では、idlj コンパイラが -fall コマンド行オプションを指定したときに生成する Hello.idl ファイルは次のとおりです。

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

トラブルシューティング

詳細情報


次のレッスン: Hello World サーバの開発
前のレッスン: Java IDL 入門
Java IDL トップへ

Copyright © 2001 Sun Microsystems, Inc., 901 San Antonio Rd., Palo Alto, CA. 94303-4900 USA., All rights reserved.