norman
Tue, 09 Feb 2010 06:33:04 -0800
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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org