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/21 22:50:27 UTC
svn commit: r678560 -
/directory/apacheds/branches/bigbang/protocol-newldap/src/main/java/org/apache/directory/server/newldap/handlers/NewSearchHandler.java
Author: akarasulu
Date: Mon Jul 21 13:50:26 2008
New Revision: 678560
URL: http://svn.apache.org/viewvc?rev=678560&view=rev
Log:
unrolling SearchResponseIterator into SearchHandler to do away with it
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=678560&r1=678559&r2=678560&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 13:50:26 2008
@@ -21,6 +21,8 @@
import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.ReferralHandlingMode;
+import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.entry.ServerAttribute;
import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.entry.ServerEntryUtils;
@@ -32,6 +34,7 @@
import org.apache.directory.shared.ldap.constants.JndiPropertyConstants;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.entry.EntryAttribute;
+import org.apache.directory.shared.ldap.entry.Value;
import org.apache.directory.shared.ldap.exception.LdapException;
import org.apache.directory.shared.ldap.exception.OperationAbandonedException;
import org.apache.directory.shared.ldap.filter.PresenceNode;
@@ -86,28 +89,28 @@
/** Speedup for logs */
private static final boolean IS_DEBUG = LOG.isDebugEnabled();
+
private void handlePersistentSearch( LdapSession session, SearchRequest req,
- PersistentSearchControl psearchControl, EntryFilteringCursor list ) throws NamingException
+ PersistentSearchControl psearchControl ) throws Exception
{
/*
* We want the search to complete first before we start listening to
* events when the control does NOT specify changes ONLY mode.
*/
-
if ( ! psearchControl.isChangesOnly() )
{
- list = session.getCoreSession().search( req );
+ EntryFilteringCursor cursor = session.getCoreSession().search( req );
- if ( list instanceof AbandonListener )
+ if ( cursor instanceof AbandonListener )
{
- req.addAbandonListener( ( AbandonListener ) list );
+ req.addAbandonListener( ( AbandonListener ) cursor );
}
- list.beforeFirst();
+ cursor.beforeFirst();
- if ( list.next() )
+ if ( cursor.next() )
{
- Iterator<Response> it = new SearchResponseIterator( req, list, session );
+ Iterator<Response> it = new SearchResponseIterator( req, cursor, session );
while ( it.hasNext() )
{
@@ -164,8 +167,6 @@
String[] ids = null;
Collection<String> retAttrs = new HashSet<String>();
- AttributeTypeRegistry atr = session.getCoreSession().getDirectoryService().getRegistries().getAttributeTypeRegistry();
-
// add the search request to the registry of outstanding requests for this session
session.registerOutstandingRequest( req );
@@ -188,12 +189,12 @@
// Handle psearch differently
// ===============================================================
- PersistentSearchControl psearchControl = ( PersistentSearchControl ) req.getControls().get(
- PersistentSearchControl.CONTROL_OID );
+ PersistentSearchControl psearchControl = ( PersistentSearchControl )
+ req.getControls().get( PersistentSearchControl.CONTROL_OID );
if ( psearchControl != null )
{
- handlePersistentSearch( session, req, psearchControl, cursor );
+ handlePersistentSearch( session, req, psearchControl );
return;
}
@@ -214,70 +215,40 @@
}
// Position the cursor at the beginning
- // TODO : should'nt it be always the case ?
cursor.beforeFirst();
while ( cursor.next() )
{
- ServerEntry result = cursor.get();
-
- SearchResponseEntry respEntry;
- respEntry = new SearchResponseEntryImpl( req.getMessageId() );
- respEntry.setAttributes( ServerEntryUtils.toAttributesImpl( result ) );
- respEntry.setObjectName( result.getDn() );
-
- /*
- * TODO : handle referrals here ...
- */
- /*
- EntryAttribute ref = result.get( SchemaConstants.REF_AT );
- LdapDN dn = result.getDn();
-
- if ( !session.getCoreSession().getReferralHandlingMode()
- || req.getControls().containsKey( ManageDsaITControl.CONTROL_OID ) )
- {
- SearchResponseEntry respEntry;
- respEntry = new SearchResponseEntryImpl( req.getMessageId() );
- respEntry.setAttributes( result.getAttributes() );
- respEntry.setObjectName( dn );
- prefetched = respEntry;
- }
- else
- {
-
+ 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 ( int ii = 0; ii < ref.size(); ii++ )
+
+ for ( Value<?> val : ref )
{
- String url;
-
- try
- {
- url = ( String ) ref.get( ii );
- respRef.getReferral().addLdapUrl( url );
- }
- catch ( NamingException e )
- {
- try
- {
- underlying.close();
- }
- catch ( Throwable t )
- {
- LOG.error( "Encountered error while trying to close underlying enumeration", t );
- }
-
- prefetched = null;
- respDone = getResponse( req, e );
- }
+ String url = ( String ) val.get();
+ respRef.getReferral().addLdapUrl( url );
}
-
- prefetched = respRef;
- //}*/
+
+ 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)respEntry );
+ session.getIoSession().write( response );
}
}
catch ( ReferralException e )