private int copyEntryRecursive( IEntry entryToCopy, IEntry parent, int scope, int num,
ExtendedProgressMonitor monitor )
{
try
{
SearchParameter param = new SearchParameter();
param.setSearchBase( entryToCopy.getDn() );
param.setFilter( ISearch.FILTER_TRUE );
param.setScope( ISearch.SCOPE_OBJECT );
param.setAliasesDereferencingMethod( IConnection.DEREFERENCE_ALIASES_NEVER );
param.setReferralsHandlingMethod( IConnection.HANDLE_REFERRALS_IGNORE );
param.setReturningAttributes( new String[]
{ ISearch.ALL_USER_ATTRIBUTES, IAttribute.REFERRAL_ATTRIBUTE } );
ISearch search = new Search( entryToCopy.getConnection(), param );
entryToCopy.getConnection().search( search, monitor );
ISearchResult[] srs = search.getSearchResults();
if ( !monitor.isCanceled() && srs != null && srs.length == 1 )
{
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 )
{
rdnAttribute = new Attribute( newEntry, part.getType() );
newEntry.addAttribute( rdnAttribute );
rdnAttribute.addValue( new Value( rdnAttribute, part.getUnencodedValue() ) );
}
else
{
boolean mustAdd = true;
IValue[] values = rdnAttribute.getValues();
for ( int ii = 0; ii < values.length; ii++ )
{
if ( part.getUnencodedValue().equals( values[ii].getStringValue() ) )
{
mustAdd = false;
break;
}
}
if ( mustAdd )
{
rdnAttribute.addValue( new Value( rdnAttribute, part.getUnencodedValue() ) );
}
}
}
newEntry.getConnection().create( newEntry, monitor );
newEntry.getParententry().addChild( newEntry );
newEntry.setHasChildrenHint( false );
num++;
monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.model__copied_n_entries,
new String[]
{ Integer.toString( num ) } ) );
// check for children
if ( !monitor.isCanceled() && ( scope == ISearch.SCOPE_ONELEVEL || scope == ISearch.SCOPE_SUBTREE ) )
{
SearchParameter subParam = new SearchParameter();
subParam.setSearchBase( entryToCopy.getDn() );
subParam.setFilter( ISearch.FILTER_TRUE );
subParam.setScope( ISearch.SCOPE_ONELEVEL );
subParam.setReturningAttributes( ISearch.NO_ATTRIBUTES );
ISearch subSearch = new Search( entryToCopy.getConnection(), subParam );
entryToCopy.getConnection().search( subSearch, monitor );
ISearchResult[] subSrs = subSearch.getSearchResults();
if ( !monitor.isCanceled() && subSrs != null && subSrs.length > 0 )