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