Added ExtendedOperationHandlers property to ServerStartupConfiguration sothat users cn configure LDAP extended operation handlers.

git-svn-id: https://svn.apache.org/repos/asf/directory/apacheds/trunk@325857 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/main/src/main/java/org/apache/ldap/server/configuration/MutableServerStartupConfiguration.java b/main/src/main/java/org/apache/ldap/server/configuration/MutableServerStartupConfiguration.java
index 63b54f5..9094602 100644
--- a/main/src/main/java/org/apache/ldap/server/configuration/MutableServerStartupConfiguration.java
+++ b/main/src/main/java/org/apache/ldap/server/configuration/MutableServerStartupConfiguration.java
@@ -19,6 +19,7 @@
 package org.apache.ldap.server.configuration;
 
 import java.io.File;
+import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
@@ -99,4 +100,8 @@
     {
         super.setMinaServiceRegistry( minaServiceRegistry );
     }
+
+    public void setExtendedOperationHandlers(Collection handlers) {
+        super.setExtendedOperationHandlers(handlers);
+    }
 }
diff --git a/main/src/main/java/org/apache/ldap/server/configuration/ServerStartupConfiguration.java b/main/src/main/java/org/apache/ldap/server/configuration/ServerStartupConfiguration.java
index a90a22e..b0047fd 100644
--- a/main/src/main/java/org/apache/ldap/server/configuration/ServerStartupConfiguration.java
+++ b/main/src/main/java/org/apache/ldap/server/configuration/ServerStartupConfiguration.java
@@ -18,6 +18,11 @@
  */
 package org.apache.ldap.server.configuration;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.ldap.server.protocol.ExtendedOperationHandler;
 import org.apache.mina.registry.ServiceRegistry;
 import org.apache.mina.registry.SimpleServiceRegistry;
 
@@ -36,6 +41,7 @@
     private int ldapPort = 389;
     private int ldapsPort = 636;
     private boolean enableKerberos;
+    private final Collection extendedOperationHandlers = new ArrayList();
 
     protected ServerStartupConfiguration()
     {
@@ -128,4 +134,24 @@
         }
         this.minaServiceRegistry = minaServiceRegistry;
     }
+    
+    public Collection getExtendedOperationHandlers()
+    {
+        return new ArrayList( extendedOperationHandlers );
+    }
+    
+    protected void setExtendedOperationHandlers( Collection handlers )
+    {
+        for( Iterator i = handlers.iterator(); i.hasNext(); )
+        {
+            if( !( i.next() instanceof ExtendedOperationHandler ) )
+            {
+                throw new IllegalArgumentException(
+                        "The specified handler collection contains an element which is not an ExtendedOperationHandler." );
+            }
+        }
+        
+        this.extendedOperationHandlers.clear();
+        this.extendedOperationHandlers.addAll( handlers );
+    }
 }
diff --git a/main/src/main/java/org/apache/ldap/server/jndi/ServerContextFactory.java b/main/src/main/java/org/apache/ldap/server/jndi/ServerContextFactory.java
index e0ad696..8cd8e2f 100644
--- a/main/src/main/java/org/apache/ldap/server/jndi/ServerContextFactory.java
+++ b/main/src/main/java/org/apache/ldap/server/jndi/ServerContextFactory.java
@@ -40,6 +40,7 @@
 import org.apache.ldap.common.util.PropertiesUtils;
 import org.apache.ldap.server.DirectoryService;
 import org.apache.ldap.server.configuration.ServerStartupConfiguration;
+import org.apache.ldap.server.protocol.ExtendedOperationHandler;
 import org.apache.ldap.server.protocol.LdapProtocolProvider;
 import org.apache.mina.common.TransportType;
 import org.apache.mina.registry.Service;
@@ -204,9 +205,17 @@
         int port = cfg.getLdapPort();
         Service service = new Service( "ldap", TransportType.SOCKET, new InetSocketAddress( port ) );
 
+        // Register all extended operation handlers.
+        LdapProtocolProvider protocolProvider = new LdapProtocolProvider( ( Hashtable ) env.clone() );
+        for( Iterator i = cfg.getExtendedOperationHandlers().iterator(); i.hasNext(); )
+        {
+            ExtendedOperationHandler h = ( ExtendedOperationHandler ) i.next();
+            protocolProvider.addExtendedOperationHandler( h );
+        }
+        
         try
         {
-            minaRegistry.bind( service, new LdapProtocolProvider( ( Hashtable ) env.clone() ) );
+            minaRegistry.bind( service, protocolProvider );
             ldapService = service;
             if ( log.isInfoEnabled() )
             {