You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2010/01/12 19:05:32 UTC
svn commit: r898445 - in /directory:
apacheds/trunk/ldap-api-test/src/test/java/org/apache/directory/shared/client/api/operations/
shared/trunk/ldap-client-api/src/main/java/org/apache/directory/shared/ldap/client/api/
Author: elecharny
Date: Tue Jan 12 18:05:32 2010
New Revision: 898445
URL: http://svn.apache.org/viewvc?rev=898445&view=rev
Log:
Fixed the BindRequest client API so that the async bind returns a Future and not a BindResponse
Modified:
directory/apacheds/trunk/ldap-api-test/src/test/java/org/apache/directory/shared/client/api/operations/ClientBindRequestTest.java
directory/shared/trunk/ldap-client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java
Modified: directory/apacheds/trunk/ldap-api-test/src/test/java/org/apache/directory/shared/client/api/operations/ClientBindRequestTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/ldap-api-test/src/test/java/org/apache/directory/shared/client/api/operations/ClientBindRequestTest.java?rev=898445&r1=898444&r2=898445&view=diff
==============================================================================
--- directory/apacheds/trunk/ldap-api-test/src/test/java/org/apache/directory/shared/client/api/operations/ClientBindRequestTest.java (original)
+++ directory/apacheds/trunk/ldap-api-test/src/test/java/org/apache/directory/shared/client/api/operations/ClientBindRequestTest.java Tue Jan 12 18:05:32 2010
@@ -79,6 +79,8 @@
BindResponse bindResponse = connection.bind( "uid=admin,ou=system", "secret" );
assertNotNull( bindResponse );
+ assertNotNull( bindResponse.getLdapResult() );
+ assertEquals( ResultCodeEnum.SUCCESS, bindResponse.getLdapResult().getResultCode() );
connection.unBind();
}
@@ -114,7 +116,6 @@
try
{
- long t0 = System.currentTimeMillis();
lock.acquire();
for ( ; i < nbLoop; i++)
@@ -125,14 +126,12 @@
bindRequest.setName( "uid=admin,ou=system" );
bindRequest.setCredentials( "secret" );
-
connection.bind( bindRequest, new BindListener()
{
public void bindCompleted( LdapConnection connection, BindResponse bindResponse ) throws LdapException
{
assertNotNull( bindResponse );
assertEquals( ResultCodeEnum.SUCCESS, bindResponse.getLdapResult().getResultCode() );
- //System.out.println( "Bound" );
lock.release();
}
} );
@@ -140,15 +139,7 @@
lock.acquire();
lock.release();
connection.unBind();
-
- if ( i % 100 == 0 )
- {
- System.out.println( i );
- }
}
-
- long t1 = System.currentTimeMillis();
- System.out.println( (t1 - t0) );
}
catch ( LdapException le )
{
Modified: directory/shared/trunk/ldap-client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap-client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java?rev=898445&r1=898444&r2=898445&view=diff
==============================================================================
--- directory/shared/trunk/ldap-client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java (original)
+++ directory/shared/trunk/ldap-client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java Tue Jan 12 18:05:32 2010
@@ -143,8 +143,8 @@
import org.slf4j.LoggerFactory;
/**
- *
- * Describe the methods to be implemented by the LdapConnection class.
+ * This class is the base for every operations sent or received to and
+ * from a LDAP server.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$, $Date$
@@ -991,7 +991,7 @@
bindRequest.setName( name );
bindRequest.setCredentials( credentials );
- BindResponse response = bind( bindRequest, null );
+ BindResponse response = bind( bindRequest );
if ( LOG.isDebugEnabled() )
{
@@ -1018,7 +1018,49 @@
*/
public BindResponse bind( BindRequest bindRequest ) throws LdapException
{
- return bind( bindRequest, null );
+ ResponseFuture responseFuture = bind( bindRequest, null );
+
+ // Get the result from the future
+ try
+ {
+ // Read the response, waiting for it if not available immediately
+ long timeout = getTimeout( bindRequest.getTimeout() );
+
+ // Get the response, blocking
+ BindResponse bindResponse = (BindResponse)responseFuture.get( timeout, TimeUnit.MILLISECONDS );
+
+ // Everything is fine, return the response
+ LOG.debug( "Bind successful : {}", bindResponse );
+
+ return bindResponse;
+ }
+ catch ( TimeoutException te )
+ {
+ // Send an abandon request
+ if( !responseFuture.isCancelled() )
+ {
+ abandon( bindRequest.getMessageId() );
+ }
+
+ // We didn't received anything : this is an error
+ LOG.error( "Bind failed : timeout occured" );
+ throw new LdapException( TIME_OUT_ERROR );
+ }
+ catch ( Exception ie )
+ {
+ // Catch all other exceptions
+ LOG.error( NO_RESPONSE_ERROR, ie );
+ LdapException ldapException = new LdapException( NO_RESPONSE_ERROR );
+ ldapException.initCause( ie );
+
+ // Send an abandon request
+ if( !responseFuture.isCancelled() )
+ {
+ abandon( bindRequest.getMessageId() );
+ }
+
+ throw ldapException;
+ }
}
@@ -1027,8 +1069,9 @@
*
* @param bindRequest The BindRequest to send
* @param listener The listener
+ * @return ResponseFuture A future
*/
- public BindResponse bind( BindRequest bindRequest, BindListener bindListener ) throws LdapException
+ public ResponseFuture bind( BindRequest bindRequest, BindListener bindListener ) throws LdapException
{
// First try to connect, if we aren't already connected.
connect();
@@ -1041,12 +1084,16 @@
// Creates the messageID and stores it into the
// initial message and the transmitted message.
+ // As it's a Bind request, qe reset the MessageId
+ // value to zero.
+ messageId.set( 0 );
int newId = messageId.incrementAndGet();
bindRequest.setMessageId( newId );
bindMessage.setMessageId( newId );
if( bindListener != null )
{
+ // This is an asynchronous bind
listenerMap.put( newId, bindListener );
}
@@ -1101,62 +1148,21 @@
LOG.debug( "-----------------------------------------------------------------" );
LOG.debug( "Sending request \n{}", bindMessage );
+ // Create a future for this Bind opeation
ResponseFuture responseFuture = new ResponseFuture( bindResponseQueue );
futureMap.put( newId, responseFuture );
// Send the request to the server
ldapSession.write( bindMessage );
- if ( bindListener == null )
- {
- // And get the result
- try
- {
- // Read the response, waiting for it if not available immediately
- long timeout = getTimeout( bindRequest.getTimeout() );
-
- // Get the response, blocking
- BindResponse bindResponse = (BindResponse)responseFuture.get( timeout, TimeUnit.MILLISECONDS );
-
- // Everything is fine, return the response
- LOG.debug( "Bind successful : {}", bindResponse );
-
- return bindResponse;
- }
- catch ( TimeoutException te )
- {
- // Send an abandon request
- if( !responseFuture.isCancelled() )
- {
- abandon( bindRequest.getMessageId() );
- }
-
- // We didn't received anything : this is an error
- LOG.error( "Bind failed : timeout occured" );
- throw new LdapException( TIME_OUT_ERROR );
- }
- catch ( Exception ie )
- {
- // Catch all other exceptions
- LOG.error( NO_RESPONSE_ERROR, ie );
- LdapException ldapException = new LdapException( NO_RESPONSE_ERROR );
- ldapException.initCause( ie );
-
- // Send an abandon request
- if( !responseFuture.isCancelled() )
- {
- abandon( bindRequest.getMessageId() );
- }
-
- throw ldapException;
- }
- }
- else
+ if ( bindListener != null )
{
- // Return null.
+ // If this is an asynchronous operation, associate the ID
+ // with the operation listener
listenerMap.put( newId, bindListener );
- return null;
}
+
+ return responseFuture;
}