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 2010/02/09 12:28:00 UTC

svn commit: r908005 - in /james/server/trunk: mina-socket/src/main/java/org/apache/james/socket/mina/ pop3server/src/main/java/org/apache/james/pop3server/mina/ pop3server/src/test/java/org/apache/james/pop3server/ remotemanager/src/main/java/org/apach...

Author: norman
Date: Tue Feb  9 11:27:59 2010
New Revision: 908005

URL: http://svn.apache.org/viewvc?rev=908005&view=rev
Log:
Use BeanFactoryBeanProcessors to load instances and parse configs. This includes implementations for UsersStore, VirtualTableStore und ProtocolHandlerChain. See same should get done for Loading Mailets and for MailStore. This is the first step to remove the LoaderService (JAMES-966)

Added:
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/AbstractStore.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/Registry.java
      - copied, changed from r907595, james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/LogProvider.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringProtocolHandlerChain.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringUsersStore.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringVirtualUserTableStore.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationRegistry.java
      - copied, changed from r907595, james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationProvider.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogRegistry.java
      - copied, changed from r907595, james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogProvider.java
Removed:
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/ConfigurationProvider.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/LogProvider.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationProvider.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogProvider.java
    james/server/trunk/user-function/src/main/java/org/apache/james/core/
Modified:
    james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java
    james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/AsyncPOP3Server.java
    james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java
    james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3TestConfiguration.java
    james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/mina/AsyncRemoteManager.java
    james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java
    james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTestConfiguration.java
    james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java
    james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java
    james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPTestConfiguration.java
    james/server/trunk/spring-deployment/pom.xml
    james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/AbstractLifeCycleBeanPostProcessor.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/CommonsConfigurableBeanPostProcessor.java
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/LogEnabledBeanPostProcessor.java

Modified: james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java (original)
+++ james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java Tue Feb  9 11:27:59 2010
@@ -30,7 +30,6 @@
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.logging.Log;
 import org.apache.james.api.dnsservice.DNSService;
-import org.apache.james.api.kernel.LoaderService;
 import org.apache.james.lifecycle.Configurable;
 import org.apache.james.lifecycle.LogEnabled;
 import org.apache.james.services.FileSystem;
@@ -85,9 +84,6 @@
      */
     private MailServer mailServer;
 
-    /** Loads instances */
-    private LoaderService loader;
-
     private Log logger;
 
     private DNSService dns;
@@ -118,22 +114,6 @@
 
     private SslContextFactory contextFactory;
 
-    /**
-     * Gets the current instance loader.
-     * @return the loader
-     */
-    public final LoaderService getLoader() {
-        return loader;
-    }
-
-    /**
-     * Sets the loader to be used for instances.
-     * @param loader the loader to set, not null
-     */
-    @Resource(name="org.apache.james.LoaderService")
-    public final void setLoader(LoaderService loader) {
-        this.loader = loader;
-    }
     
     @Resource(name="dnsserver")
     public final void setDNSService(DNSService dns) {

Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/AsyncPOP3Server.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/AsyncPOP3Server.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/AsyncPOP3Server.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/AsyncPOP3Server.java Tue Feb  9 11:27:59 2010
@@ -20,17 +20,13 @@
 
 package org.apache.james.pop3server.mina;
 
-import javax.annotation.Resource;
-
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.commons.configuration.SubnodeConfiguration;
 import org.apache.james.pop3server.POP3HandlerConfigurationData;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3ServerMBean;
-import org.apache.james.pop3server.core.CoreCmdHandlerLoader;
 import org.apache.james.pop3server.mina.filter.POP3ResponseFilter;
-import org.apache.james.socket.ProtocolHandlerChainImpl;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
 import org.apache.james.socket.mina.AbstractAsyncServer;
 import org.apache.james.socket.mina.filter.ResponseValidationFilter;
 import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
@@ -56,40 +52,19 @@
     private POP3HandlerConfigurationData theConfigData
         = new POP3HandlerConfigurationDataImpl();
 
-	private SubnodeConfiguration handlerConfiguration;
-
-	private ProtocolHandlerChainImpl handlerChain;
+	private ProtocolHandlerChain handlerChain;
 
 
+	public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+	    this.handlerChain = handlerChain;
+	}
+	
 	@Override
 	protected IoHandler createIoHandler() {
 		return new POP3IoHandler(handlerChain, theConfigData, getLogger(), getSslContextFactory());
 	}
 
-	 /**
-     * Prepare the handlerchain
-     * 
-     * @throws Exception
-     */
-    private void prepareHandlerChain() throws Exception {
-        //read from the XML configuration and create and configure each of the handlers
-        HierarchicalConfiguration handlerchainConfig = handlerConfiguration.configurationAt("handlerchain");
-        if (handlerchainConfig.getString("[@coreHandlersPackage]") == null)
-            handlerchainConfig.addProperty("[@coreHandlersPackage]", CoreCmdHandlerLoader.class.getName());
-        
-        handlerChain = getLoader().load(ProtocolHandlerChainImpl.class, getLogger(), handlerchainConfig);
-        handlerChain.configure(handlerchainConfig);
-        
-    }
-
 
-    /**
-     * @see org.apache.james.socket.mina.AbstractAsyncServer#preInit()
-     */
-    protected void preInit() throws Exception {
-        prepareHandlerChain();
-    }
-    
 	@Override
 	protected int getDefaultPort() {
 		return 110;
@@ -104,7 +79,7 @@
     @Override
     protected void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
         super.doConfigure(configuration);
-        handlerConfiguration = configuration.configurationAt("handler");
+        HierarchicalConfiguration handlerConfiguration = configuration.configurationAt("handler");
         lengthReset = handlerConfiguration.getInteger("lengthReset", lengthReset);
         if (getLogger().isInfoEnabled()) {
             getLogger().info("The idle timeout will be reset every " + lengthReset + " bytes.");

Modified: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java Tue Feb  9 11:27:59 2010
@@ -45,6 +45,7 @@
 import org.apache.james.pop3server.mina.AsyncPOP3Server;
 import org.apache.james.services.MailRepository;
 import org.apache.james.services.MailServer;
+import org.apache.james.socket.ProtocolHandlerChainImpl;
 import org.apache.james.test.mock.james.InMemorySpoolRepository;
 import org.apache.james.test.mock.james.MockFileSystem;
 import org.apache.james.test.mock.james.MockMailServer;
@@ -65,6 +66,7 @@
     private FakeLoader serviceManager;
     private DNSService dnsservice;
     private MockFileSystem fSystem;
+    private ProtocolHandlerChainImpl chain;
     
     public AsyncPOP3ServerTest() {
         super("AsyncPOP3ServerTest");
@@ -74,11 +76,17 @@
 
     protected void setUp() throws Exception {
         setUpServiceManager();
-
+        
+        chain = new ProtocolHandlerChainImpl();
+        chain.setLoader(serviceManager);
+        chain.setLog(new SimpleLog("ChainLog"));
+        
         m_pop3Server = new AsyncPOP3Server();
         m_pop3Server.setDNSService(dnsservice);
         m_pop3Server.setFileSystem(fSystem);
-        m_pop3Server.setLoader(serviceManager);
+        m_pop3Server.setProtocolHandlerChain(chain);
+       
+        
         SimpleLog log = new SimpleLog("Mock");
         log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
         m_pop3Server.setLog(log);
@@ -88,7 +96,9 @@
 
     protected void finishSetUp(POP3TestConfiguration testConfiguration) throws Exception {
         testConfiguration.init();
+        chain.configure(testConfiguration.configurationAt("handler.handlerchain"));        
         m_pop3Server.configure(testConfiguration);
+        chain.init();
         m_pop3Server.init();
     }
 

Modified: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3TestConfiguration.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3TestConfiguration.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3TestConfiguration.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3TestConfiguration.java Tue Feb  9 11:27:59 2010
@@ -36,6 +36,6 @@
         addProperty("port", m_pop3ListenerPort);
         addProperty("handler.helloName", "myMailServer");
         addProperty("handler.connectiontimeout", "360000");
-        addProperty("handler.handlerchain.handler.[@class]", CoreCmdHandlerLoader.class.getName());
+        addProperty("handler.handlerchain.[@coreHandlersPackage]", CoreCmdHandlerLoader.class.getName());
     }
 }

Modified: james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/mina/AsyncRemoteManager.java
URL: http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/mina/AsyncRemoteManager.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/mina/AsyncRemoteManager.java (original)
+++ james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/mina/AsyncRemoteManager.java Tue Feb  9 11:27:59 2010
@@ -25,12 +25,11 @@
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
 import org.apache.james.remotemanager.RemoteManagerHandlerConfigurationData;
 import org.apache.james.remotemanager.RemoteManagerMBean;
 import org.apache.james.remotemanager.RemoteManagerResponse;
-import org.apache.james.remotemanager.core.CoreCmdHandlerLoader;
 import org.apache.james.remotemanager.mina.filter.RemoteManagerResponseFilter;
-import org.apache.james.socket.ProtocolHandlerChainImpl;
 import org.apache.james.socket.mina.AbstractAsyncServer;
 import org.apache.james.socket.mina.filter.ResponseValidationFilter;
 import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
@@ -38,11 +37,14 @@
 
 public class AsyncRemoteManager extends AbstractAsyncServer implements RemoteManagerMBean{
 
-    private HierarchicalConfiguration handlerConfiguration;
     private Map<String,String> adminAccounts = new HashMap<String, String>();
-    private ProtocolHandlerChainImpl handlerChain;
+    private ProtocolHandlerChain handlerChain;
     private RemoteManagerHandlerConfigurationData configData = new RemoteManagerHandlerConfigurationDataImpl();
     
+    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+        this.handlerChain = handlerChain;
+    }
+    
     @Override
     protected IoHandler createIoHandler() {
         return new RemoteManagerIoHandler(configData, handlerChain, getLogger());
@@ -62,20 +64,13 @@
     @Override
     protected void doConfigure(HierarchicalConfiguration config) throws ConfigurationException {
         super.doConfigure(config);
-        handlerConfiguration = config.configurationAt("handler");
+        HierarchicalConfiguration handlerConfiguration = config.configurationAt("handler");
         List<HierarchicalConfiguration> accounts = handlerConfiguration.configurationsAt("administrator_accounts.account");
         for (int i = 0; i < accounts.size(); i++) {
             adminAccounts.put(accounts.get(i).getString("[@login]"), accounts.get(i).getString("[@password]"));
         }
     }
 
-    
-    @Override
-    protected void preInit() throws Exception {
-        prepareHandlerChain();
-    }
-
-    
     protected DefaultIoFilterChainBuilder createIoFilterChainBuilder() {
         DefaultIoFilterChainBuilder builder = super.createIoFilterChainBuilder();
         
@@ -85,17 +80,7 @@
         return builder;
     }
     
-    
-    private void prepareHandlerChain() throws Exception {
-        
-        //read from the XML configuration and create and configure each of the handlers
-        HierarchicalConfiguration jamesConfiguration = handlerConfiguration.configurationAt("handlerchain");
-        if (jamesConfiguration.getString("[@coreHandlersPackage]") == null)
-            jamesConfiguration.addProperty("[@coreHandlersPackage]", CoreCmdHandlerLoader.class.getName());
-        
-        handlerChain = getLoader().load(ProtocolHandlerChainImpl.class, getLogger(), jamesConfiguration);
-    }
-
+  
     
     /*
      * (non-Javadoc)

Modified: james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java (original)
+++ james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java Tue Feb  9 11:27:59 2010
@@ -56,6 +56,7 @@
 import org.apache.james.management.SpoolManagementService;
 import org.apache.james.remotemanager.mina.AsyncRemoteManager;
 import org.apache.james.services.MailServer;
+import org.apache.james.socket.ProtocolHandlerChainImpl;
 import org.apache.james.test.mock.avalon.MockStore;
 import org.apache.james.test.mock.james.MockFileSystem;
 import org.apache.james.test.mock.james.MockMailServer;
@@ -79,14 +80,21 @@
 	private MockFileSystem filesystem;
 	private MockVirtualUserTableManagementService vutManagement;
 	private AsyncRemoteManager remotemanager;
-
+	private ProtocolHandlerChainImpl chain;
+	
 	protected void setUp() throws Exception {
 		setUpFakeLoader();
 
+		chain = new ProtocolHandlerChainImpl();
+	    chain.setLoader(serviceManager);
+	    chain.setLog(new SimpleLog("ChainLog"));
+	        
+	        
 		remotemanager = new AsyncRemoteManager();
 		remotemanager.setDNSService(dnsservice);
 		remotemanager.setFileSystem(filesystem);
-		remotemanager.setLoader(serviceManager);
+		remotemanager.setProtocolHandlerChain(chain);
+       
 		SimpleLog log = new SimpleLog("Mock");
 		log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
 		remotemanager.setLog(log);
@@ -103,7 +111,9 @@
 	protected void finishSetUp(RemoteManagerTestConfiguration testConfiguration)
 			throws Exception {
 		testConfiguration.init();
+        chain.configure(testConfiguration.configurationAt("handler.handlerchain"));        
 		remotemanager.configure(testConfiguration);
+		chain.init();
 		remotemanager.init();
 	}
 

Modified: james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTestConfiguration.java
URL: http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTestConfiguration.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTestConfiguration.java (original)
+++ james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTestConfiguration.java Tue Feb  9 11:27:59 2010
@@ -70,7 +70,7 @@
         addProperty("handler.administrator_accounts.account.[@login]", m_loginName);
         addProperty("handler.administrator_accounts.account.[@password]", m_loginPassword);
 
-        addProperty("handler.handlerchain.handler.[@class]", CoreCmdHandlerLoader.class.getName());
+        addProperty("handler.handlerchain.[@coreHandlersPackage]", CoreCmdHandlerLoader.class.getName());
        
     }
 }

Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java Tue Feb  9 11:27:59 2010
@@ -23,17 +23,14 @@
 
 
 
-import javax.annotation.PostConstruct;
-
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.api.dnsservice.util.NetMatcher;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
 import org.apache.james.protocols.smtp.SMTPResponse;
 import org.apache.james.protocols.smtp.SMTPServerMBean;
-import org.apache.james.smtpserver.CoreCmdHandlerLoader;
 import org.apache.james.smtpserver.mina.filter.SMTPResponseFilter;
-import org.apache.james.socket.ProtocolHandlerChainImpl;
 import org.apache.james.socket.mina.AbstractAsyncServer;
 import org.apache.james.socket.mina.filter.ResponseValidationFilter;
 import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
@@ -53,11 +50,7 @@
      * Command handlers , Message handlers and connection handlers
      * Constructed during initialisation to allow dependency injection.
      */
-    private ProtocolHandlerChainImpl handlerChain;
-
-   
-    /** Cached configuration data for handler */
-    private HierarchicalConfiguration handlerConfiguration;
+    private ProtocolHandlerChain handlerChain;
 
     /**
      * Whether authentication is required to use
@@ -106,9 +99,15 @@
     private boolean addressBracketsEnforcement = true;
 
     
+
+    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+        this.handlerChain = handlerChain;
+    }
+
+    
     public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
         if (isEnabled()) {
-            handlerConfiguration = configuration.configurationAt("handler");
+            HierarchicalConfiguration handlerConfiguration = configuration.configurationAt("handler");
             String authRequiredString = handlerConfiguration.getString("authRequired","false").trim().toLowerCase();
             if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
             else if (authRequiredString.equals("announce")) authRequired = AUTH_ANNOUNCE;
@@ -179,33 +178,6 @@
             addressBracketsEnforcement = handlerConfiguration.getBoolean("addressBracketsEnforcement",true);
         }
     }
-    
-    
-    /**
-     * Prepare the handlerchain
-     * 
-     * @throws Exception
-     */
-    private void prepareHandlerChain() throws Exception {
-        //read from the XML configuration and create and configure each of the handlers
-        HierarchicalConfiguration handlerchainConfig = handlerConfiguration.configurationAt("handlerchain");
-        if (handlerchainConfig.getString("[@coreHandlersPackage]") == null)
-            handlerchainConfig.addProperty("[@coreHandlersPackage]", CoreCmdHandlerLoader.class.getName());
-        
-        handlerChain = getLoader().load(ProtocolHandlerChainImpl.class, getLogger(), handlerchainConfig);
-        handlerChain.configure(handlerchainConfig);
-        
-    }
-
-
-    /**
-     * @see org.apache.james.socket.mina.AbstractAsyncServer#preInit()
-     */
-    protected void preInit() throws Exception {
-        prepareHandlerChain();
-    }
-
-
 
     /**
      * @see org.apache.james.socket.mina.AbstractAsyncServer#getDefaultPort()

Modified: james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java (original)
+++ james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java Tue Feb  9 11:27:59 2010
@@ -48,8 +48,8 @@
 import org.apache.james.lifecycle.LifecycleUtil;
 import org.apache.james.services.FileSystem;
 import org.apache.james.services.MailServer;
-import org.apache.james.smtpserver.SMTPServerDNSServiceAdapter;
 import org.apache.james.smtpserver.mina.AsyncSMTPServer;
+import org.apache.james.socket.ProtocolHandlerChainImpl;
 import org.apache.james.test.mock.DummyVirtualUserTableStore;
 import org.apache.james.test.mock.avalon.MockStore;
 import org.apache.james.test.mock.james.MockFileSystem;
@@ -110,7 +110,6 @@
             }
 
             throw new UnsupportedOperationException("getByName not implemented in mock for host: " + host);
-            // return InetAddress.getByName(host);
         }
 
         public Collection<String> findTXTRecords(String hostname) {
@@ -152,7 +151,8 @@
     protected MockStore store;
     protected MockFileSystem fileSystem;
     protected SMTPServerDNSServiceAdapter dnsAdapter;
-
+    private ProtocolHandlerChainImpl chain;
+    
     public AsyncSMTPServerTest() {
         super("AsyncSMTPServerTest");
         m_smtpListenerPort = Util.getNonPrivilegedPort();
@@ -160,19 +160,28 @@
 
     protected void setUp() throws Exception {
         setUpFakeLoader();
+        m_testConfiguration = new SMTPTestConfiguration(m_smtpListenerPort);
 
         m_smtpServer = new AsyncSMTPServer();
         m_smtpServer.setDNSService(m_dnsServer);
         m_smtpServer.setFileSystem(fileSystem);
-        m_smtpServer.setLoader(m_serviceManager);
+        
+        chain = new ProtocolHandlerChainImpl();
+        chain.setLoader(m_serviceManager);
+        chain.setLog(new SimpleLog("ChainLog"));
+        
+        m_smtpServer.setProtocolHandlerChain(chain);
+        
         m_smtpServer.setLog(new SimpleLog("Mock"));
         m_smtpServer.setMailServer(m_mailServer);
-        m_testConfiguration = new SMTPTestConfiguration(m_smtpListenerPort);
     }
 
     protected void finishSetUp(SMTPTestConfiguration testConfiguration) throws Exception {
         testConfiguration.init();
+        chain.configure(testConfiguration.configurationAt("handler.handlerchain"));        
         m_smtpServer.configure(testConfiguration);
+        chain.init();
+        
         m_smtpServer.init();
         m_mailServer.setMaxMessageSizeBytes(m_testConfiguration.getMaxMessageSize() * 1024);
     }

Modified: james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPTestConfiguration.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPTestConfiguration.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPTestConfiguration.java (original)
+++ james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPTestConfiguration.java Tue Feb  9 11:27:59 2010
@@ -31,6 +31,7 @@
 import org.apache.james.smtpserver.fastfail.ValidSenderDomainHandler;
 
 
+@SuppressWarnings("serial")
 public class SMTPTestConfiguration extends DefaultConfigurationBuilder {
 
     private int m_smtpListenerPort;
@@ -185,8 +186,7 @@
             addProperty("handler.handlerchain.handler.[@class]", MaxRcptHandler.class.getName());
             addProperty("handler.handlerchain.handler.maxRcpt", m_maxRcpt);
         }
-       
-        addProperty("handler.handlerchain.handler.[@class]", CoreCmdHandlerLoader.class.getName());
+        addProperty("handler.handlerchain.[@coreHandlersPackage]", CoreCmdHandlerLoader.class.getName());
     }
     
 }

Modified: james/server/trunk/spring-deployment/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/pom.xml?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/pom.xml (original)
+++ james/server/trunk/spring-deployment/pom.xml Tue Feb  9 11:27:59 2010
@@ -251,7 +251,6 @@
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-user-api</artifactId>
-      <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
@@ -393,5 +392,10 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    
+    <dependency>
+      <groupId>org.apache.james.protocols</groupId>
+      <artifactId>protocols-api</artifactId>
+    </dependency>
   </dependencies>
 </project>

Modified: james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml (original)
+++ james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml Tue Feb  9 11:27:59 2010
@@ -64,28 +64,40 @@
 	-->
 
 	<bean class="org.apache.james.container.spring.lifecycle.CommonsConfigurableBeanPostProcessor">
-		<property name="configurationProvider" ref="configurationProvider" />
+		<property name="configurationRegistry" ref="configurationRegistry" />
 		<property name="order" value="1" />
-		<property name="mappings">
-			<map>
-				<entry key="mailboxmanager" value="imapserver" />		
-				<entry key="mailetcontext" value="James"/>		
-			</map>
-		</property>
 	</bean>
 
-	<bean id="configurationProvider" class="org.apache.james.container.spring.lifecycle.SpringConfigurationProvider"/>
+	<bean id="configurationRegistry" class="org.apache.james.container.spring.lifecycle.SpringConfigurationRegistry">
+	    <property name="configurationMappings">
+	        <map>
+	            <entry key="mailboxmanager" value="imapserver" />		
+			    <entry key="mailetcontext" value="James"/>
+			    <entry key="smtpProtocolHandlerChain" value="smtpserver"/>
+				<entry key="pop3ProtocolHandlerChain" value="pop3server"/>
+				<entry key="remoteProtocolHandlerChain" value="remotemanager"/>		
+	        </map>
+		</property>
+	</bean>
 		
     <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
       <property name = "location" value="classpath:database.properties"/>
     </bean>
   
 	<bean class="org.apache.james.container.spring.lifecycle.LogEnabledBeanPostProcessor">
-		<property name="logProvider" ref="logProvider" />
+		<property name="logRegistry" ref="logRegistry" />
 		<property name="order" value="0" />
 	</bean>
 
-	<bean id="logProvider" class="org.apache.james.container.spring.lifecycle.SpringLogProvider" />
+	<bean id="logRegistry" class="org.apache.james.container.spring.lifecycle.SpringLogRegistry">
+		<property name="logMappings">
+			<map>
+				<entry key="smtpProtocolHandlerChain" value="smtpserver"/>
+				<entry key="pop3ProtocolHandlerChain" value="pop3server"/>
+				<entry key="remoteProtocolHandlerChain" value="remoteManager"/>
+			</map>
+		</property>
+	</bean>
 
 
 	<bean id="org.apache.james.LoaderService" class="org.apache.james.container.spring.lifecycle.JSR250LoaderService">
@@ -117,19 +129,44 @@
 		class="org.apache.james.management.impl.BayesianAnalyzerManagement" />
 
 	<!-- Async RemoteManager -->
-	<bean id="remotemanager" class="org.apache.james.remotemanager.mina.AsyncRemoteManager" />
+	<bean id="remotemanager" class="org.apache.james.remotemanager.mina.AsyncRemoteManager" >
+	     <property name="protocolHandlerChain" ref="remoteProtocolHandlerChain"/>
+	</bean>
+
+    <bean id="remoteProtocolHandlerChain" class="org.apache.james.container.spring.SpringProtocolHandlerChain">
+    	<property name="logRegistry" ref="logRegistry"/>
+	    <property name="configurationRegistry" ref="configurationRegistry"/>
+	    <property name="coreHandlersPackage" value="org.apache.james.remotemanager.core.CoreCmdHandlerLoader"/>
+
+    </bean>
+	
 	
 	<!-- The User Management block  -->
 	<bean id="usermanagement" class="org.apache.james.impl.user.UserManagement" />
 
 	
 	<!-- Async POP3 Server -->
-    <bean id="pop3server"  class="org.apache.james.pop3server.mina.AsyncPOP3Server" />
-	
+    <bean id="pop3server"  class="org.apache.james.pop3server.mina.AsyncPOP3Server" >
+        <property name="protocolHandlerChain" ref="pop3ProtocolHandlerChain"/>
+	</bean>
+
+    <bean id="pop3ProtocolHandlerChain" class="org.apache.james.container.spring.SpringProtocolHandlerChain">
+    	<property name="logRegistry" ref="logRegistry"/>
+	    <property name="configurationRegistry" ref="configurationRegistry"/>
+	    <property name="coreHandlersPackage" value="org.apache.james.pop3server.core.CoreCmdHandlerLoader"/>
+    </bean>
 	
 	<!-- Async SMTP Server -->
-	<bean id="smtpserver" class="org.apache.james.smtpserver.mina.AsyncSMTPServer" />
+	<bean id="smtpserver" class="org.apache.james.smtpserver.mina.AsyncSMTPServer">
+	    <property name="protocolHandlerChain" ref="smtpProtocolHandlerChain"/>
+	</bean>
 
+    <bean id="smtpProtocolHandlerChain" class="org.apache.james.container.spring.SpringProtocolHandlerChain">
+    	<property name="logRegistry" ref="logRegistry"/>
+	    <property name="configurationRegistry" ref="configurationRegistry"/>
+	    <property name="coreHandlersPackage" value="org.apache.james.smtpserver.CoreCmdHandlerLoader"/>
+    </bean>
+	
 	<!-- FetchMail Service -->
 	<bean id="fetchmail" class="org.apache.james.fetchmail.FetchScheduler" />
 
@@ -141,8 +178,10 @@
 		class="org.apache.james.mailrepository.MailStoreSpoolRepository" />
 
 	<!-- The User Storage block -->
-	<bean id="users-store" class="org.apache.james.core.UsersStoreImpl" >
+	<bean id="users-store" class="org.apache.james.container.spring.SpringUsersStore" >
 	    <property name="defaultRepository" value="LocalUsers"/>
+    	<property name="logRegistry" ref="logRegistry"/>
+	    <property name="configurationRegistry" ref="configurationRegistry"/>
 	</bean>
 
 	<!--
@@ -169,8 +208,10 @@
 		class="org.apache.james.impl.vut.VirtualUserTableManagement" />
 
 	<!-- VirtualUserTable Store -->
-	<bean id="virtualusertable-store" class="org.apache.james.core.VirtualUserTableStoreImpl">
+	<bean id="virtualusertable-store" class="org.apache.james.container.spring.SpringVirtualUserTableStore">
 	    <property name="defaultTable" value="DefaultVirtualUserTable"/>
+    	<property name="logRegistry" ref="logRegistry"/>
+	    <property name="configurationRegistry" ref="configurationRegistry"/>
 	</bean>
 
 

Added: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/AbstractStore.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/AbstractStore.java?rev=908005&view=auto
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/AbstractStore.java (added)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/AbstractStore.java Tue Feb  9 11:27:59 2010
@@ -0,0 +1,134 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.container.spring;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.james.container.spring.Registry.RegistryException;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.beans.factory.BeanNameAware;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * Abstract base class which implement Store behavior based on Spring
+ *
+ */
+public abstract class AbstractStore implements BeanFactoryPostProcessor, BeanNameAware, ApplicationContextAware{
+
+
+    protected String beanName;
+    protected ApplicationContext context;
+    protected Registry<Log> logProvider;
+    protected Registry<HierarchicalConfiguration> confProvider;
+    protected Log log;
+
+    protected final List<String> objects = Collections.synchronizedList(new ArrayList<String>());
+
+    public void setConfigurationRegistry(Registry<HierarchicalConfiguration> confProvider) {
+        this.confProvider = confProvider;
+    }
+
+    public void setLogRegistry(Registry<Log> logProvider) {
+        this.logProvider = logProvider;
+    }
+
+    
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang
+     * .String)
+     */
+    public void setBeanName(String beanName) {
+        this.beanName = beanName;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.springframework.context.ApplicationContextAware#setApplicationContext
+     * (org.springframework.context.ApplicationContext)
+     */
+    public void setApplicationContext(ApplicationContext context) throws BeansException {
+        this.context = context;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory)
+     */
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
+        // Store the log object for later usage
+        
+        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) arg0;
+
+        try {
+            log = logProvider.getForComponent(beanName);
+            List<HierarchicalConfiguration> repConfs = getSubConfigurations(confProvider.getForComponent(beanName));
+            ClassLoader theClassLoader = arg0.getBeanClassLoader();
+            for (int i = 0; i < repConfs.size(); i++) {
+                final HierarchicalConfiguration repConf = repConfs.get(i);
+                String repName = repConf.getString("[@name]", null);
+                String repClass = repConf.getString("[@class]");
+
+                if (repName == null) {
+                    repName = repClass;
+                }
+                
+                if (log.isDebugEnabled()) {
+                    log.debug("Starting " + repClass);
+                }
+                
+                Class<?> objectClass = (Class<?>) theClassLoader.loadClass(repClass);
+                
+                // register configuration and log for the bean
+                confProvider.registerForComponent(repName, repConf);
+                logProvider.registerForComponent(repName, log);
+                
+                registry.registerBeanDefinition(repName, BeanDefinitionBuilder.rootBeanDefinition(objectClass).setLazyInit(false).getBeanDefinition());
+
+                objects.add(repName);
+                
+                if (log.isInfoEnabled()) {
+                    StringBuffer logBuffer = new StringBuffer(64).append("Bean  ").append(repName).append(" started.");
+                    log.info(logBuffer.toString());
+                }
+            }
+        } catch (RegistryException e) {
+            throw new FatalBeanException("Unable to read configuration for " + beanName, e);
+        } catch (ClassNotFoundException e) {
+            throw new FatalBeanException("Unable to instance class", e);
+        }
+
+    }
+    
+    protected abstract List<HierarchicalConfiguration> getSubConfigurations(HierarchicalConfiguration rootConf);
+}

Copied: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/Registry.java (from r907595, james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/LogProvider.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/Registry.java?p2=james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/Registry.java&p1=james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/LogProvider.java&r1=907595&r2=908005&rev=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/LogProvider.java (original)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/Registry.java Tue Feb  9 11:27:59 2010
@@ -18,20 +18,42 @@
  ****************************************************************/
 package org.apache.james.container.spring;
 
-import org.apache.commons.logging.Log;
-
 /**
- * Provide a Log for a Component
+ * Provide a Object for a Component
  * 
  *
  */
-public interface LogProvider {
+public interface Registry<E> {
 
 	/**
-	 * Return the Log object which should get used for the Component with the given name
+	 * Return the object which should get used for the Component with the given name
 	 * 
 	 * @param componentname
-	 * @return log
+	 * @return object
+	 */
+	public E getForComponent(String componentname) throws RegistryException;
+	
+	/**
+	 * Register the object for the componentname
+	 * 
+	 * @param componentName
+	 * @param object
 	 */
-	public Log getLogForComponent(String componentname);
+	public void registerForComponent(String componentName, E object);
+	
+	
+    @SuppressWarnings("serial")
+    public final class RegistryException extends Exception {
+        public RegistryException(String msg, Throwable t) {
+            super(msg, t);
+        }
+
+        public RegistryException(Throwable t) {
+            super(t);
+        }
+
+        public RegistryException(String msg) {
+            super(msg);
+        }
+    }
 }

Added: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringProtocolHandlerChain.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringProtocolHandlerChain.java?rev=908005&view=auto
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringProtocolHandlerChain.java (added)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringProtocolHandlerChain.java Tue Feb  9 11:27:59 2010
@@ -0,0 +1,272 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.container.spring;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.james.protocols.api.ExtensibleHandler;
+import org.apache.james.protocols.api.HandlersPackage;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.api.WiringException;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.beans.factory.BeanNameAware;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+
+
+/**
+ * ProtocolHandlerchain implementation which register all configured Handlers
+ * in the BeanFactory of the Spring context.
+ * 
+ *
+ */
+public class SpringProtocolHandlerChain implements BeanFactoryPostProcessor, ProtocolHandlerChain, ApplicationContextAware, ApplicationListener, BeanNameAware {
+
+    private final List<String> handlers = new LinkedList<String>();
+    private Registry<HierarchicalConfiguration> confProvider;
+    private Registry<Log> logProvider;
+    private Log log;
+    private ApplicationContext context;
+    private String coreHandlersPackage;
+    private String name;
+
+    public void setConfigurationRegistry(Registry<HierarchicalConfiguration> confProvider) {
+        this.confProvider = confProvider;
+    }
+
+    public void setLogRegistry(Registry<Log> logProvider) {
+        this.logProvider = logProvider;
+    }
+
+    public void setCoreHandlersPackage(String coreHandlersPackage) {
+        this.coreHandlersPackage = coreHandlersPackage;
+    }
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory)
+     */
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
+        HierarchicalConfiguration handlerchainConfig;
+        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) arg0;
+        
+        try {
+            log = logProvider.getForComponent(name);
+            handlerchainConfig = confProvider.getForComponent(name).configurationAt("handler.handlerchain");
+            if (handlerchainConfig.getString("[@coreHandlersPackage]") == null)
+                handlerchainConfig.addProperty("[@coreHandlersPackage]", coreHandlersPackage);
+            
+            loadHandlers(registry, handlerchainConfig);                      
+        } catch (Exception e) {
+            throw new FatalBeanException("Unable to instance ProtocolHandlerChain",e);
+        }
+     
+        
+    }
+
+    
+    /**
+     * ExtensibleHandler wiring
+     * 
+     * @throws WiringException 
+     */
+    private void wireExtensibleHandlers() throws WiringException {
+        String[] beanNames = context.getBeanNamesForType(ExtensibleHandler.class);
+
+        for (int a = 0; a < beanNames.length; a++) {
+            String name = beanNames[a];
+            
+            // check if the bean is one of our handlers
+            if (handlers.contains(name)) {
+                final ExtensibleHandler extensibleHandler = (ExtensibleHandler) context.getBean(name);
+                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);
+                    extensibleHandler.wireExtensions(markerInterface, extensions);
+                }
+            }
+        }
+
+    }
+    
+    /**
+     * Load and add the classes to the handler map
+     * 
+     * @param classLoader The classLoader to use
+     * @param className The class name 
+     * @param config The configuration 
+     * @throws ConfigurationException Get thrown on error
+     */
+    private void loadClass(BeanDefinitionRegistry registry, String className,
+            org.apache.commons.configuration.HierarchicalConfiguration config) throws Exception {
+        final Class<?> handlerClass = context.getClassLoader().loadClass(className);
+        
+        
+       
+
+        // if it is a commands handler add it to the map with key as command
+        // name
+        if (HandlersPackage.class.isAssignableFrom(handlerClass)) {
+            List<String> c = ((HandlersPackage) handlerClass.newInstance()).getHandlers();
+
+            for (Iterator<String> i = c.iterator(); i.hasNext(); ) {
+                String cName = i.next();
+
+                HierarchicalConfiguration cmdConf = addHandler(cName);
+
+                loadClass(registry, cName, cmdConf);
+            }
+
+        } else {
+            confProvider.registerForComponent(className, config);
+            logProvider.registerForComponent(className, log);
+            
+            registry.registerBeanDefinition(className, BeanDefinitionBuilder.genericBeanDefinition(className).setLazyInit(false).getBeanDefinition());
+            // fill the big handler table
+            handlers.add(className);
+            
+            if (log.isInfoEnabled()) {
+                log.info("Added Handler: " + className);
+            }
+
+        }
+
+    }
+    
+    /**
+     * Return a DefaultConfiguration build on the given command name and classname
+     * 
+     * @param cmdName The command name
+     * @param className The class name
+     * @return DefaultConfiguration
+     * @throws ConfigurationException 
+     */
+    private HierarchicalConfiguration addHandler(String className) throws ConfigurationException {
+        HierarchicalConfiguration hConf = new DefaultConfigurationBuilder();
+        hConf.addProperty("handler/@class", className);
+        return hConf;
+    }
+    
+    
+    /* (non-Javadoc)
+     * @see org.apache.james.socket.shared.ProtocolHandlerChain#getHandlers(java.lang.Class)
+     */
+    @SuppressWarnings("unchecked")
+    public <T> LinkedList<T> getHandlers(Class<T> type) {
+        LinkedList<T> result = new LinkedList<T>();
+        Map<String,T> beans = context.getBeansOfType(type);
+        
+        for (Iterator<String> i = handlers.iterator(); i.hasNext(); ) {
+            String handler = i.next();
+            T bean = beans.get(handler);
+            if (bean != null) {
+                result.add(bean);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * loads the various handlers from the configuration
+     * 
+     * @param configuration
+     *            configuration under handlerchain node
+     */
+    @SuppressWarnings("unchecked")
+    private void loadHandlers(BeanDefinitionRegistry registry, HierarchicalConfiguration commonsConf) throws Exception {
+
+            List<org.apache.commons.configuration.HierarchicalConfiguration> children = ((HierarchicalConfiguration) commonsConf).configurationsAt("handler");
+
+            String coreCmdName = commonsConf.getString("[@coreHandlersPackage]");
+            // load the core handlers
+            loadClass(registry, coreCmdName,
+                    addHandler(coreCmdName));
+
+            // load the configured handlers
+            if (children != null && children.isEmpty() == false) {
+
+                for (int i = 0; i < children.size(); i++) {
+                    org.apache.commons.configuration.HierarchicalConfiguration hConf = children.get(i);
+                    String className = hConf.getString("[@class]");
+
+                    if (className != null) {
+                        // ignore base handlers.
+                        if (!className.equals(coreCmdName)) {
+
+                            // load the handler
+                            loadClass(registry, className, hConf);
+                        }
+                    }
+                }
+               
+            }
+        
+    }
+    
+
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
+     */
+    public void setApplicationContext(ApplicationContext context) throws BeansException {
+        this.context = context;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String)
+     */
+    public void setBeanName(String name) {        
+        this.name = name;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
+     */
+    public void onApplicationEvent(ApplicationEvent event) {
+        if (event instanceof ContextRefreshedEvent) {
+            try {
+                // wire the extensions after the startup of the application was complete
+                // This is needed to be sure that every dependency was injected and every bean was
+                // initialized
+                wireExtensibleHandlers();
+            } catch (WiringException e) {
+                throw new RuntimeException("Unable to wire handlers", e);
+            }
+        }
+    }
+}
\ No newline at end of file

Added: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringUsersStore.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringUsersStore.java?rev=908005&view=auto
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringUsersStore.java (added)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringUsersStore.java Tue Feb  9 11:27:59 2010
@@ -0,0 +1,84 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.container.spring;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.api.user.UsersRepository;
+import org.apache.james.api.user.UsersStore;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+
+/**
+ * UsersStore implementation which will parse the configuration file for users-store and add every configured repository
+ * to the Spring BeanFactory.
+ * @author norman
+ *
+ */
+public class SpringUsersStore extends AbstractStore implements UsersStore {
+
+    private String defaultName;
+
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.james.api.user.UsersStore#getRepository(java.lang.String)
+     */
+    public UsersRepository getRepository(String name) {
+        if (name == null || name.trim().equals("")) {
+            name = defaultName;
+        }
+
+        UsersRepository response = null;
+
+        if (objects.contains(name)) {
+            try {
+                response = (UsersRepository) context.getBean(name, UsersRepository.class);
+            } catch (NoSuchBeanDefinitionException e) {
+                // Just catch the exception
+            }
+        }
+        if ((response == null) && (log.isWarnEnabled())) {
+            log.warn("No users repository called: " + name);
+        }
+        return response;
+    }
+
+    public void setDefaultRepository(String defaultName) {
+        this.defaultName = defaultName;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.james.api.user.UsersStore#getRepositoryNames()
+     */
+    public Iterator<String> getRepositoryNames() {
+        return objects.iterator();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected List<HierarchicalConfiguration> getSubConfigurations(HierarchicalConfiguration rootConf) {
+        return rootConf.configurationsAt("repository");
+    }
+
+}

Added: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringVirtualUserTableStore.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringVirtualUserTableStore.java?rev=908005&view=auto
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringVirtualUserTableStore.java (added)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringVirtualUserTableStore.java Tue Feb  9 11:27:59 2010
@@ -0,0 +1,77 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.container.spring;
+
+import java.util.List;
+
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.api.vut.VirtualUserTable;
+import org.apache.james.api.vut.VirtualUserTableStore;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+
+public class SpringVirtualUserTableStore extends AbstractStore implements VirtualUserTableStore{
+
+    private String defaultName;
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.container.spring.AbstractStore#getSubConfigurations(org.apache.commons.configuration.HierarchicalConfiguration)
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    protected List<HierarchicalConfiguration> getSubConfigurations(HierarchicalConfiguration rootConf) {
+        return rootConf.configurationsAt("table");
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.api.vut.VirtualUserTableStore#getTable(java.lang.String)
+     */
+    public VirtualUserTable getTable(String name) {
+        if (name == null || name.trim().equals("")) {
+            name = defaultName;
+        }
+
+        VirtualUserTable response = null;
+
+        if (objects.contains(name)) {
+            try {
+                response = (VirtualUserTable) context.getBean(name, VirtualUserTable.class);
+            } catch (NoSuchBeanDefinitionException e) {
+                // Just catch the exception
+            }
+        }
+        if ((response == null) && (log.isWarnEnabled())) {
+            log.warn("No VirtualUserTable called: " + name);
+        }
+        return response;   
+    }
+
+
+    /**
+     * Set the default VirtualUserTable which will get returned when no name is given or the name is empty
+     * 
+     * @param defaultName
+     */
+    public void setDefaultTable(String defaultName) {
+        this.defaultName = defaultName;
+    }
+    
+}

Modified: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/AbstractLifeCycleBeanPostProcessor.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/AbstractLifeCycleBeanPostProcessor.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/AbstractLifeCycleBeanPostProcessor.java (original)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/AbstractLifeCycleBeanPostProcessor.java Tue Feb  9 11:27:59 2010
@@ -18,9 +18,6 @@
  ****************************************************************/
 package org.apache.james.container.spring.lifecycle;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import org.springframework.beans.BeansException;
 import org.springframework.beans.FatalBeanException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
@@ -35,22 +32,18 @@
  */
 public abstract class AbstractLifeCycleBeanPostProcessor<T> implements BeanPostProcessor, PriorityOrdered{
 
-	private Map<String, String> mappings = new HashMap<String, String>();
 	private int order = Ordered.HIGHEST_PRECEDENCE;
-
-	public void setMappings(Map<String,String> mappings) {
-		this.mappings = mappings;
-	}
 	
 	/*
 	 * (non-Javadoc)
 	 * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object, java.lang.String)
 	 */
-	public final Object postProcessAfterInitialization(Object bean, String name)
+	@SuppressWarnings("unchecked")
+    public final Object postProcessAfterInitialization(Object bean, String name)
 			throws BeansException {
 		try {
 			Class<T> lClass = getLifeCycleInterface();
-			if (lClass.isInstance(bean)) executeLifecycleMethodAfterInit((T)bean, name, getMapping(name));
+			if (lClass.isInstance(bean)) executeLifecycleMethodAfterInit((T)bean, name);
 		} catch (Exception e) {
 			throw new FatalBeanException("Unable to execute lifecycle method on bean" + name,e);
 		}
@@ -72,7 +65,7 @@
 			throws BeansException {
 		try {
 			Class<T> lClass = getLifeCycleInterface();
-			if (lClass.isInstance(bean)) executeLifecycleMethodBeforeInit((T)bean, name, getMapping(name));
+			if (lClass.isInstance(bean)) executeLifecycleMethodBeforeInit((T)bean, name);
 		} catch (Exception e) {
 			throw new FatalBeanException("Unable to execute lifecycle method on bean" + name,e);
 		}
@@ -85,10 +78,9 @@
 	 * 
 	 * @param bean the actual bean
 	 * @param beanname then name of the bean
-	 * @param componentName the component name 
 	 * @throws Exception 
 	 */
-	protected void executeLifecycleMethodBeforeInit(T bean, String beanname, String componentName) throws Exception {
+	protected void executeLifecycleMethodBeforeInit(T bean, String beanname) throws Exception {
 		
 	}
 	
@@ -101,17 +93,10 @@
 	 * @param componentName the component name 
 	 * @throws Exception 
 	 */
-	protected void executeLifecycleMethodAfterInit(T bean, String beanname, String componentName) throws Exception {
+	protected void executeLifecycleMethodAfterInit(T bean, String beanname) throws Exception {
 
 	}
 	
-	private String getMapping(String name) {
-		String newname = mappings.get(name);
-		if (newname == null) newname = name;
-		return newname;
-	}
-	
-	
 	public void setOrder(int order) {
 		this.order = order;
 	}

Modified: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/CommonsConfigurableBeanPostProcessor.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/CommonsConfigurableBeanPostProcessor.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/CommonsConfigurableBeanPostProcessor.java (original)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/CommonsConfigurableBeanPostProcessor.java Tue Feb  9 11:27:59 2010
@@ -19,7 +19,7 @@
 package org.apache.james.container.spring.lifecycle;
 
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.james.container.spring.ConfigurationProvider;
+import org.apache.james.container.spring.Registry;
 import org.apache.james.lifecycle.Configurable;
 
 /**
@@ -30,12 +30,11 @@
 public class CommonsConfigurableBeanPostProcessor extends
 		AbstractLifeCycleBeanPostProcessor<Configurable> {
 
-	private ConfigurationProvider provider;
+	private Registry<HierarchicalConfiguration> provider;
 	
 	@Override
-	protected void executeLifecycleMethodBeforeInit(Configurable bean, String beanname,
-			String lifecyclename) throws Exception {
-		HierarchicalConfiguration beanConfig = provider.getConfigurationForComponent(lifecyclename);
+	protected void executeLifecycleMethodBeforeInit(Configurable bean, String beanname) throws Exception {
+		HierarchicalConfiguration beanConfig = provider.getForComponent(beanname);
 		if(beanConfig != null) {
 		    bean.configure(beanConfig);
 		}
@@ -43,7 +42,7 @@
 
 
 
-	public void setConfigurationProvider(ConfigurationProvider provider) {
+	public void setConfigurationRegistry(Registry<HierarchicalConfiguration> provider) {
 		this.provider = provider;
 	}
 

Modified: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/LogEnabledBeanPostProcessor.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/LogEnabledBeanPostProcessor.java?rev=908005&r1=908004&r2=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/LogEnabledBeanPostProcessor.java (original)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/LogEnabledBeanPostProcessor.java Tue Feb  9 11:27:59 2010
@@ -18,7 +18,8 @@
  ****************************************************************/
 package org.apache.james.container.spring.lifecycle;
 
-import org.apache.james.container.spring.LogProvider;
+import org.apache.commons.logging.Log;
+import org.apache.james.container.spring.Registry;
 import org.apache.james.lifecycle.LogEnabled;
 
 /**
@@ -28,12 +29,11 @@
  */
 public class LogEnabledBeanPostProcessor extends AbstractLifeCycleBeanPostProcessor<LogEnabled> {
 
-	private LogProvider provider;
+	private Registry<Log> provider;
 
 	@Override
-	protected void executeLifecycleMethodBeforeInit(LogEnabled bean, String beanname,
-			String lifecyclename) throws Exception {
-		bean.setLog(provider.getLogForComponent(lifecyclename));
+	protected void executeLifecycleMethodBeforeInit(LogEnabled bean, String beanname) throws Exception {
+		bean.setLog(provider.getForComponent(beanname));
 	}
 
 	@Override
@@ -41,7 +41,7 @@
 		return LogEnabled.class;
 	}	
 	
-	public void setLogProvider(LogProvider provider) {
+	public void setLogRegistry(Registry<Log> provider) {
 		this.provider = provider;
 	}
 }

Copied: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationRegistry.java (from r907595, james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationProvider.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationRegistry.java?p2=james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationRegistry.java&p1=james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationProvider.java&r1=907595&r2=908005&rev=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationProvider.java (original)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringConfigurationRegistry.java Tue Feb  9 11:27:59 2010
@@ -19,11 +19,15 @@
 package org.apache.james.container.spring.lifecycle;
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.XMLConfiguration;
-import org.apache.james.container.spring.ConfigurationProvider;
+import org.apache.james.container.spring.Registry;
+import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.ResourceLoaderAware;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
@@ -33,25 +37,32 @@
  * 
  *
  */
-public class SpringConfigurationProvider implements ConfigurationProvider, ResourceLoaderAware {
+public class SpringConfigurationRegistry implements Registry<HierarchicalConfiguration>, ResourceLoaderAware, InitializingBean {
 
 	private ResourceLoader loader;
+	private Map<String,HierarchicalConfiguration> confMap = new HashMap<String,HierarchicalConfiguration>();
+    private Map<String,String> resources;
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.apache.james.container.spring.ConfigurationProvider#getConfigurationForComponent(java.lang.String)
+	 * @see org.apache.james.container.spring.Registry#getForComponent(java.lang.String)
 	 */
-	public HierarchicalConfiguration getConfigurationForComponent(String name)
-			throws ConfigurationException {
-	    Resource resource = loader.getResource("classpath:" + name + ".xml");
-	    if (resource.exists()) {
-	        try {
-                return getConfig(resource);
-            } catch (IOException e) {
-                throw new ConfigurationException("Unable to read config for component " + name, e);
-            }
+	public HierarchicalConfiguration getForComponent(String name)
+			throws RegistryException {
+	    HierarchicalConfiguration conf = confMap.get(name);
+	    if (conf != null) {
+	        return conf;
+	    } else {
+	        Resource r = loader.getResource("classpath:" + name + ".xml");
+	        if (r.exists()) {
+	            try {
+                    return getConfig(r);
+                } catch (Exception e) {
+                    throw new RegistryException("Unable to load configuration for component " + name,e);                    
+                }
+	        }
 	    }
-	    throw new ConfigurationException("Unable to load configuration for component " + name);
+	    throw new RegistryException("Unable to load configuration for component " + name);
 	}
 
 
@@ -71,4 +82,32 @@
         return config;
     }
 
+    public void setConfigurationMappings(Map<String,String> resources) {
+        this.resources = resources;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.container.spring.Registry#registerForComponent(java.lang.String, java.lang.Object)
+     */
+    public void registerForComponent(String name, HierarchicalConfiguration conf) {
+        confMap.put(name, conf);        
+    }
+
+
+    /*
+     * 
+     */
+    public void afterPropertiesSet() throws Exception {
+        if (resources != null) {
+            Iterator<String> it = resources.keySet().iterator();
+
+            while (it.hasNext()) {
+                String key = it.next();
+                String value = resources.get(key);
+                confMap.put(key,getForComponent(value));
+            }
+        }
+    }
+
 }

Copied: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogRegistry.java (from r907595, james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogProvider.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogRegistry.java?p2=james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogRegistry.java&p1=james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogProvider.java&r1=907595&r2=908005&rev=908005&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogProvider.java (original)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/SpringLogRegistry.java Tue Feb  9 11:27:59 2010
@@ -18,24 +18,64 @@
  ****************************************************************/
 package org.apache.james.container.spring.lifecycle;
 
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.impl.Log4JLogger;
-import org.apache.james.container.spring.LogProvider;
+import org.apache.james.container.spring.Registry;
+import org.springframework.beans.factory.InitializingBean;
 
 /**
  * Provide a Log object for components
  * 
  *
  */
-public class SpringLogProvider implements LogProvider{
+public class SpringLogRegistry implements Registry<Log>, InitializingBean {
 
+    private final Map<String,Log> logMap = new HashMap<String,Log>();
+    private Map<String, String> logs;
     private final static String PREFIX = "james.";
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.container.spring.Registry#getForComponent(java.lang.String)
+     */
+	public Log getForComponent(String componentname) throws RegistryException{
+	    Log log = logMap.get(componentname);
+	    if (log != null) {
+	        return log;
+	    } else {
+	        return new Log4JLogger(PREFIX + componentname);
+	    }
+	}
+	
 	/*
 	 * (non-Javadoc)
-	 * @see org.apache.james.container.spring.LogProvider#getLogForComponent(java.lang.String)
+	 * @see org.apache.james.container.spring.Registry#registerForComponent(java.lang.String, java.lang.Object)
 	 */
-	public Log getLogForComponent(String componentname) {
-		return new Log4JLogger(PREFIX + componentname);
-	}
+    public void registerForComponent(String name, Log log) {
+        logMap.put(name, log);
+    }
+
+    public void setLogMappings(Map<String,String> logs) {
+        this.logs = logs;
+    }
 
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
+     */
+    public void afterPropertiesSet() throws Exception {
+        if (logs != null) {
+            Iterator<String> it = logs.keySet().iterator();
+            while(it.hasNext()) {
+                String key = it.next();
+                String value = logs.get(key);
+                
+                logMap.put(key, new Log4JLogger(PREFIX + value));
+            }
+        }
+    }
 }



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