Description
I ran into a problem that I think needs some simple design work or a simple fix. For my project is is not necessary to handle referrals, so I decided to simply eliminate the ReferralIntercepter from my InterceptorChain. As soon as I did this, myDirectoryService started crapping on a NullPointerException buried in the bowels of the DefaultSearchHandler (something I definitely don't want to mess with for my project).
1) At DefaultSearchHandler.java:357 of there is an instantiation of a new SearchResponseIterator.
2) The constructor for SearchResponseIterator calls ServerLdapContex.isReferral() at SearchResponseItereator:117
3) ServerLdapContext.isReferral() results in a NPE at ServerLdapContext.java:264 unless your DirectoryService's InterceptorChain includes a ReferralInterceptor. Take a look at the constructor and you'll see why:
public ServerLdapContext( DirectoryService service, Hashtable<String, Object> env ) throws NamingException
{
super( service, env );
refService = ( ( ReferralInterceptor ) service.getInterceptorChain().get( ReferralInterceptor.class.getName() ) );
}
Is there any chance that we can simply Check refService for null before it's used ServerLdapContext.isReferral(). If it's refService==null, return false?
There's also similar a similar problem in PartitionNexusProxy.java:891 and 901. Here the code checks the chain for null, and returns, but it doesn't check the for null before invoking the interceptor method.
Here's the patch:
$ svn diff ServerLdapContext.java
Index: ServerLdapContext.java
===================================================================
— ServerLdapContext.java (revision 638966)
+++ ServerLdapContext.java (working copy)
@@ -261,7 +261,11 @@
*/
public boolean isReferral( String name ) throws NamingException
{
- return refService.isReferral( name );
+ if( refService == null )
+ { + return false; + }
+ return refService.isReferral( name );
}
/**
@@ -272,7 +276,11 @@
*/
public boolean isReferral( LdapDN name ) throws NamingException
{
- return refService.isReferral( name );
+ if( refService == null )
+ {+ return false;+ }+ return refService.isReferral( name );
$ svn diff PartitionNexusProxy.java
Index: PartitionNexusProxy.java
===================================================================
— PartitionNexusProxy.java (revision 638966)
+++ PartitionNexusProxy.java (working copy)
@@ -889,6 +889,10 @@
{
InterceptorChain chain = service.getInterceptorChain();
EventInterceptor interceptor = ( EventInterceptor ) chain.get( EventInterceptor.class.getName() );
+ if( interceptor == null )
+
interceptor.addNamingListener( ctx, name, filter, searchControls, namingListener );
}
@@ -901,6 +905,10 @@
return;
}
EventInterceptor interceptor = ( EventInterceptor ) chain.get( EventInterceptor.class.getName() );
+ if( interceptor == null )
+ {+ return;+ }
interceptor.removeNamingListener( ctx, namingListener );
}
}