Author: norman Date: Mon Oct 16 05:20:36 2006 New Revision: 464463 URL: http://svn.apache.org/viewvc?view=rev&rev=464463 Log: Some refactoring and fixes for JAMES-582. Now the methods seems to work like expected.
Modified: james/server/trunk/src/conf/sqlResources.xml 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/vut/AbstractVirtualUserTable.java james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java james/server/trunk/src/java/org/apache/james/vut/XMLVirtualUserTable.java james/server/trunk/src/test/org/apache/james/vut/AbstractVirtualUserTableTest.java james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java Modified: james/server/trunk/src/conf/sqlResources.xml URL: http://svn.apache.org/viewvc/james/server/trunk/src/conf/sqlResources.xml?view=diff&rev=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/conf/sqlResources.xml (original) +++ james/server/trunk/src/conf/sqlResources.xml Mon Oct 16 05:20:36 2006 @@ -990,12 +990,16 @@ <sqlDefs name="org.apache.james.vut.JDBCVirtualUserTable"> <!-- Statements used to check whether a particular message exists in this repository. --> - <sql name="selectMappings">select VirtualUserTable.target_address from VirtualUserTable, VirtualUserTable as VUTDomains -where ((VirtualUserTable."user") like ? or (VirtualUserTable."user") like '\%') -and (VirtualUserTable.domain like ? -or (VirtualUserTable.domain like '\%' and VUTDomains.domain like ?)) </sql> + <sql name="selectMappings" db="derby">select VirtualUserTable.target_address,(VirtualUserTable."user" || '@' ||VirtualUserTable.domain) from VirtualUserTable, VirtualUserTable as VUTDomains where ((VirtualUserTable."user") like ? or (VirtualUserTable."user") like '%') and (VirtualUserTable.domain like ? or (VirtualUserTable.domain like '%' and VUTDomains.domain like ?)) order by 2 desc</sql> + <sql name="selectMappings">select VirtualUserTable.target_address from VirtualUserTable, VirtualUserTable as VUTDomains where (VirtualUserTable.user like ? or VirtualUserTable.user like '%') and (VirtualUserTable.domain like ? or (VirtualUserTable.domain like '%' and VUTDomains.domain like ?)) order by concat(VirtualUserTable.user,'@',VirtualUserTable.domain) desc limit 1" </sql> + + <sql name="selectUserDomainMapping" db="derby">select VirtualUserTable.target_address from VirtualUserTable where VirtualUserTable."user" = ? and VirtualUserTable.domain = ? </sql> + <sql name="selectUserDomainMapping">select VirtualUserTable.target_address from VirtualUserTable where VirtualUserTable.user = ? and VirtualUserTable.domain = ? </sql> + <sql name="deleteMapping">delete from VirtualUserTable where VirtualUserTable."user" = ? and VirtualUserTable.domain = ? and VirtualUserTable.target_address = ?</sql> + <sql name="updateMapping">update VirtualUserTable set VirtualUserTable.target_address = ? where VirtualUserTable."user" = ? and VirtualUserTable.domain = ? </sql> + <sql name="addMapping">insert into VirtualUserTable values(?,?,?) </sql> <!-- Statements used to create the table associated with this class. --> <sql name="createTable" db="mysql"> @@ -1006,6 +1010,8 @@ PRIMARY KEY (user,domain) ) </sql> + <!-- TEMPORARY DISABLED --> + <!-- <sql name="createTable" db="hypersonic"> CREATE CACHED TABLE VirtualUserTable ( user varchar(64) NOT NULL default '', @@ -1070,6 +1076,7 @@ PRIMARY KEY (user,domain) ) </sql> + --> <sql name="createTable" db="derby"> CREATE TABLE VirtualUserTable ( "user" varchar (64) NOT NULL default '', 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=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/java/org/apache/james/services/VirtualUserTable.java (original) +++ james/server/trunk/src/java/org/apache/james/services/VirtualUserTable.java Mon Oct 16 05:20:36 2006 @@ -35,7 +35,7 @@ * * @param mailaddress the MailAddress * @return the mapped mailAddress - * @throws ErrorMappingException + * @throws ErrorMappingException get thrown if an error mapping was found */ public Collection getMappings(String user, String domain) throws ErrorMappingException; } 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=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/java/org/apache/james/services/VirtualUserTableManagement.java (original) +++ james/server/trunk/src/java/org/apache/james/services/VirtualUserTableManagement.java Mon Oct 16 05:20:36 2006 @@ -21,6 +21,8 @@ package org.apache.james.services; +import java.util.Collection; + import org.apache.james.vut.InvalidMappingException; public interface VirtualUserTableManagement extends VirtualUserTable{ @@ -47,7 +49,7 @@ * @return true if successfully * @throws InvalidMappingException get thrown if an invalid argument was given */ - public boolean removeRegexMapping(String user,String domain, String regex); + public boolean removeRegexMapping(String user,String domain, String regex) throws InvalidMappingException; /*** * Add address mapping @@ -69,7 +71,7 @@ * @return true if successfully * @throws InvalidMappingException get thrown if an invalid argument was given */ - public boolean removeAddressMapping(String user,String domain, String address); + public boolean removeAddressMapping(String user,String domain, String address) throws InvalidMappingException; /** * Add error mapping @@ -91,5 +93,16 @@ * @return true if successfully * @throws InvalidMappingException get thrown if an invalid argument was given */ - public boolean removeErrorMapping(String user,String domain, String error); + public boolean removeErrorMapping(String user,String domain, String error) throws InvalidMappingException; + + /** + * Return the explicit mapping stored for the given user and domain. Return null + * if no mapping was found + * + * @param user the username + * @param domain the domain + * @return the collection which holds the mappings. + * @throws InvalidMappingException get thrown if an invalid use or domain was given + */ + public Collection getUserDomainMappings(String user, String domain) throws InvalidMappingException; } 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=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/java/org/apache/james/vut/AbstractVirtualUserTable.java (original) +++ james/server/trunk/src/java/org/apache/james/vut/AbstractVirtualUserTable.java Mon Oct 16 05:20:36 2006 @@ -36,6 +36,9 @@ import org.apache.oro.text.regex.MalformedPatternException; import org.apache.oro.text.regex.Perl5Compiler; +/** + * + */ public abstract class AbstractVirtualUserTable extends AbstractLogEnabled implements VirtualUserTable, VirtualUserTableManagement { @@ -43,13 +46,13 @@ * @see org.apache.james.services.VirtualUserTable#getMapping(org.apache.mailet.MailAddress) */ public Collection getMappings(String user,String domain) throws ErrorMappingException { - Collection mappings = new ArrayList(); - String targetString = mapAddress(user, domain); + String targetString = mapAddress(user, domain); // Only non-null mappings are translated if (targetString != null) { + Collection mappings = new ArrayList(); if (targetString.startsWith("error:")) { throw new ErrorMappingException(targetString.substring("error:".length())); @@ -66,7 +69,8 @@ } catch (MalformedPatternException e) { getLogger().error("Exception during regexMap processing: ", e); } catch (ParseException e) { - // should never happen + // should never happen + getLogger().error("Exception during regexMap processing: ", e); } if (targetAddress == null) continue; @@ -86,17 +90,17 @@ .append(" to ").append(targetAddress); getLogger().debug(buf.toString()); - } - } - } - return mappings; + } + } + } + return null; } /** * @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 { - // TODO: More logging + getLogger().info("Add regex mapping => " + regex + " for user: " + user + " domain: " + domain); try { new Perl5Compiler().compile(regex); } catch (MalformedPatternException e) { @@ -107,11 +111,11 @@ /** + * @throws InvalidMappingException * @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) { - // TODO: More logging - + public boolean removeRegexMapping(String user, String domain, String regex) throws InvalidMappingException { + getLogger().info("Add regex mapping => " + regex + " for user: " + user + " domain: " + domain); return removeMappingInternal(user,domain,"regex:" + regex); } @@ -119,8 +123,7 @@ * @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 { - // TODO: More logging - + if (address.indexOf('@') < 0) { address = address + "@localhost"; } @@ -129,18 +132,20 @@ } catch (ParseException e) { throw new InvalidMappingException("Invalid emailAddress: " + address); } + getLogger().info("Add address mapping => " + address + " for user: " + user + " domain: " + domain); return addMappingInternal(user, domain, address); } /** + * @throws InvalidMappingException * @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) { - // TODO: More logging - + public boolean removeAddressMapping(String user, String domain, String address) throws InvalidMappingException { + if (address.indexOf('@') < 0) { address = address + "@localhost"; } + getLogger().info("Add address mapping => " + address + " for user: " + user + " domain: " + domain); return removeMappingInternal(user,domain,address); } @@ -148,17 +153,18 @@ * @throws InvalidMappingException * @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 { - // TODO: More logging - + public boolean addErrorMapping(String user, String domain, String error) throws InvalidMappingException { + getLogger().info("Add error mapping => " + error + " for user: " + user + " domain: " + domain); + return addMappingInternal(user,domain, "error:" + error); } /** + * @throws InvalidMappingException * @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) { - // TODO: More logging + public boolean removeErrorMapping(String user, String domain, String error) throws InvalidMappingException { + getLogger().info("Add error mapping => " + error + " for user: " + user + " domain: " + domain); return removeMappingInternal(user,domain,"error:" + error); } @@ -170,13 +176,14 @@ * @param rawMapping the mapping Strin * @return map a collection which holds all mappings */ - protected ArrayList mappingToColletion(String rawMapping) { + protected ArrayList mappingToCollection(String rawMapping) { ArrayList map = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(rawMapping, VirtualUserTableUtil.getSeparator(rawMapping)); while (tokenizer.hasMoreTokens()) { - map.add(tokenizer.nextToken().trim()); + String raw = tokenizer.nextToken().trim(); + map.add(raw); } return map; } @@ -200,9 +207,7 @@ mapping.append(";"); } } - - return mapping.toString(); - + return mapping.toString(); } @@ -240,7 +245,8 @@ * @param domain the domain * @param mapping the mapping * @return true if successfully + * @throws InvalidMappingException */ - public abstract boolean removeMappingInternal(String user, String domain, String mapping); + public abstract boolean removeMappingInternal(String user, String domain, String mapping) 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=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java (original) +++ james/server/trunk/src/java/org/apache/james/vut/JDBCVirtualUserTable.java Mon Oct 16 05:20:36 2006 @@ -29,6 +29,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -46,6 +47,9 @@ import org.apache.james.util.JDBCUtil; import org.apache.james.util.SqlResources; +/** + * + */ public class JDBCVirtualUserTable extends AbstractVirtualUserTable implements Configurable,Serviceable, Initializable{ private DataSourceSelector datasources = null; @@ -261,7 +265,6 @@ } } catch (SQLException sqle) { - System.out.println("SSQL:"+ sqlQueries.getSqlString("selectMappings", true)); getLogger().error("Error accessing database", sqle); } finally { theJDBCUtil.closeJDBCStatement(mappingStmt); @@ -273,35 +276,32 @@ /** * @see org.apache.james.vut.AbstractVirtualUserTable#removeRegexMappingInternal(java.lang.String, java.lang.String, java.lang.String) */ - public boolean removeMappingInternal(String user, String domain, String regex) { - String mapping = mapAddress(user,domain); - if (mapping != null) { - ArrayList map = mappingToColletion(mapping); - map.remove(regex); - - if (map.size() == 0) { - return removeMapping(user,domain,regex); - } else { - return updateMapping(user,domain,CollectionToMapping(map)); - } + public boolean removeMappingInternal(String user, String domain, String mapping) throws InvalidMappingException { + String newUser = getUserString(user); + String newDomain = getDomainString(domain); + Collection map = getUserDomainMappings(newUser,newDomain); + + if (map != null && map.size() > 1) { + map.remove(mapping); + return updateMapping(newUser,newDomain,CollectionToMapping(map)); + } else { + return removeMapping(newUser,newDomain,mapping); } - return false; } /** - * @throws InvalidMappingException * @see org.apache.james.vut.AbstractVirtualUserTable#addRegexMappingInternal(java.lang.String, java.lang.String, java.lang.String) */ public boolean addMappingInternal(String user, String domain, String regex) throws InvalidMappingException { String newUser = getUserString(user); String newDomain = getDomainString(domain); - String mapping = mapAddress(newUser,newDomain); - if (mapping != null) { - ArrayList map = mappingToColletion(mapping); + Collection map = getUserDomainMappings(newUser,newDomain); + + if (map != null && map.size() != 0) { map.add(regex); - return updateMapping(user,domain,CollectionToMapping(map)); + return updateMapping(newUser,newDomain,CollectionToMapping(map)); } return addMapping(newUser,newDomain,regex); } @@ -328,6 +328,7 @@ mappingStmt.setString(1, mapping); mappingStmt.setString(2, user); mappingStmt.setString(3, domain); + if (mappingStmt.executeUpdate()> 0) { return true; } @@ -405,6 +406,7 @@ mappingStmt.setString(1, user); mappingStmt.setString(2, domain); mappingStmt.setString(3, mapping); + if(mappingStmt.executeUpdate() >0) { return true; } @@ -459,5 +461,39 @@ return WILDCARD; } } + + /** + * @see org.apache.james.vut.AbstractVirtualUserTable#mapAddress(java.lang.String, java.lang.String) + */ + public Collection getUserDomainMappings(String user, String domain) throws InvalidMappingException { + Connection conn = null; + PreparedStatement mappingStmt = null; + + try { + conn = dataSourceComponent.getConnection(); + mappingStmt = conn.prepareStatement(sqlQueries.getSqlString("selectUserDomainMapping", true)); + + ResultSet mappingRS = null; + try { + mappingStmt.setString(1, user); + mappingStmt.setString(2, domain); + mappingRS = mappingStmt.executeQuery(); + if (mappingRS.next()) { + return mappingToCollection(mappingRS.getString(1)); + } + } finally { + theJDBCUtil.closeJDBCResultSet(mappingRS); + } + + } catch (SQLException sqle) { + getLogger().error("Error accessing database", sqle); + } finally { + theJDBCUtil.closeJDBCStatement(mappingStmt); + theJDBCUtil.closeJDBCConnection(conn); + } + return null; + } + + } Modified: james/server/trunk/src/java/org/apache/james/vut/XMLVirtualUserTable.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/vut/XMLVirtualUserTable.java?view=diff&rev=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/java/org/apache/james/vut/XMLVirtualUserTable.java (original) +++ james/server/trunk/src/java/org/apache/james/vut/XMLVirtualUserTable.java Mon Oct 16 05:20:36 2006 @@ -21,6 +21,7 @@ package org.apache.james.vut; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -70,6 +71,14 @@ public boolean removeMappingInternal(String user, String domain, String mapping) { // Not supported return false; + } + + /** + * Not implemented + */ + public Collection getUserDomainMappings(String user, String domain) { + // Not supported + return null; } } Modified: james/server/trunk/src/test/org/apache/james/vut/AbstractVirtualUserTableTest.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/vut/AbstractVirtualUserTableTest.java?view=diff&rev=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/test/org/apache/james/vut/AbstractVirtualUserTableTest.java (original) +++ james/server/trunk/src/test/org/apache/james/vut/AbstractVirtualUserTableTest.java Mon Oct 16 05:20:36 2006 @@ -42,6 +42,7 @@ protected abstract VirtualUserTableManagement getVirtalUserTable() throws ServiceException, ConfigurationException, Exception; + public void testStoreAndRetrieveRegexMapping() throws ErrorMappingException { String user = "test"; @@ -75,7 +76,7 @@ } } - + public void testStoreAndRetrieveAddressMapping() throws ErrorMappingException { String user = "test"; @@ -109,7 +110,7 @@ } } - + public void testStoreAndRetrieveErrorMapping() throws ErrorMappingException { String user = "test"; @@ -134,6 +135,7 @@ } catch (InvalidMappingException e) { fail("Storing failed"); } + } 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=464463&r1=464462&r2=464463 ============================================================================== --- james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java (original) +++ james/server/trunk/src/test/org/apache/james/vut/JDBCVirtualUserTableTest.java Mon Oct 16 05:20:36 2006 @@ -33,4 +33,36 @@ mr.initialize(); return mr; } + + public void testStoreAndRetrieveWildCardAddressMapping() throws ErrorMappingException { + + String user = "test"; + String user2 = "test2"; + String domain = "localhost"; + String address = "[EMAIL PROTECTED]"; + String address2 = "[EMAIL PROTECTED]"; + + + try { + + assertTrue("No mapping",virtualUserTable.getMappings(user, domain).isEmpty()); + + assertTrue("Added virtual mapping", virtualUserTable.addAddressMapping(null, domain, address)); + assertTrue("Added virtual mapping", virtualUserTable.addAddressMapping(user, domain, address2)); + + + assertTrue("One mappings",virtualUserTable.getMappings(user, domain).size() == 1); + assertTrue("One mappings",virtualUserTable.getMappings(user2, domain).size() == 1); + + assertTrue("remove virtual mapping", virtualUserTable.removeAddressMapping(user, domain, address2)); + assertTrue("remove virtual mapping", virtualUserTable.removeAddressMapping(null, domain, address)); + assertTrue("No mapping",virtualUserTable.getMappings(user, domain).isEmpty()); + assertTrue("No mapping",virtualUserTable.getMappings(user2, domain).isEmpty()); + + } catch (InvalidMappingException e) { + fail("Storing failed"); + } + + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]