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 15:32:30 UTC

svn commit: r908052 - in /james/server/trunk: spoolmanager/src/main/java/org/apache/james/transport/ spring-deployment/ spring-deployment/src/main/config/james/ spring-deployment/src/main/java/org/apache/james/container/spring/

Author: norman
Date: Tue Feb  9 14:32:30 2010
New Revision: 908052

URL: http://svn.apache.org/viewvc?rev=908052&view=rev
Log:
MailProcessor stuff now get handled via spring (JAMES-966)

Added:
    james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/StateAwareProcessorList.java
      - copied, changed from r907595, james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/StateAwareProcessorList.java
Removed:
    james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/StateAwareProcessorList.java
Modified:
    james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesSpoolManager.java
    james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/LinearProcessor.java
    james/server/trunk/spring-deployment/pom.xml
    james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml

Modified: james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesSpoolManager.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesSpoolManager.java?rev=908052&r1=908051&r2=908052&view=diff
==============================================================================
--- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesSpoolManager.java (original)
+++ james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesSpoolManager.java Tue Feb  9 14:32:30 2010
@@ -32,7 +32,6 @@
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.logging.Log;
-import org.apache.james.api.kernel.LoaderService;
 import org.apache.james.lifecycle.Configurable;
 import org.apache.james.lifecycle.LifecycleUtil;
 import org.apache.james.lifecycle.LogEnabled;
@@ -63,23 +62,6 @@
     private int numThreads;
 
     /**
-     * The ThreadPool containing worker threads.
-     *
-     * This used to be used, but for threads that lived the entire
-     * lifespan of the application.  Currently commented out.  In
-     * the future, we could use a thread pool to run short-lived
-     * workers, so that we have a smaller number of readers that
-     * accept a message from the spool, and dispatch to a pool of
-     * worker threads that process the message.
-     */
-    // private ThreadPool workerPool;
-
-    /**
-     * The ThreadManager from which the thread pool is obtained.
-     */
-    // private ThreadManager threadManager;
-
-    /**
      * Number of active threads
      */
     private int numActive;
@@ -101,9 +83,6 @@
 
     private Log logger;
 
-    private LoaderService loaderService;
-
-    private HierarchicalConfiguration config;
 
     /**
      * Set the SpoolRepository
@@ -114,22 +93,28 @@
     public void setSpoolRepository(SpoolRepository spool) {
         this.spool = spool;
     }
-
-
-    @Resource(name="org.apache.james.LoaderService")
-    public final void setLoaderService(LoaderService service) {
-        this.loaderService = service;
+    
+    @Resource(name="mailProcessor")
+    public final void setMailProcessor(MailProcessor processorList) {
+        this.processorList = processorList;
     }
     
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.lifecycle.LogEnabled#setLog(org.apache.commons.logging.Log)
+     */
     public final void setLog(Log logger) {
         this.logger = logger;
     }
     
     
     
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.lifecycle.Configurable#configure(org.apache.commons.configuration.HierarchicalConfiguration)
+     */
     public void configure(HierarchicalConfiguration config) throws ConfigurationException {
         numThreads = config.getInt("threads",1);
-        this.config = config;
     }
 
     /**
@@ -139,24 +124,6 @@
     public void init() throws Exception {
         logger.info("JamesSpoolManager init...");
         
-        String processorClass = config.getString("processorClass","org.apache.james.transport.StateAwareProcessorList");
-        try {
-             Class<MailProcessor> mClass = (Class<MailProcessor>) Thread.currentThread().getContextClassLoader().loadClass(processorClass);
-             processorList = loaderService.load(mClass, logger, config);
-        } catch (Exception e1) {
-            logger.error("Unable to instantiate spoolmanager processor: "+processorClass, e1);
-            throw new ConfigurationException("Instantiation exception: "+processorClass, e1);
-        }
-        
-        if (logger.isInfoEnabled()) {
-            StringBuffer infoBuffer =
-                new StringBuffer(64)
-                    .append("Spooler Manager uses ")
-                    .append(numThreads)
-                    .append(" Thread(s)");
-            logger.info(infoBuffer.toString());
-        }
-
         active = true;
         numActive = 0;
         spoolThreads = new java.util.ArrayList<Thread>(numThreads);

Modified: james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/LinearProcessor.java
URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/LinearProcessor.java?rev=908052&r1=908051&r2=908052&view=diff
==============================================================================
--- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/LinearProcessor.java (original)
+++ james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/LinearProcessor.java Tue Feb  9 14:32:30 2010
@@ -87,7 +87,7 @@
  * <P>CVS $Id$</P>
  * @version 2.2.0
  */
-public class LinearProcessor implements  MailProcessor, MailetContainer, LogEnabled, Configurable {
+public class LinearProcessor implements MailProcessor, MailetContainer, LogEnabled, Configurable {
 
     /**
      *  The name of the matcher used to terminate the matcher chain.  The

Modified: james/server/trunk/spring-deployment/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/pom.xml?rev=908052&r1=908051&r2=908052&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/pom.xml (original)
+++ james/server/trunk/spring-deployment/pom.xml Tue Feb  9 14:32:30 2010
@@ -305,7 +305,6 @@
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-spoolmanager</artifactId>
-      <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>

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=908052&r1=908051&r2=908052&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 14:32:30 2010
@@ -76,6 +76,7 @@
 			    <entry key="smtpProtocolHandlerChain" value="smtpserver"/>
 				<entry key="pop3ProtocolHandlerChain" value="pop3server"/>
 				<entry key="remoteProtocolHandlerChain" value="remotemanager"/>		
+				<entry key="mailProcessor" value="spoolmanager"/>
 	        </map>
 		</property>
 	</bean>
@@ -95,6 +96,7 @@
 				<entry key="smtpProtocolHandlerChain" value="smtpserver"/>
 				<entry key="pop3ProtocolHandlerChain" value="pop3server"/>
 				<entry key="remoteProtocolHandlerChain" value="remoteManager"/>
+				<entry key="mailProcessor" value="spoolmanager"/>
 			</map>
 		</property>
 	</bean>
@@ -113,6 +115,11 @@
 
 	<!-- The James Spool Manager block  -->
 	<bean id="spoolmanager" class="org.apache.james.transport.JamesSpoolManager" />
+	
+	<bean id="mailProcessor" class="org.apache.james.container.spring.StateAwareProcessorList">
+    	<property name="logRegistry" ref="logRegistry"/>
+	    <property name="configurationRegistry" ref="configurationRegistry"/>
+	</bean>
 
 	<bean id="matcherpackages" class="org.apache.james.transport.JamesMatcherLoader" />
 

Copied: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/StateAwareProcessorList.java (from r907595, james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/StateAwareProcessorList.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/StateAwareProcessorList.java?p2=james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/StateAwareProcessorList.java&p1=james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/StateAwareProcessorList.java&r1=907595&r2=908052&rev=908052&view=diff
==============================================================================
--- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/StateAwareProcessorList.java (original)
+++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/StateAwareProcessorList.java Tue Feb  9 14:32:30 2010
@@ -19,105 +19,71 @@
 
 
 
-package org.apache.james.transport;
+package org.apache.james.container.spring;
 
 
-import java.util.HashMap;
-import java.util.Iterator;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.annotation.Resource;
 import javax.mail.MessagingException;
 
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.logging.Log;
-import org.apache.james.api.kernel.LoaderService;
-import org.apache.james.lifecycle.Configurable;
-import org.apache.james.lifecycle.LogEnabled;
+import org.apache.james.container.spring.Registry.RegistryException;
+import org.apache.james.transport.LinearProcessor;
+import org.apache.james.transport.MailProcessor;
+import org.apache.james.transport.ProcessorList;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetException;
+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;
 
 /**
  * This class is responsible for creating a set of named processors and
  * directing messages to the appropriate processor (given the State of the mail)
  *
  */
-public class StateAwareProcessorList implements MailProcessor, ProcessorList, LogEnabled, Configurable {
+public class StateAwareProcessorList implements MailProcessor, ProcessorList, BeanFactoryPostProcessor, BeanNameAware, ApplicationContextAware {
 
     /**
      * The map of processor names to processors
      */
-    private final Map<String, MailProcessor> processors;
+    private final List<String> processors;
 
     private Log logger;
 
-    private HierarchicalConfiguration config;
+    private Registry<Log> logRegistry;
 
-    private LoaderService loader;
+    private Registry<HierarchicalConfiguration> confRegistry;
+
+    private String name;
+
+    private ApplicationContext context;
     
     public StateAwareProcessorList() {
         super();
-        this.processors = new HashMap<String, MailProcessor>();
+        this.processors = new ArrayList<String>();
     }
 
-    
-    public final void setLog(Log logger) {
-        this.logger = logger;
-    }
-    
-    
-    @Resource(name="org.apache.james.LoaderService")
-    public final void setLoaderService(LoaderService loader) {
-        this.loader = loader;
+
+
+    public void setLogRegistry(Registry<Log> logRegistry) {
+        this.logRegistry = logRegistry;
     }
     
-    /**
-     * @see org.apache.avalon.framework.activity.Initializable#initialize()
-     */
-    @SuppressWarnings("unchecked")
-    @PostConstruct
-    public void init() throws Exception {
-        final List<HierarchicalConfiguration> processorConfs = config.configurationsAt( "processor" );
-        for ( int i = 0; i < processorConfs.size(); i++ )
-        {
-            final HierarchicalConfiguration processorConf = processorConfs.get(i);
-            String processorName = processorConf.getString("[@name]");
-            String processorClass = processorConf.getString("[@class]","org.apache.james.transport.LinearProcessor");
 
-            try {
-                Class<MailProcessor> mClass = (Class<MailProcessor>)Thread.currentThread().getContextClassLoader().loadClass(processorClass);
-                 
-                MailProcessor processor = loader.load(mClass, logger, processorConf);
-              
-                processors.put(processorName, processor);
-                
-               
-                if (logger.isInfoEnabled()) {
-                    StringBuffer infoBuffer =
-                        new StringBuffer(64)
-                                .append("Processor ")
-                                .append(processorName)
-                                .append(" instantiated.");
-                    logger.info(infoBuffer.toString());
-                }
-            } catch (Exception ex) {
-                if (logger.isErrorEnabled()) {
-                    StringBuffer errorBuffer =
-                       new StringBuffer(256)
-                               .append("Unable to init processor ")
-                               .append(processorName)
-                               .append(": ")
-                               .append(ex.toString());
-                    logger.error( errorBuffer.toString(), ex );
-                }
-                throw ex;
-            }
-        }
+    public void setConfigurationRegistry(Registry<HierarchicalConfiguration> confRegistry) {
+        this.confRegistry = confRegistry;
     }
     
+    
     /**
      * Process this mail message by the appropriate processor as designated
      * in the state of the Mail object.
@@ -135,7 +101,7 @@
             }
             try {
                 MailProcessor processor
-                    = (MailProcessor)processors.get(processorName);
+                    = (MailProcessor)context.getBean(processorName);
                 if (processor == null) {
                     StringBuffer exceptionMessageBuffer =
                         new StringBuffer(128)
@@ -207,43 +173,88 @@
     }
 
     /**
-     * The dispose operation is called at the end of a components lifecycle.
-     * Instances of this class use this method to release and destroy any
-     * resources that they own.
-     *
-     * This implementation shuts down the Processors managed by this
-     * Component
-     *
-     * @see org.apache.avalon.framework.activity.Disposable#dispose()
+     * @return names of all configured processors
      */
-    @PreDestroy
-    public void dispose() {
-        Iterator<String> it = processors.keySet().iterator();
-        while (it.hasNext()) {
-            String processorName = it.next();
-            if (logger.isDebugEnabled()) {
-                logger.debug("Processor " + processorName);
+    public String[] getProcessorNames() {
+        return (String[]) processors.toArray(new String[]{});
+    }
+
+    public MailProcessor getProcessor(String name) {
+        return (MailProcessor) context.getBean(name);
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory)
+     */
+    @SuppressWarnings("unchecked")
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
+
+        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory;
+        try {
+            List<HierarchicalConfiguration> processorConfs = confRegistry.getForComponent(name).configurationsAt( "processor" );
+            logger = logRegistry.getForComponent(name);
+            
+            for ( int i = 0; i < processorConfs.size(); i++ )
+            {
+                final HierarchicalConfiguration processorConf = processorConfs.get(i);
+                String processorName = processorConf.getString("[@name]");
+                String processorClass = processorConf.getString("[@class]", LinearProcessor.class.getName());
+
+                try {
+                    logRegistry.registerForComponent(processorName, logger);
+                    confRegistry.registerForComponent(processorName, processorConf);
+                    
+                    registry.registerBeanDefinition(processorName, BeanDefinitionBuilder.rootBeanDefinition(processorClass).setLazyInit(false).getBeanDefinition());              
+                    processors.add(processorName);
+                    
+                   
+                    if (logger.isInfoEnabled()) {
+                        StringBuffer infoBuffer =
+                            new StringBuffer(64)
+                                    .append("Processor ")
+                                    .append(processorName)
+                                    .append(" instantiated.");
+                        logger.info(infoBuffer.toString());
+                    }
+                } catch (Exception ex) {
+                    if (logger.isErrorEnabled()) {
+                        StringBuffer errorBuffer =
+                           new StringBuffer(256)
+                                   .append("Unable to init processor ")
+                                   .append(processorName)
+                                   .append(": ")
+                                   .append(ex.toString());
+                        logger.error( errorBuffer.toString(), ex );
+                    }
+                    throw new FatalBeanException("Unable to init processor " + processorName, ex);
+                }
             }
-            Object processor = processors.get(processorName);
-            processors.remove(processor);
+        } catch (RegistryException e) {
+            throw new FatalBeanException("Unable to load component for " +name , e);
         }
+       
     }
 
-    /**
-     * @return names of all configured processors
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String)
      */
-    public String[] getProcessorNames() {
-        return (String[]) processors.keySet().toArray(new String[]{});
+    public void setBeanName(String name) {
+        this.name = name;
     }
 
-    public MailProcessor getProcessor(String name) {
-        return (MailProcessor) processors.get(name);
-    }
 
 
-	public void configure(HierarchicalConfiguration config)
-			throws org.apache.commons.configuration.ConfigurationException {
-		this.config = config;
-	}
+    /*
+     * (non-Javadoc)
+     * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
+     */
+    public void setApplicationContext(ApplicationContext context) throws BeansException {
+        this.context = context;
+    }
 
 }



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