JNDI の仕様は、米国 Sun Microsystems, Inc. が、Novell、Netscape、SCO、BEA を含む、業界をリードする多数のパートナーとともに開発しました。
バージョン 1.2 の仕様およびリファレンス実装は、Java Software の Web サイトからダウンロードできます。
ディレクトリサービスは、ユーザー、マシン、ネットワーク、サービス、およびアプリケーションに関するさまざまな情報へのアクセスを提供することによって、イントラネットおよびインターネットにおいて重要な役割を果たします。その性質上、ディレクトリサービスには、さまざまなエンティティーの配置と識別を特徴づける、人間が理解できる名前空間を提供するためのネーミング機能が組み込まれています。
企業のコンピューティング環境は通常、合成の名前空間のさまざまな部分を表すいくつかのネーミング機能で構成されています。たとえば、インターネットのドメインネームシステム (DNS) は、企業内のさまざまな組織のトップレベルのネーミング機能として使用されることがあります。各組織では、LDAP、NDS、NIS などのディレクトリサービスを使用します。ユーザーの観点から見ると、合成名で構成される 1 つの名前空間があるように見えます。合成名の例として、URL を挙げることができます。URL は、複数のネーミング機能の名前空間にまたがっています。ディレクトリサービスを使用するアプリケーションでは、このユーザーの観点をサポートしなければなりません。
多くの Java アプリケーション開発者は、特定のディレクトリまたはネームサービスの実装から独立しているだけでなく、複数のネーミング機能を経由したディレクトリオブジェクトへのシームレスなアクセスも可能にするディレクトリサービス API からメリットを得ることができます。たとえば、アプリケーション自体のオブジェクトを、名前空間に添付できます。このネーミング機能を使用して、Java アプリケーションから、任意の型のオブジェクトの検出および取り出しを行うことができます。
JNDI は、Java アプリケーションにディレクトリ機能とネーミング機能を提供します。JNDI は、特定のディレクトリサービス実装に依存しないように定義されています。そのため、さまざまなディレクトリ (インストール済みマシン内の新規および既存のディレクトリ) に共通の方法でアクセスできます。
JNDI ではまた、さまざまなディレクトリおよびネームサービスのドライバのプラグインを可能にするサービスプロバイダのインタフェースも定義されます。
次に、JNDI のより一般的に使用される機能のいくつかを簡単に示す 2 つの例について説明します。
プリンタにアクセスするアプリケーションには、対応するプリンタオブジェクトが必要です。この対応付けは、次のようにして行います。
prt = (Printer) building7.lookup("puffin"); prt.print(document);
ここで、building7
は、プリンタを参照するための便利なコンテキストを提供する、物理的な構築を表すネーミングコンテキストです。
プリンタオブジェクトを構築するために必要な情報を検索する作業はすべて、JNDI が実行します。
もう 1 つの例として、組織のディレクトリに格納されているユーザーの電話番号を検索するアプリケーションは、次のように記述できます。
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 操作を完了するために異なるプロバイダ実装が連携できるようにするメソッドが提供されます。