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 2009/07/24 02:55:06 UTC

svn commit: r797288 - /directory/shared/trunk/client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java

Author: elecharny
Date: Fri Jul 24 00:55:06 2009
New Revision: 797288

URL: http://svn.apache.org/viewvc?rev=797288&view=rev
Log:
o Added an ExecutorFilter in the chain in order to avoid some OOM and to allow the AbandonRequest to be sent even if the searchRequest is not processed completely
o Changed some of the delet() methods
o Removed the locking mechanism, as it's useless

Modified:
    directory/shared/trunk/client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java

Modified: directory/shared/trunk/client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java?rev=797288&r1=797287&r2=797288&view=diff
==============================================================================
--- directory/shared/trunk/client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java (original)
+++ directory/shared/trunk/client-api/src/main/java/org/apache/directory/shared/ldap/client/api/LdapConnection.java Fri Jul 24 00:55:06 2009
@@ -125,8 +125,12 @@
 import org.apache.mina.core.future.ConnectFuture;
 import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IoEventType;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.executor.ExecutorFilter;
+import org.apache.mina.filter.executor.OrderedThreadPoolExecutor;
+import org.apache.mina.filter.executor.UnorderedThreadPoolExecutor;
 import org.apache.mina.filter.ssl.SslFilter;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.slf4j.Logger;
@@ -251,42 +255,6 @@
     {
         return (LdapMessageCodec)ldapSession.getAttribute( LDAP_RESPONSE );
     }
-    
-    
-    /**
-     * Handle the lock mechanism on session. It's only a temporary lock,
-     * just for the necessary time to send the request. As we are using
-     * internally an asynchronous mechanism, once the data are written, 
-     * we can release the lock. Thus one can send a search request
-     * followed by an abandon request as soon as the search request
-     * has been written, even before having received the first response. 
-     */
-    private void lockSession() throws LdapException
-    {
-        try
-        {
-            operationMutex.acquire();
-        }
-        catch ( InterruptedException ie )
-        {
-            String message = "Cannot acquire the session lock";
-            LOG.error(  message );
-            LdapException ldapException = 
-                new LdapException( message );
-            ldapException.initCause( ie );
-            
-            throw ldapException;
-        }
-    }
-
-    
-    /**
-     * Unlock the session
-     */
-    private void unlockSession()
-    {
-        operationMutex.release();
-    }
 
     
     /**
@@ -595,6 +563,11 @@
                     throw new LdapException( e );
                 }
             }
+            
+            connector.getFilterChain().addLast( "executor", 
+                new ExecutorFilter( 
+                    new UnorderedThreadPoolExecutor( 2 ),
+                    IoEventType.MESSAGE_RECEIVED ) );
     
             // Inject the protocolHandler
             connector.setHandler( this );
@@ -710,8 +683,6 @@
     {
         checkSession();
 
-        lockSession();
-        
         AddRequestCodec addReqCodec = new AddRequestCodec();
         
         int newId = messageId.incrementAndGet();
@@ -742,7 +713,6 @@
                 if ( response == null )
                 {
                     LOG.error( "Add failed : timeout occured" );
-                    unlockSession();
                     throw new LdapException( TIME_OUT_ERROR );
                 }
             }
@@ -755,7 +725,6 @@
             {
                 LOG.error( NO_RESPONSE_ERROR );
                 futureMap.remove( newId );
-                unlockSession();
                 throw new LdapException( e );
             }
         }
@@ -764,8 +733,6 @@
             listenerMap.put( newId, listener );            
         }
 
-        unlockSession();
-        
         return response;
     }
 
@@ -991,9 +958,6 @@
             // Get the response, blocking
             BindResponse bindResponse = ( BindResponse ) bindFuture.get( timeout, TimeUnit.MILLISECONDS );
 
-            // Release the session lock
-            unlockSession();
-            
             // Everything is fine, return the response
             LOG.debug( "Bind successful : {}", bindResponse );
             
@@ -1009,7 +973,6 @@
             
             // We didn't received anything : this is an error
             LOG.error( "Bind failed : timeout occured" );
-            unlockSession();
             throw new LdapException( TIME_OUT_ERROR );
         }
         catch ( Exception ie )
@@ -1018,13 +981,13 @@
             LOG.error( "The response queue has been emptied, no response will be find." );
             LdapException ldapException = new LdapException();
             ldapException.initCause( ie );
-            unlockSession();
             
             // Send an abandon request
             if( !bindFuture.isCancelled() )
             {
                 abandon( bindRequest.getMessageId() );
             }
+            
             throw ldapException;
         }
     }
@@ -1044,10 +1007,6 @@
         // If the session has not been establish, or is closed, we get out immediately
         checkSession();
 
-        // Guarantee that for this session, we don't have more than one operation
-        // running at the same time
-        lockSession();
-        
         // Create the new message and update the messageId
         LdapMessageCodec bindMessage = new LdapMessageCodec();
 
@@ -1079,7 +1038,7 @@
             LOG.error( "The given dn '{}' is not valid", bindRequest.getName() );
             LdapException ldapException = new LdapException();
             ldapException.initCause( ine );
-            unlockSession();
+
             throw ldapException;
         }
         
@@ -1199,10 +1158,6 @@
         // If the session has not been establish, or is closed, we get out immediately
         checkSession();
     
-        // Guarantee that for this session, we don't have more than one operation
-        // running at the same time
-        lockSession();
-        
         // Create the new message and update the messageId
         LdapMessageCodec searchMessage = new LdapMessageCodec();
         
@@ -1226,7 +1181,7 @@
             LOG.error( "The given dn '{}' is not valid", searchRequest.getBaseDn() );
             LdapException ldapException = new LdapException();
             ldapException.initCause( ine );
-            unlockSession();
+
             throw ldapException;
         }
         
@@ -1259,7 +1214,7 @@
             LOG.error( "The given filter '{}' is not valid", searchRequest.getFilter() );
             LdapException ldapException = new LdapException();
             ldapException.initCause( pe );
-            unlockSession();
+
             throw ldapException;
         }
         
@@ -1314,7 +1269,7 @@
                         
                         // We didn't received anything : this is an error
                         LOG.error( "Search failed : timeout occured" );
-                        unlockSession();
+
                         throw new LdapException( TIME_OUT_ERROR );
                     }
                     else
@@ -1331,9 +1286,6 @@
                 }
                 while ( !( response instanceof SearchResultDone ) );
 
-                // Release the session lock
-                unlockSession();
-                
                 LOG.debug( "Search successful, {} elements found", searchResponses.size() );
                 
                 return new ListCursor<SearchResponse>( searchResponses );
@@ -1354,6 +1306,7 @@
                 {
                     abandon( searchMessage.getBindRequest().getMessageId() );
                 }
+                
                 throw ldapException;
             }
         }
@@ -1381,10 +1334,6 @@
         // If the session has not been establish, or is closed, we get out immediately
         checkSession();
         
-        // Guarantee that for this session, we don't have more than one operation
-        // running at the same time
-        lockSession();
-        
         // Create the UnbindRequest
         UnBindRequestCodec unbindRequest = new UnBindRequestCodec();
         
@@ -1715,8 +1664,6 @@
     {
         checkSession();
     
-        lockSession();
-        
         LdapMessageCodec modifyMessage = new LdapMessageCodec();
         
         int newId = messageId.incrementAndGet();
@@ -1746,7 +1693,7 @@
                 if ( response == null )
                 {
                     LOG.error( "Modify failed : timeout occured" );
-                    unlockSession();
+
                     throw new LdapException( TIME_OUT_ERROR );
                 }
             }
@@ -1759,7 +1706,7 @@
             {
                 LOG.error( NO_RESPONSE_ERROR );
                 futureMap.remove( newId );
-                unlockSession();
+
                 throw new LdapException( e );
             }
         }
@@ -1768,8 +1715,6 @@
             listenerMap.put( newId, listener );
         }
         
-        unlockSession();
-        
         return response;
     }
     
@@ -1898,8 +1843,6 @@
     {
         checkSession();
     
-        lockSession();
-        
         LdapMessageCodec modifyDnMessage = new LdapMessageCodec();
         
         int newId = messageId.incrementAndGet();
@@ -1931,7 +1874,7 @@
                 if ( response == null )
                 {
                     LOG.error( "Modifying DN failed : timeout occured" );
-                    unlockSession();
+
                     throw new LdapException( TIME_OUT_ERROR );
                 }
             }
@@ -1944,14 +1887,12 @@
             {
                 LOG.error( NO_RESPONSE_ERROR );
                 futureMap.remove( newId );
-                unlockSession();
+
                 LdapException ldapException = new LdapException();
                 ldapException.initCause( e );
                 throw ldapException;
             }
             
-            unlockSession();
-            
             return response;
         }
         else
@@ -1979,7 +1920,7 @@
     /**
      * @see #delete(LdapDN)
      */
-    public DeleteResponse delete( String dn )  throws LdapException
+    public DeleteResponse delete( String dn ) throws LdapException
     {
         try
         {
@@ -1999,9 +1940,9 @@
      * @param dn the target entry's DN
      * @throws LdapException
      */
-    public DeleteResponse delete( LdapDN dn )  throws LdapException
+    public DeleteResponse delete( LdapDN dn ) throws LdapException
     {
-        return delete( dn, false ); 
+        return delete( dn, false, null ); 
     }
 
 
@@ -2013,6 +1954,28 @@
      * @return operation's response, null if a non-null listener value is provided
      * @throws LdapException
      */
+    public DeleteResponse delete( String dn, DeleteListener listener )  throws LdapException
+    {
+        try
+        {
+            return delete( new LdapDN( dn ), listener );
+        }
+        catch( InvalidNameException e )
+        {
+            LOG.error( e.getMessage(), e );
+            throw new LdapException( e.getMessage(), e );
+        }
+    }
+    
+    
+    /**
+     * deletes the entry with the given DN
+     *  
+     * @param dn the target entry's DN
+     * @param listener  the delete operation response listener
+     * @return operation's response, null if a non-null listener value is provided
+     * @throws LdapException
+     */
     public DeleteResponse delete( LdapDN dn, DeleteListener listener )  throws LdapException
     {
         return delete( new DeleteRequest( dn ), listener ); 
@@ -2020,18 +1983,16 @@
     
     
     /**
-     * deletes the entry with the given DN and all its children
-     * 
-     * @param dn the target entry DN
-     * @param deleteAllChildren flag to indicate whether to delete the children
-     * @return delete operation's response
+     * deletes the entry with the given DN
+     *  
+     * @param dn the target entry's DN
+     * @param listener  the delete operation response listener
+     * @return operation's response, null if a non-null listener value is provided
      * @throws LdapException
      */
-    public DeleteResponse delete( LdapDN dn, boolean deleteAllChildren )  throws LdapException
+    public DeleteResponse delete( LdapDN dn, boolean deleteChildren, DeleteListener listener )  throws LdapException
     {
-        DeleteRequest delRequest = new DeleteRequest( dn );
-        
-        if( deleteAllChildren )
+        if( deleteChildren )
         {
             // TODO replace with a constant name, after adding support for treedelete control in core
             if( isControlSupported( "1.2.840.113556.1.4.805" ) ) 
@@ -2043,8 +2004,22 @@
                 return deleteChildren( dn, new HashMap() );
             }
         }
-            
-        return delete( delRequest, null );
+        
+        return delete( new DeleteRequest( dn ), listener ); 
+    }
+    
+    
+    /**
+     * deletes the entry with the given DN and all its children
+     * 
+     * @param dn the target entry DN
+     * @param deleteChildren flag to indicate whether to delete the children
+     * @return delete operation's response
+     * @throws LdapException
+     */
+    public DeleteResponse delete( LdapDN dn, boolean deleteChildren )  throws LdapException
+    {
+        return delete( dn, deleteChildren, null );
     }
 
     
@@ -2144,8 +2119,6 @@
     {
         checkSession();
     
-        lockSession();
-        
         LdapMessageCodec deleteMessage = new LdapMessageCodec();
         
         int newId = messageId.incrementAndGet();
@@ -2174,7 +2147,7 @@
                 if ( response == null )
                 {
                     LOG.error( "Delete DN failed : timeout occured" );
-                    unlockSession();
+
                     throw new LdapException( TIME_OUT_ERROR );
                 }
             }
@@ -2187,7 +2160,7 @@
             {
                 LOG.error( NO_RESPONSE_ERROR );
                 futureMap.remove( newId );
-                unlockSession();
+
                 LdapException ldapException = new LdapException();
                 ldapException.initCause( e );
                 throw ldapException;
@@ -2198,8 +2171,6 @@
             listenerMap.put( newId, listener );
         }
 
-        unlockSession();
-        
         return response;
     }
 
@@ -2254,8 +2225,6 @@
     {
         checkSession();
 
-        lockSession();
-        
         CompareRequestCodec compareReqCodec = new CompareRequestCodec();
         
         int newId = messageId.incrementAndGet();
@@ -2287,7 +2256,7 @@
                 if ( response == null )
                 {
                     LOG.error( "Compare failed : timeout occured" );
-                    unlockSession();
+
                     throw new LdapException( TIME_OUT_ERROR );
                 }
             }
@@ -2300,7 +2269,7 @@
             {
                 LOG.error( NO_RESPONSE_ERROR );
                 futureMap.remove( newId );
-                unlockSession();
+
                 throw new LdapException( e );
             }
         }
@@ -2309,8 +2278,6 @@
             listenerMap.put( newId, listener );            
         }
 
-        unlockSession();
-        
         return response;
     }