/*
 * @(#)SearchRetAll.java	1.6 00/04/28
 *
 * [Revised by kam@stanford.edu to demonstrate searching
 * Stanford's public directory.
 * No warranty.]
 *
 * Copyright 1997, 1998, 1999 Sun Microsystems, Inc. All Rights
 * Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free,
 * license to use, modify and redistribute this software in source and
 * binary code form, provided that i) this copyright notice and license
 * appear on all copies of the software; and ii) Licensee does not
 * utilize the software in a manner which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
 * HEREBY EXCLUDED.  SUN AND ITS LICENSORS SHALL NOT BE LIABLE
 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
 * MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN
 * NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
 * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT
 * OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line
 * control of aircraft, air traffic, aircraft navigation or aircraft
 * communications; or in the design, construction, operation or
 * maintenance of any nuclear facility. Licensee represents and warrants
 * that it will not use or redistribute the Software for such purposes.
 */

import javax.naming.*;
import javax.naming.directory.*;

import java.util.Hashtable;

/**
 * Demonstrates how to perform a search
 * usage: java SearchRetAll
 */
class SearchRetAll {
    public static void main(String[] args) {

	// Set up the environment for creating the initial context
	Hashtable env = new Hashtable(11);
	env.put(Context.INITIAL_CONTEXT_FACTORY,
	    "com.sun.jndi.ldap.LdapCtxFactory");

	env.put(Context.PROVIDER_URL, "ldap://ldap.stanford.edu:389/");

	DirContext ctx = null;
	try {
	    // Create initial context
	    ctx = new InitialDirContext(env);

		SearchControls ctls = new SearchControls();
		ctls.setReturningAttributes(
			new String[] {"displayName", "mail","description", "suSunetID"});

	    NamingEnumeration answer =
	    	ctx.search("cn=People, dc=Stanford, dc=EDU",
	    				"(&(cn=k*)(sn=murray))", ctls);

	    // Print the answer
	    SearchResultPrinter.printSearchEnumeration(answer);


		} catch (Exception e) {
		    e.printStackTrace();
		}
		 // Close the context when we're done
		finally {
			closeContext(ctx);
		}
    }

    public static void closeContext(DirContext ctx)  {
		if (!(ctx == null)) {
			try {
				ctx.close();
			}
			catch (Exception closeProblem) {
				System.err.println("error closing Context - " + closeProblem.getMessage());
			}
		}
	}
}

class SearchResultPrinter {
	public static void printSearchEnumeration(NamingEnumeration answer)
			throws NamingException {


		  while (answer != null && answer.hasMore()) {
		       SearchResult sr = (SearchResult) answer.next();

		       printEntry(sr.getName(), sr.getAttributes());
		       System.out.println();
          }
	}

     private static void printEntry(String name, Attributes attrs)
             throws NamingException {
		 System.out.println(name);
         if (attrs != null) {
             for (NamingEnumeration ae = attrs.getAll(); ae.hasMore();) {
                 Attribute attr = (Attribute) ae.next();

                 String attrName = attr.getID();

                 System.out.println("  " + attrName);

                 for (NamingEnumeration ve = attr.getAll(); ve.hasMore();) {

                     	System.out.println("    " + ve.next());
                 }
                 System.out.println();

             }
         }


    }

}
