import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.directory.InvalidSearchControlsException;
import javax.naming.directory.InvalidSearchFilterException;
import com.novell.utility.naming.Environment;
import com.novell.service.nds.NdsObject;
import com.novell.service.nds.NdsObjectACL;
import com.novell.service.nds.NdsObjectRights;
class NdsSearch
{
static boolean SHOULD_PRINT_STRING_VALUES, SUCCESSFUL, VERBOSE;
static int ENTRY_RIGHTS;
static SearchControls CONTROLS;
static StringBuffer FILTER, NAME, PROVIDER_URL, SCOPE;
static Throwable EXCEPTION;
static
{
SUCCESSFUL = false;
FILTER = new StringBuffer("");
NAME = new StringBuffer("");
PROVIDER_URL = new StringBuffer("");
}
public static void main(String[] args)
{
try
{
parseArgs(args);
DirContext target = createInitialContext(PROVIDER_URL.toString());
NamingEnumeration search_result = target.search(
NAME.toString(),
FILTER.toString(),
CONTROLS);
System.out.println("\nExamining the search results");
if (search_result.hasMore())
while (search_result.hasMore())
printSearchResults((SearchResult)search_result.next());
else
System.out.println("The search returned no results");
}
catch (InvalidSearchFilterException isfe)
{
System.out.println("\nThe search filter you specified was invalid");
EXCEPTION = isfe;
}
catch (InvalidSearchControlsException isce)
{
System.out.println("\nThe search controls you specified were invalid");
EXCEPTION = isce;
}
catch (NamingException ne)
{
System.out.println("\nReceived a general naming exception");
EXCEPTION = ne;
}
catch (NullPointerException npe)
{
System.out.println("\nReceived a null pointer exception");
EXCEPTION = npe;
}
finally
{
System.out.println("");
if ((VERBOSE) && (EXCEPTION != null))
EXCEPTION.printStackTrace();
}
}
private static void printSearchResults(SearchResult search_result)
{
if (search_result != null)
{
System.out.println(search_result.getName());
}
else
System.out.println("No search results.");
}
private static DirContext createInitialContext(String _providerURL)
{
System.out.println("\nLooking up "
+ _providerURL
);
try
{
Hashtable hash = new Hashtable(11);
hash.put(Context.INITIAL_CONTEXT_FACTORY,
Environment.NDS_INITIAL_CONTEXT_FACTORY);
hash.put(Context.PROVIDER_URL, _providerURL);
InitialDirContext initDirCtx = new InitialDirContext(hash);
DirContext theReturnableObject = ((DirContext)initDirCtx.lookup(""));
System.out.println("Successfully looked it up");
return theReturnableObject;
}
catch (NamingException ne)
{
System.out.println("\nCouldn't lookup "
+ _providerURL);
System.out.println("\nOperation failed");
if (VERBOSE)
ne.printStackTrace();
System.exit(-1);
}
return null;
}
private static void parseArgs(String[] args)
{
if (args.length < 1)
help();
if ((args[0].equals("/?")) || (args[0].equals("-h")))
help();
for (int i=0; i < args.length; i++)
{
if (args[i].startsWith("-", 0))
{
if (args[i].equalsIgnoreCase("-v"))
VERBOSE = true;
if (args[i].equalsIgnoreCase("-u"))
{
if (i == args.length -1)
help();
i++;
PROVIDER_URL = new StringBuffer(args[i]);
System.out.println("Provider URL "
+ PROVIDER_URL);
}
else if (args[i].equalsIgnoreCase("-f"))
{
if (i == args.length -1)
help();
i++;
FILTER = new StringBuffer(args[i]);
System.out.println("Filter "
+ FILTER);
}
else if (args[i].equalsIgnoreCase("-s"))
{
if (i == args.length -1)
help();
i++;
CONTROLS = new SearchControls();
String scope = args[i];
if (scope.equalsIgnoreCase("OBJECT"))
CONTROLS.setSearchScope(SearchControls.OBJECT_SCOPE);
else if (scope.equalsIgnoreCase("ONELEVEL"))
CONTROLS.setSearchScope(SearchControls.ONELEVEL_SCOPE);
else if (scope.equalsIgnoreCase("SUBTREE"))
CONTROLS.setSearchScope(SearchControls.SUBTREE_SCOPE);
else
{
System.out.println("Bad search control specified.");
help();
}
System.out.println("Scope "
+ scope);
}
else if (args[i].equalsIgnoreCase("-n"))
{
if (i == args.length -1)
help();
i++;
NAME = new StringBuffer(args[i]);
System.out.println("Name "
+ NAME);
}
}
}
}
private static void help()
{
System.out.println("NdsSearch -- a search utility for NDS using Java");
System.out.println("usage: java NdsSearch [-u url] [-s scope] [-v] [-f filter_string] [-n name] ");
System.out.println("\nOPTIONS\n");
System.out.println("-u\tspecifies the NDS URL as a search base");
System.out.println("-s\tspecifies the search scope");
System.out.println("-v\tspecifies verbose errors (default is quiet)");
System.out.println("\nPARAMETERS\n");
System.out.println("url\tthe URL of the tree to search");
System.out.println("\ttakes the form of nds://[treename]/");
System.out.println("scope\tthe scope of the search to perform");
System.out.println("\tcan be ONELEVEL, SUBTREE, or OBJECT");
System.out.println("filter_string\tthe RFC 2254 search filter syntax to use to search");
System.out.println("name\tthe name of the object to search");
System.out.println("\nCAVEATS\n");
System.out.println(" * Requires an authenticated connection as a user with sufficient rights to search.");
System.out.println(" * Parameters can be specified in any order.");
System.out.println("\nEXAMPLES\n");
System.out.println("java NdsSearch -u nds://superstring/ -f (cn=kris)");
System.out.println("\tSearches the tree superstring for an object with");
System.out.println("\rattribute ID 'cn' with value 'kris'");
System.out.println("java NdsSearch -u nds://superstring/ -f (surname=magnusson) -n kris");
System.out.println("\tSearches the tree superstring for an object with");
System.out.println("\rattribute ID 'surname' with value 'magnusson', with name 'kris'");
System.exit(1);
}
}