Entry referralAncestor ) throws Exception
{
LOG.debug( "Inside getReferralOnAncestor()" );
Attribute refAttr = ((ClonedServerEntry)referralAncestor).getOriginalEntry().get( SchemaConstants.REF_AT );
Referral referral = new ReferralImpl();
for ( Value<?> value : refAttr )
{
String ref = value.getString();
LOG.debug( "Calculating LdapURL for referrence value {}", ref );
// need to add non-ldap URLs as-is
if ( !ref.startsWith( "ldap" ) )
{
referral.addLdapUrl( ref );
continue;
}
// parse the ref value and normalize the Dn
LdapUrl ldapUrl = null;
try
{
ldapUrl = new LdapUrl( ref );
}
catch ( LdapURLEncodingException e )
{
LOG.error( I18n.err( I18n.ERR_165, ref, referralAncestor ) );
}
Dn urlDn = new Dn( session.getCoreSession().getDirectoryService()
.getSchemaManager(), ldapUrl.getDn().getName() );
if ( urlDn.getNormName().equals( referralAncestor.getDn().getNormName() ) )
{
// according to the protocol there is no need for the dn since it is the same as this request
StringBuilder buf = new StringBuilder();
buf.append( ldapUrl.getScheme() );
buf.append( ldapUrl.getHost() );
if ( ldapUrl.getPort() > 0 )
{
buf.append( ":" );
buf.append( ldapUrl.getPort() );
}
referral.addLdapUrl( buf.toString() );
continue;
}
/*
* If we get here then the Dn of the referral was not the same as the
* Dn of the ref LDAP URL. We must calculate the remaining (difference)
* name past the farthest referral Dn which the target name extends.
*/
Dn suffix = req.getBase().getDescendantOf( referralAncestor.getDn() );
urlDn = urlDn.add( suffix );
StringBuilder buf = new StringBuilder();
buf.append( ldapUrl.getScheme() );
buf.append( ldapUrl.getHost() );
if ( ldapUrl.getPort() > 0 )
{
buf.append( ":" );
buf.append( ldapUrl.getPort() );
}
buf.append( "/" );
buf.append( LdapUrl.urlEncode( urlDn.getName(), false ) );
referral.addLdapUrl( buf.toString() );
}
return referral;
}