diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mappings.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mappings.java index 20085202109..d91046b5cf9 100644 --- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mappings.java +++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mappings.java @@ -28,8 +28,6 @@ public interface Mappings extends Iterable { Mappings addAll(Mappings toAdd); - void add(String mapping); - boolean contains(String mapping); int size(); diff --git a/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java b/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java index 13bbe2187d9..619f8de19cd 100644 --- a/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java +++ b/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java @@ -28,10 +28,13 @@ import org.apache.james.rrt.lib.AbstractRecipientRewriteTableTest; import org.apache.james.rrt.lib.Mappings; import org.apache.james.rrt.lib.MappingsImpl; +import org.apache.james.rrt.lib.MappingsImpl.Builder; import org.apache.james.rrt.lib.RecipientRewriteTableUtil; import org.junit.Before; import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; + /** * Test the XML Virtual User Table implementation. */ @@ -59,31 +62,33 @@ protected boolean addMapping(String user, String domain, String mapping, int typ Mappings mappings = virtualUserTable.getUserDomainMappings(user, domain); - if (mappings == null) { - mappings = MappingsImpl.empty(); - } else { + if (mappings != null) { removeMappingsFromConfig(user, domain, mappings); } + Builder builder = MappingsImpl.from(Optional.fromNullable(mappings).or(MappingsImpl.empty())); + if (type == ERROR_TYPE) { - mappings.add(RecipientRewriteTable.ERROR_PREFIX + mapping); + builder.add(RecipientRewriteTable.ERROR_PREFIX + mapping); } else if (type == REGEX_TYPE) { - mappings.add(RecipientRewriteTable.REGEX_PREFIX + mapping); + builder.add(RecipientRewriteTable.REGEX_PREFIX + mapping); } else if (type == ADDRESS_TYPE) { - mappings.add(mapping); + builder.add(mapping); } else if (type == ALIASDOMAIN_TYPE) { - mappings.add(RecipientRewriteTable.ALIASDOMAIN_PREFIX + mapping); + builder.add(RecipientRewriteTable.ALIASDOMAIN_PREFIX + mapping); } - if (mappings.size() > 0) { + Mappings updatedMappings = builder.build(); + + if (!updatedMappings.isEmpty()) { defaultConfiguration.addProperty("mapping", user + "@" + domain + "=" + RecipientRewriteTableUtil. - CollectionToMapping(mappings)); + CollectionToMapping(updatedMappings)); } try { virtualUserTable.configure(defaultConfiguration); } catch (Exception e) { - return mappings.size() <= 0; + return updatedMappings.size() <= 0; } return true; diff --git a/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java b/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java index 0ee04bd4ea0..7879742d35f 100644 --- a/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java +++ b/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java @@ -37,11 +37,14 @@ import org.apache.james.rrt.lib.AbstractRecipientRewriteTable; import org.apache.james.rrt.lib.Mappings; import org.apache.james.rrt.lib.MappingsImpl; +import org.apache.james.rrt.lib.MappingsImpl.Builder; import org.apache.james.rrt.lib.RecipientRewriteTableUtil; import org.apache.james.system.hbase.TablePool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; + /** * Implementation of the RecipientRewriteTable for a HBase persistence. */ @@ -62,8 +65,8 @@ protected void addMappingInternal(String user, String domain, String mapping) th String fixedDomain = getFixedDomain(domain); Mappings map = getUserDomainMappings(fixedUser, fixedDomain); if (map != null && map.size() != 0) { - map.add(mapping); - doUpdateMapping(fixedUser, fixedDomain, RecipientRewriteTableUtil.CollectionToMapping(map)); + Mappings updatedMappings = MappingsImpl.from(map).add(mapping).build(); + doUpdateMapping(fixedUser, fixedDomain, RecipientRewriteTableUtil.CollectionToMapping(updatedMappings.getMappings())); } else { doAddMapping(fixedUser, fixedDomain, mapping); } @@ -131,12 +134,14 @@ protected Map getAllMappingsInternal() throws RecipientRewrite if (map == null) { map = new HashMap(); } - Mappings list = map.get(email); - if (list == null) { - list = MappingsImpl.empty(); - } - list.add(Bytes.toString(keyValue.getRow())); - map.put(email, list); + Mappings mappings = + MappingsImpl.from( + Optional.fromNullable( + map.get(email)) + .or(MappingsImpl.empty())) + .add(Bytes.toString(keyValue.getRow())) + .build(); + map.put(email, mappings); } } } diff --git a/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java b/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java index 85775c77d3c..7d2dcbc4547 100644 --- a/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java +++ b/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java @@ -209,8 +209,8 @@ protected void addMappingInternal(String user, String domain, String regex) thro String fixedDomain = getFixedDomain(domain); Mappings map = getUserDomainMappings(fixedUser, fixedDomain); if (map != null && map.size() != 0) { - map.add(regex); - doUpdateMapping(fixedUser, fixedDomain, RecipientRewriteTableUtil.CollectionToMapping(map)); + Mappings updatedMappings = MappingsImpl.from(map).add(regex).build(); + doUpdateMapping(fixedUser, fixedDomain, RecipientRewriteTableUtil.CollectionToMapping(updatedMappings)); } doAddMapping(fixedUser, fixedDomain, regex); } diff --git a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java index c1312a46b97..5b9d45de431 100644 --- a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java +++ b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java @@ -65,8 +65,8 @@ protected void addMappingInternal(String user, String domain, String mapping) th String fixedDomain = getFixedDomain(domain); Mappings map = getUserDomainMappings(fixedUser, fixedDomain); if (map != null && map.size() != 0) { - map.add(mapping); - doUpdateMapping(fixedUser, fixedDomain, RecipientRewriteTableUtil.CollectionToMapping(map)); + Mappings updatedMappings = MappingsImpl.from(map).add(mapping).build(); + doUpdateMapping(fixedUser, fixedDomain, RecipientRewriteTableUtil.CollectionToMapping(updatedMappings)); } else { doAddMapping(fixedUser, fixedDomain, mapping); } diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java index 330b03656fb..9d3a1c5fe26 100644 --- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java +++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java @@ -126,7 +126,7 @@ public Mappings getMappings(String user, String domain, int mappingLimit) throws // Only non-null mappings are translated if (targetString != null) { - Mappings mappings = MappingsImpl.empty(); + MappingsImpl.Builder mappings = MappingsImpl.builder(); if (targetString.startsWith(RecipientRewriteTable.ERROR_PREFIX)) { throw new ErrorMappingException(targetString.substring(RecipientRewriteTable.ERROR_PREFIX.length())); @@ -189,7 +189,7 @@ public Mappings getMappings(String user, String domain, int mappingLimit) throws } } - return mappings; + return mappings.build(); } diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java index edb4b74e07a..e7109337437 100644 --- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java +++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java @@ -23,9 +23,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; -import java.util.List; import java.util.StringTokenizer; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -53,6 +53,40 @@ public static Mappings fromCollection(Collection mappings) { return new MappingsImpl(mappings); } + public static Builder from(Mappings from) { + Builder builder = new Builder(); + builder.addAll(from); + return builder; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private final ImmutableList.Builder mappings; + + private Builder() { + mappings = ImmutableList.builder(); + } + + public Builder add(String mapping) { + mappings.add(mapping); + return this; + } + + public Builder addAll(Mappings mappings) { + this.mappings.addAll(mappings); + return this; + } + + public Mappings build() { + return new MappingsImpl(mappings.build()); + } + + } + private final Collection mappings; private MappingsImpl(Collection mappings) { @@ -74,11 +108,6 @@ public Mappings addAll(Mappings toAdd) { return MappingsImpl.fromCollection(Lists.newArrayList(Iterables.concat(this, toAdd.getMappings()))); } - @Override - public void add(String mapping) { - mappings.add(mapping); - } - @Override public boolean contains(String mapping) { return mappings.contains(mapping); @@ -94,10 +123,6 @@ public boolean remove(String mapping) { return mappings.remove(mapping); } - public void addAll(List target) { - mappings.addAll(target); - } - @Override public boolean isEmpty() { return mappings.isEmpty(); diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java index 52f9dec245b..a1b821db250 100644 --- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java +++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java @@ -29,6 +29,7 @@ import org.apache.james.rrt.api.RecipientRewriteTableException; import org.apache.james.rrt.lib.Mappings; import org.apache.james.rrt.lib.MappingsImpl; +import org.apache.james.rrt.lib.MappingsImpl.Builder; import org.apache.james.user.api.JamesUsersRepository; import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; @@ -121,7 +122,7 @@ public void updateUser(User user) throws UsersRepositoryException { * java.lang.String) */ public Mappings getMappings(String username, String domain) throws ErrorMappingException, RecipientRewriteTableException { - MappingsImpl mappings = MappingsImpl.empty(); + Builder mappingsBuilder = MappingsImpl.builder(); try { User user = getUserByName(username); @@ -131,14 +132,14 @@ public Mappings getMappings(String username, String domain) throws ErrorMappingE if (enableAliases && jUser.getAliasing()) { String alias = jUser.getAlias(); if (alias != null) { - mappings.add(alias + "@" + domain); + mappingsBuilder.add(alias + "@" + domain); } } if (enableForwarding && jUser.getForwarding()) { String forward; if (jUser.getForwardingDestination() != null && ((forward = jUser.getForwardingDestination().toString()) != null)) { - mappings.add(forward); + mappingsBuilder.add(forward); } else { String errorBuffer = "Forwarding was enabled for " + username + " but no forwarding address was set for this account."; getLogger().error(errorBuffer); @@ -148,6 +149,7 @@ public Mappings getMappings(String username, String domain) throws ErrorMappingE } catch (UsersRepositoryException e) { throw new RecipientRewriteTableException("Unable to lookup forwards/aliases", e); } + Mappings mappings = mappingsBuilder.build(); if (mappings.size() == 0) { return null; } else { diff --git a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/mock/MockRecipientRewriteTableManagementImpl.java b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/mock/MockRecipientRewriteTableManagementImpl.java index 5988f1c8ebe..831f660070b 100644 --- a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/mock/MockRecipientRewriteTableManagementImpl.java +++ b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/mock/MockRecipientRewriteTableManagementImpl.java @@ -109,18 +109,17 @@ public Mappings getMappings(String user, String domain) throws ErrorMappingExcep } private void addRawMapping(String user, String domain, String mapping) throws RecipientRewriteTableException { - MappingsImpl map; String key = user + "@" + domain; String mappings = (String) store.get(key); if (mappings != null) { - map = MappingsImpl.fromRawString(mappings); + MappingsImpl map = MappingsImpl.fromRawString(mappings); if (map.contains(mapping)) { throw new RecipientRewriteTableException("Mapping " + mapping + " already exist!"); } else { - map.add(mapping); - store.put(key, RecipientRewriteTableUtil.CollectionToMapping(map)); + Mappings updateMappings = MappingsImpl.from(map).add(mapping).build(); + store.put(key, RecipientRewriteTableUtil.CollectionToMapping(updateMappings)); } } else { store.put(key, mapping); diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java index a94687641a4..404e9313881 100644 --- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java +++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -115,13 +116,12 @@ private RecipientRewriteTable setUpRecipientRewriteTable() { @Override public Mappings getMappings(String user, String domain) throws ErrorMappingException, RecipientRewriteTableException { - Mappings mappings = MappingsImpl.empty(); if (user.equals(USER1)) { - mappings.add("address@localhost"); + return MappingsImpl.fromCollection(Arrays.asList("address@localhost")); } else if (user.equals(USER2)) { throw new ErrorMappingException("554 BOUNCE"); } - return mappings; + return MappingsImpl.empty(); } @Override