JavaTM 2 Platform
Std. Ed. v1.3

パッケージ javax.naming.ldap

LDAPv3 の拡張操作とコントロールをサポートします。

参照:
          説明

インタフェースの概要
Control このインタフェースは、「RFC 2251」で定義されているように LDAPv3 コントロールを表示します。
ExtendedRequest このインタフェースは、「RFC 2251」で定義されている LDAPv3 拡張操作の要求を表示します。
ExtendedResponse このインタフェースは、「RFC 2251」で定義されている LDAP 拡張操作の応答を表示します。
HasControls このインタフェースは、オブジェクトが NamingEnumerations で返されるとき、コントロールを返すのに使用されます。
LdapContext このインタフェースは、LDAPv3 スタイルのコントロールを持つ操作と LDAPv3 スタイルの拡張操作を実行できるコンテキストを表します。
UnsolicitedNotification このインタフェースは、「RFC 2251」で定義された非要請通知を表します。
UnsolicitedNotificationListener このインタフェースは、UnsolicitedNotificationEvent を処理するためのものです。
 

クラスの概要
ControlFactory この抽象クラスは、LDAPv3 コントロールの作成に使用するファクトリを表示します。
InitialLdapContext このクラスは、LDAPv3 スタイルの拡張操作および拡張コントロールを実行するための開始コンテキストです。
UnsolicitedNotificationEvent このクラスは、LDAP サーバから送信された非要請通知に応じてトリガーされたイベントを表します
 

例外の概要
LdapReferralException LDAP 参照例外を示すには abstract クラスを使用します。
 

パッケージ javax.naming.ldap の説明

LDAPv3 の拡張操作とコントロールをサポートします。

このパッケージは、Java Naming and Directory InterfaceTM (JNDI) のディレクトリ操作を拡張します。JNDI は、Java プログラミング言語で作成されたアプリケーションにネーミング機能およびディレクトリ機能を提供します。JNDI は、特定のネーミングまたはディレクトリサービス実装とは独立して設計されています。このため、新しいサービスおよびすでに配置されている様々なサービスに、共通の方法でアクセスできます。

このパッケージは、「RFC 2251」で定義された LDAPv3 の拡張操作とコントロールを処理するアプリケーションおよびサービスプロバイダ向けのものです。このパッケージのコアインタフェースは LdapContext で、これは拡張操作実行およびコントロール処理のコンテキストのメソッドを定義します。

拡張操作

このパッケージは、拡張操作の引数を表す ExtendedRequest インタフェースおよび拡張操作の結果を表す ExtendedResponse インタフェースを定義します。拡張応答は常に拡張要求とペアになりますが、拡張要求は必ずしも拡張応答とペアになる必要はありません。つまり、対応する拡張応答のない拡張要求を持てるということです。

アプリケーションは通常、これらのインタフェースを直接は処理しません。代わりに、これらのインタフェースを実装しているクラスを処理します。アプリケーションはこれらのクラスを、標準化された拡張操作のレパートリの一部として IETF から取得するか、あるいはベンダー固有の拡張操作のディレクトリベンダーから取得します。要求クラスには、型保証されたユーザが使いやすい方法で引数を受け入れるコンストラクタが必要で、応答クラスには、型保証されたユーザが使いやすい方法で応答のデータを取得するためのアクセスメソッドが必要です。内部的には、要求クラスおよび応答クラスは BER 値の符号化および復号化を処理します。

たとえば、LDAP サーバが「時間取得」の拡張操作をサポートしている場合、LDAP サーバは、アプリケーションがこの機能を使えるよう、GetTimeRequestGetTimeResponse などのクラスを指定します。アプリケーションはこれらの機能を次のように使います。

GetTimeResponse resp =
    (GetTimeResponse) ectx.extendedOperation(new GetTimeRequest());
long time = resp.getTime();

GetTimeRequest および GetTimeResponse クラスは次のように定義できます。

public class GetTimeRequest implements ExtendedRequest {
    // User-friendly constructor 
    public GetTimeRequest() {
    };

    // Methods used by service providers
    public String getID() {
        return GETTIME_REQ_OID;
    }
    public byte[] getEncodedValue() {
        return null;  // no value needed for get time request
    }
    public ExtendedResponse createExtendedResponse(
        String id, byte[] berValue, int offset, int length) throws NamingException {
        return new GetTimeResponse(id, berValue, offset, length);
    }
}
public class GetTimeResponse() implements ExtendedResponse {
    long time;
    // called by GetTimeRequest.createExtendedResponse()
    GetTimeResponse(String id, byte[] berValue, int offset, int length) 
        throws NamingException {
        // check validity of id
        long time =  ... // decode berValue to get time
    }

    // Type-safe and User-friendly methods
    public java.util.Date getDate() { return new java.util.Date(time); }
    public long getTime() { return time; }

    // Low level methods
    public byte[] getEncodedValue() {
        return // berValue saved;
    }
    public String getID() {
        return GETTIME_RESP_OID;
    }
}

コントロール

このパッケージは、LDAPv3 コントロールを表す Control インタフェースを定義します。このインタフェースは、LDAP サーバに送信されるコントロール (要求コントロール) となるか、あるいは LDAP サーバによって返されるコントロール (応答コントロール) となります。拡張要求や拡張応答と異なり、必ずしも要求コントロールと応答コントロールの間でペアを組む必要はありません。要求コントロールを送信して応答コントロールが戻らないようにしたり、あるいは要求コントロールを送信しないで応答コントロールを受信したりできます。

アプリケーションは通常、このインタフェースを直接は処理しません。代わりに、このインタフェースを実装しているクラスを処理します。アプリケーションはコントロールクラスを、標準化されたコントロールのレパートリの一部として IETF から取得するか、あるいはベンダー固有コントロールのディレクトリベンダーから取得します。要求コントロールクラスには、型保証されたユーザが使いやすい方法で引数を受け取るコンストラクタが必要で、応答コントロールクラスには、型保証されたユーザが使いやすい方法で応答のデータを取得するためのアクセスメソッドが必要です。内部的には、要求コントロールクラスおよび応答コントロールクラスは BER 値の符号化および復号化を扱います。

たとえば、LDAP サーバが「ソート」の要求コントロールをサポートしている場合、このコントロールは、検索要求とともに送信された場合、検索結果を特定の属性で順序付けて返すようサーバに要求します。このコントロールは、アプリケーションがこの機能を使えるよう、SortControl クラスを指定します。アプリケーションはこのクラスを次のように使います。

Control[] reqCtls = new Control[] {new SortControl("age")};
ectx.setRequestControls(reqCtls);
NamingEnumeration enum = ectx.search(...);
SortControl クラスは次のように定義できます。
public class SortControl implements Control {
    // User-friendly constructor 
    public SortControl(String attrID) {
        // encode attrID
    };

    // Methods used by service providers
    public String getID() {
        return SORT_OID;
    }
    public byte[] getEncodedValue() {
        return // encoded attrID
    }
    ...
}

サービスプロバイダが応答コントロールを受信すると、このプロバイダは ControlFactory クラスを使って、Control インタフェースを実装する特定のクラスを生成します。

LDAP サーバは、LDAP 操作とともに応答コントロールを返信でき、またリストや検索操作などによって返された列挙結果とともに返信できます。LdapContext は、LDAP 操作とともに送信された応答コントロールを取得するメソッド (getResponseControls()) を提供し、HasControls は、列挙結果に関連した応答コントロールを取得するのに使用されます。

たとえば、変更完了にともない LDAP サーバが「ID 変更」コントロールを返信する場合、サーバは、アプリケーションがこの機能を使えるように ChangeIDControl クラスを指定します。アプリケーションは更新を行い、続いて ID 変更を取得しようとします。

// Perform update
Context ctx = ectx.createSubsubcontext("cn=newobj");

// Get response controls
Control[] respCtls = ectx.getResponseControls();
if (respCtls != null) {
    // Find the one we want
    for (int i = 0; i < respCtls; i++) {
        if(respCtls[i] instanceof ChangeIDControl) {
	    ChangeIDControl cctl = (ChangeIDControl)respCtls[i];
	    System.out.println(cctl.getChangeID());
        }
    }
}
ベンダーは次のような ChangeIDControl クラスおよび VendorXControlFactory クラスを指定します。VendorXControlFactory は、サービスプロバイダが LDAP サーバから応答コントロールを受信したときにそのプロバイダが使用します。
public class ChangeIDControl implements Control {
    long id;

    // Constructor used by ControlFactory
    ChangeIDControl(String OID, byte[] berVal) throws NamingException {
        // check validity of OID
        id = // extract change ID from berVal
    };

    // Type-safe and User-friendly method
    public long getChangeID() {
        return id;
    }

    // Low-level methods
    public String getID() {
        return CHANGEID_OID;
    }
    public byte[] getEncodedValue() {
        return // original berVal
    }
    ...
}
public class VendorXControlFactory extends ControlFactory {
    public VendorXControlFactory () {
    }

    public Control getControlInstance(Control orig) throws NamingException {
        if (isOneOfMyControls(orig.getID())) {
	    ... 

	    // determine which of ours it is and call its constructor
	    return (new ChangeIDControl(orig.getID(), orig.getEncodedValue()));
	}
        return null;  // not one of ours
    }
}

パッケージの仕様

「Java technology web site」では次のドキュメントを参照できます。

導入されたバージョン:
1.3

JavaTM 2 Platform
Std. Ed. v1.3

バグや機能要求の報告
さらに詳しい API リファレンスおよび開発者ドキュメントについては、 Java 2 SDK SE Developer Documentation を参照してください。このドキュメントには、概念、用語の定義、回避策、 実用的なコード例など、開発者を対象にした詳細な解説が掲載されています。

Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.