17.2 | Programmierung mit einem Verzeichnisdienst |
Für den speziellen Umgang mit Verzeichnisdiensten (wie beispielsweise LDAP) benutzt man statt des normalen Context die Unterklasse DirContext, die neben den Methoden für Namensdienste spezifische Methoden für Verzeichnisdienste anbietet.
Jede Bindung besitzt neben dem eigentlichen Objekt Attribute, die über entsprechende Methoden im DirContext abgefragt werden können. Über die zusätzliche Methode search() kann zudem eine Suchanfrage über das Verzeichnis gestellt werden.
Im folgenden Beispiel wird eine LDAP-spezifische Suchanfrage gestellt. Hierbei wird die boolesche Verknüpfung (¦ bedeutet »oder«) vor die Argumente gestellt. Es werden also alle (Unter-)Elemente gesucht, die unterhalb (beliebige Tiefe) des Verzeichnisbaums c=DE (Land), o=FH-Heilbronn (Organisation) und ou=People (Organisationseinheit) liegen und deren Attribut fhstudiengang MI oder IM ist.
Hashtable env = new Hashtable();
// Provider (Implementierung setzen)
env.put(Context.PROVIDER_URL,
"ldap://ldap-master.fh-heilbronn.de:389");
// Kontext setzen (Directory-Kontext)
DirContext ctx = new InitialDirContext(env);
// Suchparameter
SearchControls constraints = new SearchControls();
// Auch Unterebenen durchsuchen
constraints.setSearchScope(
SearchControls.SUBTREE_SCOPE);
// Suche starten
NamingEnumeration results = ctx.search(
"ou=People,o=FH-Heilbronn,c=DE",
"|(fhstudiengang=MI)(fhstudiengang=IM)",
constraints);
// Durch alle gefundenen Datensätze durchgehen
while (results != null && results.hasMore()) {
// Das nächste Ergebnis aussuchen
SearchResult si = (SearchResult) results.next();
// Attribute
Attributes attrs = si.getAttributes();
if (attrs == null)
System.out.println("No attributes");
else // Nur die UID ausgeben
System.out.println(
"uid: "+attrs.get("uid"));
}