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 2010/12/30 18:11:53 UTC

svn commit: r1053944 - in /james/server/trunk: user-api/src/main/java/org/apache/james/user/api/ user-file/src/main/java/org/apache/james/user/file/ user-file/src/test/java/org/apache/james/user/file/ user-jcr/src/main/java/org/apache/james/user/jcr/ u...

Author: norman
Date: Thu Dec 30 17:11:52 2010
New Revision: 1053944

URL: http://svn.apache.org/viewvc?rev=1053944&view=rev
Log:
Check if the username is valid in terms of virtualhosting support. Also remove deprecated methods and classes. See JAMES-1164

Added:
    james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
    james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
      - copied, changed from r1052807, james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/MockUsersRepositoryTest.java
Removed:
    james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/ListUsersJdbcRepository.java
    james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/ListUsersJdbcRepositoryTest.java
    james/server/trunk/user-library/src/main/java/org/apache/james/vut/lib/AbstractReadOnlyVirtualUserTable.java
    james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/MockUsersRepositoryTest.java
Modified:
    james/server/trunk/user-api/src/main/java/org/apache/james/user/api/UsersRepository.java
    james/server/trunk/user-file/src/main/java/org/apache/james/user/file/UsersFileRepository.java
    james/server/trunk/user-file/src/test/java/org/apache/james/user/file/UsersFileRepositoryTest.java
    james/server/trunk/user-jcr/src/main/java/org/apache/james/user/jcr/JCRUsersRepository.java
    james/server/trunk/user-jcr/src/test/java/org/apache/james/user/jcr/JcrUserRepositoryTest.java
    james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepository.java
    james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/JamesUsersJdbcRepository.java
    james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepositoryTest.java
    james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/JamesUsersJdbcRepositoryTest.java
    james/server/trunk/user-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java
    james/server/trunk/user-jpa/src/test/java/org/apache/james/user/jpa/JpaUsersRepositoryTest.java
    james/server/trunk/user-library/pom.xml
    james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
    james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/mock/MockUsersRepository.java

Modified: james/server/trunk/user-api/src/main/java/org/apache/james/user/api/UsersRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-api/src/main/java/org/apache/james/user/api/UsersRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-api/src/main/java/org/apache/james/user/api/UsersRepository.java (original)
+++ james/server/trunk/user-api/src/main/java/org/apache/james/user/api/UsersRepository.java Thu Dec 30 17:11:52 2010
@@ -41,32 +41,7 @@ public interface UsersRepository {
     String ROLE = "org.apache.james.api.user.UsersRepository";
 
     String USER = "USER";
-
-    /**
-     * Adds a user to the repository with the specified User object.
-     *
-     * @param user the user to be added
-     *
-     * @return true if succesful, false otherwise
-     * @since James 1.2.2
-     * 
-     * @deprecated James 2.4 user should be added using username/password
-     * because specific implementations of UsersRepository will support specific 
-     * implementations of users object.
-     */
-    boolean addUser(User user);
-
-    /**
-     * Adds a user to the repository with the specified attributes.  In current
-     * implementations, the Object attributes is generally a String password.
-     *
-     * @param name the name of the user to be added
-     * @param attributes see decription
-     * 
-     * @deprecated James 2.4 user is always added using username/password and
-     * eventually modified by retrieving it later.
-     */
-    void addUser(String name, Object attributes);
+    
     
     /**
      * Adds a user to the repository with the specified password
@@ -90,18 +65,6 @@ public interface UsersRepository {
      */
     User getUserByName(String name);
 
-    /**
-     * Get the user object with the specified user name. Match user naems on
-     * a case insensitive basis.  Return null if no such user.
-     *
-     * @param name the name of the user to retrieve
-     * @return the user being retrieved, null if the user doesn't exist
-     *
-     * @since James 1.2.2
-     * @deprecated James 2.4 now caseSensitive is a property of the repository
-     * implementations and the getUserByName will search according to this property.
-     */
-    User getUserByNameCaseInsensitive(String name);
 
     /**
      * Returns the user name of the user matching name on an equalsIgnoreCase
@@ -135,17 +98,6 @@ public interface UsersRepository {
      */
     boolean contains(String name);
 
-    /**
-     * Returns whether or not this user is in the repository. Names are
-     * matched on a case insensitive basis.
-     *
-     * @param name the name to check in the repository
-     * @return whether the user is in the repository
-     * 
-     * @deprecated James 2.4 now caseSensitive is a property of the repository
-     * implementations and the contains will search according to this property.
-     */
-    boolean containsCaseInsensitive(String name);
 
     /**
      * Test if user with name 'name' has password 'password'.

Modified: james/server/trunk/user-file/src/main/java/org/apache/james/user/file/UsersFileRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-file/src/main/java/org/apache/james/user/file/UsersFileRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-file/src/main/java/org/apache/james/user/file/UsersFileRepository.java (original)
+++ james/server/trunk/user-file/src/main/java/org/apache/james/user/file/UsersFileRepository.java Thu Dec 30 17:11:52 2010
@@ -28,7 +28,6 @@ import org.apache.james.filesystem.api.F
 import org.apache.james.repository.file.FilePersistentObjectRepository;
 import org.apache.james.user.api.model.User;
 import org.apache.james.user.lib.AbstractJamesUsersRepository;
-import org.apache.james.user.lib.model.DefaultJamesUser;
 
 
 import java.util.Iterator;
@@ -137,14 +136,7 @@ public class UsersFileRepository
         }
     }
 
-    /**
-     * @see org.apache.james.user.api.UsersRepository#addUser(java.lang.String, java.lang.String)
-     */
-    public boolean addUser(String username, String password) {
-        User newbie = new DefaultJamesUser(username, "SHA");
-        newbie.setPassword(password);
-        return addUser(newbie);
-    }
+
 
     /**
      * @see org.apache.james.user.api.UsersRepository#getUserByName(java.lang.String)
@@ -169,17 +161,6 @@ public class UsersFileRepository
     }
 
     /**
-     * @see org.apache.james.user.api.UsersRepository#getUserByNameCaseInsensitive(java.lang.String)
-     */
-    public User getUserByNameCaseInsensitive(String name) {
-        String realName = getRealName(name, true);
-        if (realName == null ) {
-            return null;
-        }
-        return getUserByName(realName);
-    }
-
-    /**
      * Return the real name, given the ignoreCase boolean parameter
      */
     public String getRealName(String name, boolean ignoreCase) {

Modified: james/server/trunk/user-file/src/test/java/org/apache/james/user/file/UsersFileRepositoryTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-file/src/test/java/org/apache/james/user/file/UsersFileRepositoryTest.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-file/src/test/java/org/apache/james/user/file/UsersFileRepositoryTest.java (original)
+++ james/server/trunk/user-file/src/test/java/org/apache/james/user/file/UsersFileRepositoryTest.java Thu Dec 30 17:11:52 2010
@@ -34,14 +34,14 @@ import org.apache.james.lifecycle.api.Li
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.model.JamesUser;
 import org.apache.james.user.file.UsersFileRepository;
-import org.apache.james.user.lib.MockUsersRepositoryTest;
+import org.apache.james.user.lib.AbstractUsersRepositoryTest;
 import org.apache.james.vut.api.VirtualUserTable;
 import org.apache.mailet.MailAddress;
 
 /**
  * Test basic behaviours of UsersFileRepository
  */
-public class UsersFileRepositoryTest extends MockUsersRepositoryTest {
+public class UsersFileRepositoryTest extends AbstractUsersRepositoryTest {
 
     /**
      * Create the repository to be tested.

Modified: james/server/trunk/user-jcr/src/main/java/org/apache/james/user/jcr/JCRUsersRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jcr/src/main/java/org/apache/james/user/jcr/JCRUsersRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jcr/src/main/java/org/apache/james/user/jcr/JCRUsersRepository.java (original)
+++ james/server/trunk/user-jcr/src/main/java/org/apache/james/user/jcr/JCRUsersRepository.java Thu Dec 30 17:11:52 2010
@@ -34,20 +34,18 @@ import javax.jcr.SimpleCredentials;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.commons.logging.Log;
 import org.apache.jackrabbit.util.ISO9075;
 import org.apache.jackrabbit.util.Text;
-import org.apache.james.lifecycle.api.Configurable;
-import org.apache.james.lifecycle.api.LogEnabled;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.model.User;
 import org.apache.james.user.jcr.model.JCRUser;
+import org.apache.james.user.lib.AbstractUsersRepository;
 
 /**
  * {@link UsersRepository} implementation which stores users to a JCR {@link Repository}
  *
  */
-public class JCRUsersRepository implements UsersRepository, Configurable, LogEnabled {
+public class JCRUsersRepository extends AbstractUsersRepository {
     
     //TODO: Add namespacing
     private static final String PASSWD_PROPERTY = "passwd";
@@ -55,138 +53,25 @@ public class JCRUsersRepository implemen
     private static final String USERNAME_PROPERTY = "username";
     private static final String USERS_PATH = "users";
 
-	private Repository repository;
-	private SimpleCredentials creds;
-	private String workspace;
+    private Repository repository;
+    private SimpleCredentials creds;
+    private String workspace;
 
-	private Log logger;
-
-    private boolean virtualHosting;
-	
     @Resource(name="jcrRepository")
     public void setRepository(Repository repository) {
     	this.repository = repository;
     }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.lifecycle.Configurable#configure(org.apache.commons.configuration.HierarchicalConfiguration)
-     */
-	public void configure(HierarchicalConfiguration config)
-			throws ConfigurationException {
-		this.workspace = config.getString("workspace",null);
-		String username = config.getString("username", null);
-		String password = config.getString("password",null);
-		
-		if (username != null && password != null) {
-			this.creds = new SimpleCredentials(username, password.toCharArray());
-		}
-        virtualHosting = config.getBoolean("enableVirtualHosting", false);
-
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.apache.james.lifecycle.LogEnabled#setLog(org.apache.commons.logging.Log)
-	 */
-	public void setLog(Log log) {		
-		this.logger = log;
-	}
 
-    /**
-     * Adds a user to the repository with the specified User object.
-     *
-     * @param user the user to be added
-     *
-     * @return true if succesful, false otherwise
-     * 
-     * @deprecated James 2.4 user should be added using username/password
-     * because specific implementations of UsersRepository will support specific 
-     * implementations of users object.
-     */
-    public boolean addUser(User user) {
-        throw new UnsupportedOperationException("Unsupported by JCR");
-    }
+    public void doConfigure(HierarchicalConfiguration config) throws ConfigurationException {
+        this.workspace = config.getString("workspace", null);
+        String username = config.getString("username", null);
+        String password = config.getString("password", null);
 
-    /**
-     * Adds a user to the repository with the specified attributes.  In current
-     * implementations, the Object attributes is generally a String password.
-     *
-     * @param name the name of the user to be added
-     * @param attributes see decription
-     * 
-     * @deprecated James 2.4 user is always added using username/password and
-     * eventually modified by retrieving it later.
-     */
-    public void addUser(String name, Object attributes) {
-        if (attributes instanceof String) {
-            addUser(name, (String) attributes);
-        } else {
-            throw new IllegalArgumentException("Expected password string");
+        if (username != null && password != null) {
+            this.creds = new SimpleCredentials(username, password.toCharArray());
         }
     }
-    
-    /**
-     * Adds a user to the repository with the specified password
-     * 
-     * @param username the username of the user to be added
-     * @param password the password of the user to add
-     * @return true if succesful, false otherwise
-     * 
-     */
-    public boolean addUser(String username, String password) {
 
-        try {
-            final Session session = login();
-            try {
-                final String name = toSafeName(username);
-                final String path = USERS_PATH + "/" + name;
-                final Node rootNode = session.getRootNode();
-                try {
-                    rootNode.getNode(path);
-                    logger.info("User already exists");
-                    return false;
-                } catch (PathNotFoundException e) {
-                    // user does not exist
-                }
-                Node parent;
-                try {
-                    parent = rootNode.getNode(USERS_PATH);
-                } catch (PathNotFoundException e) {
-                    // TODO: Need to consider whether should insist that parent
-                    // TODO: path exists.
-                    parent = rootNode.addNode(USERS_PATH);
-                }
-                
-                Node node = parent.addNode(name);
-                node.setProperty(USERNAME_PROPERTY, username);
-                final String hashedPassword;
-                if (password == null)
-                {
-                    // Support easy password reset
-                    hashedPassword = "";
-                }
-                else
-                {
-                    hashedPassword = JCRUser.hashPassword(username, password);
-                }
-                node.setProperty(PASSWD_PROPERTY, hashedPassword);
-                session.save();
-                return true;
-            } finally {
-                session.logout();
-            }
-            
-        } catch (RepositoryException e) {
-            if (logger.isInfoEnabled()) {
-                logger.info("Failed to add user: " + username, e);
-            }
-        }
-
-        return false;
-    }
-    
     protected String toSafeName(String key) {
         String name = ISO9075.encode(Text.escapeIllegalJcrChars(key));
         return name;
@@ -226,28 +111,14 @@ public class JCRUsersRepository implemen
             }
             
         } catch (RepositoryException e) {
-            if (logger.isInfoEnabled()) {
-                logger.info("Failed to add user: " + username, e);
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("Failed to add user: " + username, e);
             }
             user = null;
         }
         return user;
     }
 
-    /**
-     * Get the user object with the specified user name. Match user naems on
-     * a case insensitive basis.  Return null if no such user.
-     *
-     * @param name the name of the user to retrieve
-     * @return the user being retrieved, null if the user doesn't exist
-     *
-     * @since James 1.2.2
-     * @deprecated James 2.4 now caseSensitive is a property of the repository
-     * implementations and the getUserByName will search according to this property.
-     */
-    public User getUserByNameCaseInsensitive(String name) {
-        throw new UnsupportedOperationException();
-    }
 
     /**
      * Returns the user name of the user matching name on an equalsIgnoreCase
@@ -285,15 +156,15 @@ public class JCRUsersRepository implemen
                         return true;
                     } catch (PathNotFoundException e) {
                         // user not found
-                        logger.debug("User not found");
+                        getLogger().debug("User not found");
                     }
                 } finally {
                     session.logout();
                 }
                 
             } catch (RepositoryException e) {
-                if (logger.isInfoEnabled()) {
-                    logger.info("Failed to add user: " + userName, e);
+                if (getLogger().isInfoEnabled()) {
+                    getLogger().info("Failed to add user: " + userName, e);
                 }
             }
         }
@@ -322,8 +193,8 @@ public class JCRUsersRepository implemen
             }
             
         } catch (RepositoryException e) {
-            if (logger.isInfoEnabled()) {
-                logger.info("Failed to add user: " + username, e);
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("Failed to add user: " + username, e);
             }
         }
     }
@@ -347,27 +218,14 @@ public class JCRUsersRepository implemen
             }
             
         } catch (RepositoryException e) {
-            if (logger.isDebugEnabled()) {
-                logger.debug("User not found: " + name, e);
+            if (getLogger().isDebugEnabled()) {
+                getLogger().debug("User not found: " + name, e);
             }
         }
 
         return false;
     }
 
-    /**
-     * Returns whether or not this user is in the repository. Names are
-     * matched on a case insensitive basis.
-     *
-     * @param name the name to check in the repository
-     * @return whether the user is in the repository
-     * 
-     * @deprecated James 2.4 now caseSensitive is a property of the repository
-     * implementations and the contains will search according to this property.
-     */
-    public boolean containsCaseInsensitive(String name) {
-        throw new UnsupportedOperationException();
-    }
 
     /**
      * Test if user with name 'name' has password 'password'.
@@ -399,7 +257,7 @@ public class JCRUsersRepository implemen
                     return current.equals(hashPassword);
                 } catch (PathNotFoundException e) {
                     // user not found
-                    logger.debug("User not found");
+                    getLogger().debug("User not found");
                     return false;
                 }
             } finally {
@@ -407,8 +265,8 @@ public class JCRUsersRepository implemen
             }
             
         } catch (RepositoryException e) {
-            if (logger.isInfoEnabled()) {
-                logger.info("Failed to add user: " + username, e);
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("Failed to add user: " + username, e);
             }
             return false;
         }
@@ -438,8 +296,8 @@ public class JCRUsersRepository implemen
                 session.logout();
             }
         } catch (RepositoryException e) {
-            if (logger.isInfoEnabled()) {
-                logger.info("Failed to count user", e);
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("Failed to count user", e);
             }
             return 0;
         }
@@ -466,29 +324,74 @@ public class JCRUsersRepository implemen
                             final String userName = node.getProperty(USERNAME_PROPERTY).getString();
                             userNames.add(userName);
                         } catch (PathNotFoundException e) {
-                            logger.info("Node missing user name. Ignoring.");
+                            getLogger().info("Node missing user name. Ignoring.");
                         }
                     }
                 } catch (PathNotFoundException e) {
-                    logger.info("Path not found. Forgotten to setup the repository?");
+                    getLogger().info("Path not found. Forgotten to setup the repository?");
                 }
             } finally {
                 session.logout();
             }
         } catch (RepositoryException e) {
-            if (logger.isInfoEnabled()) {
-                logger.info("Failed to count user", e);
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("Failed to count user", e);
             }
         }
         return userNames.iterator();
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.user.api.UsersRepository#supportVirtualHosting()
-     */
-    public boolean supportVirtualHosting() {
-        return virtualHosting;
+
+    @Override
+    protected boolean doAddUser(String username, String password) {
+        try {
+            final Session session = login();
+            try {
+                final String name = toSafeName(username);
+                final String path = USERS_PATH + "/" + name;
+                final Node rootNode = session.getRootNode();
+                try {
+                    rootNode.getNode(path);
+                    getLogger().info("User already exists");
+                    return false;
+                } catch (PathNotFoundException e) {
+                    // user does not exist
+                }
+                Node parent;
+                try {
+                    parent = rootNode.getNode(USERS_PATH);
+                } catch (PathNotFoundException e) {
+                    // TODO: Need to consider whether should insist that parent
+                    // TODO: path exists.
+                    parent = rootNode.addNode(USERS_PATH);
+                }
+                
+                Node node = parent.addNode(name);
+                node.setProperty(USERNAME_PROPERTY, username);
+                final String hashedPassword;
+                if (password == null)
+                {
+                    // Support easy password reset
+                    hashedPassword = "";
+                }
+                else
+                {
+                    hashedPassword = JCRUser.hashPassword(username, password);
+                }
+                node.setProperty(PASSWD_PROPERTY, hashedPassword);
+                session.save();
+                return true;
+            } finally {
+                session.logout();
+            }
+            
+        } catch (RepositoryException e) {
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("Failed to add user: " + username, e);
+            }
+        }
+
+        return false;
     }
 
 }

Modified: james/server/trunk/user-jcr/src/test/java/org/apache/james/user/jcr/JcrUserRepositoryTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jcr/src/test/java/org/apache/james/user/jcr/JcrUserRepositoryTest.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jcr/src/test/java/org/apache/james/user/jcr/JcrUserRepositoryTest.java (original)
+++ james/server/trunk/user-jcr/src/test/java/org/apache/james/user/jcr/JcrUserRepositoryTest.java Thu Dec 30 17:11:52 2010
@@ -27,10 +27,10 @@ import org.apache.jackrabbit.core.Reposi
 import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.jcr.JCRUsersRepository;
-import org.apache.james.user.lib.MockUsersRepositoryTest;
+import org.apache.james.user.lib.AbstractUsersRepositoryTest;
 import org.xml.sax.InputSource;
 
-public class JcrUserRepositoryTest extends MockUsersRepositoryTest {
+public class JcrUserRepositoryTest extends AbstractUsersRepositoryTest {
 
     private static final String JACKRABBIT_HOME = "target/jackrabbit";
     private RepositoryImpl repository;

Modified: james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepository.java (original)
+++ james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepository.java Thu Dec 30 17:11:52 2010
@@ -28,7 +28,6 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
-import javax.annotation.PostConstruct;
 
 
 /**
@@ -90,9 +89,13 @@ public class DefaultUsersJdbcRepository 
      * @see org.apache.james.user.api.UsersRepository#addUser(java.lang.String, java.lang.String)
      */
     public boolean addUser(String username, String password)  {
+        if (contains(username) == true ||  isValidUsername(username) == false) {
+            return false;
+        }
         User newbie = new DefaultUser(username, "SHA");
         newbie.setPassword(password);
-        return addUser(newbie);
+        doAddUser(newbie);
+        return true;
     }
 
 

Modified: james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/JamesUsersJdbcRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/JamesUsersJdbcRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/JamesUsersJdbcRepository.java (original)
+++ james/server/trunk/user-jdbc/src/main/java/org/apache/james/user/jdbc/JamesUsersJdbcRepository.java Thu Dec 30 17:11:52 2010
@@ -148,14 +148,5 @@ public class JamesUsersJdbcRepository ex
     
     
     
-    /**
-     * @see org.apache.james.user.api.UsersRepository#addUser(java.lang.String,
-     *      java.lang.String)
-     */
-    public boolean addUser(String username, String password)  {
-        User newbie = new DefaultJamesUser(username, "SHA");
-        newbie.setPassword(password);
-        return addUser(newbie);
-    }
     
 }

Modified: james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepositoryTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepositoryTest.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepositoryTest.java (original)
+++ james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/DefaultUsersJdbcRepositoryTest.java Thu Dec 30 17:11:52 2010
@@ -29,7 +29,7 @@ import org.apache.james.lifecycle.api.Li
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.jdbc.AbstractJdbcUsersRepository;
 import org.apache.james.user.jdbc.DefaultUsersJdbcRepository;
-import org.apache.james.user.lib.MockUsersRepositoryTest;
+import org.apache.james.user.lib.AbstractUsersRepositoryTest;
 
 import java.util.Iterator;
 
@@ -38,7 +38,7 @@ import javax.sql.DataSource;
 /**
  * Test basic behaviours of UsersFileRepository
  */
-public class DefaultUsersJdbcRepositoryTest extends MockUsersRepositoryTest {
+public class DefaultUsersJdbcRepositoryTest extends AbstractUsersRepositoryTest {
 
     /**
      * Create the repository to be tested.

Modified: james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/JamesUsersJdbcRepositoryTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/JamesUsersJdbcRepositoryTest.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/JamesUsersJdbcRepositoryTest.java (original)
+++ james/server/trunk/user-jdbc/src/test/java/org/apache/james/user/jdbc/JamesUsersJdbcRepositoryTest.java Thu Dec 30 17:11:52 2010
@@ -31,7 +31,7 @@ import org.apache.james.user.api.UsersRe
 import org.apache.james.user.api.model.JamesUser;
 import org.apache.james.user.jdbc.AbstractJdbcUsersRepository;
 import org.apache.james.user.jdbc.JamesUsersJdbcRepository;
-import org.apache.james.user.lib.MockUsersRepositoryTest;
+import org.apache.james.user.lib.AbstractUsersRepositoryTest;
 import org.apache.james.vut.api.VirtualUserTable;
 import org.apache.mailet.MailAddress;
 
@@ -43,7 +43,7 @@ import javax.sql.DataSource;
 /**
  * Test basic behaviours of UsersFileRepository
  */
-public class JamesUsersJdbcRepositoryTest extends MockUsersRepositoryTest {
+public class JamesUsersJdbcRepositoryTest extends AbstractUsersRepositoryTest {
 
     /**
      * Create the repository to be tested.

Modified: james/server/trunk/user-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java (original)
+++ james/server/trunk/user-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java Thu Dec 30 17:11:52 2010
@@ -33,27 +33,21 @@ import javax.persistence.PersistenceUnit
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.logging.Log;
-import org.apache.james.lifecycle.api.Configurable;
-import org.apache.james.lifecycle.api.LogEnabled;
-import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.model.User;
 import org.apache.james.user.jpa.model.JPAUser;
+import org.apache.james.user.lib.AbstractUsersRepository;
 
 
 /**
  * JPA based UserRepository
  *
  */
-public class JPAUsersRepository implements UsersRepository, Configurable, LogEnabled {
+public class JPAUsersRepository extends AbstractUsersRepository {
 
     private EntityManagerFactory entityManagerFactory;
 
     private String algo;
 
-    private Log logger;
-
-    private boolean virtualHosting;
-
 
     /**
      * Sets entity manager.
@@ -71,69 +65,7 @@ public class JPAUsersRepository implemen
         createEntityManager().close();
     }
 
-    /**
-     * Adds a user to the repository with the specified User object.
-     * 
-     * @param user
-     *            the user to be added
-     * 
-     * @return true if succesful, false otherwise
-     * @since James 1.2.2
-     * 
-     * @deprecated James 2.4 user should be added using username/password
-     *             because specific implementations of UsersRepository will
-     *             support specific implementations of users object.
-     */
-    public boolean addUser(User user) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Adds a user to the repository with the specified attributes. In current
-     * implementations, the Object attributes is generally a String password.
-     * 
-     * @param name
-     *            the name of the user to be added
-     * @param attributes
-     *            see decription
-     * 
-     * @deprecated James 2.4 user is always added using username/password and
-     *             eventually modified by retrieving it later.
-     */
-    public void addUser(String name, Object attributes) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Adds a user to the repository with the specified password
-     * 
-     * @param username
-     *            the username of the user to be added
-     * @param password
-     *            the password of the user to add
-     * @return true if succesful, false otherwise
-     * 
-     * @since James 2.3.0
-     */
-    public boolean addUser(String username, String password) {
-        EntityManager entityManager = entityManagerFactory.createEntityManager();
-        final EntityTransaction transaction = entityManager.getTransaction();
-        try {
-            transaction.begin();
-            JPAUser user = new JPAUser(username, password, algo);
-            entityManager.persist(user);
-            transaction.commit();
-            return true;
-        } catch (PersistenceException e) {
-            logger.debug("Failed to save user", e);
-            if (transaction.isActive()) {
-                transaction.rollback();
-            }
-        } finally {
-            entityManager.close();
-        }
-        return false;
-    }
+   
 
     /**
      * Get the user object with the specified user name. Return null if no such
@@ -151,29 +83,13 @@ public class JPAUsersRepository implemen
         try {
             return (JPAUser) entityManager.createNamedQuery("findUserByName").setParameter("name", name).getSingleResult();
         } catch (PersistenceException e) {
-            logger.debug("Failed to find user", e);
+            getLogger().debug("Failed to find user", e);
             return null;
         } finally {
             entityManager.close();
         }    
     }
 
-    /**
-     * Get the user object with the specified user name. Match user naems on a
-     * case insensitive basis. Return null if no such user.
-     * 
-     * @param name
-     *            the name of the user to retrieve
-     * @return the user being retrieved, null if the user doesn't exist
-     * 
-     * @since James 1.2.2
-     * @deprecated James 2.4 now caseSensitive is a property of the repository
-     *             implementations and the getUserByName will search according
-     *             to this property.
-     */
-    public User getUserByNameCaseInsensitive(String name) {
-        throw new UnsupportedOperationException();
-    }
 
     /**
      * Returns the user name of the user matching name on an equalsIgnoreCase
@@ -207,11 +123,11 @@ public class JPAUsersRepository implemen
                 entityManager.merge(user);
                 transaction.commit();
             } else {
-                logger.debug("User not found");
+                getLogger().debug("User not found");
                 return false;
             }
         } catch (PersistenceException e) {
-            logger.debug("Failed to update user", e);
+            getLogger().debug("Failed to update user", e);
             if (transaction.isActive()) {
                 transaction.rollback();
             }
@@ -237,7 +153,7 @@ public class JPAUsersRepository implemen
             entityManager.createNamedQuery("deleteUserByName").setParameter("name", name).executeUpdate();
             transaction.commit();
         } catch (PersistenceException e) {
-            logger.debug("Failed to remove user", e);
+            getLogger().debug("Failed to remove user", e);
             if (transaction.isActive()) {
                 transaction.rollback();
             }
@@ -259,7 +175,7 @@ public class JPAUsersRepository implemen
         try {
             return ((Long) entityManager.createNamedQuery("containsUser").setParameter("name", name).getSingleResult()).longValue() > 0;
         } catch (PersistenceException e) {
-            logger.debug("Failed to find user", e);
+            getLogger().debug("Failed to find user", e);
             return false;
         } finally {
             entityManager.close();
@@ -267,22 +183,6 @@ public class JPAUsersRepository implemen
     }
 
     /**
-     * Returns whether or not this user is in the repository. Names are matched
-     * on a case insensitive basis.
-     * 
-     * @param name
-     *            the name to check in the repository
-     * @return whether the user is in the repository
-     * 
-     * @deprecated James 2.4 now caseSensitive is a property of the repository
-     *             implementations and the contains will search according to
-     *             this property.
-     */
-    public boolean containsCaseInsensitive(String name) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
      * Test if user with name 'name' has password 'password'.
      * 
      * @param name
@@ -317,7 +217,7 @@ public class JPAUsersRepository implemen
         try {
             return ((Long) entityManager.createNamedQuery("countUsers").getSingleResult()).intValue();
         } catch (PersistenceException e) {
-            logger.debug("Failed to find user", e);
+            getLogger().debug("Failed to find user", e);
             return 0;
         } finally {
             entityManager.close();
@@ -338,29 +238,20 @@ public class JPAUsersRepository implemen
             return Collections.unmodifiableList(entityManager.createNamedQuery("listUserNames").getResultList()).iterator();
 
         } catch (PersistenceException e) {
-            logger.debug("Failed to find user", e);
+            getLogger().debug("Failed to find user", e);
             return new ArrayList<String>().iterator();
         } finally {
             entityManager.close();
         }
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.lifecycle.Configurable#configure(org.apache.commons.configuration.HierarchicalConfiguration)
-     */
-    public void configure(HierarchicalConfiguration config) throws ConfigurationException {
-        algo = config.getString("algorithm","MD5");
-        virtualHosting = config.getBoolean("enableVirtualHosting", false);
-
-    }
 
     /*
      * (non-Javadoc)
-     * @see org.apache.james.lifecycle.LogEnabled#setLog(org.apache.commons.logging.Log)
+     * @see org.apache.james.user.lib.AbstractUsersRepository#doConfigure(org.apache.commons.configuration.HierarchicalConfiguration)
      */
-    public void setLog(Log log) {
-        this.logger = log;
+    public void doConfigure(HierarchicalConfiguration config) throws ConfigurationException {
+        algo = config.getString("algorithm","MD5");
     }
 
     /**
@@ -372,12 +263,29 @@ public class JPAUsersRepository implemen
         return entityManagerFactory.createEntityManager();
     }
 
+
     /*
      * (non-Javadoc)
-     * @see org.apache.james.user.api.UsersRepository#supportVirtualHosting()
+     * @see org.apache.james.user.lib.AbstractUsersRepository#doAddUser(java.lang.String, java.lang.String)
      */
-    public boolean supportVirtualHosting() {
-        return virtualHosting;
+    protected boolean doAddUser(String username, String password) {
+        EntityManager entityManager = entityManagerFactory.createEntityManager();
+        final EntityTransaction transaction = entityManager.getTransaction();
+        try {
+            transaction.begin();
+            JPAUser user = new JPAUser(username, password, algo);
+            entityManager.persist(user);
+            transaction.commit();
+            return true;
+        } catch (PersistenceException e) {
+            getLogger().debug("Failed to save user", e);
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+        } finally {
+            entityManager.close();
+        }
+        return false;
     }
 
 }

Modified: james/server/trunk/user-jpa/src/test/java/org/apache/james/user/jpa/JpaUsersRepositoryTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-jpa/src/test/java/org/apache/james/user/jpa/JpaUsersRepositoryTest.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-jpa/src/test/java/org/apache/james/user/jpa/JpaUsersRepositoryTest.java (original)
+++ james/server/trunk/user-jpa/src/test/java/org/apache/james/user/jpa/JpaUsersRepositoryTest.java Thu Dec 30 17:11:52 2010
@@ -25,13 +25,13 @@ import org.apache.commons.logging.impl.S
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.jpa.JPAUsersRepository;
 import org.apache.james.user.jpa.model.JPAUser;
-import org.apache.james.user.lib.MockUsersRepositoryTest;
+import org.apache.james.user.lib.AbstractUsersRepositoryTest;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
 import org.apache.openjpa.persistence.OpenJPAEntityTransaction;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 
-public class JpaUsersRepositoryTest extends MockUsersRepositoryTest {
+public class JpaUsersRepositoryTest extends AbstractUsersRepositoryTest {
 
     private HashMap<String, String> properties;
     private OpenJPAEntityManagerFactory factory;

Modified: james/server/trunk/user-library/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/pom.xml?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-library/pom.xml (original)
+++ james/server/trunk/user-library/pom.xml Thu Dec 30 17:11:52 2010
@@ -42,6 +42,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
+      <artifactId>james-server-domainlist-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
       <artifactId>apache-mailet</artifactId>
     </dependency>
     

Modified: james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java (original)
+++ james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java Thu Dec 30 17:11:52 2010
@@ -23,15 +23,12 @@ package org.apache.james.user.lib;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.commons.logging.Log;
-import org.apache.james.lifecycle.api.Configurable;
-import org.apache.james.lifecycle.api.LogEnabled;
 import org.apache.james.user.api.JamesUsersRepository;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.model.JamesUser;
 import org.apache.james.user.api.model.User;
-import org.apache.james.user.lib.model.DefaultUser;
-import org.apache.james.vut.lib.AbstractReadOnlyVirtualUserTable;
+import org.apache.james.user.lib.model.DefaultJamesUser;
+import org.apache.james.vut.api.VirtualUserTable;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -39,8 +36,6 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
 
 /**
  * A partial implementation of a Repository to store users.
@@ -50,7 +45,7 @@ import javax.annotation.Resource;
  *@deprecated Please implement {@link UsersRepository}
  */
 @Deprecated
-public abstract class AbstractJamesUsersRepository extends AbstractReadOnlyVirtualUserTable implements JamesUsersRepository, LogEnabled, Configurable {
+public abstract class AbstractJamesUsersRepository extends AbstractUsersRepository implements JamesUsersRepository, VirtualUserTable {
 
     /**
      * Ignore case in usernames
@@ -68,30 +63,16 @@ public abstract class AbstractJamesUsers
     protected boolean enableForwarding;
 
 
-    private Log logger;
-
-    private boolean virtualHosting;
-
-    public void setLog(Log logger) {
-        this.logger = logger;
-    }
     
-    public void configure(HierarchicalConfiguration configuration) throws ConfigurationException{
+    
+    @Override
+    public void configure(HierarchicalConfiguration configuration) throws ConfigurationException {
         setIgnoreCase(configuration.getBoolean("ignoreCase", false));
         setEnableAliases(configuration.getBoolean("enableAliases", false));
         setEnableForwarding(configuration.getBoolean("enableForwarding", false));
-        virtualHosting = configuration.getBoolean("enableVirtualHosting", false);
-
-        doConfigure(configuration);
-    }
-    
-    protected void doConfigure(HierarchicalConfiguration config) throws ConfigurationException{
-        
+        super.configure(configuration);
     }
 
-    public void setEnableVirtualHosting(boolean virtualHosting) {
-        this.virtualHosting = virtualHosting;
-    }
     /**
      * Adds a user to the underlying Repository. The user name must not clash
      * with an existing user.
@@ -110,47 +91,16 @@ public abstract class AbstractJamesUsers
     protected abstract void doUpdateUser(User user);
 
 
-    /**
-     * Adds a user to the repository with the specified attributes. In current
-     * implementations, the Object attributes is generally a String password.
-     * 
-     * @param name
-     *            the name of the user to be added
-     * @param attributes
-     *            the password value as a String
-     */
-    public void addUser(String name, Object attributes) {
-        if (attributes instanceof String) {
-            User newbie = new DefaultUser(name, "SHA");
-            newbie.setPassword((String) attributes);
-            addUser(newbie);
-        } else {
-            throw new RuntimeException("Improper use of deprecated method"
-                    + " - use addUser(User user)");
-        }
-    }
-
-    //
-    // UsersRepository interface implementation.
-    //
-    /**
-     * Adds a user to the repository with the specified User object. Users names
-     * must be unique-case-insensitive in the repository.
-     * 
-     * @param user
-     *            the user to be added
-     * 
-     * @return true if succesful, false otherwise
-     * @since James 1.2.2
-     */
-    public boolean addUser(User user) {
-        String username = user.getUserName();
 
-        if (contains(username)) {
-            return false;
-        }
 
-        doAddUser(user);
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.user.lib.AbstractUsersRepository#doAddUser(java.lang.String, java.lang.String)
+     */
+    protected boolean doAddUser(String username, String password) {
+        User newbie = new DefaultJamesUser(username, "SHA");
+        newbie.setPassword(password);
+        doAddUser(newbie);
         return true;
     }
 
@@ -215,11 +165,6 @@ public abstract class AbstractJamesUsers
         }
     }
 
-    protected Log getLogger() {
-        return logger;
-    }
-    
-    
     
     /**
      * @see org.apache.james.user.api.JamesUsersRepository#setEnableAliases(boolean)
@@ -281,12 +226,75 @@ public abstract class AbstractJamesUsers
         return new ArrayList<String>();
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.user.api.UsersRepository#supportVirtualHosting()
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean addAddressMapping(String user, String domain, String address) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean addAliasDomainMapping(String aliasDomain, String realDomain) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean addErrorMapping(String user, String domain, String error) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean addMapping(String user, String domain, String mapping) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean addRegexMapping(String user, String domain, String regex) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean removeAddressMapping(String user, String domain, String address) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean removeAliasDomainMapping(String aliasDomain, String realDomain) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean removeErrorMapping(String user, String domain, String error) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
+     */
+    public boolean removeMapping(String user, String domain, String mapping) {
+        return false;
+    }
+
+    /**
+     * Do nothing and return false
      */
-    public boolean supportVirtualHosting() {
-        return virtualHosting;
+    public boolean removeRegexMapping(String user, String domain, String regex) {
+        return false;
     }
 
     

Added: james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java?rev=1053944&view=auto
==============================================================================
--- james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java (added)
+++ james/server/trunk/user-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java Thu Dec 30 17:11:52 2010
@@ -0,0 +1,130 @@
+/****************************************************************
+ * 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.user.lib;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.lifecycle.api.Configurable;
+import org.apache.james.lifecycle.api.LogEnabled;
+import org.apache.james.user.api.UsersRepository;
+
+public abstract class AbstractUsersRepository implements UsersRepository, LogEnabled, Configurable{
+
+    private DomainList domainList;
+    private boolean virtualHosting;
+    private Log logger;
+
+
+    protected Log getLogger() {
+        return logger;
+    }
+    
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.lifecycle.api.LogEnabled#setLog(org.apache.commons.logging.Log)
+     */
+    public void setLog(Log logger) {
+        this.logger = logger;
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.lifecycle.api.Configurable#configure(org.apache.commons.configuration.HierarchicalConfiguration)
+     */
+    public void configure(HierarchicalConfiguration configuration) throws ConfigurationException{
+       
+        virtualHosting = configuration.getBoolean("enableVirtualHosting", false);
+
+        doConfigure(configuration);
+    }
+   
+    
+    protected void doConfigure(HierarchicalConfiguration config) throws ConfigurationException{
+        
+    }
+
+    public void setEnableVirtualHosting(boolean virtualHosting) {
+        this.virtualHosting = virtualHosting;
+    }
+    
+    @Resource(name="domainlist")
+    public void setDomainList(DomainList domainList) {
+        this.domainList = domainList;
+    }
+    
+    protected boolean isValidUsername(String username) {
+        int i = username.indexOf("@");
+        if (supportVirtualHosting()) {
+            // need a @ in the username
+            if (i == -1) {
+                return false;
+            } else {
+                String domain = username.substring(i + 1);
+                if (domainList.containsDomain(domain) == false) {
+                    return false;
+                } else {
+                    return true;
+                }
+            }
+        } else {
+            // @ only allowed when virtualhosting is supported
+            if (i != -1) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.user.api.UsersRepository#addUser(java.lang.String, java.lang.String)
+     */
+    public boolean addUser(String username, String password) {
+        
+        if (contains(username) == false && isValidUsername(username)) {
+            return doAddUser(username, password);
+        }
+        return false;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.user.api.UsersRepository#supportVirtualHosting()
+     */
+    public boolean supportVirtualHosting() {
+        return virtualHosting;
+    }
+    
+    /**
+     * Add the user with the given username and password
+     * 
+     * @param username
+     * @param password
+     * @return successful
+     */
+    protected abstract boolean doAddUser(String username, String password);
+}

Copied: james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java (from r1052807, james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/MockUsersRepositoryTest.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java?p2=james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java&p1=james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/MockUsersRepositoryTest.java&r1=1052807&r2=1053944&rev=1053944&view=diff
==============================================================================
--- james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/MockUsersRepositoryTest.java (original)
+++ james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java Thu Dec 30 17:11:52 2010
@@ -19,23 +19,19 @@
 
 package org.apache.james.user.lib;
 
-import org.apache.commons.configuration.DefaultConfigurationBuilder;
-import org.apache.commons.logging.impl.SimpleLog;
-import org.apache.james.lifecycle.api.LifecycleUtil;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.james.user.api.model.User;
-import org.apache.james.user.lib.mock.MockUsersRepository;
-import org.apache.james.user.lib.model.DefaultJamesUser;
-
 import java.util.ArrayList;
 import java.util.Iterator;
 
 import junit.framework.TestCase;
 
+import org.apache.james.lifecycle.api.LifecycleUtil;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.model.User;
+
 /**
  * Test basic behaviours of UsersFileRepository
  */
-public class MockUsersRepositoryTest extends TestCase {
+public abstract class AbstractUsersRepositoryTest extends TestCase {
 
     /**
      * Users repository
@@ -48,44 +44,29 @@ public class MockUsersRepositoryTest ext
      * @return the user repository
      * @throws Exception 
      */
-    protected UsersRepository getUsersRepository() throws Exception {
-        MockUsersRepository repos = new MockUsersRepository();
-        repos.setLog(new SimpleLog("MockLog"));
-        repos.configure(new DefaultConfigurationBuilder());
-        return repos;
-    }
+    protected abstract UsersRepository getUsersRepository() throws Exception;
 
     public void testUsersRepositoryEmpty() {
         assertEquals("users repository not empty", 0, usersRepository.countUsers());
         assertFalse("users repository not empty", usersRepository.list().hasNext());
     }
     
-    @SuppressWarnings("deprecation")
     public void testAddUserOnce() {
         boolean res = usersRepository.addUser("username", "password");
         assertTrue("User not added", res);
         res = usersRepository.addUser("username", "password2");
         assertFalse("User added twice!", res);
         try {
-            usersRepository.addUser("username2", (Object) "password2");
+            usersRepository.addUser("username2", "password2");
             assertTrue(usersRepository.contains("username2"));
-            User u = new DefaultJamesUser("username3","SHA","password3");
-            usersRepository.addUser(u);
+            usersRepository.addUser("username3", "password3");
             assertTrue(usersRepository.contains("username3"));
         } catch (UnsupportedOperationException e) {
             
         }
         
-        try {
-            usersRepository.addUser("username2", new Object());
-            fail("adduser should throw an exception if a non string is passed");
-        } catch (Exception e) {
-            
-        }
-        
     }
     
-    @SuppressWarnings("deprecation")
     public void testUserAddedIsFound() {
         boolean res = usersRepository.addUser("username", "password");
         assertTrue("User not added", res);
@@ -93,11 +74,6 @@ public class MockUsersRepositoryTest ext
         assertNotNull(user);
         assertEquals("username does not match", user.getUserName(), "username");
         assertTrue("user not contained in the repository", usersRepository.contains("username"));
-        try {
-            assertTrue("case insensitive user not found in the repository", usersRepository.containsCaseInsensitive("userName"));
-        } catch (UnsupportedOperationException e) {
-            // some implementation could not support deprecated methods
-        }
         
         User u = usersRepository.getUserByName("uSERNAMe");
         assertNull("found the user searching for a different case!", u);
@@ -182,18 +158,7 @@ public class MockUsersRepositoryTest ext
     }
     
     
-    @SuppressWarnings("deprecation")
-    public void testCaseInsensitivesMethods() {
-        assertTrue("User not added", usersRepository.addUser("userName", "password"));
-        try {
-            assertTrue(usersRepository.containsCaseInsensitive("usERname"));
-            assertNotNull(usersRepository.getUserByNameCaseInsensitive("userNAMe"));
-        } catch (UnsupportedOperationException e) {
-            // some implementations do not support it.
-        }
-        assertEquals(usersRepository.addUser("USERNAME", "password"), getAllowMultipleUsersWithDifferentCases());
-        
-    }
+  
     
     
     /**

Modified: james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/mock/MockUsersRepository.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/mock/MockUsersRepository.java?rev=1053944&r1=1053943&r2=1053944&view=diff
==============================================================================
--- james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/mock/MockUsersRepository.java (original)
+++ james/server/trunk/user-library/src/test/java/org/apache/james/user/lib/mock/MockUsersRepository.java Thu Dec 30 17:11:52 2010
@@ -186,4 +186,10 @@ public class MockUsersRepository extends
     protected void doUpdateUser(User user) {
         // unused
     }
+
+    @Override
+    protected boolean doAddUser(String username, String password) {
+        // TODO Auto-generated method stub
+        return false;
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org