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 er...@apache.org on 2010/09/10 06:57:44 UTC
svn commit: r995669 - in /james/server/trunk:
spring-deployment/src/main/config/james/
spring-deployment/src/main/config/james/META-INF/ user-function/
user-function/src/main/java/org/apache/james/vut/
user-function/src/main/java/org/apache/james/vut/m...
Author: eric
Date: Fri Sep 10 04:57:44 2010
New Revision: 995669
URL: http://svn.apache.org/viewvc?rev=995669&view=rev
Log:
Implement JPAVirtualUserTable + Code format (JAMES-1037)
Added:
james/server/trunk/user-function/src/main/java/org/apache/james/vut/JPAVirtualUserTable.java
james/server/trunk/user-function/src/main/java/org/apache/james/vut/model/
james/server/trunk/user-function/src/main/java/org/apache/james/vut/model/JPAVirtualUser.java
james/server/trunk/user-function/src/test/java/org/apache/james/vut/JPAVirtualUserTableTest.java
Modified:
james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml
james/server/trunk/spring-deployment/src/main/config/james/virtualusertable-store.xml
james/server/trunk/user-function/pom.xml
james/server/trunk/user-function/src/main/java/org/apache/james/vut/JDBCVirtualUserTable.java
james/server/trunk/user-function/src/main/java/org/apache/james/vut/XMLVirtualUserTable.java
james/server/trunk/user-function/src/test/java/org/apache/james/vut/JDBCVirtualUserTableTest.java
james/server/trunk/user-function/src/test/java/org/apache/james/vut/XMLVirtualUserTableTest.java
james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/AbstractVirtualUserTable.java
james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/VirtualUserTableUtil.java
james/server/trunk/user-library/src/test/java/org/apache/james/vut/AbstractVirtualUserTableTest.java
Modified: james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml (original)
+++ james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml Fri Sep 10 04:57:44 2010
@@ -30,10 +30,12 @@
<!-- UsersRepository -->
<class>org.apache.james.userrepository.JPAUser</class>
-
<!-- DomainList -->
<class>org.apache.james.domain.JPADomain</class>
+ <!-- VirtualUser -->
+ <class>org.apache.james.vut.model.JPAVirtualUser</class>
+
<properties>
<!-- Create tables on startup -->
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
Modified: james/server/trunk/spring-deployment/src/main/config/james/virtualusertable-store.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/config/james/virtualusertable-store.xml?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/config/james/virtualusertable-store.xml (original)
+++ james/server/trunk/spring-deployment/src/main/config/james/virtualusertable-store.xml Fri Sep 10 04:57:44 2010
@@ -41,9 +41,16 @@
<!-- Use these configurations to store the VirtualUserTable in a database. -->
<!-- The DefaultVirtualUserTable for storing James' VirtualUserTable mappings. -->
+ <!--
<table name="DefaultVirtualUserTable" class="org.apache.james.vut.JDBCVirtualUserTable" destinationURL="db://maildb/VirtualUserTable">
<recursiveMapping> true </recursiveMapping>
<mappingLimit> 10 </mappingLimit>
<sqlFile>file://conf/sqlResources.xml</sqlFile>
</table>
-</virtualusertable-store>
\ No newline at end of file
+ -->
+ <!-- The DefaultVirtualUserTable for storing James' VirtualUserTable mappings. -->
+ <table name="DefaultVirtualUserTable" class="org.apache.james.vut.JPAVirtualUserTable" destinationURL="db://maildb/VirtualUserTable">
+ <recursiveMapping> true </recursiveMapping>
+ <mappingLimit> 10 </mappingLimit>
+ </table>
+</virtualusertable-store>
Modified: james/server/trunk/user-function/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/pom.xml?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-function/pom.xml (original)
+++ james/server/trunk/user-function/pom.xml Fri Sep 10 04:57:44 2010
@@ -36,7 +36,7 @@
<artifactId>openjpa-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
- <includes>org/apache/james/userrepository/JPAUser.class</includes>
+ <includes>org/apache/james/userrepository/JPAUser.class,org/apache/james/vut/model/JPAVirtualUser.class</includes>
<addDefaultConstructor>true</addDefaultConstructor>
<enforcePropertyRestrictions>true</enforcePropertyRestrictions>
<toolProperties>
@@ -46,7 +46,7 @@
</property>
<property>
<name>metaDataFactory</name>
- <value>jpa(Types=org.apache.james.userrepository.JPAUser)</value>
+ <value>jpa(Types=org.apache.james.userrepository.JPAUser;org.apache.james.vut.model.JPAVirtualUser)</value>
</property>
</toolProperties>
</configuration>
Modified: james/server/trunk/user-function/src/main/java/org/apache/james/vut/JDBCVirtualUserTable.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/src/main/java/org/apache/james/vut/JDBCVirtualUserTable.java?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-function/src/main/java/org/apache/james/vut/JDBCVirtualUserTable.java (original)
+++ james/server/trunk/user-function/src/main/java/org/apache/james/vut/JDBCVirtualUserTable.java Fri Sep 10 04:57:44 2010
@@ -45,8 +45,11 @@ import org.apache.james.util.sql.JDBCUti
import org.apache.james.util.sql.SqlResources;
/**
+ * Class responsible to implement the Virtual User Table in database with JDBC access.
*
+ * @deprecated use JPAVirtualUserTable
*/
+@Deprecated
public class JDBCVirtualUserTable extends AbstractVirtualUserTable {
private DataSourceSelector datasources = null;
@@ -58,7 +61,7 @@ public class JDBCVirtualUserTable extend
/**
* Contains all of the sql strings for this component.
*/
- protected SqlResources sqlQueries;
+ private SqlResources sqlQueries;
/**
* The name of the SQL configuration file to be used to configure this repository.
@@ -67,61 +70,14 @@ public class JDBCVirtualUserTable extend
private FileSystem fileSystem;
- public void doConfigure(HierarchicalConfiguration conf) throws ConfigurationException {
-
- String destination = conf.getString("[@destinationURL]",null);
-
- if (destination == null) {
- throw new ConfigurationException("destinationURL must configured");
- }
-
- // normalize the destination, to simplify processing.
- if ( ! destination.endsWith("/") ) {
- destination += "/";
- }
- // Parse the DestinationURL for the name of the datasource,
- // the table to use, and the (optional) repository Key.
- // Split on "/", starting after "db://"
- List<String> urlParams = new ArrayList<String>();
- int start = 5;
-
- int end = destination.indexOf('/', start);
- while ( end > -1 ) {
- urlParams.add(destination.substring(start, end));
- start = end + 1;
- end = destination.indexOf('/', start);
- }
-
- // Build SqlParameters and get datasource name from URL parameters
- if (urlParams.size() == 0) {
- StringBuffer exceptionBuffer =
- new StringBuffer(256)
- .append("Malformed destinationURL - Must be of the format '")
- .append("db://<data-source>'. Was passed ")
- .append(conf.getString("[@destinationURL]"));
- throw new ConfigurationException(exceptionBuffer.toString());
- }
-
- if (urlParams.size() >= 1) {
- dataSourceName = (String)urlParams.get(0);
- }
-
- if (urlParams.size() >= 2) {
- tableName = (String)urlParams.get(1);
- }
-
- if (getLogger().isDebugEnabled()) {
- StringBuffer logBuffer =
- new StringBuffer(128)
- .append("Parsed URL: table = '")
- .append(tableName)
- .append("'");
- getLogger().debug(logBuffer.toString());
+ /**
+ * The JDBCUtil helper class
+ */
+ private final JDBCUtil theJDBCUtil = new JDBCUtil() {
+ protected void delegatedLog(String logString) {
+ getLogger().debug("JDBCVirtualUserTable: " + logString);
}
-
- sqlFileName = conf.getString("sqlFile");
-
- }
+ };
@PostConstruct
public void init() throws Exception {
@@ -199,14 +155,10 @@ public class JDBCVirtualUserTable extend
}
}
- /**
- * The JDBCUtil helper class
- */
- private final JDBCUtil theJDBCUtil = new JDBCUtil() {
- protected void delegatedLog(String logString) {
- getLogger().debug("JDBCVirtualUserTable: " + logString);
- }
- };
+ @Resource(name="filesystem")
+ public void setFileSystem(FileSystem fileSystem) {
+ this.fileSystem = fileSystem;
+ }
public void setDataSource(DataSource dataSourceComponent) {
this.dataSourceComponent = dataSourceComponent;
@@ -217,9 +169,78 @@ public class JDBCVirtualUserTable extend
this.datasources = datasources;
}
- @Resource(name="filesystem")
- public void setFileSystem(FileSystem fileSystem) {
- this.fileSystem = fileSystem;
+ protected void doConfigure(HierarchicalConfiguration conf) throws ConfigurationException {
+
+ String destination = conf.getString("[@destinationURL]",null);
+
+ if (destination == null) {
+ throw new ConfigurationException("destinationURL must configured");
+ }
+
+ // normalize the destination, to simplify processing.
+ if ( ! destination.endsWith("/") ) {
+ destination += "/";
+ }
+ // Parse the DestinationURL for the name of the datasource,
+ // the table to use, and the (optional) repository Key.
+ // Split on "/", starting after "db://"
+ List<String> urlParams = new ArrayList<String>();
+ int start = 5;
+
+ int end = destination.indexOf('/', start);
+ while ( end > -1 ) {
+ urlParams.add(destination.substring(start, end));
+ start = end + 1;
+ end = destination.indexOf('/', start);
+ }
+
+ // Build SqlParameters and get datasource name from URL parameters
+ if (urlParams.size() == 0) {
+ StringBuffer exceptionBuffer =
+ new StringBuffer(256)
+ .append("Malformed destinationURL - Must be of the format '")
+ .append("db://<data-source>'. Was passed ")
+ .append(conf.getString("[@destinationURL]"));
+ throw new ConfigurationException(exceptionBuffer.toString());
+ }
+
+ if (urlParams.size() >= 1) {
+ dataSourceName = (String)urlParams.get(0);
+ }
+
+ if (urlParams.size() >= 2) {
+ tableName = (String)urlParams.get(1);
+ }
+
+ if (getLogger().isDebugEnabled()) {
+ StringBuffer logBuffer =
+ new StringBuffer(128)
+ .append("Parsed URL: table = '")
+ .append(tableName)
+ .append("'");
+ getLogger().debug(logBuffer.toString());
+ }
+
+ sqlFileName = conf.getString("sqlFile");
+
+ }
+
+ /**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#addMappingInternal(String, String, String)
+ */
+ protected boolean addMappingInternal(String user, String domain, String regex) throws InvalidMappingException {
+
+ String newUser = getUserString(user);
+ String newDomain = getDomainString(domain);
+ Collection<String> map = getUserDomainMappings(newUser,newDomain);
+
+ if (map != null && map.size() != 0) {
+ map.add(regex);
+ return updateMapping(newUser,newDomain,VirtualUserTableUtil.CollectionToMapping(map));
+ }
+
+ return addRawMapping(newUser,newDomain,regex);
+
}
/**
@@ -254,13 +275,74 @@ public class JDBCVirtualUserTable extend
}
/**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#mapAddress(java.lang.String, java.lang.String)
+ */
+ protected Collection<String> getUserDomainMappingsInternal(String user, String domain) {
+ 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 VirtualUserTableUtil.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;
+ }
+
+ /**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#getAllMappingsInternal()
+ */
+ protected Map<String,Collection<String>> getAllMappingsInternal() {
+ Connection conn = null;
+ PreparedStatement mappingStmt = null;
+ Map<String,Collection<String>> mapping = new HashMap<String,Collection<String>>();
+ try {
+ conn = dataSourceComponent.getConnection();
+ mappingStmt = conn.prepareStatement(sqlQueries.getSqlString("selectAllMappings", true));
+ ResultSet mappingRS = null;
+ try {
+ mappingRS = mappingStmt.executeQuery();
+ while(mappingRS.next()) {
+ String user = mappingRS.getString(1);
+ String domain = mappingRS.getString(2);
+ String map = mappingRS.getString(3);
+ mapping.put(user + "@" + domain, VirtualUserTableUtil.mappingToCollection(map));
+ }
+ if (mapping.size() > 0 ) return mapping;
+ } finally {
+ theJDBCUtil.closeJDBCResultSet(mappingRS);
+ }
+
+ } catch (SQLException sqle) {
+ getLogger().error("Error accessing database", sqle);
+ } finally {
+ theJDBCUtil.closeJDBCStatement(mappingStmt);
+ theJDBCUtil.closeJDBCConnection(conn);
+ }
+ return null;
+ }
+
+ /**
* @see org.apache.james.impl.vut.AbstractVirtualUserTable#removeMappingInternal(String, String, String)
*/
- public boolean removeMappingInternal(String user, String domain, String mapping) throws InvalidMappingException {
+ protected boolean removeMappingInternal(String user, String domain, String mapping) throws InvalidMappingException {
String newUser = getUserString(user);
String newDomain = getDomainString(domain);
Collection<String> map = getUserDomainMappings(newUser,newDomain);
-
if (map != null && map.size() > 1) {
map.remove(mapping);
return updateMapping(newUser,newDomain,VirtualUserTableUtil.CollectionToMapping(map));
@@ -269,26 +351,7 @@ public class JDBCVirtualUserTable extend
}
}
-
- /**
- * @see org.apache.james.impl.vut.AbstractVirtualUserTable#addMappingInternal(String, String, String)
- */
- public boolean addMappingInternal(String user, String domain, String regex) throws InvalidMappingException {
-
- String newUser = getUserString(user);
- String newDomain = getDomainString(domain);
- Collection<String> map = getUserDomainMappings(newUser,newDomain);
-
- if (map != null && map.size() != 0) {
- map.add(regex);
- return updateMapping(newUser,newDomain,VirtualUserTableUtil.CollectionToMapping(map));
- }
-
- return addRawMapping(newUser,newDomain,regex);
-
- }
-
- /**
+ /**
* Update the mapping for the given user and domain
*
* @param user the user
@@ -444,73 +507,4 @@ public class JDBCVirtualUserTable extend
}
}
- /**
- * @see org.apache.james.impl.vut.AbstractVirtualUserTable#mapAddress(java.lang.String, java.lang.String)
- */
- protected Collection<String> getUserDomainMappingsInternal(String user, String domain) {
- 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 VirtualUserTableUtil.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;
- }
-
- /**
- * @see org.apache.james.impl.vut.AbstractVirtualUserTable#getAllMappingsInternal()
- */
- public Map<String,Collection<String>> getAllMappingsInternal() {
- Connection conn = null;
- PreparedStatement mappingStmt = null;
- Map<String,Collection<String>> mapping = new HashMap<String,Collection<String>>();
-
- try {
- conn = dataSourceComponent.getConnection();
- mappingStmt = conn.prepareStatement(sqlQueries.getSqlString("selectAllMappings", true));
-
- ResultSet mappingRS = null;
- try {
- mappingRS = mappingStmt.executeQuery();
- while(mappingRS.next()) {
- String user = mappingRS.getString(1);
- String domain = mappingRS.getString(2);
- String map = mappingRS.getString(3);
-
- mapping.put(user + "@" + domain,VirtualUserTableUtil.mappingToCollection(map));
- }
-
- if (mapping.size() > 0 ) return mapping;
- } finally {
- theJDBCUtil.closeJDBCResultSet(mappingRS);
- }
-
- } catch (SQLException sqle) {
- getLogger().error("Error accessing database", sqle);
- } finally {
- theJDBCUtil.closeJDBCStatement(mappingStmt);
- theJDBCUtil.closeJDBCConnection(conn);
- }
- return null;
- }
-
}
Added: james/server/trunk/user-function/src/main/java/org/apache/james/vut/JPAVirtualUserTable.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/src/main/java/org/apache/james/vut/JPAVirtualUserTable.java?rev=995669&view=auto
==============================================================================
--- james/server/trunk/user-function/src/main/java/org/apache/james/vut/JPAVirtualUserTable.java (added)
+++ james/server/trunk/user-function/src/main/java/org/apache/james/vut/JPAVirtualUserTable.java Fri Sep 10 04:57:44 2010
@@ -0,0 +1,287 @@
+/****************************************************************
+ * 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.vut;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.PersistenceException;
+import javax.persistence.PersistenceUnit;
+
+import org.apache.james.api.vut.management.InvalidMappingException;
+import org.apache.james.impl.vut.AbstractVirtualUserTable;
+import org.apache.james.impl.vut.VirtualUserTableUtil;
+import org.apache.james.vut.model.JPAVirtualUser;
+
+/**
+ * Class responsible to implement the Virtual User Table in database with JPA access.
+ */
+public class JPAVirtualUserTable extends AbstractVirtualUserTable {
+
+ /**
+ * The entity manager to access the database.
+ */
+ private EntityManagerFactory entityManagerFactory;
+
+ /**
+ * Set the entity manager to use.
+ *
+ * @param entityManagerFactory
+ */
+ @PersistenceUnit
+ public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ /**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#addMappingInternal(String, String, String)
+ */
+ protected boolean addMappingInternal(String user, String domain, String regex) throws InvalidMappingException {
+
+ String newUser = getUserString(user);
+ String newDomain = getDomainString(domain);
+ Collection<String> map = getUserDomainMappings(newUser,newDomain);
+
+ if (map != null && map.size() != 0) {
+ map.add(regex);
+ return updateMapping(newUser, newDomain, VirtualUserTableUtil.CollectionToMapping(map));
+ }
+
+ return addRawMapping(newUser,newDomain,regex);
+
+ }
+
+ /**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#mapAddressInternal(java.lang.String, java.lang.String)
+ */
+ protected String mapAddressInternal(String user, String domain) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ final EntityTransaction transaction = entityManager.getTransaction();
+ try {
+ transaction.begin();
+ List<JPAVirtualUser> virtualUsers = entityManager.createNamedQuery("selectMappings")
+ .setParameter("user", user)
+ .setParameter("domain", domain).getResultList();
+ transaction.commit();
+ if(virtualUsers.size() > 0) {
+ return virtualUsers.get(0).getTargetAddress();
+ }
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to remove domain", e);
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } finally {
+ entityManager.close();
+ }
+ return null;
+ }
+
+ /**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#mapAddress(java.lang.String, java.lang.String)
+ */
+ protected Collection<String> getUserDomainMappingsInternal(String user, String domain) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ try {
+ List<JPAVirtualUser> virtualUsers = entityManager.createNamedQuery("selectUserDomainMapping")
+ .setParameter("user", user)
+ .setParameter("domain", domain).getResultList();
+ if (virtualUsers.size() > 0) {
+ return VirtualUserTableUtil.mappingToCollection(virtualUsers.get(0).getTargetAddress());
+ }
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to get user domain mappings", e);
+ } finally {
+ entityManager.close();
+ }
+ return null;
+ }
+
+ /**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#getAllMappingsInternal()
+ */
+ protected Map<String,Collection<String>> getAllMappingsInternal() {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ Map<String,Collection<String>> mapping = new HashMap<String,Collection<String>>();
+ try {
+ List<JPAVirtualUser> virtualUsers = entityManager.createNamedQuery("selectAllMappings").getResultList();
+ for (JPAVirtualUser virtualUser: virtualUsers) {
+ mapping.put(virtualUser.getUser()+ "@" + virtualUser.getDomain(), VirtualUserTableUtil.mappingToCollection(virtualUser.getTargetAddress()));
+ }
+ if (mapping.size() > 0) return mapping;
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to get all mappings", e);
+ } finally {
+ entityManager.close();
+ }
+ return null;
+ }
+
+ /**
+ * @see org.apache.james.impl.vut.AbstractVirtualUserTable#removeMappingInternal(String, String, String)
+ */
+ protected boolean removeMappingInternal(String user, String domain, String mapping) throws InvalidMappingException {
+ String newUser = getUserString(user);
+ String newDomain = getDomainString(domain);
+ Collection<String> map = getUserDomainMappings(newUser,newDomain);
+ if (map != null && map.size() > 1) {
+ map.remove(mapping);
+ return updateMapping(newUser,newDomain,VirtualUserTableUtil.CollectionToMapping(map));
+ } else {
+ return removeRawMapping(newUser,newDomain,mapping);
+ }
+ }
+
+ /**
+ * Update the mapping for the given user and domain
+ *
+ * @param user the user
+ * @param domain the domain
+ * @param mapping the mapping
+ * @return true if update was successfully
+ */
+ private boolean updateMapping(String user, String domain, String mapping) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ final EntityTransaction transaction = entityManager.getTransaction();
+ try {
+ transaction.begin();
+ int updated = entityManager.createNamedQuery("updateMapping")
+ .setParameter("targetAddress", mapping)
+ .setParameter("user", user)
+ .setParameter("domain", domain).executeUpdate();
+ transaction.commit();
+ if (updated > 0) {
+ return true;
+ }
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to update mapping", e);
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } finally {
+ entityManager.close();
+ }
+ return false;
+ }
+
+
+ /**
+ * Remove a mapping for the given user and domain
+ *
+ * @param user the user
+ * @param domain the domain
+ * @param mapping the mapping
+ * @return true if successful
+ */
+ private boolean removeRawMapping(String user, String domain, String mapping) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ final EntityTransaction transaction = entityManager.getTransaction();
+ try {
+ transaction.begin();
+ int deleted = entityManager.createNamedQuery("deleteMapping")
+ .setParameter("user", user)
+ .setParameter("domain", domain)
+ .setParameter("targetAddress", mapping).executeUpdate();
+ transaction.commit();
+ if (deleted > 0) {
+ return true;
+ }
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to remove mapping", e);
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } finally {
+ entityManager.close();
+ }
+ return false;
+ }
+
+ /**
+ * Add mapping for given user and domain
+ *
+ * @param user the user
+ * @param domain the domain
+ * @param mapping the mapping
+ * @return true if successfully
+ */
+ private boolean addRawMapping(String user, String domain, String mapping) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ final EntityTransaction transaction = entityManager.getTransaction();
+ try {
+ transaction.begin();
+ JPAVirtualUser jpaVirtualUser = new JPAVirtualUser(user, domain, mapping);
+ entityManager.persist(jpaVirtualUser);
+ transaction.commit();
+ return true;
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to save virtual user", e);
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } finally {
+ entityManager.close();
+ }
+ return false;
+ }
+
+ /**
+ * Return user String for the given argument
+ *
+ * @param user the given user String
+ * @return user the user String
+ * @throws InvalidMappingException get thrown on invalid argument
+ */
+ private String getUserString(String user) throws InvalidMappingException {
+ if (user != null) {
+ if(user.equals(WILDCARD) || user.indexOf("@") < 0) {
+ return user;
+ } else {
+ throw new InvalidMappingException("Invalid user: " + user);
+ }
+ } else {
+ return WILDCARD;
+ }
+ }
+
+ /**
+ * Return domain String for the given argument
+ *
+ * @param domain the given domain String
+ * @return domainString the domain String
+ * @throws InvalidMappingException get thrown on invalid argument
+ */
+ private String getDomainString(String domain) throws InvalidMappingException {
+ if(domain != null) {
+ if (domain.equals(WILDCARD) || domain.indexOf("@") < 0) {
+ return domain;
+ } else {
+ throw new InvalidMappingException("Invalid domain: " + domain);
+ }
+ } else {
+ return WILDCARD;
+ }
+ }
+
+}
Modified: james/server/trunk/user-function/src/main/java/org/apache/james/vut/XMLVirtualUserTable.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/src/main/java/org/apache/james/vut/XMLVirtualUserTable.java?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-function/src/main/java/org/apache/james/vut/XMLVirtualUserTable.java (original)
+++ james/server/trunk/user-function/src/main/java/org/apache/james/vut/XMLVirtualUserTable.java Fri Sep 10 04:57:44 2010
@@ -30,7 +30,7 @@ import org.apache.james.impl.vut.Abstrac
import org.apache.james.impl.vut.VirtualUserTableUtil;
/**
- *
+ * Class responsible to implement the Virtual User Table in XML disk file.
*/
public class XMLVirtualUserTable extends AbstractVirtualUserTable {
@@ -43,7 +43,7 @@ public class XMLVirtualUserTable extends
* @see org.apache.james.impl.vut.AbstractVirtualUserTable#doConfigure(org.apache.commons.configuration.HierarchicalConfiguration)
*/
@SuppressWarnings("unchecked")
- public void doConfigure(HierarchicalConfiguration arg0) throws ConfigurationException {
+ protected void doConfigure(HierarchicalConfiguration arg0) throws ConfigurationException {
List<String> mapConf = arg0.getList("mapping");
@@ -62,7 +62,7 @@ public class XMLVirtualUserTable extends
/**
* Not implemented
*/
- public boolean addMappingInternal(String user, String domain, String mapping) {
+ protected boolean addMappingInternal(String user, String domain, String mapping) {
// Not supported
return false;
}
@@ -81,7 +81,7 @@ public class XMLVirtualUserTable extends
/**
* Not implemented
*/
- public boolean removeMappingInternal(String user, String domain, String mapping) {
+ protected boolean removeMappingInternal(String user, String domain, String mapping) {
// Not supported
return false;
}
@@ -89,7 +89,7 @@ public class XMLVirtualUserTable extends
/**
* @see org.apache.james.impl.vut.AbstractVirtualUserTable#getUserDomainMappingsInternal(java.lang.String, java.lang.String)
*/
- public Collection<String> getUserDomainMappingsInternal(String user, String domain) {
+ protected Collection<String> getUserDomainMappingsInternal(String user, String domain) {
if (mappings == null) {
return null;
} else {
@@ -105,7 +105,7 @@ public class XMLVirtualUserTable extends
/**
* @see org.apache.james.impl.vut.AbstractVirtualUserTable#getAllMappingsInternal()
*/
- public Map<String,Collection<String>> getAllMappingsInternal() {
+ protected Map<String,Collection<String>> getAllMappingsInternal() {
if ( mappings != null && mappings.size() > 0) {
Map<String,Collection<String>> mappingsNew = new HashMap<String,Collection<String>>();
Iterator<String> maps = mappings.keySet().iterator();
Added: james/server/trunk/user-function/src/main/java/org/apache/james/vut/model/JPAVirtualUser.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/src/main/java/org/apache/james/vut/model/JPAVirtualUser.java?rev=995669&view=auto
==============================================================================
--- james/server/trunk/user-function/src/main/java/org/apache/james/vut/model/JPAVirtualUser.java (added)
+++ james/server/trunk/user-function/src/main/java/org/apache/james/vut/model/JPAVirtualUser.java Fri Sep 10 04:57:44 2010
@@ -0,0 +1,128 @@
+/****************************************************************
+ * 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.vut.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+/**
+ * VirtualUserTable class for the James Virtual User Table to be used for JPA persistence.
+ */
+@Entity(name = "JamesVirtualUserTable")
+@Table(name = "VIRTUALUSERTABLE")
+@NamedQueries( {
+ @NamedQuery(name = "selectMappings", query = "SELECT vut FROM JamesVirtualUserTable vut WHERE (vut.user LIKE :user OR vut.user='*') and (vut.domain like :domain or vut.domain='*') ORDER BY vut.domain DESC"),
+ @NamedQuery(name = "selectUserDomainMapping", query = "SELECT vut FROM JamesVirtualUserTable vut WHERE vut.user=:user AND vut.domain=:domain"),
+ @NamedQuery(name = "selectAllMappings", query = "SELECT vut FROM JamesVirtualUserTable vut"),
+ @NamedQuery(name = "deleteMapping", query = "DELETE FROM JamesVirtualUserTable vut WHERE vut.user=:user AND vut.domain=:domain AND vut.targetAddress=:targetAddress"),
+ @NamedQuery(name = "updateMapping", query = "UPDATE JamesVirtualUserTable vut SET vut.targetAddress=:targetAddress WHERE vut.user=:user AND vut.domain=:domain")
+})
+@IdClass(JPAVirtualUser.VirtualUserTableId.class)
+public class JPAVirtualUser {
+
+ public static class VirtualUserTableId implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String user;
+
+ private String domain;
+
+ public VirtualUserTableId() {}
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + (int) (user.hashCode() ^ (user.hashCode() >>> 32));
+ result = PRIME * result + (int) (domain.hashCode() ^ (domain.hashCode() >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final VirtualUserTableId other = (VirtualUserTableId) obj;
+ if (! user.equals(other.user))
+ return false;
+ if (! domain.equals(other.domain))
+ return false;
+ return true;
+ }
+ }
+
+ /**
+ * The name of the user.
+ * Column name is chosen to be compatible with the JDBCVirtualUserTableList
+ * (even if user will be probably translated by JPA to another name (example: USER0).
+ */
+ @Id
+ @Column(name = "user", nullable = false, length = 64)
+ private String user = "";
+
+ /**
+ * The name of the domain.
+ * Column name is chosen to be compatible with the JDBCVirtualUserTableList.
+ */
+ @Id
+ @Column(name = "DOMAIN", nullable = false, length = 255)
+ private String domain = "";
+
+ /**
+ * The target address. column name is chosen to be compatible with the JDBCVirtualUserTableList.
+ */
+ @Column(name = "TARGET_ADDRESS", nullable = false, length = 255)
+ private String targetAddress = "";
+
+ /**
+ * Use this simple constructor to create a new VirtualUserTable.
+ *
+ * @param user, domain and their associated targetAddress
+ */
+ public JPAVirtualUser(String user, String domain, String targetAddress) {
+ this.user = user;
+ this.domain = domain;
+ this.targetAddress = targetAddress;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public String getTargetAddress() {
+ return targetAddress;
+ }
+
+}
Modified: james/server/trunk/user-function/src/test/java/org/apache/james/vut/JDBCVirtualUserTableTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/src/test/java/org/apache/james/vut/JDBCVirtualUserTableTest.java?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-function/src/test/java/org/apache/james/vut/JDBCVirtualUserTableTest.java (original)
+++ james/server/trunk/user-function/src/test/java/org/apache/james/vut/JDBCVirtualUserTableTest.java Fri Sep 10 04:57:44 2010
@@ -25,22 +25,25 @@ import org.apache.james.impl.vut.Abstrac
import org.apache.james.test.mock.james.MockFileSystem;
import org.apache.james.test.util.Util;
+/**
+ * Test the JDBC Virtual User Table implementation.
+ */
public class JDBCVirtualUserTableTest extends AbstractVirtualUserTableTest {
/**
* @see org.apache.james.vut.AbstractVirtualUserTableTest#getVirtualUserTable()
*/
protected AbstractVirtualUserTable getVirtualUserTable() throws Exception {
- JDBCVirtualUserTable mr = new JDBCVirtualUserTable();
- mr.setLog(new SimpleLog("MockLog"));
- mr.setDataSourceSelector(Util.getDataSourceSelector());
- mr.setFileSystem(new MockFileSystem());
+ JDBCVirtualUserTable virtualUserTable = new JDBCVirtualUserTable();
+ virtualUserTable.setLog(new SimpleLog("MockLog"));
+ virtualUserTable.setDataSourceSelector(Util.getDataSourceSelector());
+ virtualUserTable.setFileSystem(new MockFileSystem());
DefaultConfigurationBuilder defaultConfiguration = new DefaultConfigurationBuilder();
defaultConfiguration.addProperty("[@destinationURL]","db://maildb/VirtualUserTable");
defaultConfiguration.addProperty("sqlFile","file://conf/sqlResources.xml");
- mr.configure(defaultConfiguration);
- mr.init();
- return mr;
+ virtualUserTable.configure(defaultConfiguration);
+ virtualUserTable.init();
+ return virtualUserTable;
}
/**
Added: james/server/trunk/user-function/src/test/java/org/apache/james/vut/JPAVirtualUserTableTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/src/test/java/org/apache/james/vut/JPAVirtualUserTableTest.java?rev=995669&view=auto
==============================================================================
--- james/server/trunk/user-function/src/test/java/org/apache/james/vut/JPAVirtualUserTableTest.java (added)
+++ james/server/trunk/user-function/src/test/java/org/apache/james/vut/JPAVirtualUserTableTest.java Fri Sep 10 04:57:44 2010
@@ -0,0 +1,110 @@
+/****************************************************************
+ * 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.vut;
+
+import java.util.HashMap;
+
+import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.james.api.vut.management.InvalidMappingException;
+import org.apache.james.impl.vut.AbstractVirtualUserTable;
+import org.apache.james.vut.model.JPAVirtualUser;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+
+/**
+ * Test the JPA Virtual User Table implementation.
+ */
+public class JPAVirtualUserTableTest extends AbstractVirtualUserTableTest {
+
+ /**
+ * The OpenJPA Entity Manager used for the tests.
+ */
+ private OpenJPAEntityManagerFactory factory;
+
+ /**
+ * The properties for the OpenJPA Entity Manager.
+ */
+ private HashMap<String, String> properties;
+
+ @Override
+ protected void setUp() throws Exception {
+
+ // Use a memory database.
+ properties = new HashMap<String, String>();
+ properties.put("openjpa.ConnectionDriverName", org.apache.derby.jdbc.EmbeddedDriver.class.getName());
+ properties.put("openjpa.ConnectionURL", "jdbc:derby:memory:JPAVirtualUserTableTestDB;create=true");
+ properties.put("openjpa.Log", "JDBC=WARN, SQL=TRACE, Runtime=WARN");
+ properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72");
+ properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
+ properties.put("openjpa.MetaDataFactory", "jpa(Types=" + JPAVirtualUser.class.getName() +")");
+
+ factory = OpenJPAPersistence.getEntityManagerFactory(properties);
+
+ super.setUp();
+
+ }
+
+ /**
+ * @see org.apache.james.vut.AbstractVirtualUserTableTest#getVirtualUserTable()
+ */
+ protected AbstractVirtualUserTable getVirtualUserTable() throws Exception {
+ JPAVirtualUserTable virtualUserTable = new JPAVirtualUserTable();
+ virtualUserTable.setLog(new SimpleLog("MockLog"));
+ virtualUserTable.setEntityManagerFactory(factory);
+ DefaultConfigurationBuilder defaultConfiguration = new DefaultConfigurationBuilder();
+ virtualUserTable.configure(defaultConfiguration);
+ return virtualUserTable;
+ }
+
+ /**
+ * @see org.apache.james.vut.AbstractVirtualUserTableTest#addMapping(java.lang.String, java.lang.String, java.lang.String, int)
+ */
+ protected boolean addMapping(String user, String domain, String mapping, int type) throws InvalidMappingException {
+ if (type == ERROR_TYPE) {
+ return virtualUserTable.addErrorMapping(user, domain, mapping);
+ } else if (type == REGEX_TYPE) {
+ return virtualUserTable.addRegexMapping(user, domain, mapping);
+ } else if (type == ADDRESS_TYPE) {
+ return virtualUserTable.addAddressMapping(user, domain, mapping);
+ } else if (type == ALIASDOMAIN_TYPE) {
+ return virtualUserTable.addAliasDomainMapping(domain, mapping);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @see org.apache.james.vut.AbstractVirtualUserTableTest#removeMapping(java.lang.String, java.lang.String, java.lang.String, int)
+ */
+ protected boolean removeMapping(String user, String domain, String mapping, int type) throws InvalidMappingException {
+ if (type == ERROR_TYPE) {
+ return virtualUserTable.removeErrorMapping(user, domain, mapping);
+ } else if (type == REGEX_TYPE) {
+ return virtualUserTable.removeRegexMapping(user, domain, mapping);
+ } else if (type == ADDRESS_TYPE) {
+ return virtualUserTable.removeAddressMapping(user, domain, mapping);
+ } else if (type == ALIASDOMAIN_TYPE) {
+ return virtualUserTable.removeAliasDomainMapping(domain, mapping);
+ } else {
+ return false;
+ }
+ }
+
+}
Modified: james/server/trunk/user-function/src/test/java/org/apache/james/vut/XMLVirtualUserTableTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/src/test/java/org/apache/james/vut/XMLVirtualUserTableTest.java?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-function/src/test/java/org/apache/james/vut/XMLVirtualUserTableTest.java (original)
+++ james/server/trunk/user-function/src/test/java/org/apache/james/vut/XMLVirtualUserTableTest.java Fri Sep 10 04:57:44 2010
@@ -29,6 +29,9 @@ import org.apache.james.api.vut.manageme
import org.apache.james.impl.vut.AbstractVirtualUserTable;
import org.apache.james.impl.vut.VirtualUserTableUtil;
+/**
+ * Test the XML Virtual User Table implementation.
+ */
public class XMLVirtualUserTableTest extends AbstractVirtualUserTableTest {
private DefaultConfigurationBuilder defaultConfiguration = new DefaultConfigurationBuilder();
@@ -40,9 +43,9 @@ public class XMLVirtualUserTableTest ext
}
protected AbstractVirtualUserTable getVirtualUserTable() throws Exception {
- XMLVirtualUserTable mr = new XMLVirtualUserTable();
- mr.setLog(new SimpleLog("MockLog"));
- return mr;
+ XMLVirtualUserTable virtualUserTable = new XMLVirtualUserTable();
+ virtualUserTable.setLog(new SimpleLog("MockLog"));
+ return virtualUserTable;
}
/**
Modified: james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/AbstractVirtualUserTable.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/AbstractVirtualUserTable.java?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/AbstractVirtualUserTable.java (original)
+++ james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/AbstractVirtualUserTable.java Fri Sep 10 04:57:44 2010
@@ -57,7 +57,7 @@ public abstract class AbstractVirtualUse
public void configure(HierarchicalConfiguration config) throws ConfigurationException {
setRecursiveMapping(config.getBoolean("recursiveMapping", true));
try {
- setMappingLimit(config.getInt("mappingLimit",10));
+ setMappingLimit(config.getInt("mappingLimit", 10));
} catch (IllegalArgumentException e) {
throw new ConfigurationException(e.getMessage());
}
@@ -316,16 +316,6 @@ public abstract class AbstractVirtualUse
return mappings;
}
-
- private boolean checkMapping(String user,String domain, String mapping) {
- Collection<String> mappings = getUserDomainMappings(user,domain);
- if (mappings != null && mappings.contains(mapping)) {
- return false;
- } else {
- return true;
- }
- }
-
/**
* @see org.apache.james.api.vut.management.VirtualUserTableManagement#getUserDomainMappings(java.lang.String, java.lang.String)
*/
@@ -349,42 +339,6 @@ public abstract class AbstractVirtualUse
return removeMappingInternal(null, aliasDomain, VirtualUserTable.ALIASDOMAIN_PREFIX + realDomain);
}
- /**
- * Get all mappings for the given user and domain. If a aliasdomain mapping was found get sure it is in the map as first mapping.
- *
- * @param user the username
- * @param domain the domain
- * @return the mappings
- */
- private String mapAddress(String user, String domain) {
-
- String mappings = mapAddressInternal(user, domain);
-
- // check if we need to sort
- // TODO: Maybe we should just return the aliasdomain mapping
- if (mappings != null && mappings.indexOf(VirtualUserTable.ALIASDOMAIN_PREFIX) > -1) {
- Collection<String> mapCol = VirtualUserTableUtil.mappingToCollection(mappings);
- Iterator<String> mapIt = mapCol.iterator();
-
- List<String> col = new ArrayList<String>(mapCol.size());
-
- while (mapIt.hasNext()) {
- int i = 0;
- String mapping = mapIt.next().toString();
-
- if (mapping.startsWith(VirtualUserTable.ALIASDOMAIN_PREFIX)) {
- col.add(i,mapping);
- i++;
- } else {
- col.add(mapping);
- }
- }
- return VirtualUserTableUtil.CollectionToMapping(col);
- } else {
- return mappings;
- }
- }
-
protected Log getLogger() {
return logger;
}
@@ -442,4 +396,49 @@ public abstract class AbstractVirtualUse
*/
protected abstract String mapAddressInternal(String user, String domain);
+ /**
+ * Get all mappings for the given user and domain. If a aliasdomain mapping was found get sure it is in the map as first mapping.
+ *
+ * @param user the username
+ * @param domain the domain
+ * @return the mappings
+ */
+ private String mapAddress(String user, String domain) {
+
+ String mappings = mapAddressInternal(user, domain);
+
+ // check if we need to sort
+ // TODO: Maybe we should just return the aliasdomain mapping
+ if (mappings != null && mappings.indexOf(VirtualUserTable.ALIASDOMAIN_PREFIX) > -1) {
+ Collection<String> mapCol = VirtualUserTableUtil.mappingToCollection(mappings);
+ Iterator<String> mapIt = mapCol.iterator();
+
+ List<String> col = new ArrayList<String>(mapCol.size());
+
+ while (mapIt.hasNext()) {
+ int i = 0;
+ String mapping = mapIt.next().toString();
+
+ if (mapping.startsWith(VirtualUserTable.ALIASDOMAIN_PREFIX)) {
+ col.add(i,mapping);
+ i++;
+ } else {
+ col.add(mapping);
+ }
+ }
+ return VirtualUserTableUtil.CollectionToMapping(col);
+ } else {
+ return mappings;
+ }
+ }
+
+ private boolean checkMapping(String user,String domain, String mapping) {
+ Collection<String> mappings = getUserDomainMappings(user,domain);
+ if (mappings != null && mappings.contains(mapping)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
}
Modified: james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/VirtualUserTableUtil.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/VirtualUserTableUtil.java?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/VirtualUserTableUtil.java (original)
+++ james/server/trunk/user-library/src/main/java/org/apache/james/impl/vut/VirtualUserTableUtil.java Fri Sep 10 04:57:44 2010
@@ -171,7 +171,6 @@ public class VirtualUserTableUtil {
ArrayList<String> map = new ArrayList<String>();
StringTokenizer tokenizer = new StringTokenizer(rawMapping,
VirtualUserTableUtil.getSeparator(rawMapping));
-
while (tokenizer.hasMoreTokens()) {
final String raw = tokenizer.nextToken().trim();
map.add(raw);
@@ -187,12 +186,9 @@ public class VirtualUserTableUtil {
*/
public static String CollectionToMapping(Collection map) {
StringBuffer mapping = new StringBuffer();
-
Iterator mappings = map.iterator();
-
while (mappings.hasNext()) {
mapping.append(mappings.next());
-
if (mappings.hasNext()) {
mapping.append(";");
}
Modified: james/server/trunk/user-library/src/test/java/org/apache/james/vut/AbstractVirtualUserTableTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/src/test/java/org/apache/james/vut/AbstractVirtualUserTableTest.java?rev=995669&r1=995668&r2=995669&view=diff
==============================================================================
--- james/server/trunk/user-library/src/test/java/org/apache/james/vut/AbstractVirtualUserTableTest.java (original)
+++ james/server/trunk/user-library/src/test/java/org/apache/james/vut/AbstractVirtualUserTableTest.java Fri Sep 10 04:57:44 2010
@@ -30,6 +30,11 @@ import org.apache.james.api.vut.manageme
import org.apache.james.impl.vut.AbstractVirtualUserTable;
import org.apache.james.lifecycle.LifecycleUtil;
+/**
+ * The abstract test for the virtual user table.
+ * Contains tests related to simple, regexp, wildcard, error,...
+ * Extend this and instanciate the needed virtualUserTable implementation.
+ */
public abstract class AbstractVirtualUserTableTest extends TestCase {
protected AbstractVirtualUserTable virtualUserTable;
@@ -48,9 +53,9 @@ public abstract class AbstractVirtualUse
Map<String,Collection<String>> mappings = virtualUserTable.getAllMappings();
if (mappings != null) {
+
Iterator<String> mappingsIt = virtualUserTable.getAllMappings().keySet().iterator();
-
while(mappingsIt.hasNext()) {
String key = mappingsIt.next().toString();
String args[] = key.split("@");
@@ -73,25 +78,6 @@ public abstract class AbstractVirtualUse
}
- private void removeMapping(String user, String domain, String rawMapping) throws InvalidMappingException {
- if (rawMapping.startsWith(VirtualUserTable.ERROR_PREFIX)) {
- removeMapping(user, domain, rawMapping.substring(VirtualUserTable.ERROR_PREFIX.length()), ERROR_TYPE);
- } else if (rawMapping.startsWith(VirtualUserTable.REGEX_PREFIX)) {
- removeMapping(user, domain, rawMapping.substring(VirtualUserTable.REGEX_PREFIX.length()), REGEX_TYPE);
- } else if (rawMapping.startsWith(VirtualUserTable.ALIASDOMAIN_PREFIX)) {
- removeMapping(user, domain, rawMapping.substring(VirtualUserTable.ALIASDOMAIN_PREFIX.length()), ALIASDOMAIN_TYPE);
- } else {
- removeMapping(user, domain, rawMapping, ADDRESS_TYPE);
- }
- }
-
- protected abstract AbstractVirtualUserTable getVirtualUserTable() throws Exception;
-
- protected abstract boolean addMapping(String user , String domain, String mapping,int type)throws InvalidMappingException;
-
- protected abstract boolean removeMapping(String user, String domain, String mapping, int type) throws InvalidMappingException;
-
-
public void testStoreAndRetrieveRegexMapping() throws ErrorMappingException {
String user = "test";
@@ -107,9 +93,8 @@ public abstract class AbstractVirtualUse
assertTrue("Added virtual mapping", addMapping(user, domain, regex, REGEX_TYPE));
assertTrue("Added virtual mapping", addMapping(user, domain, regex2, REGEX_TYPE));
-
- assertEquals("Two mappings",virtualUserTable.getMappings(user, domain).size(), 2);
- assertEquals("One mappingline",virtualUserTable.getAllMappings().size(),1);
+ assertEquals("Two mappings", virtualUserTable.getMappings(user, domain).size(), 2);
+ assertEquals("One mappingline", virtualUserTable.getAllMappings().size(), 1);
assertTrue("remove virtual mapping", removeMapping(user, domain, regex, REGEX_TYPE));
@@ -121,9 +106,10 @@ public abstract class AbstractVirtualUse
assertTrue("Invalid Mapping throw exception" , catched);
assertTrue("remove virtual mapping", removeMapping(user, domain, regex2, REGEX_TYPE));
- assertNull("No mapping",virtualUserTable.getMappings(user, domain));
- assertNull("No mappings",virtualUserTable.getAllMappings());
+ assertNull("No mapping", virtualUserTable.getMappings(user, domain));
+
+ assertNull("No mappings", virtualUserTable.getAllMappings());
} catch (InvalidMappingException e) {
fail("Storing failed");
@@ -146,8 +132,8 @@ public abstract class AbstractVirtualUse
assertTrue("Added virtual mapping", addMapping(user, domain, address, ADDRESS_TYPE));
assertTrue("Added virtual mapping", addMapping(user, domain, address2, ADDRESS_TYPE));
- assertEquals("Two mappings",virtualUserTable.getMappings(user, domain).size(),2);
- assertEquals("One mappingline",virtualUserTable.getAllMappings().size(),1);
+ assertEquals("Two mappings", virtualUserTable.getMappings(user, domain).size(),2);
+ assertEquals("One mappingline", virtualUserTable.getAllMappings().size(),1);
assertTrue("remove virtual mapping", removeMapping(user, domain, address, ADDRESS_TYPE));
@@ -166,8 +152,8 @@ public abstract class AbstractVirtualUse
assertTrue("remove virtual mapping", removeMapping(user, domain, address2, ADDRESS_TYPE));
- assertNull("No mapping",virtualUserTable.getMappings(user, domain));
- assertNull("No mappings",virtualUserTable.getAllMappings());
+ assertNull("No mapping", virtualUserTable.getMappings(user, domain));
+ assertNull("No mappings", virtualUserTable.getAllMappings());
} catch (InvalidMappingException e) {
fail("Storing failed");
@@ -188,7 +174,7 @@ public abstract class AbstractVirtualUse
assertNull("No mapping",virtualUserTable.getMappings(user, domain));
assertTrue("Added virtual mapping", addMapping(user, domain, error, ERROR_TYPE));
- assertEquals("One mappingline",virtualUserTable.getAllMappings().size(),1);
+ assertEquals("One mappingline", virtualUserTable.getAllMappings().size(),1);
try {
virtualUserTable.getMappings(user, domain);
@@ -198,8 +184,8 @@ public abstract class AbstractVirtualUse
assertTrue("Error Mapping throw exception" , catched);
assertTrue("remove virtual mapping", removeMapping(user, domain, error, ERROR_TYPE));
- assertNull("No mapping",virtualUserTable.getMappings(user, domain));
- assertNull("No mappings",virtualUserTable.getAllMappings());
+ assertNull("No mapping", virtualUserTable.getMappings(user, domain));
+ assertNull("No mappings", virtualUserTable.getAllMappings());
} catch (InvalidMappingException e) {
fail("Storing failed");
@@ -300,4 +286,22 @@ public abstract class AbstractVirtualUse
}
+ protected abstract AbstractVirtualUserTable getVirtualUserTable() throws Exception;
+
+ protected abstract boolean addMapping(String user , String domain, String mapping,int type)throws InvalidMappingException;
+
+ protected abstract boolean removeMapping(String user, String domain, String mapping, int type) throws InvalidMappingException;
+
+ private void removeMapping(String user, String domain, String rawMapping) throws InvalidMappingException {
+ if (rawMapping.startsWith(VirtualUserTable.ERROR_PREFIX)) {
+ removeMapping(user, domain, rawMapping.substring(VirtualUserTable.ERROR_PREFIX.length()), ERROR_TYPE);
+ } else if (rawMapping.startsWith(VirtualUserTable.REGEX_PREFIX)) {
+ removeMapping(user, domain, rawMapping.substring(VirtualUserTable.REGEX_PREFIX.length()), REGEX_TYPE);
+ } else if (rawMapping.startsWith(VirtualUserTable.ALIASDOMAIN_PREFIX)) {
+ removeMapping(user, domain, rawMapping.substring(VirtualUserTable.ALIASDOMAIN_PREFIX.length()), ALIASDOMAIN_TYPE);
+ } else {
+ removeMapping(user, domain, rawMapping, ADDRESS_TYPE);
+ }
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
Re: svn commit: r995669 - in /james/server/trunk: spring-deployment/src/main/config/james/
spring-deployment/src/main/config/james/META-INF/ user-function/ user-function/src/main/java/org/apache/james/vut/
user-function/src/main/java/org/apache/james/vut/m...
Posted by Norman <no...@apache.org>.
Hi Eric,
good work :) Just two minor corrections / questions ..
Am 10.09.2010 06:57, schrieb eric@apache.org:
> \ No newline at end of file
> + -->
> +<!-- The DefaultVirtualUserTable for storing James' VirtualUserTable mappings. -->
> +<table name="DefaultVirtualUserTable" class="org.apache.james.vut.JPAVirtualUserTable" destinationURL="db://maildb/VirtualUserTable">
> +<recursiveMapping> true</recursiveMapping>
> +<mappingLimit> 10</mappingLimit>
> +</table>
> +</virtualusertable-store>
>
The "destinationURL" should get removed here if I'm not wrong because
JPA does not care about it.
> Modified: james/server/trunk/user-function/pom.xml
> URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/pom.xml?rev=995669&r1=995668&r2=995669&view=diff
> ==============================================================================
> --- james/server/trunk/user-function/pom.xml (original)
> +++ james/server/trunk/user-function/pom.xml Fri Sep 10 04:57:44 2010
> @@ -36,7 +36,7 @@
> <artifactId>openjpa-maven-plugin</artifactId>
> <version>1.0</version>
> <configuration>
> -<includes>org/apache/james/userrepository/JPAUser.class</includes>
> +<includes>org/apache/james/userrepository/JPAUser.class,org/apache/james/vut/model/JPAVirtualUser.class</includes>
>
Maybe we want to put the JPAUser.class in a model package too, to be
more consistent..
Thx,
Norman
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
Re: svn commit: r995669 - in /james/server/trunk: spring-deployment/src/main/config/james/
spring-deployment/src/main/config/james/META-INF/ user-function/ user-function/src/main/java/org/apache/james/vut/
user-function/src/main/java/org/apache/james/vut/m...
Posted by Eric Charles <er...@apache.org>.
Hi Norman,
Yep, I missed the destinationURL: will remove it.
I had the JPADomain to model package as todo for today. Will also do
JPAUser move :)
Tks for caring,
Eric
On 10/09/2010 07:40, Norman wrote:
> Hi Eric,
>
> good work :) Just two minor corrections / questions ..
>
> Am 10.09.2010 06:57, schrieb eric@apache.org:
>> \ No newline at end of file
>> + -->
>> +<!-- The DefaultVirtualUserTable for storing James'
>> VirtualUserTable mappings. -->
>> +<table name="DefaultVirtualUserTable"
>> class="org.apache.james.vut.JPAVirtualUserTable"
>> destinationURL="db://maildb/VirtualUserTable">
>> +<recursiveMapping> true</recursiveMapping>
>> +<mappingLimit> 10</mappingLimit>
>> +</table>
>> +</virtualusertable-store>
>
> The "destinationURL" should get removed here if I'm not wrong because
> JPA does not care about it.
>
>> Modified: james/server/trunk/user-function/pom.xml
>> URL:
>> http://svn.apache.org/viewvc/james/server/trunk/user-function/pom.xml?rev=995669&r1=995668&r2=995669&view=diff
>> ==============================================================================
>>
>> --- james/server/trunk/user-function/pom.xml (original)
>> +++ james/server/trunk/user-function/pom.xml Fri Sep 10 04:57:44 2010
>> @@ -36,7 +36,7 @@
>> <artifactId>openjpa-maven-plugin</artifactId>
>> <version>1.0</version>
>> <configuration>
>> -<includes>org/apache/james/userrepository/JPAUser.class</includes>
>> +<includes>org/apache/james/userrepository/JPAUser.class,org/apache/james/vut/model/JPAVirtualUser.class</includes>
>>
>
> Maybe we want to put the JPAUser.class in a model package too, to be
> more consistent..
>
> Thx,
> Norman
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
> For additional commands, e-mail: server-dev-help@james.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org