//Warning: This code has been marked up for HTML

/**************************************************************************
*  Novell Software Developer Kit
*
*  Copyright (C) 2002-2003 Novell, Inc. All Rights Reserved.
*
*  THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
*  USE AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO THE LICENSE AGREEMENT
*  ACCOMPANYING THE SOFTWARE DEVELOPER KIT (SDK) THAT CONTAINS THIS WORK.
*  PURSUANT TO THE SDK LICENSE AGREEMENT, NOVELL HEREBY GRANTS TO DEVELOPER A
*  ROYALTY-FREE, NON-EXCLUSIVE LICENSE TO INCLUDE NOVELL'S SAMPLE CODE IN ITS
*  PRODUCT. NOVELL GRANTS DEVELOPER WORLDWIDE DISTRIBUTION RIGHTS TO MARKET,
*  DISTRIBUTE, OR SELL NOVELL'S SAMPLE CODE AS A COMPONENT OF DEVELOPER'S
*  PRODUCTS. NOVELL SHALL HAVE NO OBLIGATIONS TO DEVELOPER OR DEVELOPER'S
*  CUSTOMERS WITH RESPECT TO THIS CODE.
*
* $name:         GetDSE.java
* $description:  Getdse.java demonstrates how to get root DSE. For known
*                extensions and controls, a lookup table is used to print
*                a descriptive name.
* $sample run:
*              
* Root DSE:
*--------------------------------------
*   Attributes of Root DSE:
*     wholeSubtreeSearchOps
*       0
*     supportedExtension
*       2.16.840.1.113719.1.27.100.79
*       2.16.840.1.113719.1.27.100.80
*       1.3.6.1.4.1.1466.20037
*       2.16.840.1.113719.1.27.100.55  (Trigger Partition Purge Request)
*       2.16.840.1.113719.1.27.100.56  (Trigger Partition Purge Response)
*       2.16.840.1.113719.1.27.100.53  (Trigger Schema Sync Request)
*       2.16.840.1.113719.1.27.100.54  (Trigger Schema Sync Response)
*       2.16.840.1.113719.1.27.100.51  (Trigger Skulker Request)
*       2.16.840.1.113719.1.27.100.52  (Trigger Skulker Response)
*       2.16.840.1.113719.1.27.100.49  (Trigger Limber Request)
*       2.16.840.1.113719.1.27.100.50  (Trigger Limber Response)
*       2.16.840.1.113719.1.27.100.47  (Trigger Janitor Request)
*       2.16.840.1.113719.1.27.100.48  (Trigger Janitor Response)
*       2.16.840.1.113719.1.27.100.45  (Trigger DRL process Request)
*       2.16.840.1.113719.1.27.100.46  (Trigger DRL process Response)
*       2.16.840.1.113719.1.27.100.43  (Trigger Back Linker Request)
*       2.16.840.1.113719.1.27.100.44  (Trigger Back Linker Response)
******************************************************************************/
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class GetDSE implements LDAPOIDs {

    private int len = NamesAndOIDs.length;

    public static void main(String[] args) {

    if (args.length != 1) {
        usage();
    }

    String hostURL =  args[0];
    GetDSE dse = new GetDSE();
    String oid, value;

    /*  To get root DSE
     *      1. set searchBase equals empty string
     *      2. set seatchFilter equals objectclass = *
     *      3. pass OBJECT_SCOPE to setSearchScope() method
     */
    String searchBase    = "";
    String searchFilter  = "(objectclass=*)";
    SearchControls ctrl = new SearchControls();
    ctrl.setSearchScope(SearchControls.OBJECT_SCOPE);

    try {

        /* Setup environment properties */
        Hashtable env = new Hashtable(5, 0.75f);
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                                "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, hostURL);

        /* Construct an initial DirContext object */
        DirContext ctx = new InitialDirContext (env);

        /* Search the directory */
        NamingEnumeration results = ctx.search(searchBase, // search base

                           searchFilter// search filter

                           ctrl);      // search scope


        /* Now the search results contains only one entry - root DSE */
        SearchResult nextEntry = ( SearchResult )results.next();
        Attributes attrSet = nextEntry.getAttributes();

        /* Printout root DSE's attributes and corresponding values */
        if (attrSet != null) {
        System.out.println("\n\tRoot DSE:\n---------------------------"
                   + "-----------\n    Attributes of Root DSE:");

        NamingEnumeration attrs = attrSet.getAll();
        while ( attrs.hasMoreElements() ) {
            Attribute attr = (Attribute)attrs.next();
            String attrID = attr.getID();
            System.out.println("        " + attrID );

            NamingEnumeration values = attr.getAll();

            while ( values.hasMoreElements() ) {
            if ( (attrID.equalsIgnoreCase("supportedExtension"))
               ||(attrID.equalsIgnoreCase("supportedControl"))) {
               oid = (String) values.nextElement();
               System.out.print("          " + oid);
               dse.getOidInfo(oid);
            }
            else {
                value = (String) values.nextElement();
                System.out.println("            " + value);
            }
            }
        }
        }

        System.out.println("\n\tGetDSE was completed.");
    }
    catch (NamingException e) {
        System.err.println("\n\tGetDSE example failed.");
        e.printStackTrace();
    }
    finally {
        System.exit(0);
    }
    }

    public static void usage() {
        System.out.println("\n Usage:   java GetDSE <host URL>");
        System.out.println("\n Example: java GetDSE ldap://Acme.com:389");
        System.exit(1);
    }

    public void getOidInfo( String value ) {

    String descriptiveName="";

    for ( int i = 0; i < len; i++ ) {
        if ( value.equalsIgnoreCase(NamesAndOIDs[i][OIDValueIndex]) ) {
        descriptiveName = NamesAndOIDs[i][OIDDescrIndex];
        if (descriptiveName.length() != 0) {
            System.out.print( "  (" + descriptiveName + ")\n" );
            break;
        }
        else
            System.out.println("");
        }
    }
    if (descriptiveName.length() == 0) {
        System.out.print("\n");
    }
    }
}