[
https://issues.apache.org/jira/browse/DIRAPI-189?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13972820#comment-13972820
]
Robert Hou commented on DIRAPI-189:
-----------------------------------
Only set AdDirSyncImpl control in the SearchRequest is right.
Looks like Apache API has some issues to handle request control and response
control when they have same OID. Even though I don't know how should API know
which side it is on, as far as I know JNDI has the correct implementation for
this from the test. Please refer to following codes:
import java.io.*;
import java.util.Hashtable;
import javax.naming.*;
import javax.naming.ldap.*;
import javax.naming.directory.*;
import com.sun.jndi.ldap.ctl.*;
public class ModChanges4SpecifiedFields {
public static void main(String[] args) {
Hashtable env = new Hashtable();
String adminName = "cn=robert,cn=roles,dc=tibco,dc=com";
String adminPassword = "robert";
String ldapURL = "ldap://192.168.80.223:50001";
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
// set security credentials, note using simple cleartext
authentication
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, adminName);
env.put(Context.SECURITY_CREDENTIALS, adminPassword);
// connect to my domain controller
env.put(Context.PROVIDER_URL, ldapURL);
try {
// Create the initial directory context
LdapContext ctx = new InitialLdapContext(env, null);
// Create the search controls
SearchControls searchCtls = new SearchControls();
// Specify the attributes to return, null initially
return all
// values
// and in subsequent calls, null returns all modified
attributes
String returnedAtts[] = {};
searchCtls.setReturningAttributes(returnedAtts);
// Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// specify the LDAP search filter
String searchFilter = "(&(objectClass=user))";
// Specify the Base for the search
String searchBase = "DC=tibco,DC=com";
// initialize counter to total the results
int totalResults = 0;
// Specify the DirSync and DirSyncResponse controls
byte[] cookie = null;
Control[] rspCtls;
Control[] ctls = new Control[] { new DirSyncControl() };
ctx.setRequestControls(ctls);
// Search for objects using the filter
NamingEnumeration answer = ctx.search(searchBase,
searchFilter,searchCtls);
// Loop through the search results
while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult) answer.next();
totalResults++;
System.out.println(">>>" + sr.getName());
// First time around, no need to print any
attributes
}
System.out.println("Current results: " + totalResults);
// save the response controls
if ((rspCtls = ctx.getResponseControls()) != null) {
System.out.println("Response Controls: " +
rspCtls.length);
for (int i = 0; i < rspCtls.length; i++) {
if (rspCtls[i] instanceof
DirSyncResponseControl1) {
DirSyncResponseControl1 rspCtl
= (DirSyncResponseControl1) rspCtls[i];
cookie = rspCtl.getCookie();
System.out.println("Flag: " +
rspCtl.getFlag());
System.out.println("Length: "+
rspCtl.getMaxReturnLength());
System.out.println("Cookie: " +
cookie.toString());
}
}
}
// Now start a loop, prompt the user to continue/quit
and continue
// searching for modified objects
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
while (true) {
try {
String input;
while (true) {
System.out.println("Press x to
exit, return to continue");
input = in.readLine();
if (input.startsWith("x") ||
input.startsWith("X")) {
ctx.close();
System.exit(0);
}
else {
break;
}
}
}
catch (IOException e) {
System.err.println();
}
// now lets do the search again using the cookie
totalResults = 0;
// use the saved cookie in the DirSync control
ctx.setRequestControls(new Control[] { new
DirSyncControl1(1,Integer.MAX_VALUE, cookie, true) });
// execute the search again
String returnedAtts1[] = {"description"};
searchCtls.setReturningAttributes(returnedAtts1);
answer = ctx.search(searchBase, searchFilter,
searchCtls);
// Loop through the search results
while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult)
answer.next();
totalResults++;
System.out.println(">>>" +
sr.getName());
// Print out the modified attributes
// instanceType and objectGUID are
always returned
Attributes attrs = sr.getAttributes();
if (attrs != null) {
try {
for (NamingEnumeration
ae = attrs.getAll(); ae.hasMore();) {
Attribute attr
= (Attribute) ae.next();
System.out.println("Attribute: " + attr.getID());
for
(NamingEnumeration e = attr.getAll(); e.hasMore();
System.out.println(" "+ e.next().toString()));
}
}
catch (NullPointerException e) {
System.err.println();
}
}
}
System.out.println("Recently Modified: " +
totalResults);
// Save the response control again
if ((rspCtls = ctx.getResponseControls()) !=
null) {
System.out.println("Response Controls:
" + rspCtls.length);
for (int i = 0; i < rspCtls.length;
i++) {
if (rspCtls[i] instanceof
DirSyncResponseControl1) {
DirSyncResponseControl1
rspCtl = (DirSyncResponseControl1) rspCtls[i];
cookie =
rspCtl.getCookie();
System.out.println("Flag: " + rspCtl.getFlag());
System.out.println("Length: "+ rspCtl.getMaxReturnLength());
System.out.println("Cookie: " + cookie.toString());
}
}
}
}
}
catch (NamingException e) {
System.err.println("Problem searching directory: " + e);
}
catch (java.io.IOException e) {
System.err.println("Problem searching directory: " + e);
}
}
}
> Support DirSync control
> -----------------------
>
> Key: DIRAPI-189
> URL: https://issues.apache.org/jira/browse/DIRAPI-189
> Project: Directory Client API
> Issue Type: Wish
> Affects Versions: 1.0.0-M21
> Reporter: Robert Hou
> Fix For: 1.0.0-M22
>
>
> I originally wanted to impletent DirSync Control using Apache API. After I
> looked into existing Controls under
> org.apache.directory.api.ldap.model.message.controls. I think it's difficult
> to me. I can't understand the decoding and encoding of controls specification
> of Apache. So I want Apache team give implementation for this control.
> Details for this control, please refer to
> http://msdn.microsoft.com/en-us/library/ms677626(v=vs.85).aspx.
--
This message was sent by Atlassian JIRA
(v6.2#6252)