You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2009/10/21 10:35:58 UTC

svn commit: r827920 [3/4] - in /directory/studio/trunk: connection-core/src/main/java/org/apache/directory/studio/connection/core/ connection-core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/ connection-ui/src/main/java/org/apache...

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CreateEntryRunnable.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CreateEntryRunnable.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CreateEntryRunnable.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CreateEntryRunnable.java Wed Oct 21 08:35:55 2009
@@ -21,13 +21,18 @@
 package org.apache.directory.studio.ldapbrowser.core.jobs;
 
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttributes;
+import javax.naming.ldap.Control;
+import javax.naming.ldap.ManageReferralControl;
 
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.jobs.StudioBulkRunnableWithProgress;
 import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
-import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.EntryAddedEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
@@ -113,7 +118,13 @@
 
         if ( !monitor.errorsReported() )
         {
-            createdEntry = ReadEntryRunnable.getEntry( browserConnection, entryToCreate.getDn(), monitor );
+            List<StudioControl> controls = new ArrayList<StudioControl>();
+            if ( entryToCreate.isReferral() )
+            {
+                controls.add( StudioControl.MANAGEDSAIT_CONTROL );
+            }
+
+            createdEntry = ReadEntryRunnable.getEntry( browserConnection, entryToCreate.getDn(), controls, monitor );
             createdEntry.setHasChildrenHint( false );
 
             // set some flags at the parent
@@ -194,12 +205,16 @@
             }
         }
 
-        // determine referrals handling method
-        ReferralHandlingMethod referralsHandlingMethod = entryToCreate.isReferral() ? ReferralHandlingMethod.MANAGE
-            : ReferralHandlingMethod.FOLLOW;
+        // ManageDsaIT control
+        Control[] controls = null;
+        if ( entryToCreate.isReferral() )
+        {
+            controls = new Control[]
+                { new ManageReferralControl( false ) };
+        }
 
-        browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( dn, jndiAttributes,
-            referralsHandlingMethod, null, monitor, null );
+        browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( dn, jndiAttributes, controls,
+            monitor, null );
     }
 
 }

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesJob.java Wed Oct 21 08:35:55 2009
@@ -35,9 +35,11 @@
 import javax.naming.directory.SearchResult;
 import javax.naming.ldap.BasicControl;
 import javax.naming.ldap.Control;
+import javax.naming.ldap.ManageReferralControl;
 
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
@@ -49,7 +51,6 @@
 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.StudioControl;
 import org.apache.directory.studio.ldapbrowser.core.utils.JNDIUtils;
 
 
@@ -147,8 +148,8 @@
 
             // delete from directory
             int errorStatusSize1 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
-            num = optimisticDeleteEntryRecursive( browserConnection, entryToDelete.getDn(), useTreeDeleteControl, num,
-                dummyMonitor, monitor );
+            num = optimisticDeleteEntryRecursive( browserConnection, entryToDelete.getDn(), entryToDelete.isReferral(),
+                useTreeDeleteControl, num, dummyMonitor, monitor );
             int errorStatusSize2 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
 
             if ( !monitor.isCanceled() )
@@ -215,6 +216,7 @@
      * 
      * @param browserConnection the browser connection
      * @param dn the DN to delete
+     * @param useManageDsaItControl true to use the ManageDsaIT control
      * @param useTreeDeleteControl true to use the tree delete control
      * @param numberOfDeletedEntries the number of deleted entries
      * @param dummyMonitor the dummy monitor
@@ -223,12 +225,12 @@
      * @return the cumulative number of deleted entries
      */
     static int optimisticDeleteEntryRecursive( IBrowserConnection browserConnection, LdapDN dn,
-        boolean useTreeDeleteControl, int numberOfDeletedEntries, StudioProgressMonitor dummyMonitor,
-        StudioProgressMonitor monitor )
+        boolean useManageDsaItControl, boolean useTreeDeleteControl, int numberOfDeletedEntries,
+        StudioProgressMonitor dummyMonitor, StudioProgressMonitor monitor )
     {
         // try to delete entry
         dummyMonitor.reset();
-        deleteEntry( browserConnection, dn, useTreeDeleteControl, dummyMonitor );
+        deleteEntry( browserConnection, dn, useManageDsaItControl, useTreeDeleteControl, dummyMonitor );
 
         if ( !dummyMonitor.errorsReported() )
         {
@@ -241,9 +243,7 @@
         {
             // do not follow referrals or dereference aliases when deleting entries
             AliasDereferencingMethod aliasDereferencingMethod = AliasDereferencingMethod.NEVER;
-            ReferralHandlingMethod referralsHandlingMethod = browserConnection.getRootDSE().isControlSupported(
-                StudioControl.MANAGEDSAIT_CONTROL.getOid() ) ? ReferralHandlingMethod.MANAGE
-                : ReferralHandlingMethod.IGNORE;
+            ReferralHandlingMethod referralsHandlingMethod = ReferralHandlingMethod.IGNORE;
 
             // perform one-level search and delete recursively
             int numberInBatch;
@@ -269,7 +269,7 @@
                         LdapDN childDn = JNDIUtils.getDn( sr );
 
                         numberOfDeletedEntries = optimisticDeleteEntryRecursive( browserConnection, childDn, false,
-                            numberOfDeletedEntries, dummyMonitor, monitor );
+                            false, numberOfDeletedEntries, dummyMonitor, monitor );
                         numberInBatch++;
                     }
                 }
@@ -292,7 +292,7 @@
             // try to delete the entry again 
             if ( !dummyMonitor.errorsReported() )
             {
-                deleteEntry( browserConnection, dn, false, dummyMonitor );
+                deleteEntry( browserConnection, dn, false, false, dummyMonitor );
             }
             if ( !dummyMonitor.errorsReported() )
             {
@@ -340,8 +340,8 @@
     }
 
 
-    static void deleteEntry( IBrowserConnection browserConnection, LdapDN dn, boolean useTreeDeleteControl,
-        StudioProgressMonitor monitor )
+    static void deleteEntry( IBrowserConnection browserConnection, LdapDN dn, boolean useManageDsaItControl,
+        boolean useTreeDeleteControl, StudioProgressMonitor monitor )
     {
         // controls
         List<Control> controlList = new ArrayList<Control>();
@@ -352,18 +352,18 @@
                 StudioControl.TREEDELETE_CONTROL.isCritical(), StudioControl.TREEDELETE_CONTROL.getControlValue() );
             controlList.add( treeDeleteControl );
         }
+        if ( useManageDsaItControl
+            && browserConnection.getRootDSE().isControlSupported( StudioControl.MANAGEDSAIT_CONTROL.getOid() ) )
+        {
+            controlList.add( new ManageReferralControl( false ) );
+        }
         Control[] controls = controlList.toArray( new Control[controlList.size()] );
 
-        // do not follow referrals
-        ReferralHandlingMethod referralsHandlingMethod = browserConnection.getRootDSE().isControlSupported(
-            StudioControl.MANAGEDSAIT_CONTROL.getOid() ) ? ReferralHandlingMethod.MANAGE
-            : ReferralHandlingMethod.IGNORE;
-
         // delete entry
         if ( browserConnection.getConnection() != null )
         {
-            browserConnection.getConnection().getJNDIConnectionWrapper().deleteEntry( dn.getUpName(),
-                referralsHandlingMethod, controls, monitor, null );
+            browserConnection.getConnection().getJNDIConnectionWrapper().deleteEntry( dn.getUpName(), controls,
+                monitor, null );
         }
     }
 

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlJob.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlJob.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlJob.java Wed Oct 21 08:35:55 2009
@@ -259,7 +259,7 @@
             // Creating and adding a search result entry or reference for each result
             while ( ne.hasMore() )
             {
-                SearchResult searchResult = ( SearchResult ) ne.nextElement();
+                SearchResult searchResult = ( SearchResult ) ne.next();
                 sr.addResponse( convertSearchResultToDsml( searchResult, searchParameter ) );
             }
         }
@@ -398,7 +398,7 @@
             // Creating and adding an add request for each result
             while ( ne.hasMore() )
             {
-                SearchResult searchResult = ( SearchResult ) ne.nextElement();
+                SearchResult searchResult = ( SearchResult ) ne.next();
                 AddRequestDsml arDsml = convertToAddRequestDsml( searchResult );
                 batchRequest.addRequest( arDsml );
             }

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifJob.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifJob.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifJob.java Wed Oct 21 08:35:55 2009
@@ -38,13 +38,13 @@
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioControl;
+import org.apache.directory.studio.connection.core.StudioPagedResultsControl;
 import org.apache.directory.studio.connection.core.io.jndi.StudioNamingEnumeration;
 import org.apache.directory.studio.connection.core.jobs.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.SearchParameter;
-import org.apache.directory.studio.ldapbrowser.core.model.StudioControl;
-import org.apache.directory.studio.ldapbrowser.core.model.StudioPagedResultsControl;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.DummyEntry;
 import org.apache.directory.studio.ldapbrowser.core.utils.AttributeComparator;
 import org.apache.directory.studio.ldapbrowser.core.utils.JNDIUtils;

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportDsmlJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportDsmlJob.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportDsmlJob.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportDsmlJob.java Wed Oct 21 08:35:55 2009
@@ -33,7 +33,7 @@
 import javax.naming.directory.DirContext;
 import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
-import javax.naming.ldap.ExtendedRequest;
+import javax.naming.ldap.Control;
 
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.directory.shared.dsmlv2.Dsmlv2Parser;
@@ -46,7 +46,9 @@
 import org.apache.directory.shared.dsmlv2.reponse.ModDNResponseDsml;
 import org.apache.directory.shared.dsmlv2.reponse.ModifyResponseDsml;
 import org.apache.directory.shared.dsmlv2.request.BatchRequest;
+import org.apache.directory.shared.ldap.codec.ControlCodec;
 import org.apache.directory.shared.ldap.codec.LdapConstants;
+import org.apache.directory.shared.ldap.codec.LdapMessageCodec;
 import org.apache.directory.shared.ldap.codec.LdapResultCodec;
 import org.apache.directory.shared.ldap.codec.add.AddRequestCodec;
 import org.apache.directory.shared.ldap.codec.bind.BindRequestCodec;
@@ -78,6 +80,8 @@
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
 
+import com.sun.jndi.ldap.BasicControl;
+
 
 /**
  * This class implements a Job for Importing a DSML File into a LDAP server
@@ -321,7 +325,7 @@
         // Executing the add request
         Entry entry = request.getEntry();
         browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( entry.getDn().getUpName(),
-            AttributeUtils.toAttributes( entry ), ReferralHandlingMethod.IGNORE, null, monitor, null );
+            AttributeUtils.toAttributes( entry ), getControls( request ), monitor, null );
 
         // Creating the response
         if ( batchResponseDsml != null )
@@ -388,7 +392,7 @@
     {
         // Executing the del request
         browserConnection.getConnection().getJNDIConnectionWrapper().deleteEntry( request.getEntry().getUpName(),
-            ReferralHandlingMethod.IGNORE, null, monitor, null );
+            getControls( request ), monitor, null );
 
         // Creating the response
         if ( batchResponseDsml != null )
@@ -465,7 +469,7 @@
 
         // Executing the modify request
         browserConnection.getConnection().getJNDIConnectionWrapper().modifyEntry( request.getObject().getUpName(),
-            modificationItems.toArray( new ModificationItem[0] ), ReferralHandlingMethod.IGNORE, null, monitor, null );
+            modificationItems.toArray( new ModificationItem[0] ), getControls( request ), monitor, null );
 
         // Creating the response
         if ( batchResponseDsml != null )
@@ -522,8 +526,7 @@
     {
         // Executing the modify DN request
         browserConnection.getConnection().getJNDIConnectionWrapper().renameEntry( request.getEntry().getUpName(),
-            request.getNewRDN().getUpName(), request.isDeleteOldRDN(), ReferralHandlingMethod.IGNORE, null, monitor,
-            null );
+            request.getNewRDN().getUpName(), request.isDeleteOldRDN(), getControls( request ), monitor, null );
 
         // Creating the response
         if ( batchResponseDsml != null )
@@ -580,7 +583,8 @@
             // [Optimization] We're only searching if we need to produce a response
             StudioNamingEnumeration ne = browserConnection.getConnection().getJNDIConnectionWrapper().search(
                 request.getBaseObject().getUpName(), request.getFilter().toString(), getSearchControls( request ),
-                getAliasDereferencingMethod( request ), ReferralHandlingMethod.IGNORE, null, monitor, null );
+                getAliasDereferencingMethod( request ), ReferralHandlingMethod.IGNORE, getControls( request ), monitor,
+                null );
 
             SearchParameter sp = new SearchParameter();
             sp.setReferralsHandlingMethod( browserConnection.getReferralsHandlingMethod() );
@@ -670,6 +674,24 @@
     }
 
 
+    private Control[] getControls( LdapMessageCodec request )
+    {
+        List<ControlCodec> controls = request.getControls();
+        if ( controls != null )
+        {
+            List<Control> jndiControls = new ArrayList<Control>();
+            for ( ControlCodec control : controls )
+            {
+                Control jndiControl = new BasicControl( control.getControlType(), control.getCriticality(), control
+                    .getEncodedValue() );
+                jndiControls.add( jndiControl );
+            }
+            return jndiControls.toArray( new Control[jndiControls.size()] );
+        }
+        return null;
+    }
+
+
     /**
      * Get the LDAP Result corresponding to the given monitor
      *

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java Wed Oct 21 08:35:55 2009
@@ -52,7 +52,6 @@
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.ConnectionCoreConstants;
 import org.apache.directory.studio.connection.core.DnUtils;
-import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.BulkModificationEvent;
@@ -456,7 +455,7 @@
             }
 
             browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( dn, jndiAttributes,
-                ReferralHandlingMethod.IGNORE, getControls( record ), monitor, null );
+                getControls( record ), monitor, null );
 
             if ( monitor.errorsReported() && updateIfEntryExists
                 && monitor.getException() instanceof NameAlreadyBoundException )
@@ -466,14 +465,14 @@
 
                 ModificationItem[] mis = ModelConverter.entryToReplaceModificationItems( dummyEntry );
                 browserConnection.getConnection().getJNDIConnectionWrapper().modifyEntry( dn, mis,
-                    ReferralHandlingMethod.IGNORE, getControls( record ), monitor, null );
+                    getControls( record ), monitor, null );
             }
         }
         else if ( record instanceof LdifChangeDeleteRecord )
         {
             LdifChangeDeleteRecord changeDeleteRecord = ( LdifChangeDeleteRecord ) record;
             browserConnection.getConnection().getJNDIConnectionWrapper().deleteEntry( dn,
-                ReferralHandlingMethod.IGNORE, getControls( changeDeleteRecord ), monitor, null );
+                getControls( changeDeleteRecord ), monitor, null );
         }
         else if ( record instanceof LdifChangeModifyRecord )
         {
@@ -506,7 +505,7 @@
             }
 
             browserConnection.getConnection().getJNDIConnectionWrapper().modifyEntry( dn, mis,
-                ReferralHandlingMethod.IGNORE, getControls( modifyRecord ), monitor, null );
+                getControls( modifyRecord ), monitor, null );
         }
         else if ( record instanceof LdifChangeModDnRecord )
         {
@@ -529,7 +528,7 @@
                 }
 
                 browserConnection.getConnection().getJNDIConnectionWrapper().renameEntry( dn, newDn.toString(),
-                    deleteOldRdn, ReferralHandlingMethod.IGNORE, getControls( modDnRecord ), monitor, null );
+                    deleteOldRdn, getControls( modDnRecord ), monitor, null );
             }
         }
     }

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeAttributesRunnable.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeAttributesRunnable.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeAttributesRunnable.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeAttributesRunnable.java Wed Oct 21 08:35:55 2009
@@ -30,6 +30,7 @@
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.schema.parsers.AttributeTypeDescription;
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.jobs.StudioBulkRunnableWithProgress;
@@ -145,6 +146,11 @@
         {
             if ( entry.getBrowserConnection() != null && entry.isAttributesInitialized() )
             {
+                // lookup the entry from cache and fire event with real entry
+                if ( entry.getBrowserConnection().getEntryFromCache( entry.getDn() ) != null )
+                {
+                    entry = entry.getBrowserConnection().getEntryFromCache( entry.getDn() );
+                }
                 EventRegistry.fireEntryUpdated( new AttributesInitializedEvent( entry ), this );
             }
         }
@@ -219,10 +225,6 @@
                 aliasesDereferencingMethod = AliasDereferencingMethod.NEVER;
             }
             ReferralHandlingMethod referralsHandlingMethod = entry.getBrowserConnection().getReferralsHandlingMethod();
-            if ( entry.isReferral() )
-            {
-                referralsHandlingMethod = ReferralHandlingMethod.MANAGE;
-            }
 
             if ( clearAllAttributes )
             {
@@ -240,10 +242,18 @@
                 }
             }
 
-            // search
+            // create search
             ISearch search = new Search( null, entry.getBrowserConnection(), entry.getDn(),
                 entry.isSubentry() ? ISearch.FILTER_SUBENTRY : ISearch.FILTER_TRUE, attributes, SearchScope.OBJECT, 0,
                 0, aliasesDereferencingMethod, referralsHandlingMethod, false, null );
+
+            // add controls
+            if ( entry.isReferral() )
+            {
+                search.getControls().add( StudioControl.MANAGEDSAIT_CONTROL );
+            }
+
+            // search
             SearchRunnable.searchAndUpdateModel( entry.getBrowserConnection(), search, monitor );
 
             // we requested all attributes, set initialized state

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeChildrenRunnable.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeChildrenRunnable.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeChildrenRunnable.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/InitializeChildrenRunnable.java Wed Oct 21 08:35:55 2009
@@ -26,6 +26,8 @@
 import java.util.List;
 
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioControl;
+import org.apache.directory.studio.connection.core.StudioPagedResultsControl;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.jobs.StudioBulkRunnableWithProgress;
@@ -36,15 +38,15 @@
 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.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.IContinuation;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.IRootDSE;
 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.StudioControl;
-import org.apache.directory.studio.ldapbrowser.core.model.StudioPagedResultsControl;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;
-import org.apache.directory.studio.ldapbrowser.core.model.impl.AliasBaseEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.ContinuedSearchResultEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.Search;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.SearchContinuation;
 
 
 /**
@@ -60,7 +62,7 @@
     private IEntry[] entries;
 
     /** The purge all caches flag. */
-    boolean purgeAllCaches;
+    private boolean purgeAllCaches;
 
     /** The paged search control, only used internally. */
     private StudioControl pagedSearchControl;
@@ -208,10 +210,12 @@
         ISearch search = createSearch( parent, pagedSearchControl, false, false, false );
 
         // search
-        ISearchResult[] srs = executeSearch( parent, search, monitor );
+        executeSearch( parent, search, monitor );
+        ISearchResult[] srs = search.getSearchResults();
+        SearchContinuation[] scs = search.getSearchContinuations();
 
         // fill children in search result
-        if ( srs != null && srs.length > 0 )
+        if ( (srs != null && srs.length > 0) || (scs != null && scs.length > 0) )
         {
             // clearing old children before filling new children is
             // necessary to handle aliases and referrals.
@@ -219,20 +223,26 @@
 
             do
             {
-                for ( ISearchResult searchResult : srs )
+                if(srs != null)
                 {
-                    if ( parent.isAlias() && !( searchResult.getEntry() instanceof AliasBaseEntry ) )
+                    for ( ISearchResult searchResult : srs )
                     {
-                        AliasBaseEntry aliasBaseEntry = new AliasBaseEntry( searchResult.getEntry()
-                            .getBrowserConnection(), searchResult.getEntry().getDn() );
-                        parent.addChild( aliasBaseEntry );
+                        parent.addChild( searchResult.getEntry() );
                     }
-                    else
+                    srs = null;
+                }
+                
+                if(scs != null)
+                {
+                    for ( SearchContinuation searchContinuation : scs )
                     {
-                        parent.addChild( searchResult.getEntry() );
+                        ContinuedSearchResultEntry entry = new ContinuedSearchResultEntry( parent
+                            .getBrowserConnection(), searchContinuation.getUrl().getDn() );
+                        entry.setUnresolved( searchContinuation.getUrl() );
+                        parent.addChild( entry );
                     }
+                    scs = null;
                 }
-                srs = null;
 
                 StudioPagedResultsControl sprRequestControl = null;
                 StudioPagedResultsControl sprResponseControl = null;
@@ -285,7 +295,9 @@
                             search.getResponseControls().clear();
                             sprRequestControl.setCookie( sprResponseControl.getCookie() );
 
-                            srs = executeSearch( parent, search, monitor );
+                            executeSearch( parent, search, monitor );
+                            srs = search.getSearchResults();
+                            scs = search.getSearchContinuations();
                         }
                     }
                 }
@@ -322,7 +334,9 @@
 
     private void executeSubSearch( IEntry parent, ISearch subSearch, StudioProgressMonitor monitor )
     {
-        ISearchResult[] subSrs = executeSearch( parent, subSearch, monitor );
+        executeSearch( parent, subSearch, monitor );
+        ISearchResult[] subSrs = subSearch.getSearchResults();
+        SearchContinuation[] subScs = subSearch.getSearchContinuations();
 
         // fill children in search result
         if ( subSrs != null && subSrs.length > 0 )
@@ -331,81 +345,90 @@
             {
                 parent.addChild( searchResult.getEntry() );
             }
+            for ( SearchContinuation searchContinuation : subScs )
+            {
+                ContinuedSearchResultEntry entry = new ContinuedSearchResultEntry( parent
+                    .getBrowserConnection(), searchContinuation.getUrl().getDn() );
+                entry.setUnresolved( searchContinuation.getUrl() );
+                parent.addChild( entry );
+            }
         }
     }
 
 
-    private static ISearchResult[] executeSearch( IEntry parent, ISearch search, StudioProgressMonitor monitor )
+    private static void executeSearch( IEntry parent, ISearch search, StudioProgressMonitor monitor )
     {
         SearchRunnable.searchAndUpdateModel( parent.getBrowserConnection(), search, monitor );
         ISearchResult[] srs = search.getSearchResults();
         monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.jobs__init_entries_progress_subcount,
             new String[]
                 { srs == null ? Integer.toString( 0 ) : Integer.toString( srs.length ), parent.getDn().getUpName() } ) );
-        return srs;
     }
 
 
     private static ISearch createSearch( IEntry parent, StudioControl pagedSearchControl, boolean isSubSearch,
         boolean isAliasSearch, boolean isReferralsSearch )
     {
-        // determine alias and referral handling
+        // scope
         SearchScope scope = SearchScope.ONELEVEL;
+
+        // filter
+        String filter = parent.getChildrenFilter();
+        if ( isSubSearch )
+        {
+            filter = ISearch.FILTER_SUBENTRY;
+        }
+        else if ( isAliasSearch && isReferralsSearch )
+        {
+            filter = ISearch.FILTER_ALIAS_OR_REFERRAL;
+        }
+        else if ( isAliasSearch )
+        {
+            filter = ISearch.FILTER_ALIAS;
+        }
+        else if ( isReferralsSearch )
+        {
+            filter = ISearch.FILTER_REFERRAL;
+        }
+
+        // alias handling
         AliasDereferencingMethod aliasesDereferencingMethod = parent.getBrowserConnection()
             .getAliasesDereferencingMethod();
         if ( parent.isAlias() || isAliasSearch )
         {
             aliasesDereferencingMethod = AliasDereferencingMethod.NEVER;
         }
+
+        // referral handling
         ReferralHandlingMethod referralsHandlingMethod = parent.getBrowserConnection().getReferralsHandlingMethod();
-        if ( parent.isReferral() || isReferralsSearch )
-        {
-            referralsHandlingMethod = ReferralHandlingMethod.MANAGE;
-        }
 
-        if ( isSubSearch )
+        // create search
+        ISearch search = new Search( null, parent.getBrowserConnection(), parent.getDn(), filter,
+            ISearch.NO_ATTRIBUTES, scope, parent.getBrowserConnection().getCountLimit(), parent.getBrowserConnection()
+                .getTimeLimit(), aliasesDereferencingMethod, referralsHandlingMethod, BrowserCorePlugin.getDefault()
+                .getPluginPreferences().getBoolean( BrowserCoreConstants.PREFERENCE_CHECK_FOR_CHILDREN ), null );
+
+        // controls
+        if ( parent.isReferral() || isReferralsSearch || parent.getBrowserConnection().isManageDsaIT() )
         {
-            ISearch subSearch = new Search( null, parent.getBrowserConnection(), parent.getDn(), parent
-                .getChildrenFilter() != null ? parent.getChildrenFilter() : ISearch.FILTER_SUBENTRY,
-                ISearch.NO_ATTRIBUTES, scope, parent.getBrowserConnection().getCountLimit(), parent
-                    .getBrowserConnection().getTimeLimit(), aliasesDereferencingMethod, referralsHandlingMethod,
-                BrowserCorePlugin.getDefault().getPluginPreferences().getBoolean(
-                    BrowserCoreConstants.PREFERENCE_CHECK_FOR_CHILDREN ), null );
-            subSearch.getSearchParameter().getControls().add( StudioControl.SUBENTRIES_CONTROL );
-            return subSearch;
+            search.getSearchParameter().getControls().add( StudioControl.MANAGEDSAIT_CONTROL );
         }
-        else
+        if ( pagedSearchControl != null )
         {
-            String filter = parent.getChildrenFilter();
-            if ( isAliasSearch && isReferralsSearch )
-            {
-                filter = ISearch.FILTER_ALIAS_OR_REFERRAL;
-            }
-            else if ( isAliasSearch )
-            {
-                filter = ISearch.FILTER_ALIAS;
-            }
-            else if ( isReferralsSearch )
-            {
-                filter = ISearch.FILTER_REFERRAL;
-            }
-
-            ISearch search = new Search( null, parent.getBrowserConnection(), parent.getDn(), filter,
-                ISearch.NO_ATTRIBUTES, scope, parent.getBrowserConnection().getCountLimit(), parent
-                    .getBrowserConnection().getTimeLimit(), aliasesDereferencingMethod, referralsHandlingMethod,
-                BrowserCorePlugin.getDefault().getPluginPreferences().getBoolean(
-                    BrowserCoreConstants.PREFERENCE_CHECK_FOR_CHILDREN ), null );
-            if ( pagedSearchControl != null )
-            {
-                search.getSearchParameter().getControls().add( pagedSearchControl );
-            }
-            return search;
+            search.getSearchParameter().getControls().add( pagedSearchControl );
         }
+
+        return search;
     }
 
 
     static void clearCaches( IEntry entry, boolean purgeAllCaches )
     {
+        if(entry instanceof IContinuation)
+        {
+            return;
+        }
+        
         // clear the parent-child relationship, recursively
         IEntry[] children = entry.getChildren();
         if ( children != null )

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/MoveEntriesJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/MoveEntriesJob.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/MoveEntriesJob.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/MoveEntriesJob.java Wed Oct 21 08:35:55 2009
@@ -33,6 +33,7 @@
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.DnUtils;
+import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.BulkModificationEvent;
@@ -174,8 +175,8 @@
                         if ( !dummyMonitor.errorsReported() )
                         {
                             dummyMonitor.reset();
-                            numDel = DeleteEntriesJob.optimisticDeleteEntryRecursive( browserConnection, oldDn, false,
-                                numDel, dummyMonitor, monitor );
+                            numDel = DeleteEntriesJob.optimisticDeleteEntryRecursive( browserConnection, oldDn,
+                                oldEntry.isReferral(), false, numDel, dummyMonitor, monitor );
                         }
                     }
                     else
@@ -206,7 +207,12 @@
 
                 // add new entry to new parent
                 boolean hasMoreChildren = newParent.hasMoreChildren() || !newParent.isChildrenInitialized();
-                IEntry newEntry = ReadEntryRunnable.getEntry( browserConnection, newDn, monitor );
+                List<StudioControl> controls = new ArrayList<StudioControl>();
+                if ( oldEntry.isReferral() )
+                {
+                    controls.add( StudioControl.MANAGEDSAIT_CONTROL );
+                }
+                IEntry newEntry = ReadEntryRunnable.getEntry( browserConnection, newDn, controls, monitor );
                 newEntries[i] = newEntry;
                 newParent.addChild( newEntry );
                 newParent.setHasMoreChildren( hasMoreChildren );

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReadEntryRunnable.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReadEntryRunnable.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReadEntryRunnable.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReadEntryRunnable.java Wed Oct 21 08:35:55 2009
@@ -21,8 +21,11 @@
 package org.apache.directory.studio.ldapbrowser.core.jobs;
 
 
+import java.util.List;
+
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.jobs.StudioBulkRunnableWithProgress;
@@ -131,7 +134,7 @@
             pm.reportProgress( " " ); //$NON-NLS-1$
             pm.worked( 1 );
 
-            readEntry = getEntry( browserConnection, dn, pm );
+            readEntry = getEntry( browserConnection, dn, null, pm );
         }
     }
 
@@ -149,11 +152,12 @@
      * 
      * @param browserConnection the browser connection
      * @param dn the DN of the entry
+     * @param controls the LDAP controls
      * @param monitor the progress monitor
      * 
      * @return the read entry
      */
-    static IEntry getEntry( IBrowserConnection browserConnection, LdapDN dn, StudioProgressMonitor monitor )
+    static IEntry getEntry( IBrowserConnection browserConnection, LdapDN dn, List<StudioControl> controls, StudioProgressMonitor monitor )
     {
         try
         {
@@ -166,7 +170,7 @@
 
             // search in directory
             ISearch search = new Search( null, browserConnection, dn, null, ISearch.NO_ATTRIBUTES, SearchScope.OBJECT,
-                1, 0, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.MANAGE, true, null );
+                1, 0, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.IGNORE, true, controls );
             SearchRunnable.searchAndUpdateModel( browserConnection, search, monitor );
             ISearchResult[] srs = search.getSearchResults();
             if ( srs.length > 0 )

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java Wed Oct 21 08:35:55 2009
@@ -28,13 +28,15 @@
 
 import javax.naming.ContextNotEmptyException;
 import javax.naming.directory.SearchControls;
+import javax.naming.ldap.Control;
+import javax.naming.ldap.ManageReferralControl;
 
 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.StudioControl;
 import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
-import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.EntryRenamedEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
@@ -158,8 +160,8 @@
                     if ( !dummyMonitor.errorsReported() )
                     {
                         dummyMonitor.reset();
-                        DeleteEntriesJob.optimisticDeleteEntryRecursive( browserConnection, oldDn, false, 0,
-                            dummyMonitor, monitor );
+                        DeleteEntriesJob.optimisticDeleteEntryRecursive( browserConnection, oldDn, oldEntry
+                            .isReferral(), false, 0, dummyMonitor, monitor );
                     }
                 }
                 else
@@ -189,7 +191,12 @@
             IEntry parent = oldEntry.getParententry();
             boolean hasMoreChildren = parent.hasMoreChildren();
             parent.deleteChild( oldEntry );
-            newEntry = ReadEntryRunnable.getEntry( browserConnection, newDn, monitor );
+            List<StudioControl> controls = new ArrayList<StudioControl>();
+            if ( oldEntry.isReferral() )
+            {
+                controls.add( StudioControl.MANAGEDSAIT_CONTROL );
+            }
+            newEntry = ReadEntryRunnable.getEntry( browserConnection, newDn, controls, monitor );
             parent.addChild( newEntry );
             parent.setHasMoreChildren( hasMoreChildren );
 
@@ -242,7 +249,6 @@
     }
 
 
-    
     /**
      * Moves/Renames an entry.
      * 
@@ -258,14 +264,18 @@
         String oldDnString = entry.getDn().getUpName();
         String newDnString = newDn.getUpName();
 
-        // determine referrals handling method
-        ReferralHandlingMethod referralsHandlingMethod = entry.isReferral() ? ReferralHandlingMethod.MANAGE
-            : ReferralHandlingMethod.FOLLOW;
+        // ManageDsaIT control
+        Control[] controls = null;
+        if ( entry.isReferral() )
+        {
+            controls = new Control[]
+                { new ManageReferralControl( false ) };
+        }
 
         if ( browserConnection.getConnection() != null )
         {
             browserConnection.getConnection().getJNDIConnectionWrapper().renameEntry( oldDnString, newDnString, true,
-                referralsHandlingMethod, null, monitor, null );
+                controls, monitor, null );
         }
     }
 

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java Wed Oct 21 08:35:55 2009
@@ -40,8 +40,11 @@
 
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.util.LdapURL;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.DnUtils;
+import org.apache.directory.studio.connection.core.StudioControl;
+import org.apache.directory.studio.connection.core.StudioPagedResultsControl;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.io.jndi.StudioNamingEnumeration;
@@ -59,12 +62,11 @@
 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.StudioControl;
-import org.apache.directory.studio.ldapbrowser.core.model.StudioPagedResultsControl;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.BaseDNEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.ContinuedSearchResultEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.Entry;
-import org.apache.directory.studio.ldapbrowser.core.model.impl.ReferralBaseEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.SearchContinuation;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.Value;
 import org.apache.directory.studio.ldapbrowser.core.utils.JNDIUtils;
 import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
@@ -309,6 +311,7 @@
                 // add returning attributes for children and alias detection
                 SearchParameter searchParameter = getSearchParameter( search );
                 ArrayList<ISearchResult> searchResultList = new ArrayList<ISearchResult>();
+                ArrayList<SearchContinuation> searchContinuationList = new ArrayList<SearchContinuation>();
 
                 StudioNamingEnumeration enumeration = null;
                 // search
@@ -320,37 +323,54 @@
                     while ( !monitor.isCanceled() && enumeration != null && enumeration.hasMore() )
                     {
                         StudioSearchResult sr = enumeration.next();
-                        LdapDN dn = JNDIUtils.getDn( sr );
-                        boolean isReferral = sr.isReferral();
-                        Connection resultConnection = sr.getConnection();
-                        IBrowserConnection resultBrowserConnection = BrowserCorePlugin.getDefault()
-                            .getConnectionManager().getBrowserConnection( resultConnection );
-                        if ( resultBrowserConnection == null )
-                        {
-                            resultBrowserConnection = browserConnection;
-                        }
+                        boolean isContinuedSearchResult = sr.isContinuedSearchResult();
+                        LdapURL searchContinuationUrl = sr.getSearchContinuationUrl();
 
-                        // get entry from cache or create it
-                        IEntry entry = resultBrowserConnection.getEntryFromCache( dn );
-                        if ( entry == null )
+                        if ( searchContinuationUrl == null )
                         {
-                            entry = createAndCacheEntry( resultBrowserConnection, dn, monitor );
-                        }
+                            LdapDN dn = JNDIUtils.getDn( sr );
+                            IEntry entry = null;
+
+                            Connection resultConnection = sr.getConnection();
+                            IBrowserConnection resultBrowserConnection = BrowserCorePlugin.getDefault()
+                                .getConnectionManager().getBrowserConnection( resultConnection );
+                            if ( resultBrowserConnection == null )
+                            {
+                                resultBrowserConnection = browserConnection;
+                            }
+
+                            // get entry from cache or create it
+                            entry = resultBrowserConnection.getEntryFromCache( dn );
+                            if ( entry == null )
+                            {
+                                entry = createAndCacheEntry( resultBrowserConnection, dn, monitor );
+                            }
+
+                            // initialize special flags
+                            initFlags( entry, sr, searchParameter );
 
-                        // initialize special flags
-                        initFlags( entry, sr, searchParameter );
+                            // fill the attributes
+                            fillAttributes( entry, sr, search.getSearchParameter() );
 
-                        // fill the attributes
-                        fillAttributes( entry, sr, search.getSearchParameter() );
+                            if ( isContinuedSearchResult )
+                            {
+                                // the result is from a continued search
+                                // we create a special entry that displays the URL of the entry
+                                entry = new ContinuedSearchResultEntry( resultBrowserConnection, dn );
+                            }
 
-                        if ( isReferral )
+                            searchResultList
+                                .add( new org.apache.directory.studio.ldapbrowser.core.model.impl.SearchResult( entry,
+                                    search ) );
+                        }
+                        else
                         {
-                            entry = new ReferralBaseEntry( resultBrowserConnection, dn );
+                            //entry = new ContinuedSearchResultEntry( resultBrowserConnection, dn );
+                            SearchContinuation searchContinuation = new SearchContinuation( search,
+                                searchContinuationUrl );
+                            searchContinuationList.add( searchContinuation );
                         }
 
-                        searchResultList.add( new org.apache.directory.studio.ldapbrowser.core.model.impl.SearchResult(
-                            entry, search ) );
-
                         monitor
                             .reportProgress( searchResultList.size() == 1 ? BrowserCoreMessages.model__retrieved_1_entry
                                 : BrowserCoreMessages.bind( BrowserCoreMessages.model__retrieved_n_entries,
@@ -414,6 +434,8 @@
 
                 search.setSearchResults( ( ISearchResult[] ) searchResultList
                     .toArray( new ISearchResult[searchResultList.size()] ) );
+                search.setSearchContinuations( ( SearchContinuation[] ) searchContinuationList
+                    .toArray( new SearchContinuation[searchContinuationList.size()] ) );
             }
         }
         catch ( Exception e )
@@ -639,6 +661,7 @@
                         entry = new BaseDNEntry( aDN, browserConnection );
                         browserConnection.getRootDSE().addChild( entry );
                         browserConnection.cacheEntry( entry );
+                        enumeration.close();
                     }
                 }
                 catch ( NamingException e )
@@ -725,7 +748,7 @@
                             entry.setReferral( true );
                             entry.setHasChildrenHint( false );
                         }
-                        
+
                         IAttribute ocAttribute = entry.getAttribute( attributeDescription );
                         Value ocValue = new Value( ocAttribute, value );
                         ocAttribute.addValue( ocValue );

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java Wed Oct 21 08:35:55 2009
@@ -204,6 +204,9 @@
     /** The key for the connection parameter "Modify add delete order". */
     public static String CONNECTION_PARAMETER_MODIFY_ORDER = "ldapbrowser.modifyOrder";
 
+    /** The key for the connection parameter "Use ManageDsaIT Control" */
+    public static String CONNECTION_PARAMETER_MANAGE_DSA_IT = "ldapbrowser.manageDsaIT";
+
 
     /**
      * Gets the URL of this connection.
@@ -330,6 +333,22 @@
 
 
     /**
+     * Checks if ManageDsaIT control should be used.
+     * 
+     * @return true if ManageDsaIT control should be used
+     */
+    public abstract boolean isManageDsaIT();
+
+
+    /**
+     * Sets if ManageDsaIT control should be used.
+     * 
+     * @param manageDsaIT true to use ManageDsaIT control
+     */
+    public abstract void setManageDsaIT( boolean manageDsaIT );
+
+
+    /**
      * Checks if operational attributes should be fetched.
      * 
      * @return the true if operational attributes should be fetched

Added: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ICompareableEntry.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ICompareableEntry.java?rev=827920&view=auto
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ICompareableEntry.java (added)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ICompareableEntry.java Wed Oct 21 08:35:55 2009
@@ -0,0 +1,32 @@
+/*
+ *  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.model;
+
+
+/**
+ * A tagging interface for comparable entries.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public interface ICompareableEntry extends IEntry
+{
+}

Added: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IContinuation.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IContinuation.java?rev=827920&view=auto
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IContinuation.java (added)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IContinuation.java Wed Oct 21 08:35:55 2009
@@ -0,0 +1,69 @@
+/*
+ *  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.model;
+
+
+import org.apache.directory.shared.ldap.util.LdapURL;
+
+
+/**
+ * A tagging interface for search continuations.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public interface IContinuation
+{
+
+    public enum State
+    {
+        /** The search continuation URL is unresolved.*/
+        UNRESOLVED,
+
+        /** The search continuation URL is unresolved. The user didn't select a suitable connection for the URL. */
+        CANCELED,
+
+        /** The search continuation URL is resolved. The user selected a suitable connection for the URL. */
+        RESOLVED
+    }
+
+
+    /**
+     * Gets the resolve state.
+     * 
+     * @return the resolve state
+     */
+    State getState();
+
+
+    /**
+     * Resolves the search continuation URL, asks the user which connection to use.
+     */
+    void resolve();
+
+
+    /**
+     * Gets the search continuation URL.
+     * 
+     * @return the search continuation URL
+     */
+    LdapURL getUrl();
+}

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ISearch.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ISearch.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ISearch.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ISearch.java Wed Oct 21 08:35:55 2009
@@ -28,7 +28,9 @@
 import org.apache.directory.shared.ldap.util.LdapURL;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.ConnectionPropertyPageProvider;
+import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.jobs.StudioBulkRunnableWithProgress;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.SearchContinuation;
 import org.apache.directory.studio.ldapbrowser.core.propertypageproviders.SearchPropertyPageProvider;
 import org.eclipse.core.runtime.IAdaptable;
 
@@ -63,7 +65,7 @@
 
     /** Filter for fetching referrals (objectClass=referral) */
     public static final String FILTER_REFERRAL = "(objectClass=referral)"; //$NON-NLS-1$
-    
+
     /** Filter for fetching aliases and referrals (|(objectClass=alias)(objectClass=referral)) */
     public static final String FILTER_ALIAS_OR_REFERRAL = "(|(objectClass=alias)(objectClass=referral))"; //$NON-NLS-1$
 
@@ -435,4 +437,20 @@
      */
     public abstract void setTopPageSearchRunnable( StudioBulkRunnableWithProgress nextSearchRunnable );
 
+
+    /**
+     * Gets the search continuations.
+     * 
+     * @return the search continuations
+     */
+    public abstract SearchContinuation[] getSearchContinuations();
+
+
+    /**
+     * Sets the search continuations 
+     *
+     * @param the search continuations
+     */
+    public abstract void setSearchContinuations( SearchContinuation[] searchContinuations );
+
 }

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/SearchParameter.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/SearchParameter.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/SearchParameter.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/SearchParameter.java Wed Oct 21 08:35:55 2009
@@ -27,6 +27,7 @@
 
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/AbstractEntry.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/AbstractEntry.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/AbstractEntry.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/AbstractEntry.java Wed Oct 21 08:35:55 2009
@@ -47,6 +47,7 @@
 import org.apache.directory.studio.ldapbrowser.core.model.AttributeHierarchy;
 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.ICompareableEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
 import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
@@ -64,7 +65,7 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public abstract class AbstractEntry implements IEntry
+public abstract class AbstractEntry implements IEntry, ICompareableEntry
 {
 
     private static final long serialVersionUID = -2431637532526418774L;
@@ -876,11 +877,11 @@
     public boolean equals( Object o )
     {
         // check argument
-        if ( o == null || !( o instanceof IEntry ) )
+        if ( o == null || !( o instanceof ICompareableEntry ) )
         {
             return false;
         }
-        IEntry e = ( IEntry ) o;
+        ICompareableEntry e = ( ICompareableEntry ) o;
 
         // compare dn and connection
         return getDn() == null ? e.getDn() == null : ( getDn().equals( e.getDn() ) && getBrowserConnection().equals(

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/Bookmark.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/Bookmark.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/Bookmark.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/Bookmark.java Wed Oct 21 08:35:55 2009
@@ -73,7 +73,7 @@
     {
         this.connection = connection;
         this.bookmarkParameter = bookmarkParameter;
-        this.bookmarkEntry = new DelegateEntry( connection, bookmarkParameter.getDn() );
+        this.bookmarkEntry = new BookmarkEntry( connection, bookmarkParameter.getDn() );
     }
 
 
@@ -88,7 +88,7 @@
     {
         this.connection = connection;
         this.bookmarkParameter = new BookmarkParameter( dn, name );
-        this.bookmarkEntry = new DelegateEntry( connection, dn );
+        this.bookmarkEntry = new BookmarkEntry( connection, dn );
     }
 
 

Added: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BookmarkEntry.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BookmarkEntry.java?rev=827920&view=auto
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BookmarkEntry.java (added)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BookmarkEntry.java Wed Oct 21 08:35:55 2009
@@ -0,0 +1,83 @@
+/*
+ *  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.model.impl;
+
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.ICompareableEntry;
+
+
+/**
+ * An {@link BookmarkEntry} represents the target of a {@link Bookmark}.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BookmarkEntry extends DelegateEntry implements ICompareableEntry
+{
+
+    private static final long serialVersionUID = -6351277968774226912L;
+
+
+    protected BookmarkEntry()
+    {
+    }
+
+
+    /**
+     * Creates a new instance of BookmarkEntry.
+     * 
+     * @param connection the connection of the bookmark target
+     * @param dn the DN of the bookmark target
+     */
+    public BookmarkEntry( IBrowserConnection connection, LdapDN dn )
+    {
+        super( connection, dn );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public int hashCode()
+    {
+        return getDn().hashCode();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean equals( Object o )
+    {
+        // check argument
+        if ( o == null || !( o instanceof ICompareableEntry ) )
+        {
+            return false;
+        }
+        ICompareableEntry e = ( ICompareableEntry ) o;
+
+        // compare dn and connection
+        return getDn() == null ? e.getDn() == null : ( getDn().equals( e.getDn() ) && getBrowserConnection().equals(
+            e.getBrowserConnection() ) );
+    }
+}

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BrowserConnection.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BrowserConnection.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BrowserConnection.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/BrowserConnection.java Wed Oct 21 08:35:55 2009
@@ -100,7 +100,7 @@
             connection.getConnectionParameter().setExtendedIntProperty(
                 CONNECTION_PARAMETER_ALIASES_DEREFERENCING_METHOD, AliasDereferencingMethod.ALWAYS.getOrdinal() );
             connection.getConnectionParameter().setExtendedIntProperty( CONNECTION_PARAMETER_REFERRALS_HANDLING_METHOD,
-                ReferralHandlingMethod.FOLLOW.getOrdinal() );
+                ReferralHandlingMethod.FOLLOW_MANUALLY.getOrdinal() );
             connection.getConnectionParameter().setExtendedBoolProperty( CONNECTION_PARAMETER_FETCH_BASE_DNS, true );
             connection.getConnectionParameter().setExtendedProperty( CONNECTION_PARAMETER_BASE_DN, "" );
             connection.getConnectionParameter().setExtendedBoolProperty( CONNECTION_PARAMETER_FETCH_SUBENTRIES, false );
@@ -316,6 +316,25 @@
     /**
      * {@inheritDoc}
      */
+    public boolean isManageDsaIT()
+    {
+        return connection.getConnectionParameter().getExtendedBoolProperty( CONNECTION_PARAMETER_MANAGE_DSA_IT );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setManageDsaIT( boolean manageDsaIT )
+    {
+        connection.getConnectionParameter().setExtendedBoolProperty( CONNECTION_PARAMETER_MANAGE_DSA_IT, manageDsaIT );
+        ConnectionEventRegistry.fireConnectionUpdated( connection, this );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
     public boolean isFetchSubentries()
     {
         return connection.getConnectionParameter().getExtendedBoolProperty( CONNECTION_PARAMETER_FETCH_SUBENTRIES );

Copied: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/ContinuedSearchResultEntry.java (from r824908, directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/ReferralBaseEntry.java)
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/ContinuedSearchResultEntry.java?p2=directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/ContinuedSearchResultEntry.java&p1=directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/ReferralBaseEntry.java&r1=824908&r2=827920&rev=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/ReferralBaseEntry.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/ContinuedSearchResultEntry.java Wed Oct 21 08:35:55 2009
@@ -21,37 +21,176 @@
 package org.apache.directory.studio.ldapbrowser.core.model.impl;
 
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.util.LdapURL;
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
+import org.apache.directory.studio.ldapbrowser.core.jobs.InitializeAttributesRunnable;
+import org.apache.directory.studio.ldapbrowser.core.jobs.StudioBrowserJob;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.IContinuation;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
 
 
 /**
- * An {@link ReferralBaseEntry} represents the target 
- * (named by the ref attribute) of an referral entry.
+ * An {@link ContinuedSearchResultEntry} represents a result entry of a search continuation.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public class ReferralBaseEntry extends DelegateEntry
+public class ContinuedSearchResultEntry extends DelegateEntry implements IContinuation
 {
 
     private static final long serialVersionUID = -6351277968774226912L;
 
+    /** The search continuation URL. */
+    private LdapURL url;
+
+    /** The state. */
+    private State state;
+
+    /** The dummy connection. */
+    private DummyConnection dummyConnection;
+
 
-    protected ReferralBaseEntry()
+    protected ContinuedSearchResultEntry()
     {
     }
 
 
     /**
-     * Creates a new instance of ReferralBaseEntry.
+     * Creates a new instance of ContinuedSearchResultEntry.
      * 
-     * @param connection the connection of the referral target
-     * @param dn the DN of the referral target
+     * Sets the internal state of the target connection to "resolved".
+     * 
+     * @param connection the connection of the continued search
+     * @param dn the DN of the entry
      */
-    public ReferralBaseEntry( IBrowserConnection connection, LdapDN dn )
+    public ContinuedSearchResultEntry( IBrowserConnection connection, LdapDN dn )
     {
         super( connection, dn );
+        this.state = State.RESOLVED;
     }
 
+
+    /**
+     * Sets the internal state of the target connection to "unresolved".
+     * This means, when calling {@link #getAttributes()} or {@link #getChildren()}
+     * the user is asked for the target connection to use. 
+     * 
+     * @param url the new unresolved
+     */
+    public void setUnresolved( LdapURL url )
+    {
+        this.state = State.UNRESOLVED;
+        this.url = url;
+        super.connectionId = null;
+    }
+
+
+    @Override
+    public IBrowserConnection getBrowserConnection()
+    {
+        if ( state == State.RESOLVED )
+        {
+            return super.getBrowserConnection();
+        }
+        else
+        {
+            if ( dummyConnection == null )
+            {
+                dummyConnection = new DummyConnection( Schema.DEFAULT_SCHEMA );
+            }
+            return dummyConnection;
+        }
+    }
+
+
+    @Override
+    protected IEntry getDelegate()
+    {
+        if ( state == State.RESOLVED )
+        {
+            return super.getDelegate();
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public State getState()
+    {
+        return state;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public LdapURL getUrl()
+    {
+        return url != null ? url : super.getUrl();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void resolve()
+    {
+        // get referral connection, exit if canceled
+        List<LdapURL> urls = new ArrayList<LdapURL>();
+        urls.add( url );
+        Connection referralConnection = ConnectionCorePlugin.getDefault().getReferralHandler().getReferralConnection(
+            urls );
+        if ( referralConnection == null )
+        {
+            state = State.CANCELED;
+            entryDoesNotExist = true;
+        }
+        else
+        {
+            state = State.RESOLVED;
+            super.connectionId = referralConnection.getId();
+
+            InitializeAttributesRunnable iar = new InitializeAttributesRunnable( this );
+            new StudioBrowserJob( iar ).execute();
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public int hashCode()
+    {
+        return getDn().hashCode();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean equals( Object o )
+    {
+        // check argument
+        if ( o == null || !( o instanceof ContinuedSearchResultEntry ) )
+        {
+            return false;
+        }
+        ContinuedSearchResultEntry e = ( ContinuedSearchResultEntry ) o;
+
+        // compare dn and connection
+        return getDn() == null ? e.getDn() == null : ( getDn().equals( e.getDn() ) && getBrowserConnection().equals(
+            e.getBrowserConnection() ) );
+    }
 }

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DelegateEntry.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DelegateEntry.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DelegateEntry.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DelegateEntry.java Wed Oct 21 08:35:55 2009
@@ -46,22 +46,22 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public class DelegateEntry implements IEntry
+public abstract class DelegateEntry implements IEntry
 {
 
     private static final long serialVersionUID = -4488685394817691963L;
 
     /** The connection id. */
-    private String connectionId;
+    protected String connectionId;
 
     /** The DN. */
-    private LdapDN dn;
+    protected LdapDN dn;
 
     /** The entry does not exist flag. */
-    private boolean entryDoesNotExist;
+    protected boolean entryDoesNotExist;
 
     /** The delegate. */
-    private IEntry delegate;
+    protected IEntry delegate;
 
 
     protected DelegateEntry()
@@ -75,7 +75,7 @@
      * @param browserConnection the browser connection of the delegate
      * @param dn the DN of the delegate
      */
-    public DelegateEntry( IBrowserConnection browserConnection, LdapDN dn )
+    protected DelegateEntry( IBrowserConnection browserConnection, LdapDN dn )
     {
         this.connectionId = browserConnection.getConnection() != null ? browserConnection.getConnection().getId()
             : null;
@@ -207,10 +207,6 @@
         {
             return getDelegate().isInitOperationalAttributes();
         }
-        else if ( entryDoesNotExist )
-        {
-            return true;
-        }
         else
         {
             return false;
@@ -227,10 +223,6 @@
         {
             return getDelegate().isFetchAliases();
         }
-        else if ( entryDoesNotExist )
-        {
-            return true;
-        }
         else
         {
             return false;
@@ -247,10 +239,6 @@
         {
             return getDelegate().isFetchReferrals();
         }
-        else if ( entryDoesNotExist )
-        {
-            return true;
-        }
         else
         {
             return false;
@@ -267,10 +255,6 @@
         {
             return getDelegate().isFetchSubentries();
         }
-        else if ( entryDoesNotExist )
-        {
-            return true;
-        }
         else
         {
             return false;
@@ -389,7 +373,7 @@
         }
         else
         {
-            return null;
+            return new IAttribute[0];
         }
     }
 
@@ -438,7 +422,7 @@
         }
         else
         {
-            return null;
+            return new IEntry[0];
         }
     }
 
@@ -933,33 +917,6 @@
     /**
      * {@inheritDoc}
      */
-    public int hashCode()
-    {
-        return getDn().hashCode();
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean equals( Object o )
-    {
-        // check argument
-        if ( o == null || !( o instanceof IEntry ) )
-        {
-            return false;
-        }
-        IEntry e = ( IEntry ) o;
-
-        // compare dn and connection
-        return getDn() == null ? e.getDn() == null : ( getDn().equals( e.getDn() ) && getBrowserConnection().equals(
-            e.getBrowserConnection() ) );
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
     public Collection<ObjectClassDescription> getObjectClassDescriptions()
     {
         if ( getDelegate() != null )

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyConnection.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyConnection.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyConnection.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyConnection.java Wed Oct 21 08:35:55 2009
@@ -237,6 +237,23 @@
     /** 
      * {@inheritDoc}
      */
+    public boolean isManageDsaIT()
+    {
+        return false;
+    }
+
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setManageDsaIT( boolean manageDsaIT )
+    {
+    }
+
+
+    /** 
+     * {@inheritDoc}
+     */
     public boolean isFetchSubentries()
     {
         return false;

Modified: directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyEntry.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyEntry.java?rev=827920&r1=827919&r2=827920&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyEntry.java (original)
+++ directory/studio/trunk/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/impl/DummyEntry.java Wed Oct 21 08:35:55 2009
@@ -40,6 +40,7 @@
 import org.apache.directory.studio.ldapbrowser.core.model.AttributeHierarchy;
 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.ICompareableEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
 import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
@@ -58,7 +59,7 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public class DummyEntry implements IEntry
+public class DummyEntry implements IEntry, ICompareableEntry
 {
 
     private static final long serialVersionUID = 4833907766031149971L;
@@ -557,11 +558,11 @@
     public boolean equals( Object o )
     {
         // check argument
-        if ( o == null || !( o instanceof IEntry ) )
+        if ( o == null || !( o instanceof ICompareableEntry ) )
         {
             return false;
         }
-        IEntry e = ( IEntry ) o;
+        ICompareableEntry e = ( ICompareableEntry ) o;
 
         // compare dn and connection
         return getDn() == null ? e.getDn() == null : ( getDn().equals( e.getDn() ) && getBrowserConnection().equals(