Author: norman Date: Tue Oct 24 09:57:26 2006 New Revision: 467386 URL: http://svn.apache.org/viewvc?view=rev&rev=467386 Log: Add a "store" for VirtualUserTable. See JAMES-426 Add a DefaultVirtualUserTable which should be used as default implementation Create a AbstractAvalonStore and refactor AvalonUserStore to extend it Remove unused config elements form james-smtphandlerchain.xml Add javadocs
Added: james/server/trunk/src/java/org/apache/james/core/AbstractAvalonStore.java (with props) james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.java (with props) james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.xinfo james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.java (with props) james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.xinfo james/server/trunk/src/java/org/apache/james/services/VirtualUserTableStore.java (with props) Modified: james/server/trunk/src/conf/james-assembly.xml james/server/trunk/src/conf/james-config.xml james/server/trunk/src/conf/james-smtphandlerchain.xml james/server/trunk/src/java/org/apache/james/core/AvalonUsersStore.java james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo james/server/trunk/src/java/org/apache/james/services/DomainList.java james/server/trunk/src/java/org/apache/james/services/VirtualUserTable.java james/server/trunk/src/java/org/apache/james/services/VirtualUserTableManagement.java james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptHandler.java james/server/trunk/src/java/org/apache/james/vut/AbstractVirtualUserTable.java james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java Modified: james/server/trunk/src/conf/james-assembly.xml URL: http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-assembly.xml?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/conf/james-assembly.xml (original) +++ james/server/trunk/src/conf/james-assembly.xml Tue Oct 24 09:57:26 2006 @@ -89,8 +89,6 @@ <provide name="bayesiananalyzermanagement" role="org.apache.james.services.BayesianAnalyzerManagementService"/> <provide name="dnsserver" role="org.apache.james.services.DNSServer"/> - <provide name="virtualusertable" - role="org.apache.james.services.VirtualUserTableManagement" /> </block> <!-- The User Management block --> @@ -142,7 +140,7 @@ <provide name="database-connections" role="org.apache.avalon.cornerstone.services.datasources.DataSourceSelector" /> <provide name="filesystem" role="org.apache.james.services.FileSystem" /> - <provide name="virtualusertable" + <provide name="defaultvirtualusertable" role="org.apache.james.services.VirtualUserTable" /> </block> @@ -221,22 +219,18 @@ </block> - <!-- ######################################################################## --> - <!-- VirtualUserTable services --> - <block name="virtualusertable" class="org.apache.james.vut.JDBCVirtualUserTable"> + <!-- VirtualUserTable Store --> + <block name="virtualusertable-store" class="org.apache.james.core.AvalonVirtualUserTableStore"> <provide name="database-connections" role="org.apache.avalon.cornerstone.services.datasources.DataSourceSelector"/> <provide name="filesystem" role="org.apache.james.services.FileSystem"/> <provide name="dnsserver" role="org.apache.james.services.DNSServer"/> </block> - <!-- XML implementation of the virtualusertable service --> - <!-- - <block name="virtualusertable" class="org.apache.james.vut.XMLVirtualUserTable"> - <provide name="dnsserver" role="org.apache.james.services.DNSServer"/> + <block name="defaultvirtualusertable" class="org.apache.james.core.DefaultVirtualUserTable"> + <provide name="virtualusertable-store" + role="org.apache.james.services.VirtualUserTableStore"/> </block> - --> - <!-- ######################################################################## --> <!-- ######################################################################## --> Modified: james/server/trunk/src/conf/james-config.xml URL: http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-config.xml?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/conf/james-config.xml (original) +++ james/server/trunk/src/conf/james-config.xml Tue Oct 24 09:57:26 2006 @@ -816,13 +816,7 @@ <bayesiananalyzermanagement> <repositoryPath> db://maildb </repositoryPath> </bayesiananalyzermanagement> - - <!-- VirtualUserTable Service--> - <virtualusertable> - <repositoryPath> db://maildb </repositoryPath> - <sqlFile>file://conf/sqlResources.xml</sqlFile> - </virtualusertable> - + <!-- The RemoteManager server is enabled by default --> <!-- Disabling blocks will stop them from listening, --> @@ -1201,7 +1195,7 @@ </models> </repository> </repositories> - + </mailstore> @@ -1260,6 +1254,29 @@ --> </users-store> + + <!-- The VirtualUserTable Store block --> + <virtualusertable-store> + + <!-- The DefaultVirtualUserTable for storing James' VirtualUserTable mappings. --> + <!-- + <table name="DefaultVirtualUserTable" class="org.apache.james.vut.XMLVirtualUserTable"> + <mapping> [EMAIL PROTECTED] </mapping> + </table> + --> + + <!-- Database backed VirtualUsertable --> + <!-- --> + <!-- Use these configurations to store the VirtualUserTable in a database. --> + <!-- Note: The <data-source> element must refer to a connection configured --> + <!-- in the <database-connections> configuration section. --> + + <!-- The DefaultVirtualUserTable for storing James' VirtualUserTable mappings. --> + <!-- TEMPORARY DEFAULT: db using Derby --> + <table name="DefaultVirtualUserTable" class="org.apache.james.vut.JDBCVirtualUserTable" destinationURL="db://maildb/VirtualUserTable"> + <sqlFile>file://conf/sqlResources.xml</sqlFile> + </table> + </virtualusertable-store> <!-- The database-connections block --> <database-connections> Modified: james/server/trunk/src/conf/james-smtphandlerchain.xml URL: http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-smtphandlerchain.xml?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/conf/james-smtphandlerchain.xml (original) +++ james/server/trunk/src/conf/james-smtphandlerchain.xml Tue Oct 24 09:57:26 2006 @@ -96,30 +96,6 @@ </handler> --> - <!-- IF you want to use the ValidRcptHandler you can set virtual user which will accepted here.--> - <!-- - <handler class="org.apache.james.smtpserver.core.filter.fastfail.XMLVirtualUserTableHandler" command="RCPT"> - <!- 1:1 mapping -> - <mapping>[EMAIL PROTECTED]@mordor</mapping> - <!- 1:n mapping -> - <mapping>[EMAIL PROTECTED]@isengard;radigast;gandalf</mapping> - <!- regex based mapping -> - <mapping>[EMAIL PROTECTED]:(.*)@osgilliath:[EMAIL PROTECTED]</mapping> - <!- both standard and regex mapping -> - <mapping>[EMAIL PROTECTED]@mordor;regex:ring@(.*):[EMAIL PROTECTED]</mapping> - <!- conditional regex mapping example -> - <mapping>[EMAIL PROTECTED]:(.*)[EMAIL PROTECTED]:[EMAIL PROTECTED]; - regex:(.*)[EMAIL PROTECTED]:[EMAIL PROTECTED] - </mapping> - </handler> - --> - - <!-- IF you want to use the ValidRcptHandler you can set virtual user which will accepted here.--> - <!-- - <handler class="org.apache.james.smtpserver.core.filter.fastfail.JDBCVirtualUserTableHandler" command="RCPT"> - <table> db://maildb/VirtualUserTable </table> - </handler> - --> <!-- If activated all email will get rejected which has no valid user --> <!-- You need to add the recipient to the validRecipient list if you want --> Added: james/server/trunk/src/java/org/apache/james/core/AbstractAvalonStore.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/core/AbstractAvalonStore.java?view=auto&rev=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/AbstractAvalonStore.java (added) +++ james/server/trunk/src/java/org/apache/james/core/AbstractAvalonStore.java Tue Oct 24 09:57:26 2006 @@ -0,0 +1,169 @@ +/**************************************************************** + * 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.core; + +import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.configuration.Configurable; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.avalon.framework.container.ContainerUtil; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.service.ServiceException; +import org.apache.avalon.framework.service.ServiceManager; +import org.apache.avalon.framework.service.Serviceable; + +import java.util.HashMap; +import java.util.Iterator; + +/** + * Provides a registry of objects + * + */ +public abstract class AbstractAvalonStore + extends AbstractLogEnabled + implements Serviceable, Configurable, Initializable { + + private HashMap objects; + + /** + * The Avalon configuration used by the instance + */ + protected Configuration configuration; + + /** + * The Avalon component manager used by the instance + */ + protected ServiceManager manager; + + /** + * @see org.apache.avalon.framework.service.Serviceable#service(ServiceManager) + */ + public void service( final ServiceManager manager ) + throws ServiceException { + this.manager = manager; + } + + /** + * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) + */ + public void configure( final Configuration configuration ) + throws ConfigurationException { + this.configuration = configuration; + } + + /** + * @see org.apache.avalon.framework.activity.Initializable#initialize() + */ + public void initialize() + throws Exception { + + getLogger().info(getStoreName() + " init..."); + objects = new HashMap(); + + Configuration[] repConfs = getConfigurations(configuration); + ClassLoader theClassLoader = null; + for ( int i = 0; i < repConfs.length; i++ ) + { + Configuration repConf = repConfs[i]; + String repName = repConf.getAttribute("name"); + String repClass = repConf.getAttribute("class"); + + if (getLogger().isDebugEnabled()) { + getLogger().debug("Starting " + repClass); + } + + if (theClassLoader == null) { + theClassLoader = Thread.currentThread().getContextClassLoader(); + } + + Object object = getClassInstance(theClassLoader,repClass); + + setupLogger(object); + + ContainerUtil.service(object,manager); + + ContainerUtil.configure(object,repConf); + ContainerUtil.initialize(object); + + + objects.put(repName, object); + if (getLogger().isInfoEnabled()) { + StringBuffer logBuffer = + new StringBuffer(64) + .append("Store ") + .append(repName) + .append(" started."); + getLogger().info(logBuffer.toString()); + } + } + } + + + /** + * Get the object, if any, whose name corresponds to + * the argument parameter + * + * @param name the name of the desired object + * + * @return the Object corresponding to the name parameter + */ + protected Object getObject(String name) { + return objects.get(name); + } + + /** + * Yield an <code>Iterator</code> over the set of object + * names managed internally by this store. + * + * @return an Iterator over the set of repository names + * for this store + */ + protected Iterator getObjectNames() { + return this.objects.keySet().iterator(); + } + + /** + * Return new Object of the loader classname + * + * @param loader the ClassLoader + * @param className the classname + * @return the loaded Objected + * @throws Exception + */ + public abstract Object getClassInstance(ClassLoader loader, String className) throws Exception; + + /** + * Return the Store configurations + * + * @param config the main config + * @return configurations + */ + public abstract Configuration[] getConfigurations(Configuration config); + + /** + * Return the Store name which should be used for logging + * + * @return the name + */ + public abstract String getStoreName(); + +} Propchange: james/server/trunk/src/java/org/apache/james/core/AbstractAvalonStore.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: james/server/trunk/src/java/org/apache/james/core/AvalonUsersStore.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/core/AvalonUsersStore.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/AvalonUsersStore.java (original) +++ james/server/trunk/src/java/org/apache/james/core/AvalonUsersStore.java Tue Oct 24 09:57:26 2006 @@ -21,19 +21,10 @@ package org.apache.james.core; -import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.container.ContainerUtil; -import org.apache.avalon.framework.logger.AbstractLogEnabled; -import org.apache.avalon.framework.service.ServiceException; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.avalon.framework.service.Serviceable; import org.apache.james.services.UsersRepository; import org.apache.james.services.UsersStore; -import java.util.HashMap; import java.util.Iterator; /** @@ -41,88 +32,8 @@ * */ public class AvalonUsersStore - extends AbstractLogEnabled - implements Serviceable, Configurable, Initializable, UsersStore { - - /** - * A mapping of respository identifiers to actual repositories - * This mapping is obtained from the component configuration - */ - private HashMap repositories; - - /** - * The Avalon configuration used by the instance - */ - protected Configuration configuration; - - /** - * The Avalon component manager used by the instance - */ - protected ServiceManager manager; - - /** - * @see org.apache.avalon.framework.service.Serviceable#service(ServiceManager) - */ - public void service( final ServiceManager manager ) - throws ServiceException { - this.manager = manager; - } - - /** - * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) - */ - public void configure( final Configuration configuration ) - throws ConfigurationException { - this.configuration = configuration; - } - - /** - * @see org.apache.avalon.framework.activity.Initializable#initialize() - */ - public void initialize() - throws Exception { - - getLogger().info("AvalonUsersStore init..."); - repositories = new HashMap(); - - Configuration[] repConfs = configuration.getChildren("repository"); - ClassLoader theClassLoader = null; - for ( int i = 0; i < repConfs.length; i++ ) - { - Configuration repConf = repConfs[i]; - String repName = repConf.getAttribute("name"); - String repClass = repConf.getAttribute("class"); - - if (getLogger().isDebugEnabled()) { - getLogger().debug("Starting " + repClass); - } - - if (theClassLoader == null) { - theClassLoader = Thread.currentThread().getContextClassLoader(); - } - - UsersRepository rep = (UsersRepository) theClassLoader.loadClass(repClass).newInstance(); - - setupLogger(rep); - - ContainerUtil.service(rep,manager); - - ContainerUtil.configure(rep,repConf); - ContainerUtil.initialize(rep); - - repositories.put(repName, rep); - if (getLogger().isInfoEnabled()) { - StringBuffer logBuffer = - new StringBuffer(64) - .append("UsersRepository ") - .append(repName) - .append(" started."); - getLogger().info(logBuffer.toString()); - } - } - getLogger().info("AvalonUsersStore ...init"); - } - + extends AbstractAvalonStore + implements UsersStore { /** * Get the repository, if any, whose name corresponds to @@ -133,7 +44,7 @@ * @return the UsersRepository corresponding to the name parameter */ public UsersRepository getRepository(String name) { - UsersRepository response = (UsersRepository) repositories.get(name); + UsersRepository response = (UsersRepository) getObject(name); if ((response == null) && (getLogger().isWarnEnabled())) { getLogger().warn("No users repository called: " + name); } @@ -148,6 +59,27 @@ * for this store */ public Iterator getRepositoryNames() { - return this.repositories.keySet().iterator(); + return getObjectNames(); + } + + /** + * @see org.apache.james.core.AbstractAvalonStore#getClassInstance(java.lang.ClassLoader, java.lang.String) + */ + public Object getClassInstance(ClassLoader loader, String repClass) throws Exception { + return (UsersRepository) loader.loadClass(repClass).newInstance(); + } + + /** + * @see org.apache.james.core.AbstractAvalonStore#getConfigurations(org.apache.avalon.framework.configuration.Configuration) + */ + public Configuration[] getConfigurations(Configuration config) { + return configuration.getChildren("repository"); + } + + /** + * @see org.apache.james.core.AbstractAvalonStore#getStoreName() + */ + public String getStoreName() { + return "AvolonUsersStore"; } } Added: james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.java?view=auto&rev=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.java (added) +++ james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.java Tue Oct 24 09:57:26 2006 @@ -0,0 +1,87 @@ +/**************************************************************** + * 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.core; + +import org.apache.avalon.framework.configuration.Configuration; + +import org.apache.james.services.VirtualUserTable; +import org.apache.james.services.VirtualUserTableStore; + +import java.util.Iterator; + +/** + * Provides a registry of VirtualUserTables + * + */ +public class AvalonVirtualUserTableStore + extends AbstractAvalonStore + implements VirtualUserTableStore { + + + /** + * Get the repository, if any, whose name corresponds to + * the argument parameter + * + * @param name the name of the desired repository + * + * @return the VirtualUserTable corresponding to the name parameter + */ + public VirtualUserTable getTable(String name) { + VirtualUserTable response = (VirtualUserTable) getObject(name); + if ((response == null) && (getLogger().isWarnEnabled())) { + getLogger().warn("No virtualUserTable called: " + name); + } + return response; + } + + /** + * Yield an <code>Iterator</code> over the set of repository + * names managed internally by this store. + * + * @return an Iterator over the set of repository names + * for this store + */ + public Iterator getTableNames() { + return getObjectNames(); + } + + /** + * @see org.apache.james.core.AbstractAvalonStore#getClassInstance(java.lang.ClassLoader, java.lang.String, org.apache.avalon.framework.configuration.Configuration) + */ + public Object getClassInstance(ClassLoader loader, String repClass) throws Exception { + return (VirtualUserTable) loader.loadClass(repClass).newInstance(); + } + + /** + * @see org.apache.james.core.AbstractAvalonStore#getConfigurations(org.apache.avalon.framework.configuration.Configuration) + */ + public Configuration[] getConfigurations(Configuration config) { + return configuration.getChildren("table"); + } + + /** + * @see org.apache.james.core.AbstractAvalonStore#getStoreName() + */ + public String getStoreName() { + return "AvalonVirtualUserStore"; + } +} Propchange: james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.java ------------------------------------------------------------------------------ svn:eol-style = native Added: james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.xinfo URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.xinfo?view=auto&rev=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.xinfo (added) +++ james/server/trunk/src/java/org/apache/james/core/AvalonVirtualUserTableStore.xinfo Tue Oct 24 09:57:26 2006 @@ -0,0 +1,27 @@ +<?xml version="1.0"?> + +<blockinfo> + + <!-- section to describe block --> + <block> + <version>1.0</version> + </block> + + <!-- services that are offered by this block --> + <services> + <service name="org.apache.james.services.VirtualUserTableStore" version="1.0" /> + </services> + + <dependencies> + <dependency> + <service name="org.apache.james.services.DNSServer" version="1.0"/> + </dependency> + <dependency> + <service name="org.apache.avalon.cornerstone.services.datasources.DataSourceSelector" version="1.0"/> + </dependency> + <dependency> + <service name="org.apache.james.services.FileSystem" version="1.0"/> + </dependency> + </dependencies> + +</blockinfo> Added: james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.java?view=auto&rev=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.java (added) +++ james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.java Tue Oct 24 09:57:26 2006 @@ -0,0 +1,117 @@ +/**************************************************************** + * 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.core; + +import java.util.Collection; + +import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.service.ServiceException; +import org.apache.avalon.framework.service.ServiceManager; +import org.apache.avalon.framework.service.Serviceable; +import org.apache.james.services.VirtualUserTableManagement; +import org.apache.james.services.VirtualUserTableStore; +import org.apache.james.vut.ErrorMappingException; +import org.apache.james.vut.InvalidMappingException; + +/** + * Default VirtualUserTable + */ +public class DefaultVirtualUserTable implements VirtualUserTableManagement, Serviceable, Initializable { + + VirtualUserTableManagement vut = null; + + VirtualUserTableStore store = null; + + /** + * @see org.apache.avalon.framework.activity.Initializable#initialize() + */ + public void initialize() throws Exception { + vut = (VirtualUserTableManagement) store.getTable("DefaultVirtualUserTable"); + if (vut == null) { + throw new ServiceException("","The VirtualUserTable could not be found."); + } + } + + /** + * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager) + */ + public void service(ServiceManager arg0) throws ServiceException { + store = (VirtualUserTableStore) arg0.lookup(VirtualUserTableStore.ROLE); + } + + /** + * @see org.apache.james.services.VirtualUserTableManagement#addAddressMapping(java.lang.String, java.lang.String, java.lang.String) + */ + public boolean addAddressMapping(String user, String domain, String address) throws InvalidMappingException { + return vut.addAddressMapping(user, domain, address); + } + + /** + * @see org.apache.james.services.VirtualUserTableManagement#addErrorMapping(java.lang.String, java.lang.String, java.lang.String) + */ + public boolean addErrorMapping(String user, String domain, String error) throws InvalidMappingException { + return vut.addErrorMapping(user, domain, error); + } + + /** + * @see org.apache.james.services.VirtualUserTableManagement#addRegexMapping(java.lang.String, java.lang.String, java.lang.String) + */ + public boolean addRegexMapping(String user, String domain, String regex) throws InvalidMappingException { + return vut.addRegexMapping(user, domain, regex); + } + + /** + * @see org.apache.james.services.VirtualUserTableManagement#getUserDomainMappings(java.lang.String, java.lang.String) + */ + public Collection getUserDomainMappings(String user, String domain) throws InvalidMappingException { + return vut.getUserDomainMappings(user, domain); + } + + /** + * @see org.apache.james.services.VirtualUserTableManagement#removeAddressMapping(java.lang.String, java.lang.String, java.lang.String) + */ + public boolean removeAddressMapping(String user, String domain, String address) throws InvalidMappingException { + return vut.removeAddressMapping(user, domain, address); + } + + /** + * @see org.apache.james.services.VirtualUserTableManagement#removeErrorMapping(java.lang.String, java.lang.String, java.lang.String) + */ + public boolean removeErrorMapping(String user, String domain, String error) throws InvalidMappingException { + return vut.removeErrorMapping(user, domain, error); + } + + /** + * @see org.apache.james.services.VirtualUserTableManagement#removeRegexMapping(java.lang.String, java.lang.String, java.lang.String) + */ + public boolean removeRegexMapping(String user, String domain, String regex) throws InvalidMappingException { + return vut.removeRegexMapping(user, domain, regex); + } + + /** + * @see org.apache.james.services.VirtualUserTable#getMappings(java.lang.String, java.lang.String) + */ + public Collection getMappings(String user, String domain) throws ErrorMappingException { + return vut.getMappings(user, domain); + } + +} Propchange: james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.java ------------------------------------------------------------------------------ svn:eol-style = native Added: james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.xinfo URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.xinfo?view=auto&rev=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.xinfo (added) +++ james/server/trunk/src/java/org/apache/james/core/DefaultVirtualUserTable.xinfo Tue Oct 24 09:57:26 2006 @@ -0,0 +1,22 @@ +<?xml version="1.0"?> + +<blockinfo> + + <!-- section to describe block --> + <block> + <version>1.0</version> + </block> + + <!-- services that are offered by this block --> + <services> + <service name="org.apache.james.services.VirtualUserTable" version="1.0" /> + <service name="org.apache.james.services.VirtualUserTableManagement" version="1.0" /> + </services> + + <dependencies> + <dependency> + <service name="org.apache.james.services.VirtualUserTableStore" version="1.0"/> + </dependency> + </dependencies> + +</blockinfo> Modified: james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo (original) +++ james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo Tue Oct 24 09:57:26 2006 @@ -43,8 +43,5 @@ <dependency> <service name="org.apache.james.services.DNSServer" version="1.0"/> </dependency> - <dependency> - <service name="org.apache.james.services.VirtualUserTableManagement" version="1.0"/> - </dependency> </dependencies> </blockinfo> Modified: james/server/trunk/src/java/org/apache/james/services/DomainList.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/services/DomainList.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/services/DomainList.java (original) +++ james/server/trunk/src/java/org/apache/james/services/DomainList.java Tue Oct 24 09:57:26 2006 @@ -29,6 +29,9 @@ */ public interface DomainList { + /** + * The component role used by components implementing this service + */ public final static String ROLE ="org.apache.james.services.DomainList"; /** Modified: james/server/trunk/src/java/org/apache/james/services/VirtualUserTable.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/services/VirtualUserTable.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/services/VirtualUserTable.java (original) +++ james/server/trunk/src/java/org/apache/james/services/VirtualUserTable.java Tue Oct 24 09:57:26 2006 @@ -25,8 +25,15 @@ import org.apache.james.vut.ErrorMappingException; +/** + * Interface which should be implemented of classes which map recipients + * + */ public interface VirtualUserTable { + /** + * The component role used by components implementing this service + */ public static final String ROLE = "org.apache.james.services.VirtualUserTable"; /** Modified: james/server/trunk/src/java/org/apache/james/services/VirtualUserTableManagement.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/services/VirtualUserTableManagement.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/services/VirtualUserTableManagement.java (original) +++ james/server/trunk/src/java/org/apache/james/services/VirtualUserTableManagement.java Tue Oct 24 09:57:26 2006 @@ -27,6 +27,9 @@ public interface VirtualUserTableManagement extends VirtualUserTable{ + /** + * The component role used by components implementing this service + */ public static final String ROLE = "org.apache.james.services.VirtualUserTableManagement"; /** Added: james/server/trunk/src/java/org/apache/james/services/VirtualUserTableStore.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/services/VirtualUserTableStore.java?view=auto&rev=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/services/VirtualUserTableStore.java (added) +++ james/server/trunk/src/java/org/apache/james/services/VirtualUserTableStore.java Tue Oct 24 09:57:26 2006 @@ -0,0 +1,58 @@ +/**************************************************************** + * 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.services; + +import java.util.Iterator; + +/** + * Interface for Phoenix blocks to access a store of VirtualUserTable. A VirtualUserTableStore + * contains one or more VirtualUserTables. Multiple VirtualUserTables may or may + * not have overlapping membership. + * + * @version 1.0.0, 24/04/1999 + */ +public interface VirtualUserTableStore +{ + /** + * The component role used by components implementing this service + */ + String ROLE = "org.apache.james.services.VirtualUserTableStore"; + + /** + * Get the table, if any, whose name corresponds to + * the argument parameter + * + * @param name the name of the desired repository + * + * @return the VirtualUserTable corresponding to the name parameter + */ + VirtualUserTable getTable( String name ); + + /** + * Yield an <code>Iterator</code> over the set of repository + * names managed internally by this store. + * + * @return an Iterator over the set of repository names + * for this store + */ + Iterator getTableNames(); +} Propchange: james/server/trunk/src/java/org/apache/james/services/VirtualUserTableStore.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptHandler.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptHandler.java (original) +++ james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptHandler.java Tue Oct 24 09:57:26 2006 @@ -35,6 +35,7 @@ import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; import org.apache.james.services.VirtualUserTable; +import org.apache.james.services.VirtualUserTableStore; import org.apache.james.smtpserver.CommandHandler; import org.apache.james.smtpserver.SMTPSession; import org.apache.james.util.mail.dsn.DSNStatus; @@ -55,12 +56,17 @@ private Collection regex = new ArrayList(); private boolean vut = true; private VirtualUserTable table; + private String tableName = null; /** * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager) */ public void service(ServiceManager arg0) throws ServiceException { - table = (VirtualUserTable) arg0.lookup(VirtualUserTable.ROLE); + if (tableName == null || tableName.equals("")) { + table = (VirtualUserTable) arg0.lookup(VirtualUserTable.ROLE); + } else { + table = ((VirtualUserTableStore) arg0.lookup(VirtualUserTableStore.ROLE)).getTable(tableName); + } } /** @@ -90,6 +96,11 @@ if (vutConfig != null) { vut = vutConfig.getValueAsBoolean(true); } + Configuration tableConfig = arg0.getChild("table"); + + if (tableConfig != null) { + tableName = tableConfig.getValue(null); + } } /** @@ -145,7 +156,7 @@ } public void setVirtualUserTableSupport(boolean vut) { - this.vut = vut; + this.vut = vut; } /** Modified: james/server/trunk/src/java/org/apache/james/vut/AbstractVirtualUserTable.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/vut/AbstractVirtualUserTable.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/vut/AbstractVirtualUserTable.java (original) +++ james/server/trunk/src/java/org/apache/james/vut/AbstractVirtualUserTable.java Tue Oct 24 09:57:26 2006 @@ -171,7 +171,6 @@ } /** - * @throws InvalidMappingException * @see org.apache.james.services.VirtualUserTableManagement#addErrorMapping(java.lang.String, java.lang.String, java.lang.String) */ public synchronized boolean addErrorMapping(String user, String domain, String error) throws InvalidMappingException { @@ -181,7 +180,6 @@ } /** - * @throws InvalidMappingException * @see org.apache.james.services.VirtualUserTableManagement#removeErrorMapping(java.lang.String, java.lang.String, java.lang.String) */ public synchronized boolean removeErrorMapping(String user, String domain, String error) throws InvalidMappingException { Modified: james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java (original) +++ james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java Tue Oct 24 09:57:26 2006 @@ -88,13 +88,12 @@ * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration) */ public void configure(Configuration arg0) throws ConfigurationException { - Configuration config = arg0.getChild("repositoryPath"); + String destination = arg0.getAttribute("destinationURL",null); - if (config == null) { - throw new ConfigurationException("RepositoryPath must configured"); + if (destination == null) { + throw new ConfigurationException("destinationURL must configured"); } - - String destination = config.getValue(); + // normalize the destination, to simplify processing. if ( ! destination.endsWith("/") ) { destination += "/"; Modified: james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java?view=diff&rev=467386&r1=467385&r2=467386 ============================================================================== --- james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java (original) +++ james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java Tue Oct 24 09:57:26 2006 @@ -52,7 +52,7 @@ mr.enableLogging(new MockLogger()); DefaultConfiguration defaultConfiguration = new DefaultConfiguration("ReposConf"); - defaultConfiguration.addChild(new AttrValConfiguration("repositoryPath","db://maildb")); + defaultConfiguration.setAttribute("destinationURL","db://maildb/VirtualUserTable"); defaultConfiguration.addChild(new AttrValConfiguration("sqlFile","file://conf/sqlResources.xml")); mr.service(serviceManager); mr.configure(defaultConfiguration); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]