You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/10/17 09:47:24 UTC

svn commit: r325856 - in /directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol: ExtendedOperationHandler.java LdapProtocolProvider.java support/ExtendedHandler.java

Author: trustin
Date: Mon Oct 17 00:47:18 2005
New Revision: 325856

URL: http://svn.apache.org/viewcvs?rev=325856&view=rev
Log:
Implemented an extension mechanism for LDAP extended operations.

Modified:
    directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/ExtendedOperationHandler.java
    directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java
    directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/support/ExtendedHandler.java

Modified: directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/ExtendedOperationHandler.java
URL: http://svn.apache.org/viewcvs/directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/ExtendedOperationHandler.java?rev=325856&r1=325855&r2=325856&view=diff
==============================================================================
--- directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/ExtendedOperationHandler.java (original)
+++ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/ExtendedOperationHandler.java Mon Oct 17 00:47:18 2005
@@ -18,9 +18,9 @@
  */
 package org.apache.ldap.server.protocol;
 
-import javax.naming.ldap.ExtendedResponse;
-
 import org.apache.ldap.common.message.ExtendedRequest;
+import org.apache.ldap.common.message.ExtendedResponse;
+import org.apache.mina.protocol.ProtocolSession;
 
 /**
  * An extension (hook) point that enables an implementor to provide his or her
@@ -38,12 +38,15 @@
     String getOid();
     
     /**
-     * Handles the specified extended operation and returns its response.
-     * Don't lock the returning response; messageID and resultCode will
+     * Handles the specified extended operation and fills its response to
+     * <tt>res</tt>.  Don't lock the response; messageID and resultCode might be
      * be filled by caller automatically.
      * 
-     * @param request the LDAP Extended operation
+     * @param session the MINA session object related with current connection
+     * @param req the LDAP Extended operation request
+     * @param res the LDAP Extended operation response you have to fill its payload
+     * 
      * @throws Exception if failed to handle the operation
      */
-    ExtendedResponse handleExtendedOperation( ExtendedRequest request ) throws Exception;
+    void handleExtendedOperation( ProtocolSession session, SessionRegistry registry, ExtendedRequest req, ExtendedResponse res ) throws Exception;
 }

Modified: directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java
URL: http://svn.apache.org/viewcvs/directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java?rev=325856&r1=325855&r2=325856&view=diff
==============================================================================
--- directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java (original)
+++ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java Mon Oct 17 00:47:18 2005
@@ -61,7 +61,6 @@
 import org.apache.ldap.server.protocol.support.ModifyHandler;
 import org.apache.ldap.server.protocol.support.SearchHandler;
 import org.apache.ldap.server.protocol.support.UnbindHandler;
-import org.apache.mina.common.IdleStatus;
 import org.apache.mina.protocol.ProtocolCodecFactory;
 import org.apache.mina.protocol.ProtocolDecoder;
 import org.apache.mina.protocol.ProtocolEncoder;
@@ -84,7 +83,7 @@
     public static final String SERVICE_NAME = "ldap";
 
     /** a map of the default request object class name to the handler class name */
-    public static final Map DEFAULT_HANDLERS;
+    private static final Map DEFAULT_HANDLERS;
 
     static
     {
@@ -144,7 +143,7 @@
     // ------------------------------------------------------------------------
 
     /**
-     * Creates a SEDA LDAP protocol provider.
+     * Creates a MINA LDAP protocol provider.
      *
      * @param env environment properties used to configure the provider and
      * underlying codec providers if any
@@ -188,7 +187,7 @@
             {
                 Class typeClass = Class.forName( type );
                 handler = ( MessageHandler ) clazz.newInstance();
-                this.handler.registerMessageType( typeClass, handler );
+                this.handler.addMessageHandler( typeClass, handler );
             }
             catch( Exception e )
             {
@@ -205,7 +204,7 @@
     }
 
     /**
-     * Creates a SEDA LDAP protocol provider.
+     * Creates a MINA LDAP protocol provider.
      */
     public LdapProtocolProvider() throws LdapNamingException
     {
@@ -225,7 +224,7 @@
             {
                 Class typeClass = Class.forName( type );
                 handler = ( MessageHandler ) clazz.newInstance();
-                this.handler.registerMessageType( typeClass, handler );
+                this.handler.addMessageHandler( typeClass, handler );
             }
             catch( Exception e )
             {
@@ -259,7 +258,46 @@
     {
         return handler;
     }
-
+    
+    /**
+     * Registeres the specified {@link ExtendedOperationHandler} to this
+     * protocol provider to provide a specific LDAP extended operation.
+     */
+    public void addExtendedOperationHandler( ExtendedOperationHandler eoh )
+    {
+        ExtendedHandler eh = ( ExtendedHandler ) handler.getMessageHandler( ExtendedRequest.class );
+        eh.addHandler( eoh );
+    }
+    
+    /**
+     * Deregisteres an {@link ExtendedOperationHandler} with the specified <tt>oid</tt>
+     * from this protocol provider.
+     */
+    public void removeExtendedOperationHandler( String oid )
+    {
+        ExtendedHandler eh = ( ExtendedHandler ) handler.getMessageHandler( ExtendedRequest.class );
+        eh.removeHandler( oid );
+    }
+    
+    /**
+     * Returns an {@link ExtendedOperationHandler} with the specified <tt>oid</tt>
+     * which is registered to this protocol provider.
+     */
+    public ExtendedOperationHandler getExtendedOperationHandler( String oid )
+    {
+        ExtendedHandler eh = ( ExtendedHandler ) handler.getMessageHandler( ExtendedRequest.class );
+        return eh.getHandler( oid );
+    }
+    
+    /**
+     * Returns a {@link Map} of all registered OID-{@link ExtendedOperationHandler}
+     * pairs.
+     */
+    public Map getExtendedOperationHandlerMap()
+    {
+        ExtendedHandler eh = ( ExtendedHandler ) handler.getMessageHandler( ExtendedRequest.class );
+        return eh.getHandlerMap();
+    }
     /**
      * A snickers based BER Decoder factory.
      */
@@ -305,20 +343,6 @@
 
     private class LdapProtocolHandler extends DemuxingProtocolHandler
     {
-        private LdapProtocolHandler()
-        {
-        }
-
-        public void deregisterMessageType( Class arg0 )
-        {
-            super.deregisterMessageType( arg0 );
-        }
-
-        public void registerMessageType( Class arg0, MessageHandler arg1 )
-        {
-            super.registerMessageType( arg0, arg1 );
-        }
-
         public void sessionClosed( ProtocolSession session )
         {
             SessionRegistry.getSingleton().remove( session );
@@ -327,22 +351,6 @@
         public void exceptionCaught( ProtocolSession session, Throwable cause )
         {
             cause.printStackTrace();
-        }
-
-        public void messageSent( ProtocolSession arg0, Object arg1 )
-        {
-        }
-
-        public void sessionIdle( ProtocolSession arg0, IdleStatus arg1 )
-        {
-        }
-
-        public void sessionOpened( ProtocolSession arg0 )
-        {
-        }
-
-        public void sessionCreated( ProtocolSession arg0 )
-        {
         }
     }
     

Modified: directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/support/ExtendedHandler.java
URL: http://svn.apache.org/viewcvs/directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/support/ExtendedHandler.java?rev=325856&r1=325855&r2=325856&view=diff
==============================================================================
--- directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/support/ExtendedHandler.java (original)
+++ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/support/ExtendedHandler.java Mon Oct 17 00:47:18 2005
@@ -17,12 +17,19 @@
 package org.apache.ldap.server.protocol.support;
 
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.ldap.common.message.ExtendedRequest;
 import org.apache.ldap.common.message.ExtendedResponse;
 import org.apache.ldap.common.message.ExtendedResponseImpl;
 import org.apache.ldap.common.message.LdapResult;
 import org.apache.ldap.common.message.LdapResultImpl;
 import org.apache.ldap.common.message.ResultCodeEnum;
+import org.apache.ldap.common.util.ExceptionUtils;
+import org.apache.ldap.server.protocol.ExtendedOperationHandler;
+import org.apache.ldap.server.protocol.SessionRegistry;
 import org.apache.mina.protocol.ProtocolSession;
 import org.apache.mina.protocol.handler.MessageHandler;
 
@@ -34,20 +41,74 @@
  */
 public class ExtendedHandler implements MessageHandler
 {
+    private Map handlers = new HashMap();
+    
+    public ExtendedOperationHandler addHandler( ExtendedOperationHandler eoh )
+    {
+        synchronized( handlers )
+        {
+            return ( ExtendedOperationHandler ) handlers.put( eoh.getOid(), eoh );
+        }
+    }
+    
+    public ExtendedOperationHandler removeHandler( String oid )
+    {
+        synchronized( handlers )
+        {
+            return ( ExtendedOperationHandler ) handlers.remove( oid );
+        }
+    }
+    
+    public ExtendedOperationHandler getHandler( String oid )
+    {
+        return ( ExtendedOperationHandler ) handlers.get( oid );
+    }
+    
+    public Map getHandlerMap()
+    {
+        return Collections.unmodifiableMap( handlers );
+    }
+    
     public void messageReceived( ProtocolSession session, Object request )
     {
         ExtendedRequest req = ( ExtendedRequest ) request;
-        ExtendedResponse resp = new ExtendedResponseImpl( req.getMessageId() );
-        resp.setLdapResult( new LdapResultImpl( resp ) );
-        
-        // As long as no extended operations are implemented, send appropriate
-        // error back to the client.        
-        String msg = "Unrecognized extended operation";
-        
-        LdapResult result = resp.getLdapResult();        
-        result.setResultCode( ResultCodeEnum.PROTOCOLERROR );
-        result.setErrorMessage( msg );
+        ExtendedResponse res = new ExtendedResponseImpl( req.getMessageId() );
+
+        ExtendedOperationHandler handler = ( ExtendedOperationHandler ) handlers.get( req.getOid() );
+        if( handler == null )
+        {
+            res.setLdapResult( new LdapResultImpl( res ) );
+            // As long as no extended operations are implemented, send appropriate
+            // error back to the client.        
+            String msg = "Unrecognized extended operation OID: " + req.getOid();
+            
+            LdapResult result = res.getLdapResult();        
+            result.setResultCode( ResultCodeEnum.PROTOCOLERROR );
+            result.setErrorMessage( msg );
+        }
+        else
+        {
+            try
+            {
+                handler.handleExtendedOperation(
+                        session,
+                        SessionRegistry.getSingleton(),
+                        req,
+                        res );
+            }
+            catch( Exception e )
+            {
+                LdapResult result = new LdapResultImpl( res );
+                result.setResultCode( ResultCodeEnum.UNAVAILABLE );
+                result.setErrorMessage(
+                        "Extended operation handler for the specified OID (" +
+                        req.getOid() + ") has failed to process your request:\n" +
+                        ExceptionUtils.getStackTrace( e ) );
+                res.setLdapResult( result );
+                res.setResponse( new byte[ 0 ] );
+            }
+        }
         
-        session.write( resp );
+        session.write( res );
     }
 }