Author: eric
Date: Wed Dec 19 11:22:57 2012
New Revision: 1423827

URL: http://svn.apache.org/viewvc?rev=1423827&view=rev
Log:
Fix rewrite recipients to both local and remote users, patch contributed by 
Eike Kettner  (JAMES-1443)

Added:
    
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
    
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
Removed:
    
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/smime/
Modified:
    
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
    
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java

Modified: 
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java?rev=1423827&r1=1423826&r2=1423827&view=diff
==============================================================================
--- 
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
 (original)
+++ 
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
 Wed Dec 19 11:22:57 2012
@@ -157,7 +157,6 @@ public abstract class AbstractRecipientR
                         logBuffer.append(", ");
                 }
                 getMailetContext().log(logBuffer.toString());
-                return null;
             } catch (MessagingException me) {
                 StringBuffer logBuffer = new StringBuffer(128).append("Error 
forwarding mail to ");
                 for (Iterator<MailAddress> j = remoteRecipients.iterator(); 
j.hasNext();) {

Added: 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java?rev=1423827&view=auto
==============================================================================
--- 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
 (added)
+++ 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
 Wed Dec 19 11:22:57 2012
@@ -0,0 +1,148 @@
+/****************************************************************
+ * 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.transport.mailets;
+
+import org.apache.james.rrt.api.RecipientRewriteTableException;
+
+import java.util.*;
+
+/**
+ * @since 15.12.12 11:40
+ */
+public class RecipientRewriteTableMock implements 
org.apache.james.rrt.api.RecipientRewriteTable {
+
+    public static class Mapping {
+        public final String address;
+        public final List<String> target;
+
+        public Mapping(String address, List<String> target) {
+            this.address = address;
+            this.target = target;
+        }
+
+        public Mapping(String address) {
+            this.address = address;
+            this.target = null;
+        }
+
+        public Mapping to(String... target) {
+            return new Mapping(address, Arrays.asList(target));
+        }
+    }
+
+    public static Mapping mapFrom(String from) {
+        return new Mapping(from);
+    }
+
+    public static RecipientRewriteTableMock rewriteTableMock(Mapping... 
mappings) {
+        return new RecipientRewriteTableMock(Arrays.asList(mappings));
+    }
+
+    private final List<Mapping> mappings = new LinkedList<Mapping>();
+
+    private RecipientRewriteTableMock(List<Mapping> mappings) {
+        this.mappings.addAll(mappings);
+    }
+
+    private List<Mapping> findUserDomain(String user, String domain) {
+        List<Mapping> results = new LinkedList<Mapping>();
+        for (Mapping m : mappings) {
+            String[] parts = m.address.split("@", 2);
+            if (parts.length == 2) {
+                if (user.equals(parts[0]) && domain.equals(parts[1])) {
+                    results.add(m);
+                }
+            }
+        }
+        return results;
+    }
+
+    @Override
+    public Collection<String> getMappings(String user, String domain) throws 
ErrorMappingException, RecipientRewriteTableException {
+        List<String> recipients = new LinkedList<String>();
+        for (Mapping m : findUserDomain(user, domain)) {
+            recipients.addAll(m.target);
+        }
+        if (recipients.isEmpty()) {
+            return null;
+        } else {
+            return recipients;
+        }
+    }
+
+    @Override
+    public void addRegexMapping(String user, String domain, String regex) 
throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void removeRegexMapping(String user, String domain, String regex) 
throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void addAddressMapping(String user, String domain, String address) 
throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void removeAddressMapping(String user, String domain, String 
address) throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void addErrorMapping(String user, String domain, String error) 
throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void removeErrorMapping(String user, String domain, String error) 
throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public Collection<String> getUserDomainMappings(String user, String 
domain) throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void addMapping(String user, String domain, String mapping) throws 
RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void removeMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public Map<String, Collection<String>> getAllMappings() throws 
RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void addAliasDomainMapping(String aliasDomain, String realDomain) 
throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void removeAliasDomainMapping(String aliasDomain, String 
realDomain) throws RecipientRewriteTableException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+}

Modified: 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java?rev=1423827&r1=1423826&r2=1423827&view=diff
==============================================================================
--- 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java
 (original)
+++ 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java
 Wed Dec 19 11:22:57 2012
@@ -18,28 +18,34 @@
  ****************************************************************/
 package org.apache.james.transport.mailets;
 
-import java.util.*;
-import javax.mail.MessagingException;
-import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
+import org.apache.mailet.MailetContext;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.apache.mailet.base.test.FakeMimeMessage;
 import org.junit.After;
-import static org.junit.Assert.*;
 import org.junit.Before;
 import org.junit.Test;
 
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+
+import static 
org.apache.james.transport.mailets.RecipientRewriteTableMock.mapFrom;
+import static 
org.apache.james.transport.mailets.RecipientRewriteTableMock.rewriteTableMock;
+import static org.junit.Assert.assertEquals;
+
 public class RecipientRewriteTableTest {
 
     private org.apache.james.transport.mailets.RecipientRewriteTable table;
 
     @Before
     public void setUp() throws Exception {
-
-        table = new org.apache.james.transport.mailets.RecipientRewriteTable();
         final FakeMailContext mockMailetContext = new FakeMailContext() {
 
             @Override
@@ -51,99 +57,23 @@ public class RecipientRewriteTableTest {
                 return false;
             }
         };
-        FakeMailetConfig mockMailetConfig = new FakeMailetConfig("vut", 
mockMailetContext, new Properties());
-        // mockMailetConfig.put("recipientrewritetable", "vut");
-
-        table.setRecipientRewriteTable(new 
org.apache.james.rrt.api.RecipientRewriteTable() {
-
-            @Override
-            public Collection<String> getMappings(String user, String domain) 
throws ErrorMappingException,
-                    RecipientRewriteTableException {
-                if (user.equals("test") && domain.equals("localhost")) {
-                    return Arrays.asList(new String[]{"whatever@localhost", 
"blah@localhost"});
-                }
-                return null;
-            }
-
-            @Override
-            public void addRegexMapping(String user, String domain, String 
regex) throws RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-            }
-
-            @Override
-            public void removeRegexMapping(String user, String domain, String 
regex) throws
-                    RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-
-            @Override
-            public void addAddressMapping(String user, String domain, String 
address) throws
-                    RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-
-            @Override
-            public void removeAddressMapping(String user, String domain, 
String address) throws
-                    RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-
-            @Override
-            public void addErrorMapping(String user, String domain, String 
error) throws RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-
-            @Override
-            public void removeErrorMapping(String user, String domain, String 
error) throws
-                    RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
 
-            }
-
-            @Override
-            public Collection<String> getUserDomainMappings(String user, 
String domain) throws
-                    RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-            }
-
-            @Override
-            public void addMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-
-            @Override
-            public void removeMapping(String user, String domain, String 
mapping) throws RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-
-            @Override
-            public Map<String, Collection<String>> getAllMappings() throws 
RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-            }
-
-            @Override
-            public void addAliasDomainMapping(String aliasDomain, String 
realDomain) throws
-                    RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-
-            @Override
-            public void removeAliasDomainMapping(String aliasDomain, String 
realDomain) throws
-                    RecipientRewriteTableException {
-                throw new UnsupportedOperationException("Not implemented");
-
-            }
-        });
+        table = createRecipientRewriteMailet(
+            
rewriteTableMock(mapFrom("test@localhost").to("whatever@localhost", 
"blah@localhost")),
+            mockMailetContext
+        );
+    }
 
-        table.init(mockMailetConfig);
+    private static RecipientRewriteTable createRecipientRewriteMailet(
+            org.apache.james.rrt.api.RecipientRewriteTable vut,
+            MailetContext mailContext) throws MessagingException {
+        RecipientRewriteTable rrt = new 
org.apache.james.transport.mailets.RecipientRewriteTable();
 
+        FakeMailetConfig mockMailetConfig = new FakeMailetConfig("vut", 
mailContext, new Properties());
+        // mockMailetConfig.put("recipientrewritetable", "vut");
+        rrt.setRecipientRewriteTable(vut);
+        rrt.init(mockMailetConfig);
+        return rrt;
     }
 
     @After
@@ -178,4 +108,35 @@ public class RecipientRewriteTableTest {
         mail.setMessage(new FakeMimeMessage());
         return mail;
     }
+
+    @Test
+    public void testMixedLocalAndRemoteRecipients() throws Exception {
+        RecordingMailContext context = new RecordingMailContext();
+        RecipientRewriteTable mailet = createRecipientRewriteMailet(
+            rewriteTableMock(mapFrom("mixed@localhost").to("a@localhost", 
"[email protected]")),
+            context
+        );
+        Mail mail = createMail(new String[]{"mixed@localhost"});
+        mailet.service(mail);
+        //the mail must be send via the context to [email protected], the other
+        //recipient a@localhost must be in the recipient list of the message
+        //after processing.
+        assertEquals(context.getSendmails().size(), 1);
+        MimeMessage msg = context.getSendmails().get(0).getMessage();
+        if (msg == null) {
+            msg = context.getSendmails().get(0).getMail().getMessage();
+        }
+        if (msg.getRecipients(Message.RecipientType.TO).length == 1) {
+            
assertEquals(msg.getRecipients(Message.RecipientType.TO)[0].toString(), 
"[email protected]");
+        } else {
+            assertEquals(context.getSendmails().get(0).getRecipients().size(), 
1);
+            MailAddress rec = 
context.getSendmails().get(0).getRecipients().iterator().next();
+            assertEquals(rec.toInternetAddress().toString(), 
"[email protected]");
+        }
+
+        assertEquals(mail.getRecipients().size(), 1);
+        MailAddress localRec = (MailAddress) 
mail.getRecipients().iterator().next();
+        assertEquals(localRec.toInternetAddress().toString(), "a@localhost");
+    }
+
 }

Added: 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java?rev=1423827&view=auto
==============================================================================
--- 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
 (added)
+++ 
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
 Wed Dec 19 11:22:57 2012
@@ -0,0 +1,121 @@
+/****************************************************************
+ * 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.transport.mailets;
+
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.test.FakeMailContext;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @since 15.12.12 12:02
+ */
+public class RecordingMailContext extends FakeMailContext {
+
+    private final List<SendMailEvent> sendmails = new 
LinkedList<SendMailEvent>();
+
+    @Override
+    public boolean isLocalServer(String serverName) {
+        return "localhost".equals(serverName);
+    }
+
+    @Override
+    public void sendMail(Mail mail) throws MessagingException {
+        sendmails.add(new SendMailEvent(mail));
+    }
+
+    @Override
+    public void sendMail(MimeMessage msg) throws MessagingException {
+       sendmails.add(new SendMailEvent(msg));
+    }
+
+    @Override
+    public void sendMail(MailAddress sender, Collection recipients, 
MimeMessage msg) throws MessagingException {
+        sendmails.add(new SendMailEvent(msg, sender, recipients));
+    }
+
+    @Override
+    public void sendMail(MailAddress sender, Collection recipients, 
MimeMessage msg, String state) throws MessagingException {
+        sendmails.add(new SendMailEvent(msg, sender, recipients, state));
+    }
+
+    public List<SendMailEvent> getSendmails() {
+        return sendmails;
+    }
+
+    public static class SendMailEvent {
+        private final Object message;
+        private final MailAddress sender;
+        private final Collection<MailAddress> recipients;
+        private final String state;
+
+        private SendMailEvent(Object message, MailAddress sender, 
Collection<MailAddress> recipients, String state) {
+            this.message = message;
+            this.sender = sender;
+            this.recipients = recipients;
+            this.state = state;
+        }
+
+        public SendMailEvent(Mail mail) {
+            this(mail, null, null, null);
+        }
+
+        public SendMailEvent(MimeMessage mail) {
+            this(mail, null, null, null);
+        }
+
+        public SendMailEvent(MimeMessage mail, MailAddress sender, 
Collection<MailAddress> recipients) {
+            this(mail, sender, recipients, null);
+        }
+        public SendMailEvent(MimeMessage mail, MailAddress sender, 
Collection<MailAddress> recipients, String state) {
+            this((Object)mail, sender, recipients, state);
+        }
+
+        public Mail getMail() {
+            if (message instanceof Mail) {
+                return (Mail) message;
+            }
+            return null;
+        }
+        public MimeMessage getMessage() {
+            if (message instanceof MimeMessage) {
+                return  (MimeMessage) message;
+            }
+            return null;
+        }
+
+        public MailAddress getSender() {
+            return sender;
+        }
+
+        public Collection<MailAddress> getRecipients() {
+            return recipients;
+        }
+
+        public String getState() {
+            return state;
+        }
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to