目次 | 前へ | 次へ |
ここでは、JNDI で有効になった機能を示すのに役立つ、いくつかのアプリケーションのシナリオの概要について説明します。
以降の例に従ってアプリケーションを作成する必要はありません。多くの場合、問題の解決には複数の方法があります。JNDI は、柔軟に設計されています。
セキュリティー保護されたシステムでは、ユーザーは、アクセスしようとするコンピュータ、ネットワーク、またはサービスに対して自分自身を認証する必要があります。たとえば、UNIX にログインするときは、パスワードを入力する必要があります。また、SSL を使用するときは、X.509 証明書を渡す必要があります。このような認証情報は、ディレクトリ内の各ユーザーに関連付けられた属性として格納されます。認証を実行しているシステムは、ユーザーの属性 (「パスワード」など) を検索し、ユーザーによって指定された情報を使用して本人であることを検証します。
DirContext ctx = new InitialDirContext(); Attribute attr = ctx.getAttributes(userName).get("password"); String password = (String)attr.get();
電子メールシステムの役立つ機能として、ユーザーと電子メールアドレスの間のマッピングを提供するディレクトリサービスがあります。電子メールのユーザーは、この機能を使用して特定のユーザーの電子メールアドレスを検索できます。この操作は、電話をかけるときに電話帳で特定の電話番号を検索することと似ています。たとえば、同じ部署内の「John Smith」にメールを送信する場合は、メールアプリケーションの「検索」ウィジェットを使用して、そのディレクトリで「John Smith」を検索します。このウィジェットによって、5 つの「John Smith」エントリが返されます。その中から、同一職場の建物にあるエントリを選択し、そのエントリに関連付けられた電子メールアドレス属性を使用します。
NamingEnumeration matches = deptCtx.search("user", new BasicAttributes("name", "John Smith")); // use matches to construct a selectable list for end-user while (matches.hasMore()) { SearchResult item = (SearchResult) matches.next(); Attributes info = item.getAttributes(); /* display attributes */ ... }
ディレクトリはまた、ユーザーが個人のアドレス帳を設定するためにも使用できます。たとえば、「John Smith」の電子メールアドレスを一度特定したら、メールを送信するたびにディレクトリを繰り返し検索しないようにすることができます。ディレクトリ内に、頻繁に使用するエントリを管理するための個人用サブツリーを作成します。多くの場合、既存のエントリへのリンクを作成します。
データベースアプリケーションから、ディレクトリを使用してデータベースサーバーを検索できます。たとえば、財務アプリケーションでは、JDBC を使用している株式相場サーバーから株式相場を取得する必要があります。この財務アプリケーションで、いくつかの属性 (その市場の範囲および相場の更新頻度など) を指定して株式相場サーバーを選択できます。アプリケーションは、これらの属性を満たす相場サーバーのディレクトリを検索したあと、選択された株式相場サーバーの「位置」属性 (JDBC URL) を取得し、そのサーバーに接続します。
NamingEnumeration matches = ctx.search("service/stockQuotes", "(&(market=NASDAQ)(updateFreqency<=300))", searchctls); while (matches.hasMore()) { SearchResult item = (SearchResult)matches.next(); Attribute location = item.getAttributes().get("location"); ... }
ユーザーに名前の入力を要求するほぼすべての種類の対話型アプリケーションを使用している場合、名前空間ブラウザを使用できると、ユーザーの仕事がより簡単になります。名前空間ブラウザは、アプリケーションに組み込んでそのアプリケーション用に調整することもできますが、通常の Web ブラウザなどとして汎用的に使用することもできます。
JNDI ブラウザの非常に単純な例を使用すると、ユーザーは途中の各ステップで基本名を表示しながら、名前空間内を「参照する」ことができます。ブラウザは、「*」を出力して各 Context
の名前を強調表示することによって、ユーザーに次に移動できる場所を知らせています。 1
// Start at the top -- the initial context. Context ctx = new InitialContext(); while (ctx != null) { // display one level NamingEnumeration items = ctx.list(); while (items.hasMoreElements()) { NameClassPair item = (NameClassPair)items.next(); if (isContext(item.getClassName())) { System.out.print("*"); } else { System.out.print(" "); } System.out.println(" " + item.getName()); } // Take the next step down into the namespace. String target = input.readLine(); try { ctx = (Context)ctx.lookup(target); } catch (NamingException e) { // handle error } catch (ClassCastException e) { // not a context; cannot traverse } }
印刷サービスの重要な機能として、ユーザーがネットワーク内のプリンタを容易に検出して選択するための手段を提供することがあります。印刷が行われるアプリケーションまたはそのアプリケーションが実行されているマシンは、新しいプリンタがネットワークに追加されるたびに設定する必要がないようにしなければなりません。プリンタへのネットワークアクセスのスコープには、ワークグループからグローバルまでさまざまなものがあります。印刷サービスでは、この機能を提供するときにディレクトリが使用されます。
プリンタが Printer
インタフェースで表されているとします。その中のメソッドの 1 つに print()
があります。これは、InputStream
が与えられると、InputStream
からデータを読み取り、それをこの Printer のインスタンスで表されるプリンタに印刷します。
interface Printer { void print(InputStream data) throws PrinterException; ... }
ユーザーは、論理プリンタ名を使用して (明示的に、またはデフォルト設定によって) プリンタを選択します。たとえば、すべてのアプリケーションに対してデフォルトプリンタを指定した場合、この設定は、ほかのプリンタを明示的に指定したときにだけオーバーライドされます。印刷要求を受け入れたアプリケーションでは、そのプリンタ名を受け取り、ディレクトリサービス内でルックアップします。アプリケーションは、その結果として、Printer
インタフェースを実装するオブジェクトを受信することを予測します。
void myAppPrint(String printerName, String fileName) throws IOException { try { DirContext ctx = new InitialDirContext(); Printer prt = (Printer) ctx.lookup(printerName); prt.print(new FileInputStream(fileName)); } catch (NamingException e){ System.err.println("Could not locate printer: " + e); } catch (ClassCastException e) { System.err.println(printerName + "does not name a printer"); } }
名前を明示的に指定することによるプリンタの選択は、プリンタを識別するための 1 つの方法にすぎません。ディレクトリを使用すれば、使用可能なさまざまなプリンタを表示したり (ブラウズ機能)、特定の属性を持つプリンタを検索したりすることができます。たとえば、ディレクトリに対して、Mountain View キャンパスの 5 番ビルの 2 階にあるすべてのプリンタの一覧表示、または 600dpi の解像度を持つすべてのカラーレーザプリンタの検索を要求できます。アプリケーションの観点から見ると、lookup()
が Printer
オブジェクトを返したように、一覧表示および検索操作によっても、アプリケーションが印刷要求を送信するために使用できる Printer
オブジェクトを返す同じ機能が提供されます。