Persistent search in JNDI is based on event listeners that are registered using an EventDirContext. You could try something like this:
Code:
public void testPersistentSearch() throws Exception {
final SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
ContextExecutor contextExecutor = new ContextExecutor() {
public Object executeWithContext(DirContext ctx) throws NamingException {
EventDirContext ectx = (EventDirContext) ctx.lookup("");
ectx.addNamingListener("", "(cn=*)", searchControls, new MyEventListener("listener_1"));
return null;
}
};
ldapTemplate.executeReadOnly(contextExecutor);
// test the listener
ldapTemplate.unbind("cn=Some Person99,ou=company1,c=Sweden");
}
where MyEventlistener looks like this:
Code:
/**
* MyEventlistener class An instance of this class is registered with an
* EventDirContext object. The registered instance's NamespaceChangeListener
* interface methods are called when a pertinent event occurs.
*/
private static class MyEventListener implements NamespaceChangeListener, ObjectChangeListener {
private String id;
public MyEventListener(String id) {
this.id = id;
}
public void objectAdded(NamingEvent evt) {
System.out.println("\n\n" + id + ">>> object added event. Object Name: " + evt.getNewBinding().getName());
}
public void objectRemoved(NamingEvent evt) {
System.out.println("\n\n" + id + ">>> object removed event. Object Name: " + evt.getOldBinding().getName());
}
public void objectRenamed(NamingEvent evt) {
System.out.println("\n\n" + id + ">>> object renamed event. New name: " + evt.getNewBinding().getName()
+ " Old name: " + evt.getOldBinding().getName());
}
public void objectChanged(NamingEvent evt) {
System.out.println("\n\n" + id + ">>> object changed event. Object name: " + evt.getNewBinding().getName());
}
public void namingExceptionThrown(NamingExceptionEvent evt) {
System.out.println("\n\n" + id + ">>> Listener received a naming exception");
evt.getException().printStackTrace();
}
}