COS ネームサービスプロバイダ
Java Naming and Directory InterfaceTM (JNDI)


コメントの送付先: jndi@java.sun.com

目次


はじめに

Common Object Services (COS) ネームサーバは、Common Object Request Broker Architecture (CORBA) オブジェクト参照を格納するためのネームサーバです。COS ネームサーバには、COS ネーミングパッケージ (org.omg.CORBA.CosNaming) を使用して CORBA アプリケーションからアクセスできます。

JNDI/COS ネームサービスプロバイダによって、COS ネーミングパッケージの最上位に javax.naming.Context インタフェースが実装されます。この結果、アプリケーションから JNDI を使用して COS ネームサーバにアクセスできます。この結果、CORBA アプリケーションに、ほかのネームおよびディレクトリサービスにアクセスするためのインタフェースが提供されます。

このドキュメントでは、COS ネームサービスプロバイダの機能、および JNDI と COS ネーミングパッケージのマッピングの詳細について説明します。


適合性

JNDI の COS ネームサービスプロバイダでは、JavaTM IDL が使用されます。Java プログラミング言語は業界標準の Object Management Group Interface Definition Language (OMG IDL) にマッピングされます。ネームサービスには、COS ネームサービスが使用されます。

COS ネームサービスの仕様は、すべて OMG から取得できます。

名前の構文は、Interoperable Naming Server (INS) の仕様 (99-12-03) に準拠しており、INS の以前のバージョン (OMG TC ドキュメント orbos/98-10-11) に対する下位互換性をサポートしています。「名前と URL」を参照してください。


環境プロパティ

COS ネームサービスプロバイダでは、次の JNDI 環境プロパティを使用します。環境プロパティ、システムプロパティ、アプレットパラメータ、およびリソースファイルを使用する際のプロパティの初期化の方法については、JNDI のドキュメントを参照してください。

java.naming.factory.initial
COS ネームサービスプロバイダを選択するときに使用します。 プロバイダ自体では使用されません。プロバイダの初期コンテキストファクトリのクラス名を指定します。

次に例を示します。

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory");

COS ネームサービスを初期コンテキストとして使用している場合は、このプロパティを設定する必要があります。ただし、初期コンテキストに URL だけを渡した場合は、このプロパティを指定する必要はありません。詳細は、「名前と URL」を参照してください。

java.naming.provider.url
ルートネーミングコンテキストまたは Object Request Broker (ORB)、あるいはその両方を構成するときに使用します。値は、URL の文字列表現です。

このプロパティが指定されていない場合、ORB は、java.naming.corba.orb プロパティ、java.naming.applet プロパティ、またはその他の ORB 初期化プロパティによって初期化されます。ルートネーミングコンテキストは、次の呼び出しで取得します。

orb.resolve_initial_references("NameService");

URL スキーマが INS 仕様 (99-12-03) に指定されている「IOR」、「corbaname」、または「corbaloc」の 1 つである場合、ルートネーミングコンテキストは、URL に命名されたコンテキストになります。ORB は、java.naming.corba.orb プロパティ、java.naming.applet プロパティ、またはその他の ORB 初期化プロパティによって初期化されます。

URL スキーマが「iiop」または「iiopname」の場合は、ORB を初期化するときに URL のホストおよびポートフィールドを使用します。「iiopname」の URL の場合は、URL が現在は使用されていない INS 仕様 (98-10-11) に準拠していなければなりません。次の形式を使用します。

iiopname://[<addr_list>][/<cosnaming_name>]

「iiop」URL の場合は、以前のバージョンの INS 仕様との下位互換性がサポートされます。次の形式を使用します。

iiop://[<host>[:<port>]][/<cosnaming_name>]

「iiop」および「iiopname」の URL の場合、<host> が指定されていないときは、アプリケーションでは「localhost」、アプレットではアプレットのホストがデフォルト値となります。<port> が指定されていない場合は、「iiopname」では 9999、「iiop」では 900 がデフォルト値となります。ルートネーミングコンテキストは、ORB 上で次のメソッドを呼び出して取得します。

orb.resolve_initial_references("NameService");

<cosnaming_name> が空でない場合、ルートネーミングコンテキストは、cosnaming_name に命名されたネーミングコンテキストです。

URL スキーマが「iiop」、「iiopname」、「IOR」、「corbaname」、または「corbaloc」以外の場合は、文字列化したルートネーミングコンテキストの IOR が含まれる位置を、URL に指定する必要があります。たとえば、プロパティに file:/nsdir/ior が指定されている場合は、/nsdir/ior ファイルに文字列化した IOR を格納する必要があります。URL スキーマには、対応する URL プロトコルハンドラ (java.net.URLStreamHandler) のいずれにもなることができます。詳細は、java.net.URL クラスを参照してください。文字列化された IOR は、ISO Latin-1 の文字エンコーディングを使用して、URL に対応するデータストリームから読み込まれます。ストリームの最初の行は、接頭辞「IOR:」を含む文字列化された IOR です。たとえば、URL スキーマが「http」の場合は、ストリームのヘッダはスキップされ、接頭辞「IOR:」を含む最初の行が IOR として返されます。

文字列化した IOR またはその位置がプロパティに指定されているときは、ルートネーミングコンテキストは、文字列化した IOR に指定されているものになります。ORB は、java.naming.corba.orb プロパティ、java.naming.applet プロパティ、またはその他の ORB 初期化プロパティによって初期化されます。

java.naming.corba.orb
このプロパティには、プログラムで使用中の ORB を指定します。「NameService」初期参照を調べるとき、または文字列化された IOR をオブジェクト参照に変換するときなど、JNDI COS ネームサービスプロバイダで ORB が使用されるときは、この ORB が使用されます。

アプリケーションにこのプロパティを設定する場合は、次のようなコードを実行します。

ORB orb = ORB.init(args, null);
Hashtable env = new Hashtable(5, 0.75f);
env.put("java.naming.corba.orb", orb);
...
    
アプレットに設定する場合は、次のようなコードを実行します。
public class MyApplet extends Applet {

    public someInitMethod() {
        ORB orb = ORB.init(this, null);
        Hashtable env = new Hashtable(5, 0.75f);
        env.put("java.naming.corba.orb", orb);
        ...
    }
...
}
    
このプロパティが設定されていない場合は、java.naming.provider.url プロパティ、java.naming.applet プロパティ、または ORB 初期化プロパティによって ORB が初期化されます。
java.naming.applet
このプロパティには、プログラムで使用中のアプレットを指定します。COS ネームサービスプロバイダによって使用される ORB を初期化するときに使用します。このプロパティのパラメータは、JNDI 関連のプロパティを設定するときに使用します。 詳細は、JNDI のドキュメントを参照してください。
public class MyApplet extends Applet {

    public someInitMethod() {
        Hashtable env = new Hashtable(5, 0.75f);
        env.put("java.naming.applet", this);
        ...
    }
...
}
    
java.naming.factory.state
状態ファクトリクラスの完全修飾名のリストです。コロンで区切られています。渡されたオブジェクトが格納されるときに、オブジェクトの状態を取得するために使用されます。この機構を使用して、オブジェクトを COS ネームサーバに格納できる形式に変換することができます。COS ネームサーバには、CORBA オブジェクトを格納できます。

java.rmi.Remote を CORBA オブジェクトに変換する状態ファクトリが、デフォルトで提供されます。このファクトリは、RMI-IIOP を使用するアプリケーションで使用します。その他のオブジェクトを CORBA オブジェクトに変換して格納するときに、別のファクトリを使用することもできます。詳細は、javax.naming.spi.NamingManager.getStateToBind() を参照してください。

java.naming.factory.object
オブジェクトファクトリクラスの完全修飾名のリストです。コロンで区切られています。CORBA オブジェクトが変換されます。この機構を使用して、オブジェクトをアプリケーションに適した形式に変換することができます。たとえば、特定のオブジェクトファクトリを使用して、目的の型のオブジェクトを返すときに適切なナロー変換を行うことができます。詳細は、javax.naming.spi.NamingManager.getObject.Instance() を参照してください。
java.naming.batchsize
list()/listBindings() の結果を取得するときに、CosNaming::BindingIterator.next_n で使用するバッチサイズを指定します。デフォルトは、100 です。

たとえば、次の場合は、バッチサイズが 24 に設定されます。

    
env.put(Context.BATCHSIZE, "24");
ORB 初期化プロパティ
接頭辞が org.omg.CORBA のプロパティなど、CORBA 関連のプロパティを指定します。String 型のプロパティは、ORB を指定するときに使用されます。

ORB の初期化

使用する ORB および ORB の初期化方法を指定するときは、次のプロパティを使用します。

使用する ORB を決定するときは、次のアルゴリズムが使用されます。
  1. java.naming.corba.orb が設定されている場合は、その値 (ORB) が使用されます。

  2. それ以外の場合、プロバイダは、次のように ORB を内部で初期化して使用します。

    a) org.omg.CORBA.* プロパティおよび String 型のプロパティが抽出され、ORB.init() メソッドの Properties 引数として使用されます。この機構は、使用する ORB 実装またはホストを指定するときなどに使用します。

    b) java.naming.provider.url が設定され、スキーマが「iiop」または「iiopname」の URL が指定されている場合は、URL に指定されているホストおよびポート番号は、ORB.init() メソッドの Properties 引数として使用されます。この場合、(a) で設定した org.omg.CORBA.ORBInitialHost および org.omg.CORBA.ORBInitialPort プロパティより優先指定されます。

    c) (a) および (b) で構築された Properties インスタンスは、java.naming.applet プロパティの Applet インスタンスとともに ORB.init() に渡されます。java.naming.applet が渡されなかった場合は、空の String[] が渡されます。

(a)、(b)、および (c) で使用されているプロパティに、ORB の初期化に関連する情報が含まれていない場合は、Java IDL の実装のデフォルト値が使用されます。標準では、アプリケーションの場合はローカルホストのポート 900、アプレットの場合はアプレットホストのポート 900 が使用されます。 ORB.init() によって ORB が初期化されるときは、その引数は org.omg.CORBA.ORB の javadoc から、次の順に検査されます。

  1. Applet パラメータまたはアプリケーションの文字列配列を調べる (存在する場合)
  2. プロパティのパラメータを調べる (存在する場合)
  3. System プロパティを調べる (現在はアプリケーションのみ)
  4. ハードコードされているデフォルトの動作を調べる (Java IDL の実装を使用)

ルートネーミングコンテキストの初期化

ルートネーミングコンテキストは、java.naming.provider.url プロパティを使用するか、ORB 上で resolve_initial_references() を呼び出して初期化します。java.naming.provider.url プロパティが設定されているときに、スキーマが「iiop」または「iiopname」の URL が指定されていない場合は、文字列化された IOR、「corbaname」または「corbaloc」の URL、または文字列化された IOR の位置が含まれる URL が指定されていると見なされます。IOR は、ルートネーミングコンテキストを取得するために使用され、CosNaming::NamingContext 型の CORBA オブジェクトの IOR でなければなりません。

java.naming.provider.url が設定されていないと、ルートネーミングコンテキストは、ORB で次のメソッドを呼び出して取得されます。

        orb.resolve_initial_references("NameService");

名前と URL

String

java.naming.Context メソッドが受け取る String 名は、JNDI 複合名で、その各コンポーネントは文字列化された形式の CosNaming::NameComponent です。

CosNaming::Name には、CosNaming::NameComponent のシーケンスが含まれます。文字列化された形式のコンポーネントは、コンポーネントの ID、区切り文字 (「.」)、およびコンポーネントの種類が連結されています。コンポーネントの ID または種類にメタキャラクタ (「.」、「/」、または「\」) が使用されている場合は、エスケープ文字 (\) を使用してエスケープされています。文字列化された形式の CosNaming::Name は、INS 仕様 (99-12-03) の 3.5 節に定義されています。

JNDI 複合名の構文は、INS の構文に似ていますが、同じではありません。エスケープおよび引用符の扱いが多少異なっています。INS 構文に完全に準拠した名前を使用する場合は、String 引数の代わりに Name 引数を受け取るオーバーロードを使用してください。Name 引数は nameParser.parse() から返された値でなければなりません。nameParser は、COS ネームサービスプロバイダから取得した値です。「名前の解析」を参照してください。

URL 文字列名

URL 形式の CosNaming::Name は、INS 仕様に定義されています。

corbaname:<corbaloc_obj>["#" <cosnaming_name>]
この場合の <corbaloc_obj> は、次の形式です。
<corbaloc_obj> = <obj_addr_list> ["/" <key_string>]
また、<obj_addr_list> は「corbaloc」の URL に定義されたアドレスのリストであり、<key_string> は「corbaloc」の URL に定義された主要文字列です。 <cosnaming_name> は、文字列化された INS 名です (「名前の解析」を参照)。

以前の INS 仕様との下位互換性を保持するために、次の URL スキーマもサポートされます。

iiopname://[<addr_list>][/<cosnaming_name>]

<addr_list> は、ホストとポートの組み合わせです。<port> が指定されていない場合は、デフォルト値の 9999 が使用されます。<cosnaming_name> は、文字列化された形式の INS 名です。

iiop://<host>[:<port>][/<cosnaming_name>]

<port> が指定されていない場合は、デフォルト値の 900 が使用されます。 <cosnaming_name> は、文字列化された形式の INS 名です。

「iiop」または「iiopname」の URL をこの方法で初期コンテキストに指定すると、string_to_object() メソッドで 99-12-03 INS 仕様がサポートされている場合は、初期コンテキストに供給される ORB が使用されます。そうでない場合は ORB が無視され、URL で指定されたサーバとポートが ORB を作成するために使用されます。java.naming.factory.initial プロパティの値は、URL を解釈するために無視されます。

この規則は、初期コンテキストに「corbaname」の URL を指定した場合は使用されません。「corbaname」の URL の場合は、URL の解釈に ORB が必要なため、初期コンテキストに供給された ORB が使用されます。

名前オブジェクト

Context メソッドに指定された Name 引数は、文字列のシーケンスと見なされます。各文字列は、CosNaming::NameComponent が文字列化されたものです。

名前の解析

COS ネームサービスプロバイダでは、INS 仕様に規定されている構文の名前がサポートされます。つまり、構文は左から右へのスラッシュ (/) で区切られ、大文字と小文字が区別されるコンポーネントです。各コンポーネントの ID および種類は、ピリオド (.) で区切られます。

次のコードでは、COS ネームサービスプロバイダの名前パーサを使用して、INS 名を使用して参照します。

String insName = ...;
InitialContext ctx = new InitialContext(env);   // env contains init properties
NameParser parser = ctx.getNameParser("");      // parser for INS names
Name name = parser.parse(insName);              // get parsed INS name
Object obj = ctx.lookup(name);                  // do lookup

API マッピング

COS ネームサーバでは、ネーミング操作だけを行います。適切な COS ネーミング呼び出しを使用するために、COS ネームサービスプロバイダは、javax.naming.Context メソッドをマッピングします。

addToEnvironment()
環境プロパティに変更を記録しますが、ORB は初期化し直しません。
bind()
オブジェクトを指定した名前にバインドします。

バインドされているオブジェクトが org.omg.CosNaming.NamingContext の場合は、CosNaming::NamingContext.bind_context が使用されます。バインドされているオブジェクトが org.omg.CORBA.Object の場合は、CosNaming::NamingContext.bind が使用されます。次に説明する状態ファクトリ機構を使用してオブジェクトを org.omg.CORBA.Object に変換しないかぎり、ほかの型のオブジェクトのバインドはサポートされません。

バインディングがネームサーバ上で実行される前に、COS ネームサービスプロバイダで javax.naming.spi.NamingManager.getStateToBind() を使用して、オブジェクトを org.omg.CORBA.Object に変換することができます。getStateToBind() メソッドでは、COS ネームサービスプロバイダで利用可能な状態ファクトリが使用されます。状態ファクトリが java.rmi.Remote オブジェクトを受け付ける場合は、このファクトリは、オブジェクトの RMI-IIOP スタブの取得およびコンテキストに関連した ORB への接続について責任があります。接続されたスタブは、ネームサーバにバインドされるオブジェクトです。

デフォルトでは、COS ネームサービスプロバイダは、java.rmi.Remote インタフェースを実装したオブジェクトを、上記の要件に従って org.omg.CORBA.Object に変換する状態ファクトリを供給し使用します。このファクトリは、javax.rmi.CORBA パッケージ内のユーティリティを使用します。オブジェクトを CORBA オブジェクトに変換するために、別の状態ファクトリを指定することもできます。

close()
使用中の内部データ構造を解放します。
composeName()
渡された名前に接頭辞を連結します。
createSubcontext()
CosNaming::NamingContext.bind_new_context を使用して、新しいコンテキストの作成およびバインディングを行います。
destroySubcontext()
CosNaming::NamingContext.destroy を使用して名前付きコンテキストを破棄します。次に、CosNaming::NamingContext.unbind を使用してバインディングを削除します。
getEnvironment()
このコンテキストの環境を返します。
getNameInNamespace()
COS ネーミング名前空間のルートと相対的なこのコンテキストの INS 名を返します。
getNameParser()
INS 名を解析するために、名前パーサを返します。
lookup()
lookupLink()
CosNaming::NamingContext.resolve を使用して名前を参照し、CORBA オブジェクト参照を返します。ただし、CosNaming::NamingContext の参照の場合は、Context オブジェクトを代わりに返します。アプリケーションまたはユーザからオブジェクトファクトリが返されている場合は、NamingManager.getObjectInstance() を呼び出してからオブジェクトを返します。
list()
listBindings()
CosNaming::NamingContext.resolve を使用して、そのコンテキストのオブジェクト参照を取得します。次に、CosNaming::BindingIterator およびヘルパークラスを使用して、コンテキストに対して繰り返し処理を行います。名前にバインドされているオブジェクトは、CosNaming::NamingContext.resolve を呼び出して取得します。アプリケーションまたはユーザからオブジェクトファクトリが返されている場合は、NamingManager.getObjectInstance() を呼び出してからオブジェクトを返します。
removeFromEnvironment()
指定されたプロパティを環境から削除します。削除しない場合は、コンテキストは更新しません。
rebind()
バインドされているオブジェクトが org.omg.CosNaming.NamingContext の場合は、CosNaming::NamingContext.rebind_context が使用されます。バインドされているオブジェクトが org.omg.CORBA.Object の場合は、CosNaming::NamingContext.rebind が使用されます。状態ファクトリを使用して引数を org.omg.CORBA.Object に変換する方法についての詳細は、bind() を参照してください。
rename()
このメソッドを実装するには、unbind() を使用してから bind() を使用します。このメソッドは不可分ではありません。
unbind()
CosNaming::NamingContext.resolve を使用してオブジェクトをアンバインドします。

JNDI を使用するための CORBA プログラムの変換

ここでは、JNDI を使用するために、Java IDL プログラムを変更する方法について説明します。説明のために、Java IDL サンプルプログラム helloClient.java および helloServer.java を使用します。

  1. IDL ファイルからスタブを生成します。

    # idltojava -fclient -fserver hello.idl
    

    クライアント (helloClient.java) とサーバ (helloServer.java) のスケルトン、および共通コード (HelloApp/*.java など) が格納されるディレクトリが作成されます。

  2. クライアントとサーバのプログラムにコードを記述します。

  3. COS ネーミングディレクトリの代わりに JNDI を使用するように、変更 (またはクライアントとサーバのファイルをコピー) します。

    • javax.naming.*; を使用するように、import を置き換えます。
      削除:
      import org.omg.CosNaming.*;
      import org.omg.CosNaming.NamingContextPackage.*;
      
      追加:
      import javax.naming.*;
      
    • InitialContext を使用して「NameService」への初期参照を取得する方法を置き換えます。初期コンテキストに、現在のアプリケーションで使用されている ORB を渡します。
      削除:
      org.omg.CORBA.Object objRef = 
         orb.resolve_initial_references("NameService");
      NamingContext ncRef = NamingContextHelper.narrow(objRef);
      
      追加:
      Hashtable env = new Hashtable(5, 0.75f);
      env.put("java.naming.corba.orb", orb);
      Context ic = new InitialContext(env);
      
    • resolve() への呼び出しを lookup() に置き換えます。
      削除:
      // resolve the Object Reference in Naming
      NameComponent nc = new NameComponent("Hello", "");
      NameComponent path[] = {nc};
      hello helloRef = helloHelper.narrow(ncRef.resolve(path));
      
      追加:
      // resolve the Object Reference using JNDI
      hello helloRef = 
      helloHelper.narrow((org.omg.CORBA.Object)ic.lookup("Hello"));
      

セキュリティについて

セキュリティマネージャがインストールされているときは、JNDI を使用するアプリケーションおよび COS ネームサービスプロバイダに対して、次のアクセス権を割り当てる必要があります。

permission java.net.SocketPermission "host[:port]", "connect";
java.naming.factory.initial プロパティ、コンテキストメソッドに渡された URL 文字列名、ORB 初期化パラメータとプロパティ、およびオブジェクト参照に指定されている、各ホストまたはポートに対して割り当てられます。


Copyright © 1999-2001 Sun Microsystems, Inc., All Rights Reserved.