Java Naming and Directory InterfaceTM テクノロジ (JNDI) は、複数のネームサービスおよびディレクトリサービスに、統一されたインタフェースを提供します。Java Enterprise API セットの一部である JNDI によって、異なる企業のネームサービスおよびディレクトリサービスにシームレスに接続することができます。開発者は、この業界標準のインタフェースを使用して、強力で移植性があり、ディレクトリ機能を備えた Java アプリケーションを構築できるようになりました。JNDI の仕様は、米国 Sun Microsystems, Inc. と、Novell、Netscape、SCO、および BEA を含む、業界をリードする多数のパートナーが開発しました。
ディレクトリサービスは、ユーザ、マシン、ネットワーク、サービス、およびアプリケーションに関するさまざまな情報へのアクセスを提供することによって、イントラネットおよびインターネットにおいて重要な役割を果たします。その性質上、ディレクトリサービスには、人間が理解できる名前空間を提供するネーミング機能が組み込まれていて、さまざまなエンティティの処理および識別を行うことができます。
通常、企業のコンピューティング環境は、いくつかのネーミング機能で構成されています。 多くの場合、それぞれが 1 つの「複合」名前空間の異なる部分を表しています。たとえば、インターネットのドメインネームシステム (DNS) は、企業内の複数の組織間の 最上位のネーミング機能として使用します。各組織では、LDAP、NDS、NIS などのディレクトリサービスを使用します。ユーザの観点から見ると、複合名で構成される 1 つの名前空間があるように見えます。複数名の例として URL を挙げることができます。 URL は、複数のネーミング機能の名前空間にまたがっています。ディレクトリサービスを使用するアプリケーションでは、このユーザの観点をサポートしなければなりません。
ディレクトリサービス API は、特定のディレクトリサービスまたはネームサービスに依存していません。 また、複数のネーミング機能を介してディレクトリオブジェクトにシームレスにアクセスすることができます。 このため、多くの場合、ディレクトリサービス API を使用すると、Java アプリケーションを効率的に開発することができます。 たとえば、アプリケーション自体のオブジェクトを、名前空間に添付することができます。このネーミング機能を使用して、Java アプリケーションから、任意の型のオブジェクトの検出および取り出しを行うことができます。
JNDI によって、ディレクトリ機能およびネーミング機能が Java アプリケーションに提供されます。JNDI は、特定のディレクトリサービス実装に依存しないように定義されています。したがって、インストールベース内の新しいディレクトリや既存のディレクトリなどの、さまざまなディレクトリに、共通の方法でアクセスできます。
また、JNDI には、サービスプロバイダのインタフェースも定義されているため、さまざまなディレクトリサービスおよびネームサービスのドライバをプラグインできます。
次に、よく使用される JNDI の機能を簡単に示した例を 2 つ挙げます。
プリンタにアクセスするアプリケーションには、対応するプリンタオブジェクトが必要です。この対応付けは、次のようにして行います。
prt = (Printer) building7.lookup("puffin"); prt.print(document);
building7
は、物理的な構築を表すネーミングコンテキストで、プリンタの参照に使用するコンテキストを提供します。
JNDI では、プリンタオブジェクトの構築に必要な情報の検索がすべて行われます。
次の例では、アプリケーションから、組織のディレクトリ内に格納されている特定のユーザの電話番号を検索しています。 次のように記述します。
String[] attrs = {"workPhone", "cellPhone", "faxNumber"}; bobsPhones = directory.getAttributes("cn=Bob,o=Widget,c=US", attrs);
また「Widget」という組織に「Bob」という名前のユーザが複数存在する場合は、次のようにすれば、組織のディレクトリを検索して正しい「Bob」を見つけることができます。
bob = directory.search("o=Widget,c=US","(cn=Bob)", controls);
その他のアプリケーションの例として、企業全体のディレクトリサービスに格納されたセキュリティ資格へのアクセス、電子メールアドレスへのアクセス、およびデータベースやネットワークファイルシステムなどの既存の各種サービスのアドレスへのアクセスがあります。
Context
は、ネーミングコンテキストを指定するコアインタフェースです。基本操作 (名前とオブジェクトのバインディングの追加、特定の名前にバインド済みのオブジェクトのルックアップ、バインディングの一覧表示、名前とオブジェクトのバインディングの削除、同じ型のサブコンテキストの作成と破棄など) を定義します。
Context.lookup()
は、使用頻度がもっとも高い操作です。このコンテキストの実装は、Java アプリケーションに必要なクラスのオブジェクトを返すことができます。たとえば、アプリケーションではプリンタ名を使用して、対応する Printer
オブジェクトのルックアップを行い、そこに直接印刷することができます。
Printer printer = (Printer) ctx.lookup("treekiller"); printer.print(report);
アプリケーションは、ネームサービスの実装に影響されません。また、新しい型のネームサービスを導入するときに、アプリケーションを変更したり、実行中のアプリケーションを中断する必要はありません。
「ディレクトリオブジェクトと属性」。DirContext
インタフェースでは、ディレクトリオブジェクトに関連した属性の検査および更新を行うメソッドが定義されているため、ディレクトリ機能を使用できます。各ディレクトリオブジェクトには、Attribute
クラスの 0 から複数の一連のオブジェクトが含まれています。
各属性は、文字列の識別子で識別されます。 また、任意の型の値を 0 個以上指定できます。
「ネーミングコンテキストとしてのディレクトリオブジェクト」。DirContext
インタフェースが Context
インタフェースを継承した場合は、ネーミングコンテキストとして動作します。つまり、任意のディレクトリオブジェクトからネーミングコンテキストを提供できます。さまざまなユーザ情報を保持しているディレクトリオブジェクトは、プリンタ、ファイルシステム、カレンダなど、個人にかかわるリソースの本来のネーミングコンテキストにもなります。
「検索」。DirContext
インタフェースでは、コンテンツベースのディレクトリ検索がサポートされています。もっとも簡単で一般的な例として、アプリケーションで、特定の値を設定したいくつかの属性を指定して、照合に使用することができます。
この場合、DirContext.search()
メソッドがそのディレクトリオブジェクト上で呼び出され、一致したディレクトリオブジェクトと要求した属性が返されます。
「ネーミングイベント」。NamingEvent
クラスは、ネームサービスまたはディレクトリサービスによって生成されたイベントを表します。NamingEvent
の例として、ディレクトリエントリの属性の変更や、ディレクトリエントリの名前の変更があります。
「ネーミングリスナー」。NamingListener
は、NamingEvent
の影響を登録するオブジェクトです。
リスナーは、コンテキストに登録し、コンテキスト、その子供、またはそのサブツリー内の変更の通知を受け取ります。
LdapContext
インタフェースでは、「拡張機能」および「コントロール」など、汎用的な DirContext
インタフェースに組み込まれていない LDAP v3 固有の機能をアプリケーションで使用することができます。
JNDI SPI では、さまざまなネームサービスおよびディレクトリサービスプロバイダの実装の開発および接続を行うことができます。 このため、アプリケーションで JNDI を使用している場合は、対応するサービスにアクセスすることができます。 また、JNDI は複数の名前空間にかかって名前を指定することができます。 このため、特定のサービスプロバイダ実装で、操作を完了するために別のサービスプロバイダとの対話が必要になる場合は、SPI は、別のプロバイダ実装に、連携してクライアントの JNDI 操作を完了させるメソッドを提供します。