{
entryToCopy = srs[0].getEntry();
IAttribute[] attributesToCopy = entryToCopy.getAttributes();
// create new entry
RDN rdn = entryToCopy.getRdn();
IEntry newEntry = new Entry( parent, rdn );
// change RDN if entry already exists
ExtendedProgressMonitor testMonitor = new ExtendedProgressMonitor( monitor );
IEntry testEntry = parent.getConnection().getEntry( newEntry.getDn(), testMonitor );
if ( testEntry != null )
{
String rdnValue = rdn.getValue();
String newRdnValue = BrowserCoreMessages.bind( BrowserCoreMessages.copy_n_of_s, "", rdnValue ); //$NON-NLS-1$
RDN newRdn = getNewRdn( rdn, newRdnValue );
newEntry = new Entry( parent, newRdn );
testEntry = parent.getConnection().getEntry( newEntry.getDn(), testMonitor );
for ( int i = 2; testEntry != null; i++ )
{
newRdnValue = BrowserCoreMessages.bind( BrowserCoreMessages.copy_n_of_s, i + " ", rdnValue ); //$NON-NLS-1$
newRdn = getNewRdn( rdn, newRdnValue );
newEntry = new Entry( parent, newRdn );
testEntry = parent.getConnection().getEntry( newEntry.getDn(), testMonitor );
}
}
// copy attributes
for ( int i = 0; i < attributesToCopy.length; i++ )
{
IAttribute attributeToCopy = attributesToCopy[i];
if ( SchemaUtils.isModifyable( attributeToCopy.getAttributeTypeDescription() )
|| IAttribute.REFERRAL_ATTRIBUTE.equalsIgnoreCase( attributeToCopy.getDescription() ) )
{
IAttribute newAttribute = new Attribute( newEntry, attributeToCopy.getDescription() );
newEntry.addAttribute( newAttribute );
IValue[] valuesToCopy = attributeToCopy.getValues();
for ( int j = 0; j < valuesToCopy.length; j++ )
{
IValue valueToCopy = valuesToCopy[j];
IValue newValue = new Value( newAttribute, valueToCopy.getRawValue() );
newAttribute.addValue( newValue );
}
}
}
// check if RDN attributes ar present
RDN newRdn = newEntry.getRdn();
RDNPart[] oldRdnParts = rdn.getParts();
for ( int i = 0; i < oldRdnParts.length; i++ )
{
RDNPart part = oldRdnParts[i];
IAttribute rdnAttribute = newEntry.getAttribute( part.getType() );
if ( rdnAttribute != null )
{
IValue[] values = rdnAttribute.getValues();
for ( int ii = 0; ii < values.length; ii++ )
{
if ( part.getUnencodedValue().equals( values[ii].getRawValue() ) )
{
rdnAttribute.deleteValue( values[ii] );
}
if ( rdnAttribute.getValueSize() == 0 )
{
newEntry.deleteAttribute( rdnAttribute );
}
}
}
}
RDNPart[] newRdnParts = newRdn.getParts();
for ( int i = 0; i < newRdnParts.length; i++ )
{
RDNPart part = newRdnParts[i];
IAttribute rdnAttribute = newEntry.getAttribute( part.getType() );
if ( rdnAttribute == null )