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