コメントの送付先: 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 のドキュメントを参照してください。
例を示します。
COS ネームサービスを初期コンテキストとして使用している場合は、このプロパティを設定する必要があります。ただし、初期コンテキストに URL だけを渡した場合は、このプロパティを指定する必要はありません。詳細は、「名前と URL」を参照してください。
URL スキーマが「iiop」または「iiopname」の場合は、ORB を初期化するときに URL のホストおよびポートフィールドを使用します。「iiopname」の場合は、INS 仕様に準拠していなければなりません。次の形式を使用します。
「iiop」の場合は、以前のバージョンの INS 仕様との下位互換性がサポートされます。次の形式を使用します。
「iiop」および「iiopname」の場合は、ホストが指定されていないときは、アプリケーションでは「localhost」、アプレットではアプレットのホストがデフォルト値となります。ポートが指定されていない場合は、「iiopname」では 9999、「iiop」では 900 がデフォルト値となります。ルートネーミングコンテキストは、ORB 上で次のメソッドを呼び出して取得します。
「cosnaming name」が空以外の場合は、「cosnaming name」に指定されているネーミングコンテキストがルートネーミングコンテキストになります。
URL スキーマが「IOR」の場合は、文字列化したルートネーミングコンテキストの IOR をプロパティに指定する必要があります。
URL スキーマが「iiop」、「iiopname」、および「IOR」以外の場合は、文字列化したルートネーミングコンテキストの IOR が含まれる位置を、URL に指定する必要があります。たとえば、プロパティに「file:/nsdir/ior」が指定されている場合は、「/nsdir/ior」ファイルに文字列化した IOR を格納する必要があります。URL スキーマは、対応する URL プロトコルハンドラ (java.net.URLStreamHandler 文字列化した IOR またはその位置がプロパティに指定されているときは、ルートネーミングコンテキストは、文字列化した IOR に指定されているものになります。ORB は、java.naming.corba.orb プロパティ、java.naming.applet プロパティ、またはその他の ORB 初期化プロパティによって初期化されます。
このプロパティが指定されていない場合は、ORB は、java.naming.corba.orb プロパティ、java.naming.applet プロパティ、またはその他の ORB 初期化プロパティによって初期化されます。ルートネーミングコンテキストは、次の呼び出しで取得されます。
はじめに
適合性
環境プロパティ
java.naming.factory.initial
COS ネームサービスプロバイダを選択するときに使用します。 プロバイダ自体では使用されません。プロバイダの初期コンテキストファクトリのクラス名を指定します。
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory");
java.naming.provider.url
ルートネーミングコンテキストまたは Object Request Broker (ORB)、あるいはその両方を構成するときに使用します。値は、URL の文字列表現です。
) があればどれでもかまいません。詳細は、 java.net.URL クラスを参照してください。文字列化された IOR は、URL に対応するデータストリームから読み込まれます。 文字エンコーディングは、ISO Latin-1 とみなされます。 ストリームの最初の行は、接頭辞「IOR:」を含む文字列化された IOR です。たとえば、URL スキーマが「http」の場合は、ストリームのヘッダはスキップされ、接頭辞「IOR:」を含む最初の行が IOR として返されます。
iiopname://[<addr_list>][/<cosnaming name>]
iiop://[<host>[:<port>]][/<cosnaming name>]
orb.resolve_initial_references("NameService");
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); ...このプロパティが設定されていない場合は、java.naming.provider.url プロパティ、java.naming.applet プロパティ、または 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.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 です。ORB 初期化プロパティたとえば、次の場合は、バッチサイズが 24 に設定されます。
env.put(Context.BATCHSIZE, "24");
接頭辞が org.omg.CORBA のプロパティなど、CORBA 関連のプロパティを指定します。String 型のプロパティは、ORB を指定するときに使用されます。
使用する ORB および ORB の初期化方法を指定するときは、次のプロパティを使用します。
(a)、(b)、および (c) で使用されているプロパティに、ORB の初期化に関連する情報が含まれていない場合は、Java IDL の実装のデフォルト値が使用されます。標準では、アプリケーションの場合はローカルホストのポート 900、アプレットの場合はアプレットホストのポート 900 が使用されます。
ORB.init() によって ORB が初期化されるときは、その引数は org.omg.CORBA.ORB の javadoc から、次の順に検査されます。
ルートネーミングコンテキストは、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 上で次のメソッドが呼び出されます。
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 仕様に定義されています。
addr_list は、ホストとポートの組み合わせです。ポートが指定されていない場合は、デフォルト値の 9999 が使用されます。<cosnaming name> は、文字列化された形式の INS 名です。「名前の解析」を参照してください。
以前の INS 仕様との下位互換性を保持するために、次の URL もサポートされます。
ポートが指定されていない場合は、デフォルト値の 900 が使用されます。<cosnaming name> は、文字列化された形式の INS 名です。「名前の解析」を参照してください。
この方法で初期コンテキストに URL を渡したときは、初期コンテキストに渡される ORB は無視されます。実際、java.naming.factory.initial および java.naming.corba.orb プロパティの値は無視されます。
たとえば、次のコードの場合、ホスト「server」上で動作するネームサービスにポート「1900」で接続し、INS 名「some/cos/name」を参照します。
名前オブジェクト
Context メソッドに指定された Name 引数は、文字列のシーケンスとみなされます。 各文字列は、CosNaming::NameComponent が文字列化されたものです。
COS ネームサービスプロバイダでは、INS 仕様に規定されている構文の名前がサポートされます。つまり、構文は左から右へのスラッシュ (「/」) で区切られ、大文字小文字が区別されるコンポーネントです。各コンポーネントの ID および種類は、ピリオド (「.」) で区切られます。
次のコードでは、COS ネームサービスプロバイダの名前パーサを使用して、INS 名を使用して参照します。
COS ネームサーバでは、ネーミング操作だけを行います。適切な COS ネーミング呼び出しを使用するために、COS ネームサービスプロバイダは、javax.naming.Context メソッドをマッピングします。
バインディングがネームサーバ上で実行される前に、COS ネームサービスプロバイダは javax.naming.spi.NamingManager.getStateToBind() を使用して、オブジェクトを org.omg.CORBA.Object に変換することができます。デフォルトでは、状態ファクトリが提供され、java.rmi.Remote インタフェースが実装されているオブジェクトを org.omg.CORBA.Object に変換するために使用されます。このファクトリでは、javax.rmi.CORBA パッケージが使用されます。オブジェクトを CORBA オブジェクトに変換してバインドするために、別の状態ファクトリを指定することもできます。
ORB の初期化
使用する ORB を決定するときは、次のアルゴリズムが使用されます。
java.naming.corba.orb
java.naming.applet
java.naming.provider.url
ルートネーミングコンテキストの初期化
orb.resolve_initial_references("NameService");
名前と URL
iiopname://[<addr_list>][/<cosnaming name>]
iiop://<host>[:<port>][/<cosnaming name>]
InitialContext ictx = new InitialContext();
Object helloRef = ictx.lookup("iiopname://server:1900/some/cos/name");
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 マッピング
addToEnvironment()
環境プロパティに変更を記録しますが、ORB は初期化し直しません。
bind()
バインドされているオブジェクトが org.omg.CosNaming.NamingContext の場合は、CosNaming::NamingContext.bind_context が使用されます。バインドされているオブジェクトが org.omg.CORBA.Object の場合は、CosNaming::NamingContext.bind が使用されます。その他の種類のオブジェクトのバインディングはサポートされません。
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 を使用してオブジェクトをアンバインドします。