You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2008/07/22 00:09:30 UTC

svn commit: r678584 - /directory/apacheds/branches/bigbang/protocol-newldap/src/main/java/org/apache/directory/server/newldap/handlers/NewSearchHandler.java

Author: akarasulu
Date: Mon Jul 21 15:09:30 2008
New Revision: 678584

URL: http://svn.apache.org/viewvc?rev=678584&view=rev
Log:
cleaning up new search handler a bit removing old remnants and preparing for new logic

Modified:
    directory/apacheds/branches/bigbang/protocol-newldap/src/main/java/org/apache/directory/server/newldap/handlers/NewSearchHandler.java

Modified: directory/apacheds/branches/bigbang/protocol-newldap/src/main/java/org/apache/directory/server/newldap/handlers/NewSearchHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/protocol-newldap/src/main/java/org/apache/directory/server/newldap/handlers/NewSearchHandler.java?rev=678584&r1=678583&r2=678584&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/protocol-newldap/src/main/java/org/apache/directory/server/newldap/handlers/NewSearchHandler.java (original)
+++ directory/apacheds/branches/bigbang/protocol-newldap/src/main/java/org/apache/directory/server/newldap/handlers/NewSearchHandler.java Mon Jul 21 15:09:30 2008
@@ -31,6 +31,7 @@
 import org.apache.directory.server.newldap.LdapServer;
 import org.apache.directory.server.newldap.LdapSession;
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
+import org.apache.directory.shared.ldap.codec.search.SearchResultDone;
 import org.apache.directory.shared.ldap.constants.JndiPropertyConstants;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.entry.EntryAttribute;
@@ -99,56 +100,133 @@
          */
         if ( ! psearchControl.isChangesOnly() )
         {
-            EntryFilteringCursor cursor = session.getCoreSession().search( req );
+            SearchResponseDone done = doSimpleSearch( session, req );
             
+            // ok if normal search beforehand failed somehow quickly abandon psearch
+            if ( done.getLdapResult().getResultCode() != ResultCodeEnum.SUCCESS )
+            {
+                session.getIoSession().write( done );
+                return;
+            }
+        }
+
+        // now we process entries for ever as they change
+        PersistentSearchListener handler = new PersistentSearchListener( session, req );
+        getLdapServer().getDirectoryService().addNamingListener( req.getBase(), req.getFilter().toString(), handler );
+        return;
+    }
+    
+    
+    
+    private void handleRootDseSearch( LdapSession session, SearchRequest req ) throws Exception
+    {
+    }
+    
+    
+    /**
+     * Conducts a simple search across the result set returning each entry 
+     * back except for the search response done.  This is calculated but not
+     * returned so the persistent search mechanism can leverage this method
+     * along with standard search.
+     *
+     * @param session the LDAP session object for this request
+     * @param req the search request 
+     * @return the result done 
+     * @throws Exception if there are failures while processing the request
+     */
+    private SearchResponseDone doSimpleSearch( LdapSession session, SearchRequest req ) throws Exception
+    {
+        /*
+         * Iterate through all search results building and sending back responses
+         * for each search result returned.
+         */
+        EntryFilteringCursor cursor = null;
+        
+        try
+        {
+            cursor = session.getCoreSession().search( req );
+            
+            // TODO - fix this (need to make Cursors abandonable)
             if ( cursor instanceof AbandonListener )
             {
                 req.addAbandonListener( ( AbandonListener ) cursor );
             }
-            
+    
+            // Position the cursor at the beginning
             cursor.beforeFirst();
             
-            if ( cursor.next() )
+            while ( cursor.next() )
             {
-                Iterator<Response> it = new SearchResponseIterator( req, cursor, session );
-                
-                while ( it.hasNext() )
+                ClonedServerEntry entry = cursor.get();
+                session.getIoSession().write( generateResponse( req, entry ) );
+            }
+    
+            LdapResult ldapResult = req.getResultResponse().getLdapResult();
+            ldapResult.setResultCode( ResultCodeEnum.SUCCESS );
+            
+            // DO NOT WRITE THE RESPONSE - JUST RETURN IT
+            
+            return ( SearchResponseDone ) req.getResultResponse();
+        }
+        finally
+        {
+            if ( cursor != null )
+            {
+                try
+                {
+                    cursor.close();
+                }
+                catch ( NamingException e )
                 {
-                    Response resp = it.next();
-                    
-                    if ( resp instanceof SearchResponseDone )
-                    {
-                        // ok if normal search beforehand failed somehow quickly abandon psearch
-                        ResultCodeEnum rcode = ( ( SearchResponseDone ) resp ).getLdapResult().getResultCode();
-
-                        if ( rcode != ResultCodeEnum.SUCCESS )
-                        {
-                            session.getIoSession().write( resp );
-                            return;
-                        }
-                        // if search was fine then we returned all entries so now
-                        // instead of returning the DONE response we break from the
-                        // loop and user the notification listener to send back
-                        // notifications to the client in never ending search
-                        else
-                        {
-                            break;
-                        }
-                    }
-                    else
-                    {
-                        session.getIoSession().write( resp );
-                    }
+                    LOG.error( "failed on list.close()", e );
                 }
             }
         }
-
-        // now we process entries for ever as they change
-        PersistentSearchListener handler = new PersistentSearchListener( session, req );
-        getLdapServer().getDirectoryService().addNamingListener( req.getBase(), req.getFilter().toString(), handler );
-        return;
     }
+    
 
+    /**
+     * Generates a response for an entry retrieved from the server core based 
+     * on the nature of the request with respect to referral handling.  This 
+     * method will either generate a SearchResponseEntry or a 
+     * SearchResponseReference depending on if the entry is a referral or if 
+     * the ManageDSAITControl has been enabled.
+     *
+     * @param req the search request
+     * @param entry the entry to be handled
+     * @return the response for the entry
+     * @throws Exception if there are problems in generating the response
+     */
+    private Response generateResponse( SearchRequest req, ClonedServerEntry entry ) throws Exception
+    {
+        EntryAttribute ref = entry.getOriginalEntry().get( SchemaConstants.REF_AT );
+        boolean hasManageDsaItControl = req.getControls().containsKey( ManageDsaITControl.CONTROL_OID );
+
+        if ( ref != null && ! hasManageDsaItControl )
+        {
+            SearchResponseReference respRef;
+            respRef = new SearchResponseReferenceImpl( req.getMessageId() );
+            respRef.setReferral( new ReferralImpl() );
+            
+            for ( Value<?> val : ref )
+            {
+                String url = ( String ) val.get();
+                respRef.getReferral().addLdapUrl( url );
+            }
+            
+            return respRef;
+        }
+        else 
+        {
+            SearchResponseEntry respEntry;
+            respEntry = new SearchResponseEntryImpl( req.getMessageId() );
+            respEntry.setAttributes( ServerEntryUtils.toAttributesImpl( entry ) );
+            respEntry.setObjectName( entry.getDn() );
+            
+            return respEntry;
+        }
+    }
+    
     
     /**
      * Main message handing method for search requests.
@@ -163,26 +241,18 @@
             LOG.debug( "Message received:  {}", req.toString() );
         }
 
-        EntryFilteringCursor cursor = null;
-        String[] ids = null;
-        Collection<String> retAttrs = new HashSet<String>();
-        
         // add the search request to the registry of outstanding requests for this session
         session.registerOutstandingRequest( req );
 
         try
         {
-            boolean isRootDSESearch = isRootDSESearch( req );
-
             // ===============================================================
             // Handle search in rootDSE differently.
-            // TODO : is this necessary ?
             // ===============================================================
-            if ( isRootDSESearch )
-            {
-            }
-            else
+            if ( isRootDSESearch( req ) )
             {
+                handleRootDseSearch( session, req );
+                return;
             }
 
             // ===============================================================
@@ -202,59 +272,8 @@
             // Handle regular search requests from here down
             // ===============================================================
 
-            /*
-             * Iterate through all search results building and sending back responses
-             * for each search result returned.
-             */
-            cursor = session.getCoreSession().search( req );
-            
-            // TODO - fix this (need to make Cursors abandonable)
-            if ( cursor instanceof AbandonListener )
-            {
-                req.addAbandonListener( ( AbandonListener ) cursor );
-            }
-
-            // Position the cursor at the beginning
-            cursor.beforeFirst();
-            
-            while ( cursor.next() )
-            {
-                Response response;
-            	ClonedServerEntry result = cursor.get();
-            	EntryAttribute ref = result.getOriginalEntry().get( SchemaConstants.REF_AT );
-            	boolean hasManageDsaItControl = req.getControls().containsKey( ManageDsaITControl.CONTROL_OID );
-
-            	if ( ref != null && ! hasManageDsaItControl )
-            	{
-                    SearchResponseReference respRef;
-                    respRef = new SearchResponseReferenceImpl( req.getMessageId() );
-                    respRef.setReferral( new ReferralImpl() );
-                    
-                    for ( Value<?> val : ref )
-                    {
-                        String url = ( String ) val.get();
-                        respRef.getReferral().addLdapUrl( url );
-                    }
-                    
-                    response = respRef;
-            	}
-            	else 
-            	{
-                    SearchResponseEntry respEntry;
-                    respEntry = new SearchResponseEntryImpl( req.getMessageId() );
-                    respEntry.setAttributes( ServerEntryUtils.toAttributesImpl( result ) );
-                    respEntry.setObjectName( result.getDn() );
-                    
-                    response = respEntry;
-            	}
-                
-                session.getIoSession().write( response );
-            }
-
-            // At the end, we have to write a last message : a responseDone
-            LdapResult ldapResult = req.getResultResponse().getLdapResult();
-            ldapResult.setResultCode( ResultCodeEnum.SUCCESS );
-            session.getIoSession().write( req.getResultResponse() );
+            SearchResponseDone done = doSimpleSearch( session, req );
+            session.getIoSession().write( done );
         }
         catch ( ReferralException e )
         {
@@ -324,68 +343,6 @@
             session.getIoSession().write( req.getResultResponse() );
             session.unregisterOutstandingRequest( req );
         }
-        finally
-        {
-            if ( cursor != null )
-            {
-                try
-                {
-                	cursor.close();
-                }
-                catch ( NamingException e )
-                {
-                    LOG.error( "failed on list.close()", e );
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Based on the request and the max limits for time configured in the 
-     * server, this returns the minimum allowed time limit.
-     *
-     * @param session the session
-     * @param req the search request
-     * @return the minimum allowed time limit
-     */
-    private int getTimeLimit( LdapSession session, SearchRequest req )
-    {
-        if ( session.getCoreSession().isAnAdministrator() )
-        {
-            // The setTimeLimit needs a number of milliseconds
-            // when the search control is expressed in seconds
-            int timeLimit = req.getTimeLimit();
-
-            // Just check that we are not exceeding the maximum for a long
-            if ( timeLimit > Integer.MAX_VALUE / 1000 )
-            {
-                timeLimit = 0;
-            }
-            
-            return timeLimit * 1000;
-        }
-        
-        return Math.min( req.getTimeLimit(), getLdapServer().getMaxTimeLimit() );
-    }
-    
-
-    /**
-     * Based on the request and the max limits for size configured in the 
-     * server, this returns the minimum allowed size limit.
-     *
-     * @param session the session
-     * @param req the search request
-     * @return the minimum allowed size limit
-     */
-    private int getSizeLimit( LdapSession session, SearchRequest req )
-    {
-        if ( session.getCoreSession().isAnAdministrator() )
-        {
-            return req.getSizeLimit();
-        }        
-
-        return Math.min( req.getSizeLimit(), getLdapServer().getMaxSizeLimit() );
     }