The LDAPv3 protocol uses Controls to send and receive additional
data to affect the behavior of predefined operations. In order to simplify
the implementation of a request control
DirContextProcessor, Spring LDAP provides the base
class AbstractRequestControlDirContextProcessor. This
class handles the retrieval of the current request controls from the
LdapContext, calls a template method for creating a
request control, and adds it to the LdapContext. All
you have to do in the subclass is to implement the template method
createRequestControl, and of course the
postProcess method for performing whatever you need to
do after the search.
public abstract class AbstractRequestControlDirContextProcessor implements
DirContextProcessor {
public void preProcess(DirContext ctx) throws NamingException {
...
}
public abstract Control createRequestControl();
}A typical DirContextProcessor will be similar to the following:
Example 5.1. A request control DirContextProcessor implementation
package com.example.control;
public class MyCoolRequestControl extends AbstractRequestControlDirContextProcessor {
private static final boolean CRITICAL_CONTROL = true;
private MyCoolCookie cookie;
...
public MyCoolCookie getCookie() {
return cookie;
}
public Control createRequestControl() {
return new SomeCoolControl(cookie.getCookie(), CRITICAL_CONTROL);
}
public void postProcess(DirContext ctx) throws NamingException {
LdapContext ldapContext = (LdapContext) ctx;
Control[] responseControls = ldapContext.getResponseControls();
for (int i = 0; i < responseControls.length; i++) {
if (responseControls[i] instanceof SomeCoolResponseControl) {
SomeCoolResponseControl control = (SomeCoolResponseControl) responseControls[i];
this.cookie = new MyCoolCookie(control.getCookie());
}
}
}
}Make sure you use LdapContextSource when you
use Controls. The Control
interface is specific for LDAPv3 and requires that
LdapContext is used instead of
DirContext. If an
AbstractRequestControlDirContextProcessor subclass is
called with an argument that is not an LdapContext,
it will throw an IllegalArgumentException.