You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/05/06 23:21:49 UTC

svn commit: r1100381 - in /james/server/trunk: container-spring/ container-spring/src/main/config/james/context/ container-spring/src/main/java/org/apache/james/container/spring/bean/ container-spring/src/main/java/org/apache/james/container/spring/bea...

Author: norman
Date: Fri May  6 21:21:48 2011
New Revision: 1100381

URL: http://svn.apache.org/viewvc?rev=1100381&view=rev
Log:
Make ProtocolHandlerChain implementation less a hack and more clear

Added:
    james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/ProtocolHandlerChainImpl.java
      - copied, changed from r1097906, james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java
    james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/ConfigurableProtocolHandlerchain.java
Removed:
    james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java
    james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/postprocessor/ProtocolHandlerChainPostProcessor.java
Modified:
    james/server/trunk/container-spring/pom.xml
    james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml
    james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
    james/server/trunk/pop3server/pom.xml
    james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
    james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
    james/server/trunk/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerChain.java
    james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java

Modified: james/server/trunk/container-spring/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/pom.xml?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/container-spring/pom.xml (original)
+++ james/server/trunk/container-spring/pom.xml Fri May  6 21:21:48 2011
@@ -573,7 +573,6 @@
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-protocols-library</artifactId>
-      <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>

Modified: james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml (original)
+++ james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml Fri May  6 21:21:48 2011
@@ -238,32 +238,20 @@
      -->
     <bean id="smtpserver" class="org.apache.james.smtpserver.netty.SMTPServer"/>
     
-    <bean id="smtphandlerchain" class="org.apache.james.container.spring.bean.postprocessor.ProtocolHandlerChainPostProcessor">
-        <property name="coreHandlersPackage" value="org.apache.james.smtpserver.CoreCmdHandlerLoader"/>
-        <property name="jmxHandlersPackage" value="org.apache.james.smtpserver.jmx.JMXHandlersLoader"/>
-        <property name="beanName" value="smtpserver"/>
-    </bean>
+    <bean id="smtphandlerchain" class="org.apache.james.container.spring.bean.ProtocolHandlerChainImpl"/>
 
     <!-- 
       LMTP Server
      -->
     <bean id="lmtpserver" class="org.apache.james.lmtpserver.netty.LMTPServer"/>
     
-    <bean id="lmtphandlerchain" class="org.apache.james.container.spring.bean.postprocessor.ProtocolHandlerChainPostProcessor">
-        <property name="coreHandlersPackage" value="org.apache.james.lmtpserver.CoreCmdHandlerLoader"/>
-        <property name="jmxHandlersPackage" value="org.apache.james.lmtpserver.jmx.JMXHandlersLoader"/>
-        <property name="beanName" value="lmtpserver"/>
-    </bean>
+    <bean id="lmtphandlerchain" class="org.apache.james.container.spring.bean.ProtocolHandlerChainImpl"/>
 
     <!-- 
       POP3 Server
      -->
     <bean id="pop3server"  class="org.apache.james.pop3server.netty.POP3Server"/>
-    <bean id="pop3handlerchain" class="org.apache.james.container.spring.bean.postprocessor.ProtocolHandlerChainPostProcessor">
-        <property name="coreHandlersPackage" value="org.apache.james.pop3server.core.CoreCmdHandlerLoader"/>
-        <property name="jmxHandlersPackage" value="org.apache.james.pop3server.jmx.JMXHandlersLoader"/>
-        <property name="beanName" value="pop3server"/>
-    </bean>
+    <bean id="pop3handlerchain" class="org.apache.james.container.spring.bean.ProtocolHandlerChainImpl"/>
 
     <!-- 
       IMAP Server

Copied: james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/ProtocolHandlerChainImpl.java (from r1097906, james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/ProtocolHandlerChainImpl.java?p2=james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/ProtocolHandlerChainImpl.java&p1=james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java&r1=1097906&r2=1100381&rev=1100381&view=diff
==============================================================================
--- james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java (original)
+++ james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/ProtocolHandlerChainImpl.java Fri May  6 21:21:48 2011
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.container.spring.bean.factorypostprocessor;
+package org.apache.james.container.spring.bean;
 
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -27,21 +27,17 @@ import org.apache.commons.configuration.
 import org.apache.commons.configuration.ConfigurationUtils;
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.james.container.spring.provider.configuration.ConfigurationProvider;
-import org.apache.james.container.spring.provider.log.LogProvider;
 import org.apache.james.lifecycle.api.Configurable;
-import org.apache.james.lifecycle.api.LogEnabled;
 import org.apache.james.protocols.api.ExtensibleHandler;
 import org.apache.james.protocols.api.HandlersPackage;
 import org.apache.james.protocols.api.ProtocolHandlerChain;
-import org.slf4j.Logger;
+import org.apache.james.protocols.api.WiringException;
+import org.apache.james.protocols.lib.ConfigurableProtocolHandlerchain;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.FatalBeanException;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.beans.factory.support.BeanDefinitionBuilder;
-import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 
 /**
  * 
@@ -56,75 +52,42 @@ import org.springframework.beans.factory
  * which it is responsible.
  */
 @SuppressWarnings("unchecked")
-public abstract class ProtocolHandlerChainFactoryPostProcessor implements ProtocolHandlerChain, BeanFactoryPostProcessor {
+public class ProtocolHandlerChainImpl implements ConfigurableProtocolHandlerchain, BeanFactoryAware {
 
     private ConfigurableListableBeanFactory beanFactory;
 
-    private String coreHandlersPackage;
-
-    private List<String> handlers = new LinkedList<String>();
-
-    private String beanname;
-
-    private String jmxHandlersPackage;
-
-    /**
-     * Lookup the {@link HierarchicalConfiguration} for the beanname which was
-     * configured via {@link #setBeanName(String)} and parse it for handlers
-     * which should be registered in the {@link ConfigurableListableBeanFactory}
-     * .
-     */
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
-
-        this.beanFactory = beanFactory;
-
-        ConfigurationProvider confProvider = beanFactory.getBean(ConfigurationProvider.class);
-
-        LogProvider logProvider = beanFactory.getBean(LogProvider.class);
+    private List<Object> handlers = new LinkedList<Object>();
 
+    @Override
+    public void init(HierarchicalConfiguration handlerchainConfig) throws ConfigurationException {
         try {
-
-            Logger log = logProvider.getLog(beanname);
-
-            HierarchicalConfiguration config = confProvider.getConfiguration(beanname);
-            String jmxName = config.getString("jmxName", beanname);
-            HierarchicalConfiguration handlerchainConfig = config.configurationAt("handlerchain");
+            String jmxName = handlerchainConfig.getString("[@jmxName]");
             List<org.apache.commons.configuration.HierarchicalConfiguration> children = handlerchainConfig.configurationsAt("handler");
+            ClassLoader loader = beanFactory.getBeanClassLoader();
 
-            // check if the coreHandlersPackage was specified inte hconfig if
-            // not add the default
-            if (handlerchainConfig.getString("[@coreHandlersPackage]") == null)
-                handlerchainConfig.addProperty("[@coreHandlersPackage]", coreHandlersPackage);
-
+   
             String coreCmdName = handlerchainConfig.getString("[@coreHandlersPackage]");
 
-            BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
-
-            String coreCmdBeanName = getBeanName(coreCmdName);
-
             // now register the HandlerPackage
-            BeanDefinition def = BeanDefinitionBuilder.genericBeanDefinition(coreCmdName).setLazyInit(false).getBeanDefinition();
-            registry.registerBeanDefinition(coreCmdBeanName, def);
-            HandlersPackage handlersPackage = beanFactory.getBean(coreCmdBeanName, HandlersPackage.class);
+            // Use the classloader which is used for bean instance stuff
+            Class<HandlersPackage> c = (Class<HandlersPackage>) loader.loadClass(coreCmdName);
+            HandlersPackage handlersPackage = beanFactory.createBean(c);
 
-            registerHandlersPackage(handlersPackage, null, children);
 
-            String jmxCmdName = jmxHandlersPackage;
+            registerHandlersPackage(handlersPackage, null, children);
 
             if (handlerchainConfig.getBoolean("[@enableJmx]", true)) {
-                String jmxCmdBeanName = getBeanName(jmxCmdName);
+                String jmxHandlerPackage = handlerchainConfig.getString("[@jmxHandlersPackage]");
 
                 // now register the HandlerPackage for jmx
-                BeanDefinition jmxDef = BeanDefinitionBuilder.genericBeanDefinition(jmxCmdName).setLazyInit(false).getBeanDefinition();
-                registry.registerBeanDefinition(jmxCmdBeanName, jmxDef);
-                HandlersPackage jmxPackage = beanFactory.getBean(jmxCmdBeanName, HandlersPackage.class);
+                Class<HandlersPackage> jC = (Class<HandlersPackage>) loader.loadClass(jmxHandlerPackage);
+                HandlersPackage jmxPackage = beanFactory.createBean(jC);
 
                 DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
                 builder.addProperty("jmxName", jmxName);
                 registerHandlersPackage(jmxPackage, builder, children);
             }
 
-            ClassLoader loader = beanFactory.getBeanClassLoader();
             for (int i = 0; i < children.size(); i++) {
                 HierarchicalConfiguration hConf = children.get(i);
                 String className = hConf.getString("[@class]", null);
@@ -133,37 +96,44 @@ public abstract class ProtocolHandlerCha
                     // ignore base handlers.
                     if (!className.equals(coreCmdName)) {
 
-                        String handlerBeanName = getBeanName(className);
-
-                        Class<?> clazz = loader.loadClass(className);
-                        if (Configurable.class.isAssignableFrom(clazz)) {
-                            confProvider.registerConfiguration(handlerBeanName, hConf);
-
+                        // Use the classloader which is used for bean instance stuff
+                        Class<?> clazz = (Class<?>) loader.loadClass(className);
+                        Object handler = beanFactory.createBean(clazz);
+                        if (handler instanceof Configurable) {
+                            ((Configurable) handler).configure(hConf);
                         }
-                        if (LogEnabled.class.isAssignableFrom(clazz)) {
-                            logProvider.registerLog(handlerBeanName, log);
-                        }
-
-                        // now register the BeanDefinition on the context and
-                        // store the beanname for later usage
-                        BeanDefinition handlerDef = BeanDefinitionBuilder.genericBeanDefinition(className).getBeanDefinition();
-                        registry.registerBeanDefinition(handlerBeanName, handlerDef);
-
-                        handlers.add(handlerBeanName);
+                        handlers.add(handler);
                     }
                 } else {
                     throw new FatalBeanException("Missing @class attribute in configuration: " + ConfigurationUtils.toString(hConf));
                 }
             }
-
-        } catch (ConfigurationException e) {
-            throw new FatalBeanException("Unable to load configuration for bean " + beanname, e);
-        } catch (ClassNotFoundException ex) {
-            throw new FatalBeanException("Unable to load configuration for bean " + beanname, ex);
+            
+            wireHandlers();
+        } catch (WiringException e) {
+            throw new ConfigurationException(e);
+        } catch (ClassNotFoundException e) {
+            throw new ConfigurationException("Unable to load handlers", e);
         }
-
     }
 
+    private void wireHandlers() throws WiringException {
+        for (int a = 0; a < handlers.size(); a++) {
+            Object handler = handlers.get(a);
+            if (handler instanceof ExtensibleHandler) {
+                final ExtensibleHandler extensibleHandler = (ExtensibleHandler) handler;
+                final List<Class<?>> markerInterfaces = extensibleHandler.getMarkerInterfaces();
+                for (int i = 0; i < markerInterfaces.size(); i++) {
+                    final Class<?> markerInterface = markerInterfaces.get(i);
+                    final List<?> extensions = getHandlers(markerInterface);
+                    // ok now time for try the wiring
+                    extensibleHandler.wireExtensions(markerInterface, extensions);
+
+                }
+            }
+        }
+    }
+    
     private void registerHandlersPackage(HandlersPackage handlersPackage, HierarchicalConfiguration handlerConfig, List<HierarchicalConfiguration> children) {
         List<String> c = handlersPackage.getHandlers();
 
@@ -184,14 +154,6 @@ public abstract class ProtocolHandlerCha
         }
     }
 
-    public void setCoreHandlersPackage(String coreHandlersPackage) {
-        this.coreHandlersPackage = coreHandlersPackage;
-    }
-
-    public void setJmxHandlersPackage(String jmxHandlersPackage) {
-        this.jmxHandlersPackage = jmxHandlersPackage;
-    }
-
     /**
      * Return a DefaultConfiguration build on the given command name and
      * classname.
@@ -209,14 +171,7 @@ public abstract class ProtocolHandlerCha
         return hConf;
     }
 
-    /**
-     * Returns the Handlers List.
-     * 
-     * @return
-     */
-    public List<String> getHandlers() {
-        return handlers;
-    }
+ 
 
     /*
      * (non-Javadoc)
@@ -227,25 +182,21 @@ public abstract class ProtocolHandlerCha
      */
     public <T> LinkedList<T> getHandlers(Class<T> type) {
         LinkedList<T> classHandlers = new LinkedList<T>();
-        String[] names = beanFactory.getBeanNamesForType(type);
-
-        for (int i = 0; i < names.length; i++) {
-            String name = names[i];
-            // check if the handler is registered in the handler chain
-            if (handlers.contains(name)) {
-                classHandlers.add(beanFactory.getBean(name, type));
+        for (int i = 0; i < handlers.size(); i++) {
+            if (type.isInstance(handlers.get(i))) {
+                classHandlers.add((T)handlers.get(i));
             }
+            
         }
 
         return classHandlers;
     }
 
-    public void setBeanName(String beanname) {
-        this.beanname = beanname;
-    }
 
-    private String getBeanName(String name) {
-        return beanname + ":" + name;
+    /*
+     * 
+     */
+    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+        this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
     }
-
 }

Modified: james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java (original)
+++ james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java Fri May  6 21:21:48 2011
@@ -23,7 +23,7 @@ import javax.net.ssl.SSLContext;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.lib.ConfigurableProtocolHandlerchain;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
 import org.apache.james.smtpserver.netty.SMTPChannelUpstreamHandler;
@@ -38,12 +38,13 @@ public class LMTPServer extends Abstract
      * 0, means no limit.
      */
     private long maxMessageSize = 0;
-    private ProtocolHandlerChain handlerChain;
+    private ConfigurableProtocolHandlerchain handlerChain;
     private LMTPConfiguration lmtpConfig = new LMTPConfiguration();
     private String lmtpGreeting;
+    private HierarchicalConfiguration config;
 
     @Resource(name = "lmtphandlerchain")
-    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+    public void setProtocolHandlerChain(ConfigurableProtocolHandlerchain handlerChain) {
         this.handlerChain = handlerChain;
     }
 
@@ -67,7 +68,20 @@ public class LMTPServer extends Abstract
         return "LMTP Service";
     }
 
+    @Override
+    protected void preInit() throws Exception {
+        super.preInit();
+        HierarchicalConfiguration hconfig = config.configurationAt("handlerchain");
+        hconfig.addProperty("[@jmxName]", jmxName);
+        hconfig.addProperty("[@jmxHandlersPackage]", "org.apache.james.lmtpserver.jmx.JMXHandlersLoader");
+        hconfig.addProperty("[@coreHandlersPackage]", "org.apache.james.lmtpserver.CoreCmdHandlerLoader");
+
+        handlerChain.init(hconfig);
+    }
+
     public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
+        this.config = configuration;
+   
         if (isEnabled()) {
 
             // get the message size limit from the conf file and multiply

Modified: james/server/trunk/pop3server/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/pom.xml?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/pop3server/pom.xml (original)
+++ james/server/trunk/pop3server/pom.xml Fri May  6 21:21:48 2011
@@ -89,6 +89,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
+      <artifactId>apache-james-mailbox-maildir</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
       <artifactId>james-server-core</artifactId>
       <type>test-jar</type>
       <scope>test</scope>

Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java Fri May  6 21:21:48 2011
@@ -20,8 +20,10 @@ package org.apache.james.pop3server.nett
 
 import javax.annotation.Resource;
 
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.pop3server.POP3HandlerConfigurationData;
-import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.lib.ConfigurableProtocolHandlerchain;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
@@ -36,14 +38,34 @@ public class POP3Server extends Abstract
      */
     private POP3HandlerConfigurationData theConfigData = new POP3HandlerConfigurationDataImpl();
 
-    private ProtocolHandlerChain handlerChain;
+    private ConfigurableProtocolHandlerchain handlerChain;
+
+    private HierarchicalConfiguration config;
 
     @Resource(name = "pop3handlerchain")
-    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+    public void setProtocolHandlerChain(ConfigurableProtocolHandlerchain handlerChain) {
         this.handlerChain = handlerChain;
     }
 
     @Override
+    protected void preInit() throws Exception {
+        super.preInit();
+        HierarchicalConfiguration hconfig = config.configurationAt("handlerchain");
+        hconfig.addProperty("[@jmxName]", jmxName);
+        hconfig.addProperty("[@jmxHandlersPackage]", "org.apache.james.pop3server.jmx.JMXHandlersLoader");
+        hconfig.addProperty("[@coreHandlersPackage]", "org.apache.james.pop3server.core.CoreCmdHandlerLoader");
+
+        handlerChain.init(hconfig);
+    }
+
+    public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
+        super.doConfigure(configuration);
+        this.config = configuration;
+      
+
+    }
+    
+    @Override
     protected int getDefaultPort() {
         return 110;
     }

Added: james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/ConfigurableProtocolHandlerchain.java
URL: http://svn.apache.org/viewvc/james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/ConfigurableProtocolHandlerchain.java?rev=1100381&view=auto
==============================================================================
--- james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/ConfigurableProtocolHandlerchain.java (added)
+++ james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/ConfigurableProtocolHandlerchain.java Fri May  6 21:21:48 2011
@@ -0,0 +1,10 @@
+package org.apache.james.protocols.lib;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+
+public interface ConfigurableProtocolHandlerchain extends ProtocolHandlerChain {
+
+    public void init(HierarchicalConfiguration config) throws ConfigurationException;
+}

Modified: james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java (original)
+++ james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java Fri May  6 21:21:48 2011
@@ -103,7 +103,7 @@ public abstract class AbstractConfigurab
 
     private SSLContext context;
 
-    private String jmxName;
+    protected String jmxName;
 
     private String[] enabledCipherSuites;
 

Modified: james/server/trunk/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerChain.java
URL: http://svn.apache.org/viewvc/james/server/trunk/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerChain.java?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerChain.java (original)
+++ james/server/trunk/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerChain.java Fri May  6 21:21:48 2011
@@ -33,6 +33,7 @@ import org.apache.james.protocols.api.Ex
 import org.apache.james.protocols.api.HandlersPackage;
 import org.apache.james.protocols.api.ProtocolHandlerChain;
 import org.apache.james.protocols.api.WiringException;
+import org.apache.james.protocols.lib.ConfigurableProtocolHandlerchain;
 import org.slf4j.Logger;
 
 /**
@@ -43,7 +44,7 @@ import org.slf4j.Logger;
  * TODO: Move this to test package as it is the only place where it get used
  */
 @SuppressWarnings("unchecked")
-public class MockProtocolHandlerChain implements ProtocolHandlerChain, Configurable, LogEnabled {
+public class MockProtocolHandlerChain implements ConfigurableProtocolHandlerchain, Configurable, LogEnabled {
 
     private Logger log;
     private String coreHandlersPackage;
@@ -223,4 +224,9 @@ public class MockProtocolHandlerChain im
     public void setLog(Logger log) {
         this.log = log;
     }
+
+    @Override
+    public void init(HierarchicalConfiguration config) throws ConfigurationException {
+        
+    }
 }
\ No newline at end of file

Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java?rev=1100381&r1=1100380&r2=1100381&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java Fri May  6 21:21:48 2011
@@ -23,7 +23,7 @@ import javax.annotation.Resource;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.dnsservice.library.netmatcher.NetMatcher;
-import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.lib.ConfigurableProtocolHandlerchain;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
@@ -39,7 +39,7 @@ public class SMTPServer extends Abstract
      * Command handlers , Message handlers and connection handlers Constructed
      * during initialisation to allow dependency injection.
      */
-    private ProtocolHandlerChain handlerChain;
+    private ConfigurableProtocolHandlerchain handlerChain;
 
     /**
      * Whether authentication is required to use this SMTP server.
@@ -86,12 +86,27 @@ public class SMTPServer extends Abstract
 
     private boolean verifyIdentity;
 
+    private HierarchicalConfiguration config;
+
     @Resource(name = "smtphandlerchain")
-    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+    public void setProtocolHandlerChain(ConfigurableProtocolHandlerchain handlerChain) {
         this.handlerChain = handlerChain;
     }
 
+    @Override
+    protected void preInit() throws Exception {
+        super.preInit();
+        HierarchicalConfiguration hconfig = config.configurationAt("handlerchain");
+        hconfig.addProperty("[@jmxName]", jmxName);
+
+        hconfig.addProperty("[@jmxHandlersPackage]", "org.apache.james.smtpserver.jmx.JMXHandlersLoader");
+        hconfig.addProperty("[@coreHandlersPackage]", "org.apache.james.smtpserver.CoreCmdHandlerLoader");
+        handlerChain.init(hconfig);
+    }
+
     public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
+        this.config = configuration;
+        
         if (isEnabled()) {
             String authRequiredString = configuration.getString("authRequired", "false").trim().toLowerCase();
             if (authRequiredString.equals("true"))



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org