目次
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)へのマッピングであるJava 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の初期化方法を指定するときは、次のプロパティを使用します。
java.naming.corba.orb
java.naming.applet
java.naming.provider.url
使用するORBを決定するときは、次のアルゴリズムが使用されます。
(a)、(b)および(c)で使用されているプロパティに、ORBの初期化に関連する情報が含まれていない場合は、Java IDLの実装のデフォルト値が使用されます。標準では、アプリケーションの場合はローカル・ホストのポート900、アプレットの場合はアプレット・ホストのポート900が使用されます。ORBがORB.init()を使用して初期化されるとき、その引数は次の順序でチェックされることに注意してください(org.omg.CORBA.ORB Javadocから)。
これらのネーミング・サービス・プロパティが実行中のネーム・サービスを参照していない場合は、一時ネーム・サービス(TNS)であるデフォルト・サービスがアクセスされます。
ルート・ネーミング・コンテキストは、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");
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
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を使用するために、Java IDLプログラムを変更する方法について説明します。この説明では、Java IDLサンプル・プログラムhelloClient.javaとhelloServer.javaを使用します。
# idltojava -fclient -fserver hello.idl
これにより、クライアント(helloClient.java)とサーバー(helloServer.java)のスケルトン、および共通のコード(HelloApp/*.javaなど)を含むディレクトリが作成されます。
削除:
import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*;追加:
import javax.naming.*;
削除:
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 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初期化パラメータとプロパティ、およびオブジェクト参照で識別される各ホスト/ポート用のアクセス権です。