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

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コンパイラにより生成される各ファイルの目的も説明します。

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

  1. Hello.idlの記述
  2. IDLファイルの理解
  3. Hello.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オプションを使用する必要があります。コンパイラ・オプションの詳細は、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)を使用する利点は、次のとおりです。

  1. jdk/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と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 v1.4では、Hello.idlidljコンパイラで、-fallコマンド行オプションを使って生成されるファイルは次のとおりです。

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

トラブルシューティング

詳細情報


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.