package com.idega.core.ldap.test;
import java.util.Hashtable;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
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;
/**
* This example shows how different searches are done on the ldap server
* Usage :java DifferentSearches [Lookup |Basic |Filter |ContorlAttributes |ControlResults|Compare
*/
public class DifferentSearches{
public static void main(String args[]) throws Exception{
if(args.length==0){
System.out.println("Usage :java DifferentSearches [Lookup |Basic |Filter |ContorlAttributes |ControlResults|Compare]");
System.exit(0);
}
DifferentSearches dc = new DifferentSearches();
if(args[0].equalsIgnoreCase("Lookup")) {
dc.doLookup();
}
else if(args[0].equalsIgnoreCase("Basic")) {
dc.doBasicSearch();
}
else if(args[0].equalsIgnoreCase("Filter")) {
dc.doFilterSearch();
}
else if(args[0].equalsIgnoreCase("ControlAttributes")) {
dc.controlArrtibutesInResults();
}
else if(args[0].equalsIgnoreCase("ControlResults")) {
dc.controlResults();
}
else if(args[0].equalsIgnoreCase("Compare")) {
dc.doCompareSearch();
}
else {
System.out.println("Usage :java DifferentSearches [Lookup |Basic|Filter|ControlAttributes|ControlResults|Compare]");
}
}
/**
* This method does a simple lookup for DN=cn=vectorid-2,ou=JavaObjects,o=myserver.com
*/
public void doLookup() throws Exception{
Context ctx= getContext();
Object vec =ctx.lookup("cn=vectorid-2,ou=JavaObjects,o=myserver.com");
System.out.println("Object returned for DN cn=vectorid-2,ou=JavaObjects,o=myserver.com is instance of vector =" + (vec instanceof Vector));
ctx.close();
}
/**
* This method does a basic search on the subtree for any entry that has the uid=kevink attribute
*/
public void doBasicSearch() throws Exception{
DirContext ctx= getDirContext();
Attributes matchAttrs = new BasicAttributes(true); // ignore attribute name case
matchAttrs.put(new BasicAttribute("uid", "kevink"));
// Search for objects with those matching attributes
NamingEnumeration answer = ctx.search("ou=People,o=myserver.com", matchAttrs);
formatResults(answer);
ctx.close();
}
/**
* Search for objects using filter
* Create search controls and allow java objects to be returned in the results.
* Specify the search filter as entries attribute cn=vectorid-1 and the attribute
* lastlogin has any value
*/
public void doFilterSearch() throws Exception{
DirContext ctx= getDirContext();
SearchControls ctls = new SearchControls();
ctls. setReturningObjFlag (true);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(&(cn=vectorid-1)( lastlogin=*))";
NamingEnumeration answer = ctx.search("o=myserver.com", filter, ctls);
formatResults(answer);
ctx.close();
}
/**
* This methos shows how to search and control arrtibutes returned in the result.
* Create search controls and allow java objects to be returned in the results.
* Specify the search filter as entries attribute cn=vectorid-1 and the attribute
* lastlogin has any value.
* Only the attributes cn and lastlogin should be returned in the results
*/
public void controlArrtibutesInResults() throws Exception{
DirContext ctx= getDirContext();
// Specify the ids of the attributes to return
String[] attrIDs = {"cn", "lastlogin"};
SearchControls ctls = new SearchControls();
ctls. setReturningAttributes (attrIDs);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(&(cn=vectorid-1)( lastlogin=*))";
NamingEnumeration answer = ctx.search("o=myserver.com", filter, ctls);
formatResults(answer);
ctx.close();
}
/**
* This methos shows how to search and control the actual results returned.
* Create search controls and allow java objects to be returned in the results.
* Specify the search filter as entries attribute cn=vectorid-1 and the attribute
* lastlogin has any value.
* Specify that a max of 2 results should be returned.
*/
public void controlResults()throws Exception{
DirContext ctx= getDirContext();
SearchControls ctls = new SearchControls();
ctls.setCountLimit(2);
ctls.setReturningObjFlag(true);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(&(cn=*)(lastlogin=*))";
NamingEnumeration answer = ctx.search("o=myserver.com", filter, ctls);
formatResults(answer);
ctx.close();
}
/**
* Ask the server to do a compare and tell us if the DN vectorid-1,ou=JavaObjects,o=myserver.com
* has an attribute called lastlogin and that attribute has 200 as one of its values.
* If yes, the results would contain 1 unique entry since there is no way to return a boolean
* If not, the results would be empty.
*/
public void doCompareSearch() throws Exception{
DirContext ctx= getDirContext();
SearchControls ctls = new SearchControls();
ctls. setReturningObjFlag (true);
ctls.setReturningAttributes(new String[0]);
ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
String filter = "(lastlogin=200)";
NamingEnumeration answer = ctx.search("cn=vectorid-1,ou=JavaObjects,o=myserver.com", filter, ctls);
formatResults(answer);
ctx.close();
}
/*
* Generic method to format the NamingEnumeration returned from a search.
*/
public void formatResults(NamingEnumeration enumer) throws Exception{
int count=0;
try {
while (enumer.hasMore()) {
SearchResult sr = (SearchResult)enumer.next();
System.out.println("SEARCH RESULT:" + sr.getName());
formatAttributes(sr.getAttributes());
System.out.println("====================================================");
count++;
}
System.out.println("Search returned "+ count+ " results");
} catch (NamingException e) {
e.printStackTrace();
}
}
/*
* Generic method to format the Attributes .Displays all the multiple values of
* each Attribute in the Attributes
*/
public void formatAttributes(Attributes attrs) throws Exception{
if (attrs == null) {
System.out.println("This result has no attributes");
} else {
try {
for (NamingEnumeration enumer = attrs.getAll(); enumer.hasMore();) {
Attribute attrib = (Attribute)enumer.next();
System.out.println("ATTRIBUTE :" + attrib.getID());
for (NamingEnumeration e = attrib.getAll();e.hasMore();) {
System.out.println("\t\t = " + e.next());
}
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}
/** Generic method to obtain a reference to a DirContext
*/
public DirContext getDirContext() throws Exception{
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389");
// Create the initial context
DirContext ctx = new InitialDirContext(env);
return ctx;
}
/** Generic method to obtain a reference to a Context object.
*/
public Context getContext() throws Exception{
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389");
// Create the initial context
Context ctx = new InitialContext(env);
return ctx;
}
}