You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2006/10/16 14:20:38 UTC

svn commit: r464463 - in /james/server/trunk/src: conf/ java/org/apache/james/services/ java/org/apache/james/vut/ test/org/apache/james/vut/

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 = "test@localhost2";
+        String address2 = "test@james";
+
+
+       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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org