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

目次


はじめに

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

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

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


適合性

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

COS ネームサービスの完全な仕様は、OMG から入手できます。

名前の構文は Interoperable Naming Service (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」のいずれかである場合、ルートネーミングコンテキストは URL で指定されているネーミングコンテキストになります。ORB は、java.naming.corba.orb プロパティー、java.naming.applet プロパティー、またはその他の ORB 初期化プロパティーを使用して初期化されます。

URL スキームが「iiop」または「iiopname」の場合は、ORB を初期化するときに URL のホストおよびポートフィールドを使用します。「iiopname」の 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.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 が ORB.init() を使用して初期化されるとき、その引数は (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 の「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 名は、各コンポーネントが CosNaming::NameComponent の文字列化された形式になっている JNDI 合成名です。

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 文字列名

CosNaming::Name の URL 形式は、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() メソッドで INS 仕様 (99-12-03) がサポートされている場合は、初期コンテキストに指定されている 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()

このメソッドは、bind() を使用したあとに unbind() を使用して実装されます。このメソッドは不可分ではありません。

unbind()

CosNaming::NamingContext.unbind を使用して、オブジェクトをアンバインドします。


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

ここでは、JNDI を使用するために、Java IDL プログラムを変更する方法について説明します。この説明では、Java IDL サンプルプログラム helloClient.javahelloServer.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.*;
      
    • 「NameService」への初期参照を取得する方法を InitialContext で置き換え、初期コンテキストに現在のアプリケーションで使用されている 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);
      
    • lookup() を使用するように resolve() への呼び出しを置き換えます。

      削除:

      // 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 © 1993, 2013, Oracle and/or its affiliates. All rights reserved.