You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by fe...@apache.org on 2007/11/26 20:44:37 UTC

svn commit: r598395 [4/7] - in /directory/sandbox/felixk: studio-aciitemeditor/src/main/java/org/apache/directory/studio/aciitemeditor/model/ studio-aciitemeditor/src/main/java/org/apache/directory/studio/aciitemeditor/valueeditors/ studio-aciitemedito...

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/CopyAction.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/CopyAction.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/CopyAction.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/CopyAction.java Mon Nov 26 11:44:28 2007
@@ -31,7 +31,7 @@
 import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.IValue;
-import org.apache.directory.studio.ldapbrowser.core.utils.LdifUtils;
+import org.apache.directory.studio.ldifparser.LdifUtils;
 
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.swt.dnd.Clipboard;

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PasteAction.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PasteAction.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PasteAction.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PasteAction.java Mon Nov 26 11:44:28 2007
@@ -21,6 +21,7 @@
 package org.apache.directory.studio.ldapbrowser.common.actions;
 
 
+import org.apache.directory.studio.ldapbrowser.common.dialogs.EntryExistsCopyStrategyDialogImpl;
 import org.apache.directory.studio.ldapbrowser.common.dialogs.ScopeDialog;
 import org.apache.directory.studio.ldapbrowser.common.dnd.EntryTransfer;
 import org.apache.directory.studio.ldapbrowser.common.dnd.ValuesTransfer;
@@ -169,7 +170,8 @@
             scope = scopeDialog.getScope();
         }
 
-        new CopyEntriesJob( parent, entriesToPaste, scope ).execute();
+        new CopyEntriesJob( parent, entriesToPaste, scope, new EntryExistsCopyStrategyDialogImpl( Display.getDefault()
+            .getActiveShell() ) ).execute();
     }
 
 

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PropertiesAction.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PropertiesAction.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PropertiesAction.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/actions/PropertiesAction.java Mon Nov 26 11:44:28 2007
@@ -22,8 +22,7 @@
 
 
 import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
-import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
-
+import org.apache.directory.studio.connection.core.Utils;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.jface.preference.PreferenceDialog;
 import org.eclipse.jface.resource.ImageDescriptor;

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/EntryExistsCopyStrategyDialogImpl.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/EntryExistsCopyStrategyDialogImpl.java?rev=598395&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/EntryExistsCopyStrategyDialogImpl.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/EntryExistsCopyStrategyDialogImpl.java Mon Nov 26 11:44:28 2007
@@ -0,0 +1,261 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.common.dialogs;
+
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.name.Rdn;
+import org.apache.directory.studio.ldapbrowser.common.widgets.BaseWidgetUtils;
+import org.apache.directory.studio.ldapbrowser.common.widgets.DnBuilderWidget;
+import org.apache.directory.studio.ldapbrowser.common.widgets.WidgetModifyEvent;
+import org.apache.directory.studio.ldapbrowser.common.widgets.WidgetModifyListener;
+import org.apache.directory.studio.ldapbrowser.core.jobs.EntryExistsCopyStrategyDialog;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * A dialog to select the copy strategy if an entry already exists.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryExistsCopyStrategyDialogImpl extends Dialog implements EntryExistsCopyStrategyDialog
+{
+
+    /** The dialog title. */
+    private String dialogTitle = "Select copy strategy";
+
+    /** The break button. */
+    private Button breakButton;
+
+    /** The ignore button. */
+    private Button ignoreButton;
+//
+//    /** The overwrite button. */
+//    private Button overwriteButton;
+
+    /** The rename button. */
+    private Button renameButton;
+//
+//    /** The remember check box. */
+//    private Button rememberCheckbox;
+
+    /** The DN builder widget. */
+    private DnBuilderWidget dnBuilderWidget;
+
+    /** The new RDN. */
+    private Rdn rdn;
+
+    /** The strategy */
+    private EntryExistsCopyStrategy strategy;
+
+    /** The remember flag */
+    private boolean isRememberStrategy;
+
+    private IBrowserConnection browserConnection;
+
+    private LdapDN dn;
+
+
+    /**
+     * Creates a new instance of ScopeDialog.
+     * 
+     * @param parentShell the parent shell
+     * @param dialogTitle the dialog title
+     * @param multipleEntriesSelected the multiple entries selected
+     */
+    public EntryExistsCopyStrategyDialogImpl( Shell parentShell )
+    {
+        super( parentShell );
+        super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
+    }
+
+
+    /**
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell( Shell shell )
+    {
+        super.configureShell( shell );
+        shell.setText( dialogTitle );
+    }
+
+
+    /**
+     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+     */
+    protected void okPressed()
+    {
+        rdn = null;
+//        isRememberStrategy = rememberCheckbox.getSelection() && rememberCheckbox.isEnabled();
+
+        if ( breakButton.getSelection() )
+        {
+            strategy = EntryExistsCopyStrategy.BREAK;
+        }
+        else if ( ignoreButton.getSelection() )
+        {
+            strategy = EntryExistsCopyStrategy.IGNORE_AND_CONTINUE;
+        }
+//        else if ( overwriteButton.getSelection() )
+//        {
+//            strategy = EntryExistsCopyStrategy.OVERWRITE_AND_CONTINUE;
+//        }
+        else if ( renameButton.getSelection() )
+        {
+            strategy = EntryExistsCopyStrategy.RENAME_AND_CONTINUE;
+            rdn = dnBuilderWidget.getRdn();
+        }
+
+        super.okPressed();
+    }
+
+
+    /**
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar( Composite parent )
+    {
+        createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false );
+        //createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false );
+    }
+
+
+    /**
+     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+     */
+    protected Control createDialogArea( Composite parent )
+    {
+        Composite composite = ( Composite ) super.createDialogArea( parent );
+        GridData gd = new GridData( GridData.FILL_BOTH );
+        composite.setLayoutData( gd );
+
+        String text = "The entry " + dn.getUpName() + " already exists. Please select how to proceed.";
+        BaseWidgetUtils.createLabel( composite, text, 1 );
+
+        Composite group2 = BaseWidgetUtils.createGroup( composite, "", 1 );
+        Composite group = BaseWidgetUtils.createColumnContainer( group2, 2, 1 );
+
+        SelectionListener listener = new SelectionAdapter()
+        {
+            public void widgetSelected( SelectionEvent e )
+            {
+                validate();
+            }
+        };
+
+        breakButton = BaseWidgetUtils.createRadiobutton( group, "Stop copy process", 2 );
+        breakButton.setSelection( true );
+        breakButton.addSelectionListener( listener );
+
+        ignoreButton = BaseWidgetUtils.createRadiobutton( group, "Ignore entry and continue", 2 );
+        ignoreButton.addSelectionListener( listener );
+//
+//        overwriteButton = BaseWidgetUtils.createRadiobutton( group, "Overwrite entry and continue", 2 );
+//        overwriteButton.setEnabled( false );
+//        overwriteButton.addSelectionListener( listener );
+
+        renameButton = BaseWidgetUtils.createRadiobutton( group, "Rename entry and continue", 2 );
+        renameButton.addSelectionListener( listener );
+
+        BaseWidgetUtils.createRadioIndent( group, 1 );
+        dnBuilderWidget = new DnBuilderWidget( true, false );
+        dnBuilderWidget.addWidgetModifyListener( new WidgetModifyListener()
+        {
+            public void widgetModified( WidgetModifyEvent event )
+            {
+                validate();
+            }
+        } );
+        dnBuilderWidget.createContents( group );
+        dnBuilderWidget.setInput( browserConnection, browserConnection.getSchema().getAttributeTypeDescriptionNames(),
+            dn.getRdn(), null );
+
+//        rememberCheckbox = BaseWidgetUtils.createCheckbox( composite, "Remember decision", 2 );
+
+        validate();
+
+        applyDialogFont( composite );
+        return composite;
+    }
+
+
+    private void validate()
+    {
+        dnBuilderWidget.setEnabled( renameButton.getSelection() );
+        if ( renameButton.getSelection() )
+        {
+            getButton( IDialogConstants.OK_ID ).setEnabled( dnBuilderWidget.getRdn() != null );
+        }
+//        rememberCheckbox.setEnabled( overwriteButton.getSelection() || ignoreButton.getSelection() );
+    }
+
+
+    public int open()
+    {
+        final int[] result = new int[1];
+        Display.getDefault().syncExec( new Runnable()
+        {
+            public void run()
+            {
+                result[0] = EntryExistsCopyStrategyDialogImpl.super.open();
+            }
+        } );
+        return result[0];
+    }
+
+
+    public EntryExistsCopyStrategy getStrategy()
+    {
+        return strategy;
+    }
+
+
+    public Rdn getRdn()
+    {
+        return rdn;
+    }
+
+
+    public boolean isRememberSelection()
+    {
+        return isRememberStrategy;
+    }
+
+
+    public void setExistingEntry( IBrowserConnection browserConnection, LdapDN dn )
+    {
+        this.browserConnection = browserConnection;
+        this.dn = dn;
+    }
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/EntryExistsCopyStrategyDialogImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/MoveEntriesDialog.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/MoveEntriesDialog.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/MoveEntriesDialog.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/dialogs/MoveEntriesDialog.java Mon Nov 26 11:44:28 2007
@@ -22,12 +22,12 @@
 
 
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.studio.connection.core.DnUtils;
 import org.apache.directory.studio.ldapbrowser.common.widgets.BaseWidgetUtils;
 import org.apache.directory.studio.ldapbrowser.common.widgets.DnBuilderWidget;
 import org.apache.directory.studio.ldapbrowser.common.widgets.WidgetModifyEvent;
 import org.apache.directory.studio.ldapbrowser.common.widgets.WidgetModifyListener;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
-import org.apache.directory.studio.ldapbrowser.core.utils.DnUtils;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.swt.SWT;

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/DnBuilderWidget.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/DnBuilderWidget.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/DnBuilderWidget.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/DnBuilderWidget.java Mon Nov 26 11:44:28 2007
@@ -28,9 +28,9 @@
 import org.apache.directory.shared.ldap.name.AttributeTypeAndValue;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.name.Rdn;
+import org.apache.directory.studio.connection.core.DnUtils;
 import org.apache.directory.studio.ldapbrowser.common.widgets.search.EntryWidget;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
-import org.apache.directory.studio.ldapbrowser.core.utils.DnUtils;
 import org.eclipse.jface.fieldassist.ComboContentAdapter;
 import org.eclipse.jface.fieldassist.ContentProposalAdapter;
 import org.eclipse.jface.fieldassist.DecoratedField;
@@ -82,9 +82,15 @@
 
     /** The selected parent DN. */
     private LdapDN parentDn;
+    
+    /** The entry widget label. */
+    private Label parentEntryLabel;
 
     /** The entry widget to enter/select the parent DN. */
     private EntryWidget parentEntryWidget;
+    
+    /** The RDN label */
+    private Label rdnLabel;
 
     /** The composite that contains the RdnLines. */
     private Composite rdnComposite;
@@ -94,6 +100,9 @@
 
     /** The list of RdnLines. */
     private ArrayList<RdnLine> rdnLineList;
+    
+    /** The preview label. */
+    private Label previewLabel;
 
     /** The preview text. */
     private Text previewText;
@@ -234,7 +243,7 @@
         // draw parent
         if ( showParent )
         {
-            BaseWidgetUtils.createLabel( composite, "Parent:", 1 );
+            parentEntryLabel = BaseWidgetUtils.createLabel( composite, "Parent:", 1 );
             parentEntryWidget = new EntryWidget();
             parentEntryWidget.createWidget( composite );
             parentEntryWidget.addWidgetModifyListener( new WidgetModifyListener()
@@ -251,7 +260,7 @@
         // draw RDN group
         if ( showRDN )
         {
-            BaseWidgetUtils.createLabel( composite, "RDN:", 1 );
+            rdnLabel = BaseWidgetUtils.createLabel( composite, "RDN:", 1 );
             rdnComposite = BaseWidgetUtils.createColumnContainer( composite, 5, 2 );
             rdnLineList = new ArrayList<RdnLine>();
             BaseWidgetUtils.createSpacer( composite, 3 );
@@ -260,7 +269,7 @@
         // draw dn/rdn preview
         if ( showRDN )
         {
-            BaseWidgetUtils.createLabel( composite, showParent ? "DN Preview: " : "RDN Preview: ", 1 );
+            previewLabel = BaseWidgetUtils.createLabel( composite, showParent ? "DN Preview: " : "RDN Preview: ", 1 );
             previewText = BaseWidgetUtils.createReadonlyText( composite, "", 2 );
             BaseWidgetUtils.createSpacer( composite, 3 );
         }
@@ -295,7 +304,6 @@
      */
     public void validate()
     {
-
         Exception rdnE = null;
         if ( showRDN )
         {
@@ -379,7 +387,7 @@
                 {
                     dn = new LdapDN();
                 }
-                previewText.setText( dn.toString() );
+                previewText.setText( dn.getUpName() );
             }
         }
 
@@ -596,6 +604,39 @@
 
         /** The rdn delete button. */
         private Button rdnDeleteButton;
+    }
+
+
+    /**
+     * Enables or disables this widget.
+     * 
+     * @param b true to enable, false to disable 
+     */
+    public void setEnabled( boolean b )
+    {
+        if ( parentEntryWidget != null )
+        {
+            parentEntryLabel.setEnabled( b );
+            parentEntryWidget.setEnabled( b );
+        }
+        if ( rdnComposite != null && rdnLineList != null )
+        {
+            rdnLabel.setEnabled( b );
+            rdnComposite.setEnabled( b );
+            for ( RdnLine rdnLine : rdnLineList )
+            {
+                rdnLine.rdnTypeCombo.setEnabled( b );
+                rdnLine.rdnEqualsLabel.setEnabled( b );
+                rdnLine.rdnValueText.setEnabled( b );
+                rdnLine.rdnAddButton.setEnabled( b );
+                rdnLine.rdnDeleteButton.setEnabled( b && rdnLineList.size() > 1 );
+            }
+        }
+        if ( previewText != null )
+        {
+            previewLabel.setEnabled( b );
+            previewText.setEnabled( b );
+        }
     }
 
 }

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/browser/BrowserLabelProvider.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/browser/BrowserLabelProvider.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/browser/BrowserLabelProvider.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/browser/BrowserLabelProvider.java Mon Nov 26 11:44:28 2007
@@ -36,7 +36,7 @@
 import org.apache.directory.studio.ldapbrowser.core.model.impl.BaseDNEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.DirectoryMetadataEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.ReferralBaseEntry;
-import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
+import org.apache.directory.studio.connection.core.Utils;
 import org.eclipse.jface.preference.PreferenceConverter;
 import org.eclipse.jface.viewers.IColorProvider;
 import org.eclipse.jface.viewers.IFontProvider;

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/search/EntryWidget.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/search/EntryWidget.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/search/EntryWidget.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/search/EntryWidget.java Mon Nov 26 11:44:28 2007
@@ -24,6 +24,7 @@
 import javax.naming.InvalidNameException;
 
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.studio.connection.core.DnUtils;
 import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
 import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
 import org.apache.directory.studio.ldapbrowser.common.dialogs.SelectEntryDialog;
@@ -34,7 +35,6 @@
 import org.apache.directory.studio.ldapbrowser.core.jobs.ReadEntryJob;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
-import org.apache.directory.studio.ldapbrowser.core.utils.DnUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;

Modified: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/valueeditors/ValueEditorManager.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/valueeditors/ValueEditorManager.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/valueeditors/ValueEditorManager.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/valueeditors/ValueEditorManager.java Mon Nov 26 11:44:28 2007
@@ -43,8 +43,8 @@
 import org.apache.directory.studio.ldapbrowser.core.model.schema.AttributeTypeDescription;
 import org.apache.directory.studio.ldapbrowser.core.model.schema.LdapSyntaxDescription;
 import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
-import org.apache.directory.studio.ldapbrowser.core.utils.LdifUtils;
 import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
+import org.apache.directory.studio.ldifparser.LdifUtils;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionPoint;

Modified: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java Mon Nov 26 11:44:28 2007
@@ -22,13 +22,10 @@
 
 
 import java.beans.Encoder;
-import java.beans.ExceptionListener;
 import java.beans.Expression;
 import java.beans.PersistenceDelegate;
 import java.beans.XMLDecoder;
-import java.beans.XMLEncoder;
 import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -45,6 +42,7 @@
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
 import org.apache.directory.studio.connection.core.ConnectionFolder;
+import org.apache.directory.studio.connection.core.Utils;
 import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
 import org.apache.directory.studio.connection.core.event.ConnectionUpdateListener;
 import org.apache.directory.studio.connection.core.io.ConnectionIOException;
@@ -60,15 +58,10 @@
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
 import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.AliasDereferencingMethod;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.ReferralHandlingMethod;
-import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.Bookmark;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.BrowserConnection;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.Search;
 import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
-import org.apache.directory.studio.ldapbrowser.core.utils.LdifUtils;
-import org.eclipse.core.runtime.IPath;
 
 
 /**
@@ -109,28 +102,7 @@
     public static final String getSchemaCacheFileName( IBrowserConnection browserConnection )
     {
         return BrowserCorePlugin.getDefault().getStateLocation().append(
-            "schema-" + toSaveString( browserConnection.getConnection().getId() ) + ".ldif" ).toOSString(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-
-    /**
-     * Gets the Modification Log filename for the corresponding browser connection.
-     *
-     * @param browserConnection
-     *      the browser connection
-     * @return
-     *      the Modification Log filename
-     */
-    public static final String getModificationLogFileName( IBrowserConnection browserConnection )
-    {
-        IPath p = BrowserCorePlugin.getDefault().getStateLocation().append( "logs" ); //$NON-NLS-1$
-        File file = p.toFile();
-        if ( !file.exists() )
-        {
-            file.mkdir();
-        }
-        return p
-            .append( "modifications-" + toSaveString( browserConnection.getConnection().getId() ) + "-%u-%g.ldiflog" ).toOSString(); //$NON-NLS-1$ //$NON-NLS-2$
+            "schema-" + Utils.getFilenameString( browserConnection.getConnection().getId() ) + ".ldif" ).toOSString(); //$NON-NLS-1$ //$NON-NLS-2$
     }
 
 
@@ -175,47 +147,6 @@
         }
 
         return filename;
-    }
-
-
-    /**
-     * Converts a String into a Saveable String.
-     *
-     * @param s
-     *      the String to convert
-     * @return
-     *      the converted String
-     */
-    private static String toSaveString( String s )
-    {
-        if ( s == null )
-        {
-            return null;
-        }
-
-        byte[] b = LdifUtils.utf8encode( s );
-        StringBuffer sb = new StringBuffer();
-        for ( int i = 0; i < b.length; i++ )
-        {
-
-            if ( b[i] == '-' || b[i] == '_' || ( '0' <= b[i] && b[i] <= '9' ) || ( 'A' <= b[i] && b[i] <= 'Z' )
-                || ( 'a' <= b[i] && b[i] <= 'z' ) )
-            {
-                sb.append( ( char ) b[i] );
-            }
-            else
-            {
-                int x = ( int ) b[i];
-                if ( x < 0 )
-                    x = 256 + x;
-                String t = Integer.toHexString( x );
-                if ( t.length() == 1 )
-                    t = "0" + t; //$NON-NLS-1$
-                sb.append( t );
-            }
-        }
-
-        return sb.toString();
     }
 
 

Modified: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java Mon Nov 26 11:44:28 2007
@@ -43,8 +43,6 @@
 
     public static final String DEFAULT_ENCODING = new OutputStreamWriter( new ByteArrayOutputStream() ).getEncoding();
 
-    public static final String DATEFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS"; //$NON-NLS-1$
-
     public static final String PREFERENCE_CHECK_FOR_CHILDREN = "checkForChildren"; //$NON-NLS-1$
 
     public static final String PREFERENCE_SHOW_ALIAS_AND_REFERRAL_OBJECTS = "showAliasAndReferralObjects"; //$NON-NLS-1$

Modified: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java Mon Nov 26 11:44:28 2007
@@ -23,7 +23,6 @@
 
 import org.apache.directory.studio.ldapbrowser.core.events.CoreEventRunner;
 import org.apache.directory.studio.ldapbrowser.core.events.EventRunner;
-import org.apache.directory.studio.ldapbrowser.core.model.IReferralHandler;
 import org.eclipse.core.runtime.Plugin;
 import org.osgi.framework.BundleContext;
 
@@ -42,9 +41,6 @@
     /** The connection manager */
     private BrowserConnectionManager connectionManager;
 
-    /** The connection provider */
-    private IReferralHandler referralHandler;
-
     /** The preferences */
     private BrowserCorePreferences preferences;
 
@@ -136,30 +132,6 @@
     public BrowserCorePreferences getCorePreferences()
     {
         return preferences;
-    }
-
-
-    /**
-     * Gets the ReferralHanlder
-     *
-     * @return
-     *      the ReferralHandler
-     */
-    public IReferralHandler getReferralHandler()
-    {
-        return referralHandler;
-    }
-
-
-    /**
-     * Sets the ReferralHandler
-     *
-     * @param referralHandler
-     *      the ReferralHandler to set
-     */
-    public void setReferralHandler( IReferralHandler referralHandler )
-    {
-        this.referralHandler = referralHandler;
     }
 
 

Modified: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesJob.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesJob.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesJob.java Mon Nov 26 11:44:28 2007
@@ -26,34 +26,39 @@
 import java.util.Iterator;
 import java.util.List;
 
-import javax.naming.InvalidNameException;
+import javax.naming.NameAlreadyBoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
 
 import org.apache.directory.shared.ldap.name.AttributeTypeAndValue;
+import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.name.Rdn;
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.DnUtils;
 import org.apache.directory.studio.connection.core.StudioProgressMonitor;
+import org.apache.directory.studio.connection.core.io.jndi.JNDIConnectionWrapper;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.ChildrenInitializedEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
+import org.apache.directory.studio.ldapbrowser.core.jobs.EntryExistsCopyStrategyDialog.EntryExistsCopyStrategy;
 import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
-import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
-import org.apache.directory.studio.ldapbrowser.core.model.IValue;
-import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.AliasDereferencingMethod;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.ReferralHandlingMethod;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;
-import org.apache.directory.studio.ldapbrowser.core.model.impl.Attribute;
-import org.apache.directory.studio.ldapbrowser.core.model.impl.Entry;
-import org.apache.directory.studio.ldapbrowser.core.model.impl.Search;
-import org.apache.directory.studio.ldapbrowser.core.model.impl.Value;
-import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaUtils;
-import org.apache.directory.studio.ldapbrowser.core.utils.DnUtils;
+import org.apache.directory.studio.ldapbrowser.core.utils.JNDIUtils;
 
 
 /**
  * Job to copy entries asynchronously.
+ * 
+ * TODO: implement overwrite strategy
+ * TODO: implement remember selection
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
@@ -70,6 +75,9 @@
     /** The copy scope */
     private SearchScope scope;
 
+    /** The dialog to ask for the strategy */
+    private EntryExistsCopyStrategyDialog dialog;
+
 
     /**
      * Creates a new instance of CopyEntriesJob.
@@ -77,12 +85,15 @@
      * @param parent the parent entry
      * @param entriesToCopy the entries to copy
      * @param scope the copy scope
+     * @param dialog the dialog
      */
-    public CopyEntriesJob( final IEntry parent, final IEntry[] entriesToCopy, SearchScope scope )
+    public CopyEntriesJob( final IEntry parent, final IEntry[] entriesToCopy, SearchScope scope,
+        EntryExistsCopyStrategyDialog dialog )
     {
         this.parent = parent;
         this.entriesToCopy = entriesToCopy;
         this.scope = scope;
+        this.dialog = dialog;
         setName( entriesToCopy.length == 1 ? BrowserCoreMessages.jobs__copy_entries_name_1
             : BrowserCoreMessages.jobs__copy_entries_name_n );
     }
@@ -126,6 +137,10 @@
 
         if ( scope == SearchScope.OBJECT || scope == SearchScope.ONELEVEL || scope == SearchScope.SUBTREE )
         {
+            StudioProgressMonitor dummyMonitor = new StudioProgressMonitor( monitor );
+            int copyScope = scope == SearchScope.SUBTREE ? SearchControls.SUBTREE_SCOPE
+                : scope == SearchScope.ONELEVEL ? SearchControls.ONELEVEL_SCOPE : SearchControls.OBJECT_SCOPE;
+
             int num = 0;
             for ( int i = 0; !monitor.isCanceled() && i < entriesToCopy.length; i++ )
             {
@@ -134,7 +149,8 @@
                 if ( scope == SearchScope.OBJECT
                     || !parent.getDn().getNormName().endsWith( entryToCopy.getDn().getNormName() ) )
                 {
-                    num = copyEntryRecursive( entryToCopy, parent, scope, num, monitor );
+                    num = copyEntry( entryToCopy.getBrowserConnection(), entryToCopy.getDn(), parent.getDn(),
+                        copyScope, num, dummyMonitor, monitor );
                 }
                 else
                 {
@@ -166,213 +182,157 @@
     }
 
 
-    /**
-     * Copies the entry recursive.
-     * 
-     * @param entryToCopy the entry to copy
-     * @param parent the parent entry
-     * @param scope the copy scope
-     * @param num the number of copied entries
-     * @param monitor the progress monitor
-     * 
-     * @return the number of copied entries
-     */
-    private int copyEntryRecursive( IEntry entryToCopy, IEntry parent, SearchScope scope, int num, StudioProgressMonitor monitor )
+    private int copyEntry( IBrowserConnection browserConnection, LdapDN dnToCopy, LdapDN parentDn, int scope,
+        int numberOfCopiedEntries, StudioProgressMonitor dummyMonitor, StudioProgressMonitor monitor )
+    {
+        SearchControls searchControls = new SearchControls();
+        searchControls.setCountLimit( 1 );
+        searchControls.setReturningAttributes( new String[]
+            { ISearch.ALL_USER_ATTRIBUTES, IAttribute.REFERRAL_ATTRIBUTE } );
+        searchControls.setSearchScope( SearchControls.OBJECT_SCOPE );
+        NamingEnumeration<SearchResult> result = browserConnection.getConnection().getJNDIConnectionWrapper().search(
+            dnToCopy.getUpName(), ISearch.FILTER_TRUE, searchControls, "never", JNDIConnectionWrapper.REFERRAL_IGNORE,
+            null, monitor, null );
+
+        numberOfCopiedEntries = copyEntryRecursive( browserConnection, result, parentDn, scope, numberOfCopiedEntries,
+            dummyMonitor, monitor );
+
+        return numberOfCopiedEntries;
+    }
+
+
+    private int copyEntryRecursive( IBrowserConnection browserConnection, NamingEnumeration<SearchResult> entries,
+        LdapDN parentDn, int scope, int numberOfCopiedEntries, StudioProgressMonitor dummyMonitor,
+        StudioProgressMonitor monitor )
     {
         try
         {
-            // TODO: use JNDI here!!!
-            SearchParameter param = new SearchParameter();
-            param.setSearchBase( entryToCopy.getDn() );
-            param.setFilter( ISearch.FILTER_TRUE );
-            param.setScope( SearchScope.OBJECT );
-            param.setAliasesDereferencingMethod( AliasDereferencingMethod.NEVER );
-            param.setReferralsHandlingMethod( ReferralHandlingMethod.IGNORE );
-            param.setReturningAttributes( new String[]
-                { ISearch.ALL_USER_ATTRIBUTES, IAttribute.REFERRAL_ATTRIBUTE } );
-            ISearch search = new Search( entryToCopy.getBrowserConnection(), param );
-            
-            SearchJob.searchAndUpdateModel( entryToCopy.getBrowserConnection(), search, monitor );
-
-            ISearchResult[] srs = search.getSearchResults();
-            if ( !monitor.isCanceled() && srs != null && srs.length == 1 )
+            while ( !monitor.isCanceled() && entries.hasMore() )
             {
-                entryToCopy = srs[0].getEntry();
-                IAttribute[] attributesToCopy = entryToCopy.getAttributes();
+                SearchResult sr = entries.next();
 
-                // create new entry
-                Rdn rdn = entryToCopy.getRdn();
-                IEntry newEntry = new Entry( parent, rdn );
-
-                // change RDN if entry already exists
-                StudioProgressMonitor testMonitor = new StudioProgressMonitor( monitor );
-                IEntry testEntry = ReadEntryJob.getEntry( parent.getBrowserConnection(), newEntry.getDn(), testMonitor );
-                if ( testEntry != null )
-                {
-                    Object rdnValue = rdn.getUpValue();
-                    String newRdnValue = BrowserCoreMessages.bind( BrowserCoreMessages.copy_n_of_s, "", rdnValue ); //$NON-NLS-1$
-                    Rdn newRdn = getNewRdn( rdn, newRdnValue );
-                    newEntry = new Entry( parent, newRdn );
-                    testEntry = ReadEntryJob.getEntry( parent.getBrowserConnection(), 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 = ReadEntryJob.getEntry( parent.getBrowserConnection(), newEntry.getDn(), testMonitor );
-                    }
-                }
+                // compose new DN
+                LdapDN oldLdapDn = JNDIUtils.getDn( sr );
+                String oldDn = oldLdapDn.getUpName();
+                Rdn oldRdn = oldLdapDn.getRdn();
+                LdapDN newLdapDn = DnUtils.composeDn( oldRdn, parentDn );
+                String newDn = newLdapDn.getUpName();
 
                 // copy attributes
-                for ( int i = 0; i < attributesToCopy.length; i++ )
-                {
-                    IAttribute attributeToCopy = attributesToCopy[i];
+                Attributes oldAttributes = sr.getAttributes();
+                Attributes newAttributes = oldAttributes;
 
-                    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 );
-                        }
-                    }
-                }
+                // create entry
+                browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( newDn, newAttributes, null,
+                    dummyMonitor );
 
-                // check if RDN attributes ar present
-                Rdn newRdn = newEntry.getRdn();
-                Iterator<AttributeTypeAndValue> atavIterator = newRdn.iterator();
-                while(atavIterator.hasNext())
+                while ( dummyMonitor.errorsReported() )
                 {
-                    AttributeTypeAndValue atav = atavIterator.next();
-                    IAttribute rdnAttribute = newEntry.getAttribute( atav.getUpType() );
-                    if ( rdnAttribute != null )
+                    if ( dummyMonitor.getException() instanceof NameAlreadyBoundException )
                     {
-                        IValue[] values = rdnAttribute.getValues();
-                        for ( int ii = 0; ii < values.length; ii++ )
+                        // open dialog
+                        dialog.setExistingEntry( browserConnection, newLdapDn );
+                        dialog.open();
+                        EntryExistsCopyStrategy strategy = dialog.getStrategy();
+//                        boolean rememberSelection = dialog.isRememberSelection();
+                        if ( strategy != null )
                         {
-                            if ( atav.getUpValue().equals( values[ii].getRawValue() ) )
-                            {
-                                rdnAttribute.deleteValue( values[ii] );
-                            }
-                            if ( rdnAttribute.getValueSize() == 0 )
+                            dummyMonitor.reset();
+
+                            switch ( strategy )
                             {
-                                newEntry.deleteAttribute( rdnAttribute );
+                                case BREAK:
+                                    monitor.setCanceled( true );
+                                    break;
+                                case IGNORE_AND_CONTINUE:
+                                    break;
+//                                case OVERWRITE_AND_CONTINUE:
+//                                    break;
+                                case RENAME_AND_CONTINUE:
+                                    Rdn renamedRdn = dialog.getRdn();
+                                    for ( Iterator<AttributeTypeAndValue> it = oldRdn.iterator(); it.hasNext(); )
+                                    {
+                                        AttributeTypeAndValue atav = it.next();
+                                        Attribute attribute = newAttributes.get( atav.getUpType() );
+                                        if ( attribute != null )
+                                        {
+                                            attribute.remove( atav.getUpValue() );
+                                            if ( attribute.size() == 0 )
+                                            {
+                                                newAttributes.remove( atav.getUpType() );
+                                            }
+                                        }
+                                    }
+                                    for ( Iterator<AttributeTypeAndValue> it = renamedRdn.iterator(); it.hasNext(); )
+                                    {
+                                        AttributeTypeAndValue atav = it.next();
+                                        Attribute attribute = newAttributes.get( atav.getUpType() );
+                                        if ( attribute == null )
+                                        {
+                                            attribute = new BasicAttribute( atav.getUpType() );
+                                            newAttributes.put( attribute );
+                                        }
+                                        if ( !attribute.contains( atav.getUpValue() ) )
+                                        {
+                                            attribute.add( atav.getUpValue() );
+                                        }
+                                    }
+
+                                    newLdapDn = DnUtils.composeDn( renamedRdn, parentDn );
+                                    newDn = newLdapDn.getUpName();
+
+                                    browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( newDn,
+                                        newAttributes, null, dummyMonitor );
+
+                                    break;
                             }
                         }
-                    }
-                }
-                atavIterator = newRdn.iterator();
-                while(atavIterator.hasNext())
-                {
-                    AttributeTypeAndValue atav = atavIterator.next();
-                    IAttribute rdnAttribute = newEntry.getAttribute( atav.getUpType() );
-                    if ( rdnAttribute == null )
-                    {
-                        rdnAttribute = new Attribute( newEntry, atav.getUpType() );
-                        newEntry.addAttribute( rdnAttribute );
-                        rdnAttribute.addValue( new Value( rdnAttribute, atav.getUpValue() ) );
+                        else
+                        {
+                            monitor.reportError( dummyMonitor.getException() );
+                            dummyMonitor.reset();
+                        }
                     }
                     else
                     {
-                        boolean mustAdd = true;
-                        IValue[] values = rdnAttribute.getValues();
-                        for ( int ii = 0; ii < values.length; ii++ )
-                        {
-                            if ( atav.getUpValue().equals( values[ii].getStringValue() ) )
-                            {
-                                mustAdd = false;
-                                break;
-                            }
-                        }
-                        if ( mustAdd )
-                        {
-                            rdnAttribute.addValue( new Value( rdnAttribute, atav.getUpValue() ) );
-                        }
+                        monitor.reportError( dummyMonitor.getException() );
+                        dummyMonitor.reset();
                     }
                 }
 
-                CreateEntryJob.createEntry( newEntry.getBrowserConnection(), newEntry, monitor );
-                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 == SearchScope.ONELEVEL || scope == SearchScope.SUBTREE ) )
+                if ( !monitor.isCanceled() && !monitor.errorsReported() )
                 {
-                    // TODO: use JNDI here!!!
-                    SearchParameter subParam = new SearchParameter();
-                    subParam.setSearchBase( entryToCopy.getDn() );
-                    subParam.setFilter( ISearch.FILTER_TRUE );
-                    subParam.setScope( SearchScope.ONELEVEL );
-                    subParam.setReturningAttributes( ISearch.NO_ATTRIBUTES );
-                    ISearch subSearch = new Search( entryToCopy.getBrowserConnection(), subParam );
-                    SearchJob.searchAndUpdateModel( entryToCopy.getBrowserConnection(), subSearch, monitor );
+                    numberOfCopiedEntries++;
 
-                    ISearchResult[] subSrs = subSearch.getSearchResults();
-                    if ( !monitor.isCanceled() && subSrs != null && subSrs.length > 0 )
+                    // copy recursively
+                    if ( scope == SearchControls.ONELEVEL_SCOPE || scope == SearchControls.SUBTREE_SCOPE )
                     {
-                        for ( int i = 0; i < subSrs.length; i++ )
-                        {
-                            ISearchResult subSearchResult = subSrs[i];
-                            IEntry childEntry = subSearchResult.getEntry();
+                        SearchControls searchControls = new SearchControls();
+                        searchControls.setCountLimit( 0 );
+                        searchControls.setReturningAttributes( new String[]
+                            { ISearch.ALL_USER_ATTRIBUTES, IAttribute.REFERRAL_ATTRIBUTE } );
+                        searchControls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+                        NamingEnumeration<SearchResult> childEntries = browserConnection.getConnection()
+                            .getJNDIConnectionWrapper().search( oldDn, ISearch.FILTER_TRUE, searchControls, "never",
+                                JNDIConnectionWrapper.REFERRAL_IGNORE, null, monitor, null );
 
-                            if ( scope == SearchScope.ONELEVEL )
-                            {
-                                num = this
-                                    .copyEntryRecursive( childEntry, newEntry,SearchScope.OBJECT, num, monitor );
-                            }
-                            else if ( scope == SearchScope.SUBTREE )
-                            {
-                                num = this.copyEntryRecursive( childEntry, newEntry, SearchScope.SUBTREE, num,
-                                    monitor );
-                            }
+                        if ( scope == SearchControls.ONELEVEL_SCOPE )
+                        {
+                            scope = SearchControls.OBJECT_SCOPE;
                         }
 
+                        numberOfCopiedEntries = copyEntryRecursive( browserConnection, childEntries, newLdapDn, scope,
+                            numberOfCopiedEntries, dummyMonitor, monitor );
                     }
                 }
             }
         }
-        catch ( Exception e )
+        catch ( NamingException e )
         {
             monitor.reportError( e );
         }
-        return num;
-    }
-
 
-    /**
-     * Gets the new rdn.
-     * 
-     * @param rdn the rdn
-     * @param newRdnValue the new rdn value
-     * 
-     * @return the new rdn
-     * @throws InvalidNameException 
-     */
-    private Rdn getNewRdn( Rdn rdn, String newRdnValue ) throws InvalidNameException
-    {
-        String[] rdnTypes = new String[rdn.size()];
-        String[] rdnValues = new String[rdn.size()];
-        int i = 0;
-        Iterator<AttributeTypeAndValue> atavIterator = rdn.iterator();
-        while(atavIterator.hasNext())
-        {
-            AttributeTypeAndValue atav = atavIterator.next();
-            rdnTypes[i] = atav.getUpType();
-            rdnValues[i] = ( String ) atav.getUpValue();
-            i++;
-        }
-        rdnValues[0] = newRdnValue;
-        Rdn newRdn = DnUtils.composeRdn( rdnTypes, rdnValues );
-        return newRdn;
+        return numberOfCopiedEntries;
     }
 
 }

Modified: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java Mon Nov 26 11:44:28 2007
@@ -28,55 +28,91 @@
 import java.util.List;
 import java.util.Set;
 
-import javax.naming.ldap.Control;
-import javax.naming.ldap.ManageReferralControl;
+import javax.naming.ContextNotEmptyException;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.BasicControl;
 
+import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.StudioProgressMonitor;
+import org.apache.directory.studio.connection.core.io.jndi.JNDIConnectionWrapper;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.ChildrenInitializedEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.EntryDeletedEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
 import org.apache.directory.studio.ldapbrowser.core.events.SearchUpdateEvent;
-import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.ConnectionException;
+import org.apache.directory.studio.ldapbrowser.core.model.Control;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
-import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.AliasDereferencingMethod;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.ReferralHandlingMethod;
-import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;
-import org.apache.directory.studio.ldapbrowser.core.model.impl.Search;
+import org.apache.directory.studio.ldapbrowser.core.utils.JNDIUtils;
 
 
-/*
- * Search+Delete vs. Delete+SearchOnError
- * 
- * Test for:
- * - delete leaf entry 100.000 times
- * - tree with 100.000 childs
- * - tree with 1000 childs each with 1000 childs 
+/**
+ * Job to delete entries.
  * 
+ * Deletes the entry recursively in a optimistic way:
+ * <ol>
+ * <li>Delete the entry
+ * <li>If that fails with error code 66 then perform a one-level search
+ *     and start from 1. for each entry. 
+ * </ol>
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
  */
-
 public class DeleteEntriesJob extends AbstractNotificationJob
 {
 
     private IEntry[] entriesToDelete;
+    private boolean useTreeDeleteContol;
+    private boolean useManageDsaITControl;
+    private boolean useSubentriesControl;
+
+    private Set<IEntry> deletedEntriesSet;
+
+    private Set<IEntry> entriesToUpdateSet;
+
+    private Set<ISearch> searchesToUpdateSet;
+
+
+    /**
+     * Creates a new instance of DeleteEntriesJob. 
+     * 
+     * @param entriesToDelete the entries to delete
+     * @param useTreeDeleteContol true to use the Tree Delete Control
+     * @param useManageDsaITControl true to use the Manage DSA IT Control
+     * @param useSubentriesControl true to delete sub-entries
+     */
+    public DeleteEntriesJob( final IEntry[] entriesToDelete, boolean useTreeDeleteContol,
+        boolean useManageDsaITControl, boolean useSubentriesControl )
+    {
+        this.entriesToDelete = entriesToDelete;
+        this.useTreeDeleteContol = useTreeDeleteContol;
+        this.useManageDsaITControl = useManageDsaITControl;
+        this.useSubentriesControl = useSubentriesControl;
+
+        this.deletedEntriesSet = new HashSet<IEntry>();
+        this.entriesToUpdateSet = new HashSet<IEntry>();
+        this.searchesToUpdateSet = new HashSet<ISearch>();
 
-    private Set deletedEntriesSet = new HashSet();
-
-    private Set entriesToUpdateSet = new HashSet();
-
-    private Set searchesToUpdateSet = new HashSet();
+        setName( entriesToDelete.length == 1 ? BrowserCoreMessages.jobs__delete_entries_name_1
+            : BrowserCoreMessages.jobs__delete_entries_name_n );
+    }
 
 
+    /**
+     * Creates a new instance of DeleteEntriesJob. 
+     * 
+     * @param entriesToDelete the entries to delete
+     */
     public DeleteEntriesJob( final IEntry[] entriesToDelete )
     {
-        this.entriesToDelete = entriesToDelete;
-        setName( entriesToDelete.length == 1 ? BrowserCoreMessages.jobs__delete_entries_name_1
-            : BrowserCoreMessages.jobs__delete_entries_name_n );
+        this( entriesToDelete, false, false, false );
     }
 
 
@@ -93,7 +129,7 @@
 
     protected Object[] getLockedObjects()
     {
-        List l = new ArrayList();
+        List<Object> l = new ArrayList<Object>();
         l.addAll( Arrays.asList( entriesToDelete ) );
         return l.toArray();
     }
@@ -101,7 +137,6 @@
 
     protected void executeNotificationJob( StudioProgressMonitor monitor )
     {
-
         monitor.beginTask( entriesToDelete.length == 1 ? BrowserCoreMessages.bind(
             BrowserCoreMessages.jobs__delete_entries_task_1, new String[]
                 { entriesToDelete[0].getDn().getUpName() } ) : BrowserCoreMessages.bind(
@@ -111,49 +146,65 @@
         monitor.worked( 1 );
 
         int num = 0;
+        StudioProgressMonitor dummyMonitor = new StudioProgressMonitor( monitor );
         for ( int i = 0; !monitor.isCanceled() && !monitor.errorsReported() && i < entriesToDelete.length; i++ )
         {
-
             IEntry entryToDelete = entriesToDelete[i];
-            IBrowserConnection connection = entryToDelete.getBrowserConnection();
+            IBrowserConnection browserConnection = entryToDelete.getBrowserConnection();
 
             // delete from directory
-            // TODO: use TreeDelete Control, if available
             int errorStatusSize1 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
-            num = deleteEntryRecursive( entryToDelete, false, num, monitor );
+            num = optimisticDeleteEntryRecursive( browserConnection, entryToDelete.getDn().getUpName(), num,
+                dummyMonitor, monitor );
             int errorStatusSize2 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
-            deletedEntriesSet.add( entryToDelete );
 
-            if ( errorStatusSize1 == errorStatusSize2 )
+            if ( !monitor.isCanceled() )
             {
-                // delete from parent
-                entryToDelete.getParententry().deleteChild( entryToDelete );
-                entriesToUpdateSet.add( entryToDelete.getParententry() );
-
-                // delete from searches
-                ISearch[] searches = connection.getSearchManager().getSearches();
-                for ( int j = 0; j < searches.length; j++ )
+                if ( errorStatusSize1 == errorStatusSize2 )
                 {
-                    ISearch search = searches[j];
-                    if ( search.getSearchResults() != null )
+                    // delete
+                    deletedEntriesSet.add( entryToDelete );
+                    entryToDelete.setChildrenInitialized( false );
+
+                    // delete from parent entry
+                    entriesToUpdateSet.add( entryToDelete.getParententry() );
+                    entryToDelete.getParententry().setChildrenInitialized( false );
+                    entryToDelete.getParententry().deleteChild( entryToDelete );
+
+                    // delete from searches
+                    ISearch[] searches = browserConnection.getSearchManager().getSearches();
+                    for ( ISearch search : searches )
                     {
-                        ISearchResult[] searchResults = search.getSearchResults();
-                        for ( int k = 0; k < searchResults.length; k++ )
+                        if ( search.getSearchResults() != null )
                         {
-                            ISearchResult result = searchResults[k];
-                            if ( entryToDelete.equals( result.getEntry() ) )
+                            ISearchResult[] searchResults = search.getSearchResults();
+                            List<ISearchResult> searchResultList = new ArrayList<ISearchResult>();
+                            searchResultList.addAll( Arrays.asList( searchResults ) );
+                            for ( Iterator<ISearchResult> it = searchResultList.iterator(); it.hasNext(); )
+                            {
+                                ISearchResult result = it.next();
+                                if ( entryToDelete.equals( result.getEntry() ) )
+                                {
+                                    it.remove();
+                                    searchesToUpdateSet.add( search );
+                                }
+                            }
+                            if ( searchesToUpdateSet.contains( search ) )
                             {
-                                ISearchResult[] newsrs = new ISearchResult[searchResults.length - 1];
-                                System.arraycopy( searchResults, 0, newsrs, 0, k );
-                                System.arraycopy( searchResults, k + 1, newsrs, k, searchResults.length - k - 1 );
-                                search.setSearchResults( newsrs );
-                                searchResults = newsrs;
-                                k--;
-                                searchesToUpdateSet.add( search );
+                                search.setSearchResults( searchResultList.toArray( new ISearchResult[searchResultList
+                                    .size()] ) );
                             }
                         }
                     }
                 }
+
+                // delete from cache
+                browserConnection.uncacheEntryRecursive( entryToDelete );
+            }
+            else
+            {
+                entriesToUpdateSet.add( entryToDelete );
+                entryToDelete.setChildrenInitialized( false );
             }
 
             monitor.worked( 1 );
@@ -161,101 +212,111 @@
     }
 
 
-    
-    private int deleteEntryRecursive( IBrowserConnection browserConnection, String dn, int numberOfDeletedEntries, StudioProgressMonitor monitor )
-    {
-//        int numberInBatch;
-//        
-//        JNDIConnectionWrapper connectionWrapper = browserConnection.getConnection().getJNDIConnectionWrapper();
-//        
-//        SearchControls searchControls = new SearchControls();
-//        searchControls.setCountLimit( 1000 );
-//        searchControls.setReturningAttributes( new String[]
-//                                                          { IAttribute.OBJECTCLASS_ATTRIBUTE, IAttribute.REFERRAL_ATTRIBUTE } );
-//        searchControls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-//        
-//        connectionWrapper.search( dn, ISearch.FILTER_TRUE, searchControls, derefAliasMethod, handleReferralsMethod, controls, monitor )
-        
-        return 0;
-    }
-    
-    
-    private int deleteEntryRecursive( IEntry entry, boolean refInitialized, int numberOfDeletedEntries,
-        StudioProgressMonitor monitor )
+    /**
+     * Deletes the entry recursively in a optimistic way:
+     * <ol>
+     * <li>Deletes the entry
+     * <li>If that fails then perform a one-level search and call the 
+     * method for each found entry
+     * </ol>
+     * 
+     * @param browserConnection the browser connection
+     * @param dn the DN to delete
+     * @param numberOfDeletedEntries the number of delted entries
+     * @param dummyMonitor the dummy monitor
+     * @param monitor the progress monitor
+     * @return the cululative number of deleted entries
+     */
+    private int optimisticDeleteEntryRecursive( IBrowserConnection browserConnection, String dn,
+        int numberOfDeletedEntries, StudioProgressMonitor dummyMonitor, StudioProgressMonitor monitor )
     {
-        try
+        // try to delete entry
+        dummyMonitor.reset();
+        deleteEntry( browserConnection, dn, useTreeDeleteContol, useManageDsaITControl, dummyMonitor );
+
+        if ( !dummyMonitor.errorsReported() )
+        {
+            numberOfDeletedEntries++;
+            monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.model__deleted_n_entries,
+                new String[]
+                    { "" + numberOfDeletedEntries } ) ); //$NON-NLS-1$
+        }
+        else if ( dummyMonitor.getException() instanceof ContextNotEmptyException )
         {
+            // perform one-level search and delete recursively
+            // TODO: ManageDsaIT control
+            // TODO: Subentries search
             int numberInBatch;
+            dummyMonitor.reset();
             do
             {
                 numberInBatch = 0;
-                
-                // TODO: use JNDI here!!!
-                
-                SearchParameter subParam = new SearchParameter();
-                subParam.setSearchBase( entry.getDn() );
-                subParam.setFilter( ISearch.FILTER_TRUE );
-                subParam.setScope( SearchScope.ONELEVEL );
-                subParam.setAliasesDereferencingMethod( AliasDereferencingMethod.NEVER );
-                subParam.setReferralsHandlingMethod( ReferralHandlingMethod.IGNORE );
-                subParam.setReturningAttributes( new String[]
-                    { IAttribute.OBJECTCLASS_ATTRIBUTE, IAttribute.REFERRAL_ATTRIBUTE } );
-                subParam.setCountLimit( 1000 );
-                ISearch search = new Search( entry.getBrowserConnection(), subParam );
-                SearchJob.searchAndUpdateModel( entry.getBrowserConnection(), search, monitor );
 
-                ISearchResult[] srs = search.getSearchResults();
-                for ( int i = 0; !monitor.isCanceled() && srs != null && i < srs.length; i++ )
-                {
-                    IEntry childEntry = srs[i].getEntry();
-                    numberOfDeletedEntries = this.deleteEntryRecursive( childEntry, true, numberOfDeletedEntries,
-                        monitor );
-                    numberInBatch++;
-                }
-            }
-            while ( numberInBatch > 0 && !monitor.isCanceled() && !monitor.errorsReported() );
+                SearchControls searchControls = new SearchControls();
+                searchControls.setCountLimit( 1000 );
+                searchControls.setReturningAttributes( new String[0] );
+                searchControls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+                NamingEnumeration<SearchResult> result = browserConnection.getConnection().getJNDIConnectionWrapper()
+                    .search( dn, ISearch.FILTER_TRUE, searchControls, "never", JNDIConnectionWrapper.REFERRAL_IGNORE,
+                        null, dummyMonitor, null );
 
-            if ( !monitor.isCanceled() && !monitor.errorsReported() )
-            {
-                // check for referrals
-                if ( !refInitialized )
+                try
                 {
-                    // TODO: use JNDI here!!!
-                    SearchParameter param = new SearchParameter();
-                    param.setSearchBase( entry.getDn() );
-                    param.setFilter( ISearch.FILTER_TRUE );
-                    param.setScope( SearchScope.OBJECT );
-                    param.setAliasesDereferencingMethod( AliasDereferencingMethod.NEVER );
-                    param.setReferralsHandlingMethod( ReferralHandlingMethod.IGNORE );
-                    param.setReturningAttributes( new String[]
-                        { IAttribute.OBJECTCLASS_ATTRIBUTE, IAttribute.REFERRAL_ATTRIBUTE } );
-                    ISearch search = new Search( entry.getBrowserConnection(), param );
-                    SearchJob.searchAndUpdateModel( entry.getBrowserConnection(), search, monitor );
-
-                    ISearchResult[] srs = search.getSearchResults();
-                    if ( !monitor.isCanceled() && srs != null && srs.length == 1 )
+                    // delete all child entries
+                    while ( !dummyMonitor.isCanceled() && result.hasMore() )
                     {
-                        entry = srs[0].getEntry();
+                        if ( dummyMonitor.errorsReported() )
+                        {
+                            throw dummyMonitor.getException();
+                        }
+
+                        SearchResult sr = result.next();
+                        LdapDN ldapDn = JNDIUtils.getDn( sr );
+                        String childDn = ldapDn.getUpName();
+
+                        numberOfDeletedEntries = optimisticDeleteEntryRecursive( browserConnection, childDn,
+                            numberOfDeletedEntries, dummyMonitor, monitor );
+                        numberInBatch++;
                     }
                 }
-
-                int errorStatusSize1 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
-                deleteEntry( entry.getBrowserConnection(), entry, monitor );
-                int errorStatusSize2 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
-
-                if ( errorStatusSize1 == errorStatusSize2 )
+                catch ( Throwable e )
                 {
-                    numberOfDeletedEntries++;
-                    monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.model__deleted_n_entries,
-                        new String[]
-                            { "" + numberOfDeletedEntries } ) ); //$NON-NLS-1$
+                    ConnectionException ce = JNDIUtils.createConnectionException( null, e );
+
+                    if ( ce.getLdapStatusCode() == 3 || ce.getLdapStatusCode() == 4 || ce.getLdapStatusCode() == 11 )
+                    {
+                        // continue with search
+                    }
+                    else
+                    {
+                        dummyMonitor.reportError( ce );
+                        break;
+                    }
                 }
             }
+            while ( numberInBatch > 0 && !monitor.isCanceled() && !dummyMonitor.errorsReported() );
 
+            // try to delete the entry again 
+            if ( !dummyMonitor.errorsReported() )
+            {
+                deleteEntry( browserConnection, dn, useTreeDeleteContol, useManageDsaITControl, dummyMonitor );
+            }
+            if ( !dummyMonitor.errorsReported() )
+            {
+                numberOfDeletedEntries++;
+                monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.model__deleted_n_entries,
+                    new String[]
+                        { "" + numberOfDeletedEntries } ) ); //$NON-NLS-1$
+            }
         }
-        catch ( Exception e )
+        else
         {
-            monitor.reportError( e );
+            Throwable exception = dummyMonitor.getException();
+            // we have another exception
+            // report it to the dummy monitor if we are in the recursion
+            dummyMonitor.reportError( exception );
+            // also report it to the real monitor
+            monitor.reportError( exception );
         }
 
         return numberOfDeletedEntries;
@@ -264,20 +325,18 @@
 
     protected void runNotification()
     {
-        for ( Iterator it = deletedEntriesSet.iterator(); it.hasNext(); )
+        for ( IEntry entry : deletedEntriesSet )
         {
-            IEntry entry = ( IEntry ) it.next();
             EventRegistry.fireEntryUpdated( new EntryDeletedEvent( entry.getBrowserConnection(), entry ), this );
         }
-        for ( Iterator it = entriesToUpdateSet.iterator(); it.hasNext(); )
+        for ( IEntry parent : entriesToUpdateSet )
         {
-            IEntry parent = ( IEntry ) it.next();
             EventRegistry.fireEntryUpdated( new ChildrenInitializedEvent( parent ), this );
         }
-        for ( Iterator it = searchesToUpdateSet.iterator(); it.hasNext(); )
+        for ( ISearch search : searchesToUpdateSet )
         {
-            ISearch search = ( ISearch ) it.next();
-            EventRegistry.fireSearchUpdated( new SearchUpdateEvent( search, SearchUpdateEvent.EventDetail.SEARCH_PERFORMED ), this );
+            EventRegistry.fireSearchUpdated( new SearchUpdateEvent( search,
+                SearchUpdateEvent.EventDetail.SEARCH_PERFORMED ), this );
         }
     }
 
@@ -288,20 +347,28 @@
             : BrowserCoreMessages.jobs__delete_entries_error_n;
     }
 
-    static void deleteEntry( IBrowserConnection browserConnection, IEntry entry, StudioProgressMonitor monitor )
-    {
-        // dn
-        String dn = entry.getDn().getUpName();
 
+    static void deleteEntry( IBrowserConnection browserConnection, String dn, boolean useTreeDeleteControl,
+        boolean useManageDsaITControl, StudioProgressMonitor monitor )
+    {
         // controls
-        Control[] controls = null;
-        if ( entry.isReferral() )
+        List<BasicControl> controls = new ArrayList<BasicControl>();
+        if ( useTreeDeleteControl )
         {
-            controls = new Control[]
-                { new ManageReferralControl() };
+            BasicControl treeDeleteControl = new BasicControl( Control.TREEDELETE_CONTROL.getOid(),
+                Control.TREEDELETE_CONTROL.isCritical(), Control.TREEDELETE_CONTROL.getControlValue() );
+            controls.add( treeDeleteControl );
+        }
+        if ( useManageDsaITControl )
+        {
+            BasicControl manageDsaITControl = new BasicControl( Control.MANAGEDSAIT_CONTROL.getOid(),
+                Control.MANAGEDSAIT_CONTROL.isCritical(), Control.MANAGEDSAIT_CONTROL.getControlValue() );
+            controls.add( manageDsaITControl );
         }
 
-        browserConnection.getConnection().getJNDIConnectionWrapper()
-            .deleteEntry( dn, controls, monitor );
+        // delete entry
+        browserConnection.getConnection().getJNDIConnectionWrapper().deleteEntry( dn,
+            controls.toArray( new BasicControl[controls.size()] ), monitor );
     }
+
 }

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/EntryExistsCopyStrategyDialog.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/EntryExistsCopyStrategyDialog.java?rev=598395&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/EntryExistsCopyStrategyDialog.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/EntryExistsCopyStrategyDialog.java Mon Nov 26 11:44:28 2007
@@ -0,0 +1,100 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.studio.ldapbrowser.core.jobs;
+
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.name.Rdn;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+
+
+/**
+ * A dialog to select the copy strategy if an entry already exists.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public interface EntryExistsCopyStrategyDialog
+{
+
+    /**
+     * Sets the existing entry.
+     * 
+     * @param browserConnection the browser connection
+     * @param newLdapDn the new DN
+     */
+    void setExistingEntry( IBrowserConnection browserConnection, LdapDN newLdapDn );
+
+
+    /**
+     * Gets the copy strategy.
+     * 
+     * @return the copy strategy
+     */
+    EntryExistsCopyStrategy getStrategy();
+
+
+    /**
+     * Gets the RDN if {@link EntryExistsCopyStrategy.RENAME_AND_CONTINUE} was selected.
+     * Returns null if another strategy was selected.
+     * 
+     * @return the RDN
+     */
+    Rdn getRdn();
+
+
+    /**
+     * Returns true to remember the selected copy strategy.
+     * 
+     * @return true, to remember the selected copy strategy
+     */
+    boolean isRememberSelection();
+
+
+    /**
+     * Opens the dialog.
+     * 
+     * @return the status code
+     */
+    int open();
+
+    /**
+     * Enum for the copy strategy.
+     * 
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    public enum EntryExistsCopyStrategy
+    {
+
+        /** Break strategy, don't continue copy process. */
+        BREAK,
+
+        /** Ignore the entry to copy and continue the copy process. */
+        IGNORE_AND_CONTINUE,
+
+        /** Overwrite the entry to copy and continue the copy process. */
+        OVERWRITE_AND_CONTINUE,
+
+        /** Rename the entry to copy and continue the copy process. */
+        RENAME_AND_CONTINUE;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/EntryExistsCopyStrategyDialog.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java Mon Nov 26 11:44:28 2007
@@ -32,8 +32,8 @@
 import org.apache.directory.studio.connection.core.StudioProgressMonitor;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
-import org.apache.directory.studio.ldapbrowser.core.model.ldif.LdifEnumeration;
-import org.apache.directory.studio.ldapbrowser.core.model.ldif.parser.LdifParser;
+import org.apache.directory.studio.ldifparser.model.LdifEnumeration;
+import org.apache.directory.studio.ldifparser.parser.LdifParser;
 
 
 /**

Modified: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportCsvJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportCsvJob.java?rev=598395&r1=598394&r2=598395&view=diff
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportCsvJob.java (original)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportCsvJob.java Mon Nov 26 11:44:28 2007
@@ -35,18 +35,15 @@
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
+import org.apache.directory.studio.ldapbrowser.core.jobs.ExportLdifJob.JndiLdifEnumeration;
 import org.apache.directory.studio.ldapbrowser.core.model.AttributeDescription;
 import org.apache.directory.studio.ldapbrowser.core.model.ConnectionException;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
-import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
-import org.apache.directory.studio.ldapbrowser.core.model.ReferralException;
 import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.ReferralHandlingMethod;
-import org.apache.directory.studio.ldapbrowser.core.model.ldif.LdifEnumeration;
-import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifContainer;
-import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifContentRecord;
-import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifAttrValLine;
-import org.apache.directory.studio.ldapbrowser.core.utils.LdifUtils;
+import org.apache.directory.studio.ldifparser.LdifUtils;
+import org.apache.directory.studio.ldifparser.model.container.LdifContainer;
+import org.apache.directory.studio.ldifparser.model.container.LdifContentRecord;
+import org.apache.directory.studio.ldifparser.model.lines.LdifAttrValLine;
 import org.eclipse.core.runtime.Preferences;
 
 
@@ -198,10 +195,10 @@
     {
         try
         {
-            LdifEnumeration enumeration = ExportLdifJob.search( browserConnection, searchParameter, monitor );
-            while ( !monitor.isCanceled() && enumeration.hasNext( monitor ) )
+            JndiLdifEnumeration enumeration = ExportLdifJob.search( browserConnection, searchParameter, monitor );
+            while ( !monitor.isCanceled() && enumeration.hasNext() )
             {
-                LdifContainer container = enumeration.next( monitor );
+                LdifContainer container = enumeration.next();
 
                 if ( container instanceof LdifContentRecord )
                 {
@@ -223,24 +220,6 @@
             if ( ce.getLdapStatusCode() == 3 || ce.getLdapStatusCode() == 4 || ce.getLdapStatusCode() == 11 )
             {
                 // nothing
-            }
-            else if ( ce instanceof ReferralException )
-            {
-
-                if ( searchParameter.getReferralsHandlingMethod() == ReferralHandlingMethod.FOLLOW )
-                {
-                    ReferralException re = ( ReferralException ) ce;
-                    ISearch[] referralSearches = re.getReferralSearches();
-                    for ( int i = 0; i < referralSearches.length; i++ )
-                    {
-                        ISearch referralSearch = referralSearches[i];
-
-                        // export recursive
-                        exportToCsv( referralSearch.getBrowserConnection(), referralSearch.getSearchParameter(),
-                            bufferedWriter, count, monitor, attributes, attributeDelimiter, valueDelimiter,
-                            quoteCharacter, lineSeparator, encoding, binaryEncoding, exportDn );
-                    }
-                }
             }
             else
             {