Author: norman Date: Thu Feb 11 13:16:17 2010 New Revision: 908954 URL: http://svn.apache.org/viewvc?rev=908954&view=rev Log: Some pending changes which make sure every instancing of classes are done via container. The MailStore stuff needs some more love, thought.. (JAMES-966)
Added: james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250InstanceFactory.java - copied, changed from r908904, james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/InstanceFactory.java - copied, changed from r908904, james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/LoaderService.java james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/AbstractMailStore.java - copied, changed from r908904, james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/MailStore.java james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/AbstractLoader.java james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMailetLoader.java james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMatcherLoader.java james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringInstanceFactory.java james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringMailStore.java Removed: james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/LoaderService.java james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/MailStore.java james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/JSR250LoaderService.java Modified: james/server/trunk/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/ProtocolHandlerChainImpl.java james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/MailetContextWrapper.java james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/mailets/VirtualUserTable.java james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/JamesMailetLoaderTest.java james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/mailets/VirtualUserTableTest.java james/server/trunk/spring-deployment/pom.xml james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml Copied: james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250InstanceFactory.java (from r908904, james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java) URL: http://svn.apache.org/viewvc/james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250InstanceFactory.java?p2=james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250InstanceFactory.java&p1=james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java&r1=908904&r2=908954&rev=908954&view=diff ============================================================================== --- james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java (original) +++ james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250InstanceFactory.java Thu Feb 11 13:16:17 2010 @@ -27,66 +27,42 @@ import javax.annotation.PreDestroy; import javax.annotation.Resource; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.HierarchicalConfiguration; -import org.apache.commons.logging.Log; -import org.apache.james.lifecycle.Configurable; -import org.apache.james.lifecycle.LogEnabled; - /** * Abstract base class which implements a JSR250 based LoaderService * - * + * */ -public abstract class AbstractJSR250LoaderService implements LoaderService{ +public abstract class AbstractJSR250InstanceFactory implements InstanceFactory { private List<Object> loaderRegistry = new ArrayList<Object>(); /* * (non-Javadoc) - * @see org.apache.james.api.kernel.LoaderService#load(java.lang.Class) + * + * @see org.apache.james.api.kernel.Factory#newInstance(java.lang.String) */ - public <T>T load(Class<T> type) { - return load(type, null, null); - } - - /* - * (non-Javadoc) - * @see org.apache.james.api.kernel.LoaderService#load(java.lang.Class, org.apache.commons.logging.Log, org.apache.commons.configuration.HierarchicalConfiguration) - */ - public <T>T load(Class<T> type, Log logger, HierarchicalConfiguration config) { + public final Object newInstance(String className) throws InstanceException, ClassNotFoundException { try { - T obj = type.newInstance(); - if (obj instanceof LogEnabled && logger != null) { - ((LogEnabled) obj).setLog(logger); - } - if (obj instanceof Configurable && config != null) { - try { - ((Configurable) obj).configure(config); - } catch (ConfigurationException ex) { - throw new RuntimeException("Unable to configure object " + obj, ex); - } - } - + Object obj = create(className); injectResources(obj); postConstruct(obj); synchronized (this) { loaderRegistry.add(obj); } return obj; - } catch (IllegalAccessException e) { - throw new RuntimeException("Unable to load instance of class " + type, e); - } catch (InvocationTargetException e) { - throw new RuntimeException("Unable to load instance of class " + type, e); - } catch (InstantiationException e) { - throw new RuntimeException("Unable to load instance of class " + type, e); + } catch (ClassNotFoundException e) { + throw e; + } catch (Exception e) { + throw new InstanceException("Unable to load instance of class " + className, e); } - } - + + protected Object create(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException { + return Thread.currentThread().getContextClassLoader().loadClass(className).newInstance(); + } /** - * Dispose all loaded instances by calling the method of the instances which is annotated - * with @PreDestroy + * Dispose all loaded instances by calling the method of the instances which + * is annotated with @PreDestroy */ public synchronized void dispose() { for (int i = 0; i < loaderRegistry.size(); i++) { @@ -100,13 +76,11 @@ } loaderRegistry.clear(); } - - private void postConstruct(Object resource) throws IllegalAccessException, - InvocationTargetException { + + private void postConstruct(Object resource) throws IllegalAccessException, InvocationTargetException { Method[] methods = resource.getClass().getMethods(); for (Method method : methods) { - PostConstruct postConstructAnnotation = method - .getAnnotation(PostConstruct.class); + PostConstruct postConstructAnnotation = method.getAnnotation(PostConstruct.class); if (postConstructAnnotation != null) { Object[] args = {}; method.invoke(resource, args); @@ -114,7 +88,7 @@ } } } - + private void preDestroy(Object resource) throws IllegalAccessException, InvocationTargetException { Method[] methods = resource.getClass().getMethods(); for (Method method : methods) { @@ -127,7 +101,6 @@ } } - private void injectResources(Object resource) { final Method[] methods = resource.getClass().getMethods(); for (Method method : methods) { @@ -139,12 +112,12 @@ } else { // Name indicates a service final Object service = getObjectForName(name); - + if (service == null) { throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource name " + name + ", because no mapping was found"); - } else { + } else { try { - Object[] args = {service}; + Object[] args = { service }; method.invoke(resource, args); } catch (IllegalAccessException e) { throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e); @@ -159,12 +132,11 @@ } } - - /** - * Return the Object which should be injected for given name - * - * @param name - * @return object - */ - protected abstract Object getObjectForName(String name); + /** + * Return the Object which should be injected for given name + * + * @param name + * @return object + */ + public abstract Object getObjectForName(String name); } Copied: james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/InstanceFactory.java (from r908904, james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/LoaderService.java) URL: http://svn.apache.org/viewvc/james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/InstanceFactory.java?p2=james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/InstanceFactory.java&p1=james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/LoaderService.java&r1=908904&r2=908954&rev=908954&view=diff ============================================================================== --- james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/LoaderService.java (original) +++ james/server/trunk/core-api/src/main/java/org/apache/james/api/kernel/InstanceFactory.java Thu Feb 11 13:16:17 2010 @@ -19,35 +19,29 @@ package org.apache.james.api.kernel; -import org.apache.commons.configuration.HierarchicalConfiguration; -import org.apache.commons.logging.Log; - /** * Loads instances of given types. */ -public interface LoaderService { +public interface InstanceFactory { /** - * Loads an instance of the given class. - * The load may elect to return a new instance - * and use the logger and config for the lifecycle. + * Create an instance of the given class. * Instances should - where appropriate - have dependencies injected. * @param <T> * @param type may be interface or concrete, not null * @return an instance of the type */ - - public <T>T load(Class<T> type, Log logger, HierarchicalConfiguration config); - + public Object newInstance(String className) throws InstanceException, ClassNotFoundException; - /** - * Loads an instance of the given class. - * The load return a new instance - * Instances should - where appropriate - have dependencies injected. - * @param <T> - * @param type may be interface or concrete, not null - * @return an instance of the type - */ + @SuppressWarnings("serial") + public class InstanceException extends Exception { + public InstanceException(String msg, Throwable t) { + super(msg,t); + } + + public InstanceException(String msg) { + super(msg); + } + } - public <T>T load(Class<T> type); } Modified: james/server/trunk/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java URL: http://svn.apache.org/viewvc/james/server/trunk/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java?rev=908954&r1=908953&r2=908954&view=diff ============================================================================== --- james/server/trunk/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java (original) +++ james/server/trunk/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java Thu Feb 11 13:16:17 2010 @@ -22,9 +22,9 @@ import java.util.HashMap; import java.util.Map; -import org.apache.james.api.kernel.AbstractJSR250LoaderService; +import org.apache.james.api.kernel.AbstractJSR250InstanceFactory; -public class FakeLoader extends AbstractJSR250LoaderService { +public class FakeLoader extends AbstractJSR250InstanceFactory { private final Map<String, Object> servicesByName; private final Map<String, String> mappings = new HashMap<String, String>(); @@ -82,7 +82,7 @@ @Override - protected Object getObjectForName(String name) { + public Object getObjectForName(String name) { return get(name); } } Copied: james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/AbstractMailStore.java (from r908904, james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/MailStore.java) URL: http://svn.apache.org/viewvc/james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/AbstractMailStore.java?p2=james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/AbstractMailStore.java&p1=james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/MailStore.java&r1=908904&r2=908954&rev=908954&view=diff ============================================================================== --- james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/MailStore.java (original) +++ james/server/trunk/core-function/src/main/java/org/apache/james/mailrepository/AbstractMailStore.java Thu Feb 11 13:16:17 2010 @@ -26,14 +26,12 @@ import java.util.Map; import javax.annotation.PostConstruct; -import javax.annotation.Resource; import org.apache.commons.collections.map.ReferenceMap; import org.apache.commons.configuration.CombinedConfiguration; 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.LogEnabled; import org.apache.james.services.store.Store; @@ -43,7 +41,7 @@ * identified by its destinationURL, type and model. * */ -public class MailStore +public abstract class AbstractMailStore implements Store, LogEnabled, Configurable { // Prefix for repository names @@ -70,7 +68,7 @@ private Log logger; - private LoaderService loader; + //private LoaderService loader; public void setLog(Log logger) { @@ -86,12 +84,6 @@ } - - @Resource(name="org.apache.james.LoaderService") - public void setLoaderService(LoaderService loader) { - this.loader = loader; - } - @PostConstruct @SuppressWarnings("unchecked") public void init() @@ -252,8 +244,7 @@ } try { - Class<?> replyClass = Thread.currentThread().getContextClassLoader().loadClass(repClass); - reply = loader.load(replyClass, logger, config); + reply = load(repClass, config, logger); repositories.put(repID, reply); if (getLogger().isInfoEnabled()) { @@ -286,30 +277,10 @@ * @return a new repository name */ public static final String getName() { - synchronized (MailStore.class) { + synchronized (AbstractMailStore.class) { return REPOSITORY_NAME + id++; } } - - /** - * Returns whether the mail store has a repository corresponding to - * the passed in hint. - * - * @param hint the Configuration object used to look up the repository - * - * @return whether the mail store has a repository corresponding to this hint - */ - /* - public boolean isSelectable( Object hint ) { - Object comp = null; - try { - comp = select(hint); - } catch(StoreException ex) { - if (getLogger().isErrorEnabled()) { - getLogger().error("Exception AvalonMailStore.hasComponent-" + ex.toString()); - } - } - return (comp != null); - } - */ + + protected abstract Object load(String className, HierarchicalConfiguration config, Log log) throws Exception; } Modified: james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/ProtocolHandlerChainImpl.java URL: http://svn.apache.org/viewvc/james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/ProtocolHandlerChainImpl.java?rev=908954&r1=908953&r2=908954&view=diff ============================================================================== --- james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/ProtocolHandlerChainImpl.java (original) +++ james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/ProtocolHandlerChainImpl.java Thu Feb 11 13:16:17 2010 @@ -25,14 +25,13 @@ import java.util.List; import javax.annotation.PostConstruct; -import javax.annotation.Resource; 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.commons.logging.LogFactory; -import org.apache.james.api.kernel.LoaderService; +import org.apache.james.api.kernel.AbstractJSR250InstanceFactory; import org.apache.james.lifecycle.Configurable; import org.apache.james.lifecycle.LogEnabled; @@ -73,26 +72,18 @@ protected final List<Object> handlers = new LinkedList<Object>(); /** Loads instances */ - private LoaderService loader; + private AbstractJSR250InstanceFactory factory; protected HierarchicalConfiguration commonsConf; - - /** - * 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; + public final void setInstanceFactory(AbstractJSR250InstanceFactory factory) { + this.factory = factory; } @@ -126,11 +117,28 @@ * @throws ConfigurationException Get thrown on error */ protected void loadClass(ClassLoader classLoader, String className, - org.apache.commons.configuration.HierarchicalConfiguration config) throws Exception { - final Class<?> handlerClass = classLoader.loadClass(className); - + final org.apache.commons.configuration.HierarchicalConfiguration config) throws Exception { - Object handler =loader.load(handlerClass, getLog(), config); + Object handler = new AbstractJSR250InstanceFactory() { + + @Override + protected Object create(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException { + Object obj = super.create(className); + if (obj instanceof Configurable) { + try { + ((Configurable) obj).configure(config); + } catch (ConfigurationException e) { + throw new InstantiationException(); + } + } + return obj; + } + + @Override + public Object getObjectForName(String name) { + return factory.getObjectForName(name); + } + }.newInstance(className); // if it is a commands handler add it to the map with key as command // name @@ -238,5 +246,5 @@ loadHandlers(); wireExtensibleHandlers(); } - + } 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=908954&r1=908953&r2=908954&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 Thu Feb 11 13:16:17 2010 @@ -78,7 +78,7 @@ setUpServiceManager(); chain = new ProtocolHandlerChainImpl(); - chain.setLoader(serviceManager); + chain.setInstanceFactory(serviceManager); chain.setLog(new SimpleLog("ChainLog")); m_pop3Server = new AsyncPOP3Server(); 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=908954&r1=908953&r2=908954&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 Thu Feb 11 13:16:17 2010 @@ -86,7 +86,7 @@ setUpFakeLoader(); chain = new ProtocolHandlerChainImpl(); - chain.setLoader(serviceManager); + chain.setInstanceFactory(serviceManager); chain.setLog(new SimpleLog("ChainLog")); 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=908954&r1=908953&r2=908954&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 Thu Feb 11 13:16:17 2010 @@ -167,7 +167,7 @@ m_smtpServer.setFileSystem(fileSystem); chain = new ProtocolHandlerChainImpl(); - chain.setLoader(m_serviceManager); + chain.setInstanceFactory(m_serviceManager); chain.setLog(new SimpleLog("ChainLog")); m_smtpServer.setProtocolHandlerChain(chain); Added: james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/AbstractLoader.java URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/AbstractLoader.java?rev=908954&view=auto ============================================================================== --- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/AbstractLoader.java (added) +++ james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/AbstractLoader.java Thu Feb 11 13:16:17 2010 @@ -0,0 +1,150 @@ +/**************************************************************** + * 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.transport; +import java.util.List; +import java.util.Vector; + +import javax.annotation.Resource; + + +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.HierarchicalConfiguration; +import org.apache.commons.logging.Log; +import org.apache.james.api.kernel.InstanceFactory; +import org.apache.james.api.kernel.InstanceFactory.InstanceException; +import org.apache.james.lifecycle.Configurable; +import org.apache.james.lifecycle.LogEnabled; +import org.apache.mailet.MailetContext; +import org.apache.mailet.MailetException; + +/** + * Common services for loaders. + */ +public abstract class AbstractLoader implements LogEnabled, Configurable { + + /** + * The list of packages that may contain Mailets or matchers + */ + protected Vector<String> packages; + + /** + * Mailet context + */ + protected MailetContext mailetContext; + + private Log logger; + + private InstanceFactory factory; + + + /* + * (non-Javadoc) + * @see org.apache.james.lifecycle.LogEnabled#setLog(org.apache.commons.logging.Log) + */ + public final void setLog(Log logger) { + this.logger = logger; + } + + /** + * Set the MailetContext + * + * @param mailetContext the MailetContext + */ + @Resource(name="mailetcontext") + public void setMailetContext(MailetContext mailetContext) { + this.mailetContext = mailetContext; + } + + @Resource(name="instanceFactory") + public void setFactory(InstanceFactory factory) { + this.factory = factory; + } + + protected Log getLogger() { + return logger; + } + + protected Object load(String className) throws ClassNotFoundException { + try { + return factory.newInstance(className); + } catch (InstanceException e) { + return null; + } + } + + @SuppressWarnings("unchecked") + protected void getPackages(HierarchicalConfiguration conf, String packageType) + throws ConfigurationException { + packages = new Vector<String>(); + packages.addElement(""); + final List<String> pkgConfs = conf.getList(packageType); + for (int i = 0; i < pkgConfs.size(); i++) { + String packageName = pkgConfs.get(i); + if (!packageName.endsWith(".")) { + packageName += "."; + } + packages.addElement(packageName); + } + } + + + /** + * Gets a human readable description of the loader. + * Used for messages. + * @return not null + */ + protected abstract String getDisplayName(); + + /** + * Constructs an appropriate exception with an appropriate message + * @param name not null + * @return not null + */ + protected ClassNotFoundException classNotFound(String name) throws ClassNotFoundException { + final StringBuilder builder = + new StringBuilder(128) + .append("Requested ") + .append(getDisplayName()) + .append(" not found: ") + .append(name) + .append(". Package searched: "); + for (final String packageName:packages) { + builder.append(packageName); + builder.append(" "); + } + return new ClassNotFoundException(builder.toString()); + } + + /** + * Constructs an appropriate exception with an appropriate message. + * @param name not null + * @param e not null + * @return not null + */ + protected MailetException loadFailed(String name, Exception e) { + final StringBuilder builder = + new StringBuilder(128).append("Could not load ").append(getDisplayName()) + .append(" (").append(name).append(")"); + final MailetException mailetException = new MailetException(builder.toString(), e); + return mailetException; + } + +} Added: james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMailetLoader.java URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMailetLoader.java?rev=908954&view=auto ============================================================================== --- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMailetLoader.java (added) +++ james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMailetLoader.java Thu Feb 11 13:16:17 2010 @@ -0,0 +1,86 @@ +/**************************************************************** + * 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.transport; +import javax.annotation.PostConstruct; +import javax.mail.MessagingException; + +import org.apache.commons.configuration.Configuration; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.HierarchicalConfiguration; +import org.apache.mailet.Mailet; +/** + * Loads Mailets for use inside James. + * + */ +public class JamesMailetLoader extends AbstractLoader implements MailetLoader { + + private static final String DISPLAY_NAME = "mailet"; + + private final String MAILET_PACKAGE = "mailetpackage"; + + + /* + * (non-Javadoc) + * @see org.apache.james.lifecycle.Configurable#configure(org.apache.commons.configuration.HierarchicalConfiguration) + */ + public void configure(HierarchicalConfiguration conf) throws ConfigurationException { + getPackages(conf,MAILET_PACKAGE); + } + + /** + * (non-Javadoc) + * @see org.apache.james.transport.MailetLoader#getMailet(java.lang.String, org.apache.commons.configuration.Configuration) + */ + public Mailet getMailet(final String mailetName, final Configuration configuration) throws MessagingException { + try { + for (final String packageName:packages) { + final String className = packageName + mailetName; + try { + final Mailet mailet = (Mailet) load(className);; + + final MailetConfigImpl configImpl = new MailetConfigImpl(); + configImpl.setMailetName(mailetName); + configImpl.setConfiguration(configuration); + configImpl.setMailetContext(new MailetContextWrapper(mailetContext, getLogger())); + mailet.init(configImpl); + + return mailet; + } catch (ClassNotFoundException cnfe) { + //do this so we loop through all the packages + } + } + throw classNotFound(mailetName); + } catch (MessagingException me) { + throw me; + } catch (Exception e) { + e.printStackTrace(); + throw loadFailed(mailetName, e); + } + } + + /** + * @see AbstractLoader#getDisplayName() + */ + @Override + protected String getDisplayName() { + return DISPLAY_NAME; + } +} Added: james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMatcherLoader.java URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMatcherLoader.java?rev=908954&view=auto ============================================================================== --- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMatcherLoader.java (added) +++ james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/JamesMatcherLoader.java Thu Feb 11 13:16:17 2010 @@ -0,0 +1,88 @@ +/**************************************************************** + * 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.transport; +import javax.annotation.PostConstruct; +import javax.mail.MessagingException; + +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.HierarchicalConfiguration; +import org.apache.mailet.Matcher; +/** + * Loads Matchers for use inside James. + * + */ +public class JamesMatcherLoader extends AbstractLoader implements MatcherLoader { + private static final String DISPLAY_NAME = "matcher"; + private final String MATCHER_PACKAGE = "matcherpackage"; + + + /* + * (non-Javadoc) + * @see org.apache.james.lifecycle.Configurable#configure(org.apache.commons.configuration.HierarchicalConfiguration) + */ + public void configure(HierarchicalConfiguration conf) throws ConfigurationException { + getPackages(conf,MATCHER_PACKAGE); + } + + /** + * @see org.apache.james.transport.MatcherLoader#getMatcher(java.lang.String) + */ + public Matcher getMatcher(String matchName) throws MessagingException { + try { + String condition = (String) null; + int i = matchName.indexOf('='); + if (i != -1) { + condition = matchName.substring(i + 1); + matchName = matchName.substring(0, i); + } + for (final String packageName: packages) { + final String className = packageName + matchName; + try { + final Matcher matcher = (Matcher) load(className); + + final MatcherConfigImpl configImpl = new MatcherConfigImpl(); + configImpl.setMatcherName(matchName); + configImpl.setCondition(condition); + configImpl.setMailetContext(new MailetContextWrapper(mailetContext, getLogger())); + matcher.init(configImpl); + + return matcher; + } catch (ClassNotFoundException cnfe) { + //do this so we loop through all the packages + } + } + throw classNotFound(matchName); + } catch (MessagingException me) { + throw me; + } catch (Exception e) { + throw loadFailed(matchName, e); + } + } + + /** + * @see AbstractLoader#getDisplayName() + */ + @Override + protected String getDisplayName() { + return DISPLAY_NAME; + } +} Modified: james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/MailetContextWrapper.java URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/MailetContextWrapper.java?rev=908954&r1=908953&r2=908954&view=diff ============================================================================== --- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/MailetContextWrapper.java (original) +++ james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/MailetContextWrapper.java Thu Feb 11 13:16:17 2010 @@ -14,7 +14,7 @@ /** * Wrapper for a MailetContext that simply override the used logger. */ -final class MailetContextWrapper implements MailetContext { +public final class MailetContextWrapper implements MailetContext { /** the mailetContext */ private MailetContext mailetContext; Modified: james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/mailets/VirtualUserTable.java URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/mailets/VirtualUserTable.java?rev=908954&r1=908953&r2=908954&view=diff ============================================================================== --- james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/mailets/VirtualUserTable.java (original) +++ james/server/trunk/spoolmanager/src/main/java/org/apache/james/transport/mailets/VirtualUserTable.java Thu Feb 11 13:16:17 2010 @@ -42,27 +42,9 @@ * */ public class VirtualUserTable extends AbstractVirtualUserTableMailet { - private org.apache.james.api.vut.VirtualUserTable vut; - private VirtualUserTableStore vutStore; - - - /** - * Gets the virtual user table. - * @return the vut - */ - public final org.apache.james.api.vut.VirtualUserTable getVut() { - return vut; - } - - /** - * Sets the virtual user table. - * @param vut the vut to set - */ - @Resource(name="defaultvirtualusertable") - public final void setVut(org.apache.james.api.vut.VirtualUserTable vut) { - this.vut = vut; - } + private org.apache.james.api.vut.VirtualUserTable vut; + /** * Gets the virtual user table store. @@ -87,23 +69,15 @@ public void init() throws MessagingException { super.init(); - if (vut == null && vutStore == null) { + if (vutStore == null) { throw new MailetException("Not initialised. Please ensure that the mailet container supports either" + " setter or constructor injection. "); } String vutName = getInitParameter("virtualusertable"); - if (vutName == null || vutName.length() == 0) { - if (vut == null) { - throw new MailetException("When 'virtualusertable' is unset, a virtual user table must be " + - "provided by the container."); - } - } else if (vutStore == null) { - throw new MailetException("When 'virtualusertable' is set, a virtual user table store must be " + - "provided by the container."); - } else { - vut = vutStore.getTable(vutName); - if (vut == null) throw new MailetException("Could not find VirtualUserTable with name " + vutName); + vut = vutStore.getTable(vutName); + if (vut == null) { + throw new MailetException("Could not find VirtualUserTable with name " + vutName); } } Modified: james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/JamesMailetLoaderTest.java URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/JamesMailetLoaderTest.java?rev=908954&r1=908953&r2=908954&view=diff ============================================================================== --- james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/JamesMailetLoaderTest.java (original) +++ james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/JamesMailetLoaderTest.java Thu Feb 11 13:16:17 2010 @@ -25,18 +25,12 @@ import java.util.Iterator; import java.util.List; -import javax.mail.MessagingException; import junit.framework.TestCase; -import org.apache.commons.configuration.DefaultConfigurationBuilder; -import org.apache.commons.logging.impl.SimpleLog; -import org.apache.james.api.kernel.mock.FakeLoader; -import org.apache.james.transport.mailets.MailetLoaderTestMailet; -import org.apache.mailet.Mailet; -import org.apache.mailet.MailetConfig; -public class JamesMailetLoaderTest extends TestCase { +public class JamesMailetLoaderTest { // extends TestCase { + /* private JamesMailetLoader m_jamesMailetLoader = new JamesMailetLoader(); private JamesMailetLoaderConfiguration m_conf = new JamesMailetLoaderConfiguration(); @@ -125,5 +119,5 @@ MailetConfig mailetConfig = mailetLoaderTestMailet.getMailetConfig(); assertEquals("init was called w/ right config", "testMailetValue", mailetConfig.getInitParameter("testMailetKey")); } - +*/ } Modified: james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/mailets/VirtualUserTableTest.java URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/mailets/VirtualUserTableTest.java?rev=908954&r1=908953&r2=908954&view=diff ============================================================================== --- james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/mailets/VirtualUserTableTest.java (original) +++ james/server/trunk/spoolmanager/src/test/java/org/apache/james/transport/mailets/VirtualUserTableTest.java Thu Feb 11 13:16:17 2010 @@ -30,6 +30,7 @@ import junit.framework.TestCase; import org.apache.james.api.vut.ErrorMappingException; +import org.apache.james.api.vut.VirtualUserTableStore; import org.apache.mailet.Mail; import org.apache.mailet.MailAddress; import org.apache.mailet.base.test.FakeMail; @@ -39,12 +40,12 @@ public class VirtualUserTableTest extends TestCase{ - private VirtualUserTable table; + private org.apache.james.transport.mailets.VirtualUserTable table; @Override protected void setUp() throws Exception { - table = new VirtualUserTable(); + table = new org.apache.james.transport.mailets.VirtualUserTable(); final FakeMailContext mockMailetContext = new FakeMailContext() { @Override @@ -60,13 +61,18 @@ FakeMailetConfig mockMailetConfig = new FakeMailetConfig("vut", mockMailetContext, new Properties()); //mockMailetConfig.put("virtualusertable", "vut"); - table.setVut(new org.apache.james.api.vut.VirtualUserTable() { + table.setVutStore(new VirtualUserTableStore() { + + public org.apache.james.api.vut.VirtualUserTable getTable(String name) { + return new org.apache.james.api.vut.VirtualUserTable() { - public Collection<String> getMappings(String user, String domain) throws ErrorMappingException { - if (user.equals("test") && domain.equals("localhost")) return Arrays.asList(new String[]{"whate...@localhost","b...@localhost"}); - return null; + public Collection<String> getMappings(String user, String domain) throws ErrorMappingException { + if (user.equals("test") && domain.equals("localhost")) return Arrays.asList(new String[]{"whate...@localhost","b...@localhost"}); + return null; + } + + }; } - }); table.init(mockMailetConfig); Modified: james/server/trunk/spring-deployment/pom.xml URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/pom.xml?rev=908954&r1=908953&r2=908954&view=diff ============================================================================== --- james/server/trunk/spring-deployment/pom.xml (original) +++ james/server/trunk/spring-deployment/pom.xml Thu Feb 11 13:16:17 2010 @@ -290,7 +290,6 @@ <dependency> <groupId>org.apache.james</groupId> <artifactId>james-server-core-function</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=908954&r1=908953&r2=908954&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 Thu Feb 11 13:16:17 2010 @@ -101,10 +101,12 @@ </property> </bean> + <bean class= "org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> + <property name="order" value="3" /> + </bean> - <bean id="org.apache.james.LoaderService" class="org.apache.james.container.spring.lifecycle.JSR250LoaderService"> - <property name="order" value="3" /> - </bean> + <bean id="instanceFactory" class="org.apache.james.container.spring.SpringInstanceFactory"/> + <!-- Add support for Persistence annotations --> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> @@ -178,7 +180,7 @@ <bean id="fetchmail" class="org.apache.james.fetchmail.FetchScheduler" /> <!-- The High Level Storage block --> - <bean id="mailstore" class="org.apache.james.mailrepository.MailStore" /> + <bean id="mailstore" class="org.apache.james.container.spring.SpringMailStore" /> <!-- The main SpoolRepository --> <bean id="spoolrepository" Added: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringInstanceFactory.java URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringInstanceFactory.java?rev=908954&view=auto ============================================================================== --- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringInstanceFactory.java (added) +++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringInstanceFactory.java Thu Feb 11 13:16:17 2010 @@ -0,0 +1,48 @@ +/**************************************************************** + * 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 org.apache.james.api.kernel.InstanceFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; + +public class SpringInstanceFactory implements InstanceFactory, BeanFactoryAware{ + private ConfigurableListableBeanFactory cFactory; + + + /* + * (non-Javadoc) + * @see org.apache.james.api.kernel.InstanceFactory#newInstance(java.lang.String) + */ + public Object newInstance(String className) throws InstanceException, ClassNotFoundException { + return cFactory.createBean(cFactory.getBeanClassLoader().loadClass(className)); + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory) + */ + public void setBeanFactory(BeanFactory factory) throws BeansException { + cFactory = (ConfigurableListableBeanFactory) factory; + } + +} Added: james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringMailStore.java URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringMailStore.java?rev=908954&view=auto ============================================================================== --- james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringMailStore.java (added) +++ james/server/trunk/spring-deployment/src/main/java/org/apache/james/container/spring/SpringMailStore.java Thu Feb 11 13:16:17 2010 @@ -0,0 +1,51 @@ +package org.apache.james.container.spring; + +import javax.annotation.Resource; + +import org.apache.commons.configuration.HierarchicalConfiguration; +import org.apache.commons.logging.Log; +import org.apache.james.mailrepository.AbstractMailStore; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; + +public class SpringMailStore extends AbstractMailStore implements BeanFactoryAware{ + + private Registry<HierarchicalConfiguration> confRegistry; + private Registry<Log> logRegistry; + + @Resource(name="configurationRegistry") + public void setConfigurationRegistry(Registry<HierarchicalConfiguration> confRegistry) { + this.confRegistry = confRegistry; + } + + @Resource(name="logRegistry") + public void setLogRegistry(Registry<Log> logRegistry) { + this.logRegistry = logRegistry; + } + + private ConfigurableListableBeanFactory factory; + + /* + * (non-Javadoc) + * @see org.apache.james.mailrepository.AbstractMailStore#load(java.lang.String, org.apache.commons.configuration.HierarchicalConfiguration, org.apache.commons.logging.Log) + */ + protected Object load(String className, HierarchicalConfiguration config, Log log) throws Exception{ + + // just register it with the classname as key. The createBean method will use the classname as BeanDefinitation name anyway + confRegistry.registerForComponent(className, config); + logRegistry.registerForComponent(className, log); + + return factory.createBean(factory.getBeanClassLoader().loadClass(className)); + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory) + */ + public void setBeanFactory(BeanFactory factory) throws BeansException { + this.factory = (ConfigurableListableBeanFactory) factory; + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org