
|
If you were logged in you would be able to see more operations.
|
|
|
| Resolution Date: |
27/Jul/06 11:36 PM
|
|
When trying to modify an attribute with an existing value, the following exception should be generated:
LdapAttributeInUseException( "Trying to add existing value 'XYZ' to attribute ABC");
But instead the code is generating a IndexOutOfBoundsException because there is a bug in the code that is generating the correct exception.
This is the wrong code:
public void modify( NextInterceptor nextInterceptor, Name name, ModificationItem[] items ) throws NamingException
{
// check if entry to modify exists
String msg = "Attempt to modify non-existant entry: ";
assertHasEntry( nextInterceptor, msg, name );
Attributes entry = nexus.lookup( name );
for ( int ii = 0; ii < items.length; ii++ )
{
if ( items[ii].getModificationOp() == DirContext.ADD_ATTRIBUTE )
{
Attribute modAttr = items[ii].getAttribute();
Attribute entryAttr = entry.get( modAttr.getID() );
if ( entryAttr != null )
{
for ( int jj = 0; jj < modAttr.size(); jj++ )
{
if ( entryAttr.contains( modAttr.get( jj ) ) )
{
throw new LdapAttributeInUseException( "Trying to add existing value '"
+ modAttr.get( ii ) + "' to attribute " + modAttr.getID() ); <----- HERE IS THE PROBLEM, should use modAttr.get( jj )
}
}
}
}
}
nextInterceptor.modify( name, items );
}
|
|
Description
|
When trying to modify an attribute with an existing value, the following exception should be generated:
LdapAttributeInUseException( "Trying to add existing value 'XYZ' to attribute ABC");
But instead the code is generating a IndexOutOfBoundsException because there is a bug in the code that is generating the correct exception.
This is the wrong code:
public void modify( NextInterceptor nextInterceptor, Name name, ModificationItem[] items ) throws NamingException
{
// check if entry to modify exists
String msg = "Attempt to modify non-existant entry: ";
assertHasEntry( nextInterceptor, msg, name );
Attributes entry = nexus.lookup( name );
for ( int ii = 0; ii < items.length; ii++ )
{
if ( items[ii].getModificationOp() == DirContext.ADD_ATTRIBUTE )
{
Attribute modAttr = items[ii].getAttribute();
Attribute entryAttr = entry.get( modAttr.getID() );
if ( entryAttr != null )
{
for ( int jj = 0; jj < modAttr.size(); jj++ )
{
if ( entryAttr.contains( modAttr.get( jj ) ) )
{
throw new LdapAttributeInUseException( "Trying to add existing value '"
+ modAttr.get( ii ) + "' to attribute " + modAttr.getID() ); <----- HERE IS THE PROBLEM, should use modAttr.get( jj )
}
}
}
}
}
nextInterceptor.modify( name, items );
}
|
Show » |
|
The fix was perfect !
I added a junit test case just in case, and fixed the code the way you proposed to do.