{
if ( aliasDn.equals( normalizedAliasTargetDn ) )
{
String msg = "[36] aliasDereferencingProblem - attempt to create alias to itself.";
ResultCodeEnum rc = ResultCodeEnum.ALIAS_DEREFERENCING_PROBLEM;
LdapNamingException e = new LdapNamingException( msg, rc );
e.setResolvedName( aliasDn );
throw e;
}
String msg = "[36] aliasDereferencingProblem - "
+ "attempt to create alias with cycle to relative " + aliasTarget
+ " not allowed from descendent alias " + aliasDn;
ResultCodeEnum rc = ResultCodeEnum.ALIAS_DEREFERENCING_PROBLEM;
LdapNamingException e = new LdapNamingException( msg, rc );
e.setResolvedName( aliasDn );
throw e;
}
/*
* Check For Aliases External To Naming Context
*
* id may be null but the alias may be to a valid entry in
* another namingContext. Such aliases are not allowed and we
* need to point it out to the user instead of saying the target
* does not exist when it potentially could outside of this upSuffix.
*/
if ( !normalizedAliasTargetDn.startsWith( normSuffix ) )
{
String msg = "[36] aliasDereferencingProblem - "
+ " the alias points to an entry outside of the " + upSuffix.getUpName()
+ " namingContext to an object whose existence cannot be determined.";
ResultCodeEnum rc = ResultCodeEnum.ALIAS_DEREFERENCING_PROBLEM;
LdapNamingException e = new LdapNamingException( msg, rc );
e.setResolvedName( aliasDn );
throw e;
}
// L O O K U P T A R G E T I D
targetId = ndnIdx.forwardLookup( normalizedAliasTargetDn.toNormName() );
/*
* Check For Target Existence
*
* We do not allow the creation of inconsistent aliases. Aliases should
* not be broken links. If the target does not exist we start screaming
*/
if ( null == targetId )
{
// Complain about target not existing
String msg = "[33] aliasProblem - "
+ "the alias '" + aliasDn.getUpName() + "' when dereferenced would not name a known object."
+ "The aliased ObjectName '" + aliasTarget + "' must be set to a valid existing entry.";
ResultCodeEnum rc = ResultCodeEnum.ALIAS_PROBLEM;
LdapNamingException e = new LdapNamingException( msg, rc );
e.setResolvedName( aliasDn );
throw e;
}
/*
* Detect Direct Alias Chain Creation
*
* Rather than resusitate the target to test if it is an alias and fail
* due to chaing creation we use the alias index to determine if the
* target is an alias. Hence if the alias we are about to create points
* to another alias as its target in the aliasedObjectName attribute,
* then we have a situation where an alias chain is being created.
* Alias chaining is not allowed so we throw and exception.
*/
if ( null != aliasIdx.reverseLookup( targetId ) )
{
String msg = "[36] aliasDereferencingProblem - "
+ " the alias points to another alias. Alias chaining is not supported by this backend.";
ResultCodeEnum rc = ResultCodeEnum.ALIAS_DEREFERENCING_PROBLEM;
LdapNamingException e = new LdapNamingException( msg, rc );
e.setResolvedName( aliasDn );
throw e;
}
// Add the alias to the simple alias index
aliasIdx.add( normalizedAliasTargetDn.getNormName(), aliasId );