tnameserv(1)

名前
tnameserv - Java IDL ネームサーバの起動スクリプト

形式
tnameserv -ORBInitialPort port_number

機能説明
CORBA の COS (Common Object Services) ネームサービス は、ファイルシステムがファイルに対してディレクトリ 構造を提供しているのと同じように、オブジェクト参照に対してツリー構造のディレクトリを提供し ます。Java IDL のネームサービスは、 COS ネームサービスの仕様を単純な形で実装したものです。

オブジェクト参照は名前空間に名前で格納され、オブジェクト参照と名前の組は、 それぞれ「ネームバインディング」と呼ばれます。ネームバインディングは「ネーミ ングコンテキスト」に組み込むことができます。ネーミングコンテキストはそれ自体 がネームバインディングであり、ファイルシステムのサブディレクトリと同じ編成機 能を持ちます。すべてのバインディングは「初期ネーミングコンテキスト」に格納さ れます。名前空間において、初期ネーミングコンテキストは唯一の持続的バイン ディングです。それ以外のネーミングコンテキストは、Java IDL のネームサーバプロセスが停止し、再起動されると失われます。

アプレットまたはアプリケーションから COS ネームサービスを使用するためには、その ORB はネームサービスが動作しているホストの名前とポートを知っているか、そのネームサーバの 文字列化された初期ネーミングコンテキストにアクセスできなければなりません。ネームサービスは、Java IDL のネームサーバでもその他の COS 準拠のネームサービスでもかまいません。

使用方法

  Java IDL ネームサーバの起動
Java IDL ネームサーバは、ネームサービスを使用するアプリケーションまたはアプレットより前に 起動しておかなければなりません。Java IDL 製品をインストールすると、Java IDL ネームサーバを起動するスクリプト (tnameserv) が作成されます。バックグラウンドで 動作するように、ネームサーバを起動してください。

特に指定しない場合、Java IDL ネームサーバは、 ORB の resolve_initial_references() メソッドと list_initial_references() メソッドの実装に使用するブートストラッププロトコルに対してポート 900 で待機します。 ほかのポート ( 1050 など) を指定するには、次のようにします。

    example% tnameserv -ORBInitialPort 1050

ネームサーバのクライアントには、新しいポート番号を知らせる必要があります。このため、 ORB オブジェクトの作成時に org.omg.CORBA.ORBInitialPort プロパティに新しいポート番号を設定します。

  Java IDL ネームサーバの停止
Java IDL ネームサーバを停止するには、 kill(1) などのオペレーティングシステムのコマンドを使います。なお、ネームサーバを終了させると、 Java IDL ネームサービスに登録されている名前は失われます。

  サンプルクライアント: オブジェクトの追加
以下に示すサンプルプログラムは、名前を名前空間に追加する方法を示すものです。 このサンプルプログラムは、このままの状態で完全に動作するネームサーバクライアントで、 次のような単純なツリーを作成するものです。

       初期
     ネーミングコンテキスト
            \
             \
   plans      Personal
               \
                \
        calendar   schedule

この例で、 plans はオブジェクト参照、 Personal は calendar と schedule の 2 つ のオブジェクト参照が含まれるネーミングコンテキストです。

import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;

public class NameClient
{
   public static void main(String args[])
   {
      try {

前述の「 JavaIDLネームサーバの起動 」では、ネームサーバはポート 1050 を使用して起動しました。次のコードで、このポート 番号をクライアントプログラムに知らせます。

        Properties props = new Properties();
        props.put("org.omg.CORBA.ORBInitialPort", "1050");
        ORB orb = ORB.init(args, props);

次のコードでは、初期ネーミングコンテキストを取得し、それを ctx に代入します。2 行目では、 ctx をダミーのオブジェクト参照 objref にコピーします。この objref には、あとでさまざまな名前を割り当てて名前空間に追加します。

        NamingContext ctx = NamingContextHelper.narrow
            (orb.resolve_initial_references("NameService"));
        NamingContext objref = ctx;

次のコードでは、text 型の名前「plans」を作成し、それをダミーのオブジェクト参照にバインドします。 その後、 rebind を使用して初期ネーミングコンテキストの下に「plans」を追加しています。 rebind メソッドを使用すれば、 bind を使用した場合に発生する例外を発生させずに、このプログラムを何度も繰り返し実行できます。

        NameComponent nc1 = new NameComponent("plans", "text");
        NameComponent[] name1 = {nc1};
        ctx.rebind(name1, objref);
        System.out.println("plans rebind sucessful!");

次のコードでは、directory 型の「Personal」というネーミングコンテキストを作成します。 その結果得られるオブジェクト参照 ctx2 をこの名前にバインドし、初期ネーミングコンテキストに追加します。

        NameComponent nc2 = new NameComponent("Personal", "directory");
        NameComponent[] name2 = {nc2};
        NamingContext ctx2 = ctx.bind_new_context(name2);
        System.out.println("new naming context added..");

残りのコードでは、ダミーのオブジェクト参照を「schedule」と「calendar」という名前でネーミ ングコンテキスト「Personal」 (ctx2) にバインドします。

        NameComponent nc3 = new NameComponent("schedule", "text");
        NameComponent[] name3 = {nc3};
        ctx2.rebind(name3, objref);
        System.out.println("schedule rebind sucessful!");

        NameComponent nc4 = new NameComponent("calender", "text");
        NameComponent[] name4 = {nc4};
        ctx2.rebind(name4, objref);
        System.out.println("calender rebind sucessful!");

    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
  }
}

  サンプルクライアント: 名前空間のブラウズ
次のサンプルプログラムでは、名前空間をブラウズする方法を示します。

import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;

public class NameClientList
{
   public static void main(String args[])
   {
      try {

前述の「 JavaIDLネームサーバの起動 」で、ネームサーバはポート 1050 を使用して起動しました。次のコードで、このポート番号をクライアントプログラムに知らせます。

        Properties props = new Properties();
        props.put("org.omg.CORBA.ORBInitialPort", "1050");
        ORB orb = ORB.init(args, props);

次のコードでは、初期ネーミングコンテキストを取得しています。

        NamingContext nc = NamingContextHelper.narrow
           (orb.resolve_initial_references("NameService"));

list メソッドは、ネーミングコンテキストに追加されているバインディングをリストします。 この場合、最大 1000 個までのバインディングが初期ネーミングコンテキストから BindingListHolder に返されます。残りのバインディングは、 BindingIteratorHolder に返されます。

        BindingListHolder bl = new BindingListHolder();
        BindingIteratorHolder blIt= new BindingIteratorHolder();
        nc.list(1000, bl, blIt);

次のコードでは、返された BindingListHolder からバインディングの配列を取得します。バインディングがない場合は、プログラムは終了します。

        Binding bindings[] = bl.value;
        if (bindings.length == 0) return;

残りのコードでは、バインディングに対してループ処理を行い、名前を出力します。

        for (int i=0; i < bindings.length; i++) {

            // get the object reference for each binding
            org.omg.CORBA.Object obj = nc.resolve
				 (bindings[i].binding_name);
            String objStr = orb.object_to_string(obj);
            int lastIx = bindings[i].binding_name.length-1;

            // check to see if this is a naming context
            if (bindings[i].binding_type == BindingType.ncontext) {
              System.out.println
				 ("Context: " + bindings[i].binding_name[lastIx].id);
            } else {
                System.out.println
				   ("Object: " + bindings[i].binding_name[lastIx].id);
            }
        }

       } catch (Exception e) {
        e.printStackTrace(System.err);
       }
   }
}

関連項目
kill(1)