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) の仕様、「OMG TC Document 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 の文字列表現です。

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

iiopname://[<addr_list>][/<cosnaming name>]

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

iiop://[<host>[:<port>]][/<cosnaming name>]

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

orb.resolve_initial_references("NameService");

「cosnaming name」が空以外の場合は、「cosnaming name」に指定されているネーミングコンテキストがルートネーミングコンテキストになります。

URL スキーマが「IOR」の場合は、文字列化したルートネーミングコンテキストの IOR をプロパティに指定する必要があります。

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

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

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

orb.resolve_initial_references("NameService");
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.getObjectInstance() を参照してください。
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、または文字列化された IOR の位置が含まれる URL が指定されているとみなされます。文字列化された IOR は、ルートネーミングコンテキストを取得するときに使用します。文字列化された IOR は、CosNaming::NamingContext 型の CORBA オブジェクトの IOR でなければなりません。

java.naming.provider.url が設定されていないか、java.naming.provider.url に文字列化された IOR またはその位置が指定されていない場合は、ルートネーミングコンテキストを取得するために ORB 上で次のメソッドが呼び出されます。

        orb.resolve_initial_references("NameService");

名前と URL

String

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

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

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

URL 文字列名

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

iiopname://[<addr_list>][/<cosnaming name>]

addr_list は、ホストとポートの組み合わせです。ポートが指定されていない場合は、デフォルト値の 9999 が使用されます。<cosnaming name> は、文字列化された形式の INS 名です。「名前の解析」を参照してください。

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

iiop://<host>[:<port>][/<cosnaming name>]

ポートが指定されていない場合は、デフォルト値の 900 が使用されます。<cosnaming name> は、文字列化された形式の INS 名です。「名前の解析」を参照してください。

この方法で初期コンテキストに URL を渡したときは、初期コンテキストに渡される ORB は無視されます。実際、java.naming.factory.initial および java.naming.corba.orb プロパティの値は無視されます。

たとえば、次のコードの場合、ホスト「server」上で動作するネームサービスにポート「1900」で接続し、INS 名「some/cos/name」を参照します。

InitialContext ictx = new InitialContext();
Object helloRef = ictx.lookup("iiopname://server:1900/some/cos/name");

名前オブジェクト

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 が使用されます。その他の種類のオブジェクトのバインディングはサポートされません。

バインディングがネームサーバ上で実行される前に、COS ネームサービスプロバイダは javax.naming.spi.NamingManager.getStateToBind() を使用して、オブジェクトを org.omg.CORBA.Object に変換することができます。デフォルトでは、状態ファクトリが提供され、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()
ルートネーミングコンテキストに関連付けられているこのコンテキストの 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 Sun Microsystems, Inc., All Rights Reserved.