﻿
import java.util.Hashtable;
import java.util.Enumeration;

import javax.naming.*;
import javax.naming.directory.*;

/**
 * @author Arnaud LE NORCY
 * 
 * Classe permettant la recherche et l'affichage de données issues d'un annuaire
 * LDAP
 *  
 */
class RechercheLDAP {

	// Cette méthode rend la prmier valeur d'un attribut pour un DN donnée d'une
	// base LDAP.
	public static String RechercheElementJNDI(String annuaire, String dnDeBase,
			String filtre, String attribut) {
		Hashtable env = new Hashtable();

		//Fournisseur de service d'annuaire
		env.put(Context.INITIAL_CONTEXT_FACTORY,
				"com.sun.jndi.ldap.LdapCtxFactory");

		//Adresse de l'annuaire LDAP
		env.put(Context.PROVIDER_URL, annuaire);

		//Identification (en commentaire dans le cas d'un bind anonyme)
		//env.put(Context.SECURITY_AUTHENTICATION, "simple");
		//env.put(Context.SECURITY_PRINCIPAL, "cn=Manager");
		//env.put(Context.SECURITY_CREDENTIALS, "secret");

		try {
			//Recuperer un pointeur sur contexte
			DirContext ctx = new InitialDirContext(env);

			//Options de recherche
			SearchControls constraints = new SearchControls();
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

			//Indication du DN de la base et du filtre de recherche
			NamingEnumeration results = ctx.search(dnDeBase, filtre,
					constraints);

			//Pour chaque entrée, afficher les attributs
			while (results != null && results.hasMore()) {
				//Lecture d'une entrée
				SearchResult entry = (SearchResult) results.next();

				Attributes attrs = entry.getAttributes();
				if (attrs == null) {
					// aucun attributs associés à ce DN...
					return null;
				} else {
					//Parcours de tous les attributs
					for (NamingEnumeration attEnum = attrs.getAll(); attEnum
							.hasMoreElements();) {
						Attribute attr = (Attribute) attEnum.next();
						String attrId = attr.getID();
						if (attrId.equals(attribut)) {
							Enumeration vals = attr.getAll();
							vals.hasMoreElements();
							// Retour de la première valeur de l'attribut
							return (vals.nextElement().toString());
						}
					}
				}
			}
		} catch (NamingException e) {
			System.err.println("La recherche a echouee");
			e.printStackTrace();
		}
		return null;
	}

	// fonction "main" permettant les tests. 
	public static void main(String[] args) {
		
		// Affichage de l'adresse email de l'utilisateur "alenorcy"  :
		System.out.println(RechercheElementJNDI(
				"ldap://ldap.rennes.enst-bretagne.fr:389",
				"o=personnel,dc=enst-bretagne,dc=fr", "cn=alenorcy", "mail"));
	}
}