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 ro...@apache.org on 2016/11/23 13:50:43 UTC

[40/46] james-project git commit: JAMES-1854 Sieve should be handled as a separate mailet

JAMES-1854 Sieve should be handled as a separate mailet


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/71accd66
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/71accd66
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/71accd66

Branch: refs/heads/master
Commit: 71accd66d33dfec90a3efe3011170b5e90d4b90b
Parents: 6a2d188
Author: Benoit Tellier <bt...@linagora.com>
Authored: Fri Nov 18 14:33:32 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Nov 23 18:19:35 2016 +0700

----------------------------------------------------------------------
 .../guice/destination/conf/mailetcontainer.xml  |   1 +
 .../spring/destination/conf/mailetcontainer.xml |   1 +
 .../main/resources/mailetcontainer-template.xml |   1 +
 .../apache/james/utils/ExtendedServerProbe.java |   2 +
 .../apache/james/utils/GuiceServerProbe.java    |   7 +-
 .../org/apache/james/mailets/SieveDelivery.java |  98 ++++
 .../mailets/configuration/CommonProcessors.java |   4 +
 .../james/mailets/utils/IMAPMessageReader.java  |   6 +-
 .../apache/james/transport/mailets/Sieve.java   | 135 +++++
 .../transport/mailets/SieveLocalDelivery.java   | 103 ----
 .../mailets/SieveToRecipientFolder.java         | 105 ----
 .../transport/mailets/delivery/MailStore.java   |   2 +
 .../mailets/delivery/MailboxAppender.java       |  11 +-
 .../mailets/delivery/SimpleMailStore.java       |  12 +-
 .../transport/mailets/jsieve/ActionContext.java |   3 +-
 .../mailets/jsieve/FileIntoAction.java          |  35 +-
 .../james/transport/mailets/jsieve/Poster.java  |   4 +-
 .../mailets/jsieve/RedirectAction.java          |   1 -
 .../transport/mailets/jsieve/RejectAction.java  |   2 -
 .../mailets/jsieve/SieveMailAdapter.java        |   3 +-
 .../mailets/jsieve/delivery/SieveExecutor.java  | 192 +++++++
 .../mailets/jsieve/delivery/SieveMailStore.java | 202 --------
 .../mailets/jsieve/delivery/SievePoster.java    |  20 +-
 .../mailets/delivery/LocalDeliveryTest.java     | 107 +---
 .../mailets/delivery/MailDispatcherTest.java    |   1 -
 .../mailets/delivery/MailboxAppenderTest.java   |  47 +-
 .../mailets/delivery/SieveIntegrationTest.java  | 495 ++++++++-----------
 .../mailets/delivery/SimpleMailStoreTest.java   |   6 +-
 .../mailets/delivery/ToRecipientFolderTest.java | 130 ++---
 .../src/test/resources/mailetcontainer.xml      |   1 +
 .../src/test/resources/mailetcontainer.xml      |   1 +
 .../src/test/resources/mailetcontainer.xml      |   1 +
 32 files changed, 774 insertions(+), 965 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/dockerfiles/run/guice/destination/conf/mailetcontainer.xml
----------------------------------------------------------------------
diff --git a/dockerfiles/run/guice/destination/conf/mailetcontainer.xml b/dockerfiles/run/guice/destination/conf/mailetcontainer.xml
index 25195ea..5008caa 100644
--- a/dockerfiles/run/guice/destination/conf/mailetcontainer.xml
+++ b/dockerfiles/run/guice/destination/conf/mailetcontainer.xml
@@ -85,6 +85,7 @@
             </mailet>
             <mailet match="All" class="RecipientRewriteTable" />
             <mailet match="RecipientIsLocal" class="org.apache.james.jmap.mailet.VacationMailet"/>
+            <mailet match="RecipientIsLocal" class="Sieve"/>
             <mailet match="RecipientIsLocal" class="LocalDelivery"/>
             <!--
             <mailet match="HostIsLocal" class="ToProcessor">

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
----------------------------------------------------------------------
diff --git a/dockerfiles/run/spring/destination/conf/mailetcontainer.xml b/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
index a62885c..710fd8c 100644
--- a/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
+++ b/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
@@ -81,6 +81,7 @@
                 <value>true</value>
             </mailet>
             <mailet match="All" class="RecipientRewriteTable" />
+            <mailet match="RecipientIsLocal" class="Sieve"/>
             <mailet match="RecipientIsLocal" class="LocalDelivery"/>
             <mailet match="HostIsLocal" class="ToProcessor">
                 <processor>local-address-error</processor>

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/app/src/main/resources/mailetcontainer-template.xml
----------------------------------------------------------------------
diff --git a/server/app/src/main/resources/mailetcontainer-template.xml b/server/app/src/main/resources/mailetcontainer-template.xml
index 9ca8191..2e3901a 100644
--- a/server/app/src/main/resources/mailetcontainer-template.xml
+++ b/server/app/src/main/resources/mailetcontainer-template.xml
@@ -430,6 +430,7 @@ Regards, Postmaster XXX.YYY
 	     </mailet>
 	
        <!-- Is the recipient is for a local account, deliver it locally -->
+       <mailet match="RecipientIsLocal" class="Sieve"/>
        <mailet match="RecipientIsLocal" class="LocalDelivery"/>
 
        <!-- If the host is handled by this server and it did not get -->

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/container/guice/guice-common/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/ExtendedServerProbe.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
index 7bc1a39..663215f 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
@@ -37,4 +37,6 @@ public interface ExtendedServerProbe extends ServerProbe {
 
     Mailbox getMailbox(String namespace, String user, String name);
 
+    void addActiveSieveScript(String user, String name, String script) throws Exception;
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
index e7457dd..61fd063 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
@@ -62,8 +62,8 @@ public class GuiceServerProbe implements ExtendedServerProbe, GuiceProbe {
     private final MailboxMapperFactory mailboxMapperFactory;
     private final DomainList domainList;
     private final UsersRepository usersRepository;
-    private final SieveRepository sieveRepository;
     private final RecipientRewriteTable recipientRewriteTable;
+    private final SieveRepository sieveRepository;
 
     @Inject
     private GuiceServerProbe(MailboxManager mailboxManager, MailboxMapperFactory mailboxMapperFactory,
@@ -349,4 +349,9 @@ public class GuiceServerProbe implements ExtendedServerProbe, GuiceProbe {
         sieveRepository.removeQuota(user);
     }
 
+    @Override
+    public void addActiveSieveScript(String user, String name, String script) throws Exception {
+        sieveRepository.putScript(user, name, script);
+        sieveRepository.setActive(user, name);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
new file mode 100644
index 0000000..950eefd
--- /dev/null
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
@@ -0,0 +1,98 @@
+/****************************************************************
+ * 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.mailets;
+
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailets.configuration.CommonProcessors;
+import org.apache.james.mailets.configuration.MailetContainer;
+import org.apache.james.mailets.utils.IMAPMessageReader;
+import org.apache.james.mailets.utils.SMTPMessageSender;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import com.jayway.awaitility.Awaitility;
+import com.jayway.awaitility.Duration;
+import com.jayway.awaitility.core.ConditionFactory;
+
+public class SieveDelivery {
+
+    private static final String DEFAULT_DOMAIN = "james.org";
+    private static final String LOCALHOST_IP = "127.0.0.1";
+    private static final int IMAP_PORT = 1143;
+    private static final int SMTP_PORT = 1025;
+    private static final String PASSWORD = "secret";
+
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+    private TemporaryJamesServer jamesServer;
+    private ConditionFactory calmlyAwait;
+
+    @Before
+    public void setup() throws Exception {
+        MailetContainer mailetContainer = MailetContainer.builder()
+            .postmaster("postmaster@" + DEFAULT_DOMAIN)
+            .threads(5)
+            .addProcessor(CommonProcessors.root())
+            .addProcessor(CommonProcessors.error())
+            .addProcessor(CommonProcessors.transport())
+            .addProcessor(CommonProcessors.spam())
+            .addProcessor(CommonProcessors.localAddressError())
+            .addProcessor(CommonProcessors.relayDenied())
+            .addProcessor(CommonProcessors.bounces())
+            .addProcessor(CommonProcessors.sieveManagerCheck())
+            .build();
+
+        jamesServer = new TemporaryJamesServer(temporaryFolder, mailetContainer);
+        Duration slowPacedPollInterval = Duration.FIVE_HUNDRED_MILLISECONDS;
+        calmlyAwait = Awaitility.with().pollInterval(slowPacedPollInterval).and().with().pollDelay(slowPacedPollInterval).await();
+    }
+
+    @After
+    public void tearDown() {
+        jamesServer.shutdown();
+    }
+
+    @Test
+    public void simpleMailShouldBeSent() throws Exception {
+        String from = "user@" + DEFAULT_DOMAIN;
+        String recipient = "user2@" + DEFAULT_DOMAIN;
+        String targetedMailbox = "INBOX.any";
+
+        jamesServer.getServerProbe().addDomain(DEFAULT_DOMAIN);
+        jamesServer.getServerProbe().addUser(from, PASSWORD);
+        jamesServer.getServerProbe().addUser(recipient, PASSWORD);
+        jamesServer.getServerProbe().createMailbox(MailboxConstants.USER_NAMESPACE, recipient, "INBOX");
+        jamesServer.getServerProbe().createMailbox(MailboxConstants.USER_NAMESPACE, recipient, targetedMailbox);
+        jamesServer.getServerProbe().addActiveSieveScript(recipient, "myscript.sieve", "require \"fileinto\";\n" +
+            "\n" +
+            "fileinto \"" + targetedMailbox + "\";");
+
+        try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DEFAULT_DOMAIN);
+             IMAPMessageReader imapMessageReader = new IMAPMessageReader(LOCALHOST_IP, IMAP_PORT)) {
+            messageSender.sendMessage(from, recipient);
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHasBeenSent);
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userReceivedMessageInMailbox(recipient, PASSWORD, targetedMailbox));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java
index 294f01c..a259504 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java
@@ -120,6 +120,10 @@ public class CommonProcessors {
                         .build())
                 .addMailet(MailetConfiguration.builder()
                         .match("RecipientIsLocal")
+                        .clazz("Sieve")
+                        .build())
+                .addMailet(MailetConfiguration.builder()
+                        .match("RecipientIsLocal")
                         .clazz("LocalDelivery")
                         .build())
                 .addMailet(MailetConfiguration.builder()

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
index 219040c..cfeda6c 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
@@ -34,8 +34,12 @@ public class IMAPMessageReader implements Closeable {
     }
 
     public boolean userReceivedMessage(String user, String password) throws IOException {
+        return userReceivedMessageInMailbox(user, password, "INBOX");
+    }
+
+    public boolean userReceivedMessageInMailbox(String user, String password, String mailbox) throws IOException {
         imapClient.login(user, password);
-        imapClient.select("INBOX");
+        imapClient.select(mailbox);
         imapClient.fetch("1:1", "ALL");
         return imapClient.getReplyString()
             .contains("OK FETCH completed");

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
new file mode 100644
index 0000000..56c7f1d
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
@@ -0,0 +1,135 @@
+/****************************************************************
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.mail.MessagingException;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.sieverepository.api.SieveRepository;
+import org.apache.james.transport.mailets.delivery.MailStore;
+import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter;
+import org.apache.james.transport.mailets.jsieve.ResourceLocator;
+import org.apache.james.transport.mailets.jsieve.delivery.SieveExecutor;
+import org.apache.james.transport.mailets.jsieve.delivery.SievePoster;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.GenericMailet;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Execute Sieve scripts for incoming emails, and set the result of the execution as attributes of the mail
+ */
+public class Sieve extends GenericMailet {
+
+    private final UsersRepository usersRepository;
+    private final ResourceLocator resourceLocator;
+    private SieveExecutor sieveExecutor;
+
+    @Inject
+    public Sieve(UsersRepository usersRepository, SieveRepository sieveRepository) throws MessagingException {
+        this(usersRepository, ResourceLocatorImpl.instanciate(usersRepository, sieveRepository));
+    }
+
+    public Sieve(UsersRepository usersRepository, ResourceLocator resourceLocator) throws MessagingException {
+        this.usersRepository = usersRepository;
+        this.resourceLocator = resourceLocator;
+    }
+
+    @Override
+    public String getMailetInfo() {
+        return "Sieve Mailet";
+    }
+
+    @Override
+    public void init() throws MessagingException {
+        Log log = CommonsLoggingAdapter.builder()
+            .wrappedLogger(getMailetContext().getLogger())
+            .quiet(getInitParameter("quiet", false))
+            .verbose(getInitParameter("verbose", false))
+            .build();
+        sieveExecutor = SieveExecutor.builder()
+            .resourceLocator(resourceLocator)
+            .usersRepository(usersRepository)
+            .mailetContext(getMailetContext())
+            .log(log)
+            .sievePoster(new SievePoster(usersRepository, MailboxConstants.INBOX))
+            .build();
+    }
+
+    @Override
+    public void service(Mail mail) throws MessagingException {
+        for(MailAddress recipient: mail.getRecipients()) {
+            executeSieveScript(mail, recipient);
+        }
+        mail.setRecipients(keepNonDiscardedRecipients(mail));
+    }
+
+    private void executeSieveScript(Mail mail, MailAddress recipient) {
+        try {
+            sieveExecutor.execute(recipient, mail);
+        } catch (Exception e) {
+            getMailetContext().getLogger().warn("Failed to execute Sieve script for user " + recipient.asPrettyString(), e);
+        }
+    }
+
+
+    private ImmutableList<MailAddress> keepNonDiscardedRecipients(Mail mail) {
+        final List<MailAddress> discardedRecipients = retrieveDiscardedRecipients(mail);
+        return FluentIterable.from(mail.getRecipients()).filter(new Predicate<MailAddress>() {
+                @Override
+                public boolean apply(MailAddress input) {
+                    return !discardedRecipients.contains(input);
+                }
+            }).toList();
+    }
+
+    private List<MailAddress> retrieveDiscardedRecipients(Mail mail) {
+        final List<MailAddress> discardedRecipients = new ArrayList<MailAddress>();
+        for(MailAddress recipient: mail.getRecipients()) {
+            if (isDiscarded(mail, recipient)) {
+                discardedRecipients.add(recipient);
+            }
+        }
+        return discardedRecipients;
+    }
+
+    private boolean isDiscarded(Mail mail, MailAddress recipient) {
+        return !(mail.getAttribute(MailStore.DELIVERY_PATH_PREFIX + retrieveUser(recipient)) instanceof String);
+    }
+
+    private String retrieveUser(MailAddress recipient) {
+        try {
+            return usersRepository.getUser(recipient);
+        } catch (UsersRepositoryException e) {
+            log("Can not retrieve username for mail address " + recipient.asPrettyString(), e);
+            return recipient.asString();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveLocalDelivery.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveLocalDelivery.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveLocalDelivery.java
deleted file mode 100644
index 99154bc..0000000
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveLocalDelivery.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/****************************************************************
- * 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 javax.inject.Inject;
-import javax.inject.Named;
-import javax.mail.MessagingException;
-
-import org.apache.commons.logging.Log;
-import org.apache.james.domainlist.api.DomainList;
-import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.model.MailboxConstants;
-import org.apache.james.sieverepository.api.SieveRepository;
-import org.apache.james.transport.mailets.delivery.MailDispatcher;
-import org.apache.james.transport.mailets.delivery.MailboxAppender;
-import org.apache.james.transport.mailets.jsieve.delivery.SieveMailStore;
-import org.apache.james.transport.mailets.jsieve.delivery.SievePoster;
-import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.mailet.Mail;
-import org.apache.mailet.base.GenericMailet;
-
-/**
- * Receives a Mail from the Queue and takes care of delivery of the
- * message to local inboxes applying SIEVE rules.
- * 
- * This mailet is a composition of RecipientRewriteTable, SieveMailet 
- * and MailboxManager configured to mimic the old "LocalDelivery"
- * James 2.3 behavior.
- */
-public class SieveLocalDelivery extends GenericMailet {
-    
-    private final UsersRepository usersRepository;
-    private final MailboxManager mailboxManager;
-    private final SieveRepository sieveRepository;
-    private final RecipientRewriteTable recipientRewriteTable;
-    private MailDispatcher mailDispatcher;
-
-    @Inject
-    public SieveLocalDelivery(UsersRepository usersRepository, @Named("mailboxmanager") MailboxManager mailboxManager,
-                              SieveRepository sieveRepository, org.apache.james.rrt.api.RecipientRewriteTable rrt, DomainList domainList) {
-        this.usersRepository = usersRepository;
-        this.mailboxManager = mailboxManager;
-        this.sieveRepository = sieveRepository;
-        this.recipientRewriteTable = new RecipientRewriteTable();
-        this.recipientRewriteTable.setDomainList(domainList);
-        this.recipientRewriteTable.setRecipientRewriteTable(rrt);
-    }
-
-    public void service(Mail mail) throws MessagingException {
-        recipientRewriteTable.service(mail);
-        mailDispatcher.dispatch(mail);
-    }
-
-    public String getMailetInfo() {
-        return "Sieve Local Delivery Mailet";
-    }
-
-    public void init() throws MessagingException {
-        recipientRewriteTable.init(getMailetConfig());
-
-        Log log = CommonsLoggingAdapter.builder()
-            .wrappedLogger(getMailetContext().getLogger())
-            .quiet(getInitParameter("quiet", false))
-            .verbose(getInitParameter("verbose", false))
-            .build();
-
-        mailDispatcher = MailDispatcher.builder()
-            .mailStore(SieveMailStore.builder()
-                .sievePoster(new SievePoster(
-                    new MailboxAppender(mailboxManager, getMailetContext().getLogger()),
-                    MailboxConstants.INBOX,
-                    usersRepository))
-                .usersRepository(usersRepository)
-                .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository))
-                .mailetContext(getMailetContext())
-                .folder(MailboxConstants.INBOX)
-                .log(log)
-                .build())
-            .consume(getInitParameter("consume", true))
-            .mailetContext(getMailetContext())
-            .log(log)
-            .build();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveToRecipientFolder.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveToRecipientFolder.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveToRecipientFolder.java
deleted file mode 100644
index ca66055..0000000
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveToRecipientFolder.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/****************************************************************
- * 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 javax.inject.Inject;
-import javax.inject.Named;
-import javax.mail.MessagingException;
-
-import org.apache.commons.logging.Log;
-import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.model.MailboxConstants;
-import org.apache.james.sieverepository.api.SieveRepository;
-import org.apache.james.transport.mailets.delivery.MailDispatcher;
-import org.apache.james.transport.mailets.delivery.MailboxAppender;
-import org.apache.james.transport.mailets.jsieve.delivery.SieveMailStore;
-import org.apache.james.transport.mailets.jsieve.delivery.SievePoster;
-import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.mailet.Mail;
-import org.apache.mailet.base.GenericMailet;
-
-/**
- * Receives a Mail from the Queue and takes care to deliver the message
- * to a defined folder of the recipient(s) applying SIEVE rules.
- * 
- * You have to define the folder name of the recipient(s).
- * The flag 'consume' will tell is the mail will be further
- * processed by the upcoming processor mailets, or not.
- * 
- * <pre>
- * &lt;mailet match="RecipientIsLocal" class="ToRecipientFolder"&gt;
- *    &lt;folder&gt; <i>Junk</i> &lt;/folder&gt;
- *    &lt;consume&gt; <i>false</i> &lt;/consume&gt;
- * &lt;/mailet&gt;
- * </pre>
- * 
- */
-public class SieveToRecipientFolder extends GenericMailet {
-
-    public static final String FOLDER_PARAMETER = "folder";
-    public static final String CONSUME_PARAMETER = "consume";
-
-    private final MailboxManager mailboxManager;
-    private final SieveRepository sieveRepository;
-    private final UsersRepository usersRepository;
-    private MailDispatcher mailDispatcher;
-
-    @Inject
-    public SieveToRecipientFolder(@Named("mailboxmanager")MailboxManager mailboxManager, SieveRepository sieveRepository,
-                                  UsersRepository usersRepository) {
-        this.mailboxManager = mailboxManager;
-        this.sieveRepository = sieveRepository;
-        this.usersRepository = usersRepository;
-    }
-
-    @Override
-    public void service(Mail mail) throws MessagingException {
-        mailDispatcher.dispatch(mail);
-    }
-
-    @Override
-    public void init() throws MessagingException {
-        Log log = CommonsLoggingAdapter.builder()
-            .wrappedLogger(getMailetContext().getLogger())
-            .quiet(getInitParameter("quiet", true))
-            .verbose(getInitParameter("verbose", false))
-            .build();
-        String folder = getInitParameter(FOLDER_PARAMETER, MailboxConstants.INBOX);
-        mailDispatcher = MailDispatcher.builder()
-            .mailStore(SieveMailStore.builder()
-                .sievePoster(new SievePoster(new MailboxAppender(mailboxManager, getMailetContext().getLogger()), folder, usersRepository))
-                .usersRepository(usersRepository)
-                .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository))
-                .mailetContext(getMailetContext())
-                .folder(folder)
-                .log(log)
-                .build())
-            .consume(getInitParameter(CONSUME_PARAMETER, false))
-            .mailetContext(getMailetContext())
-            .log(log)
-            .build();
-    }
-
-    @Override
-    public String getMailetInfo() {
-        return SieveToRecipientFolder.class.getName() + " Mailet";
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
index 567e9ec..4082d4f 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
@@ -25,5 +25,7 @@ import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 
 public interface MailStore {
+    String DELIVERY_PATH_PREFIX = "DeliveryPath_";
+
     void storeMail(MailAddress recipient, Mail mail) throws MessagingException;
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
index 64c72cb..c8dacb9 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
@@ -50,18 +50,13 @@ public class MailboxAppender {
 
     public void append(MimeMessage mail, String user, String folder) throws MessagingException {
         MailboxSession session = createMailboxSession(user);
-        append(mail, user, folder, session);
+        append(mail, user, useSlashAsSeparator(folder, session), session);
     }
 
-    public void appendAndUseSlashAsSeparator(MimeMessage mail, String user, String folder, String fallbackFolder) throws MessagingException {
-        MailboxSession session = createMailboxSession(user);
-        append(mail, user, useSlashAsSeparator(folder, session, fallbackFolder));
-    }
-
-    private String useSlashAsSeparator(String urlPath, MailboxSession session, String fallbackFolder) {
+    private String useSlashAsSeparator(String urlPath, MailboxSession session) throws MessagingException {
         String destination = urlPath.replace('/', session.getPathDelimiter());
         if (Strings.isNullOrEmpty(destination)) {
-            destination = fallbackFolder;
+            throw new MessagingException("Mail can not be delivered to empty folder");
         }
         if (destination.charAt(0) == session.getPathDelimiter()) {
             destination = destination.substring(1);

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
index db21a22..d693065 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
@@ -86,10 +86,18 @@ public class SimpleMailStore implements MailStore {
     public void storeMail(MailAddress recipient, Mail mail) throws MessagingException {
         String username = computeUsername(recipient);
 
-        mailboxAppender.append(mail.getMessage(), username, folder);
+        String locatedFolder = locateFolder(username, mail);
+        mailboxAppender.append(mail.getMessage(), username, locatedFolder);
 
         log.info("Local delivered mail " + mail.getName() + " successfully from " + DeliveryUtils.prettyPrint(mail.getSender())
-            + " to " + DeliveryUtils.prettyPrint(recipient) + " in folder " + this.folder);
+            + " to " + DeliveryUtils.prettyPrint(recipient) + " in folder " + locatedFolder);
+    }
+
+    private String locateFolder(String username, Mail mail) {
+        if (mail.getAttribute(DELIVERY_PATH_PREFIX + username) instanceof String) {
+            return (String) mail.getAttribute(DELIVERY_PATH_PREFIX + username);
+        }
+        return folder;
     }
 
     private String computeUsername(MailAddress recipient) throws MessagingException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionContext.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionContext.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionContext.java
index 0f78115..5203279 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionContext.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionContext.java
@@ -24,6 +24,7 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.commons.logging.Log;
+import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 import org.joda.time.DateTime;
 
@@ -62,7 +63,7 @@ public interface ActionContext {
      * the value should be mailbox://<user>@localhost/<mailbox-path>
      * @param mail not null
      */
-    public void post(String uri, MimeMessage mail) throws MessagingException;
+    public void post(String uri, Mail mail) throws MessagingException;
 
     /**
      * Posts the given mail.

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
index 3d2bcd7..1c91bba 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
@@ -77,7 +77,6 @@ public class FileIntoAction implements MailAction {
         try
         {
             recipient = ActionUtils.getSoleRecipient(aMail);
-            MimeMessage localMessage = createMimeMessage(aMail, recipient);
             
             if (!(destinationMailbox.length() > 0 
                     && destinationMailbox.charAt(0) == HIERARCHY_DELIMITER)) {
@@ -85,15 +84,9 @@ public class FileIntoAction implements MailAction {
             }
             
             final String mailbox = destinationMailbox.replace(HIERARCHY_DELIMITER, '/');
-            final String host;
-            if (mailbox.charAt(0) == '/') {
-                host = "@localhost";
-            } else {
-                host = "@localhost/";
-            }
-            final String url = "mailbox://" + recipient.getUser() + host + mailbox;
+            final String url = "mailbox://" + recipient.asString() + mailbox;
             //TODO: copying this message so many times seems a waste
-            context.post(url, localMessage);
+            context.post(url, aMail);
             delivered = true;
         }
         catch (MessagingException ex)
@@ -104,11 +97,6 @@ public class FileIntoAction implements MailAction {
             }
             throw ex;
         }
-        finally
-        {
-            // Ensure the mail is always ghosted
-            aMail.setState(Mail.GHOST);
-        }
         if (delivered)
         {
             final Log log = context.getLog();
@@ -120,23 +108,4 @@ public class FileIntoAction implements MailAction {
             }
         }
     }
-    
-    private static MimeMessage createMimeMessage(Mail aMail, MailAddress recipient) throws MessagingException {
-        // Adapted from LocalDelivery Mailet
-        // Add qmail's de facto standard Delivered-To header
-        MimeMessage localMessage = new MimeMessage(aMail.getMessage())
-        {
-            protected void updateHeaders() throws MessagingException
-            {
-                if (getMessageID() == null)
-                    super.updateHeaders();
-                else
-                    modified = false;
-            }
-        };
-        localMessage.addHeader("Delivered-To", recipient.toString());
-
-        localMessage.saveChanges();
-        return localMessage;
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
index aa77e0b..c86d352 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
@@ -22,6 +22,8 @@ package org.apache.james.transport.mailets.jsieve;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
+import org.apache.mailet.Mail;
+
 /**
  * Experimental interface.
  */
@@ -36,5 +38,5 @@ public interface Poster {
      * the value should be mailbox://<user>@localhost/<mailbox-path>
      * @param mail not null
      */
-    public void post(String uri, MimeMessage mail) throws MessagingException;
+    void post(String uri, Mail mail) throws MessagingException;
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RedirectAction.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RedirectAction.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RedirectAction.java
index c56fe4f..4096e34 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RedirectAction.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RedirectAction.java
@@ -61,7 +61,6 @@ public class RedirectAction implements MailAction {
         recipients.add(new MailAddress(new InternetAddress(anAction.getAddress())));
         MailAddress sender = aMail.getSender();
         context.post(sender, recipients, aMail.getMessage());
-        aMail.setState(Mail.GHOST);
         Log log = context.getLog();
         if (log.isDebugEnabled()) {
             log.debug("Redirected Message ID: "

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RejectAction.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RejectAction.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RejectAction.java
index f792f82..ecd6f9a 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RejectAction.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RejectAction.java
@@ -137,8 +137,6 @@ public class RejectAction implements MailAction {
         {
             context.getLog().info("Unable to send reject MDN. Could not determine the recipient.");
         }
-        // Ghost the original mail
-        aMail.setState(Mail.GHOST);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
index e70bd6d..b046341 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
@@ -440,7 +440,8 @@ public class SieveMailAdapter implements MailAdapter, EnvelopeAccessors, ActionC
     public String getServerInfo() {
         return getMailetContext().getServerInfo();
     }
-    public void post(String uri, MimeMessage mail) throws MessagingException {
+
+    public void post(String uri, Mail mail) throws MessagingException {
         poster.post(uri, mail);
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
new file mode 100644
index 0000000..341a710
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
@@ -0,0 +1,192 @@
+/****************************************************************
+ * 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.jsieve.delivery;
+
+import java.io.IOException;
+
+import javax.mail.MessagingException;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.transport.mailets.delivery.DeliveryUtils;
+import org.apache.james.transport.mailets.jsieve.ActionDispatcher;
+import org.apache.james.transport.mailets.jsieve.ResourceLocator;
+import org.apache.james.transport.mailets.jsieve.SieveMailAdapter;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.jsieve.ConfigurationManager;
+import org.apache.jsieve.SieveConfigurationException;
+import org.apache.jsieve.SieveFactory;
+import org.apache.jsieve.exception.SieveException;
+import org.apache.jsieve.parser.generated.ParseException;
+import org.apache.jsieve.parser.generated.TokenMgrError;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.MailetContext;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+public class SieveExecutor {
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static class Builder {
+        private MailetContext mailetContext;
+        private UsersRepository usersRepos;
+        private SievePoster sievePoster;
+        private ResourceLocator resourceLocator;
+        private Log log;
+
+        public Builder usersRepository(UsersRepository usersRepository) {
+            this.usersRepos = usersRepository;
+            return this;
+        }
+
+        public Builder sievePoster(SievePoster sievePoster) {
+            this.sievePoster = sievePoster;
+            return this;
+        }
+
+        public Builder mailetContext(MailetContext mailetContext) {
+            this.mailetContext = mailetContext;
+            return this;
+        }
+
+        public Builder resourceLocator(ResourceLocator resourceLocator) {
+            this.resourceLocator = resourceLocator;
+            return this;
+        }
+
+        public Builder log(Log log) {
+            this.log = log;
+            return this;
+        }
+
+        public SieveExecutor build() throws MessagingException {
+            Preconditions.checkNotNull(mailetContext);
+            Preconditions.checkNotNull(usersRepos);
+            Preconditions.checkNotNull(resourceLocator);
+            Preconditions.checkNotNull(log);
+            Preconditions.checkNotNull(sievePoster);
+            return new SieveExecutor(mailetContext, usersRepos, sievePoster, resourceLocator, log);
+        }
+    }
+
+    private final MailetContext mailetContext;
+    private final UsersRepository usersRepos;
+    private final SievePoster sievePoster;
+    private final ResourceLocator resourceLocator;
+    private final SieveFactory factory;
+    private final ActionDispatcher actionDispatcher;
+    private final Log log;
+
+    public SieveExecutor(MailetContext mailetContext, UsersRepository usersRepos, SievePoster sievePoster,
+                         ResourceLocator resourceLocator, Log log) throws MessagingException {
+        this.mailetContext = mailetContext;
+        this.usersRepos = usersRepos;
+        this.sievePoster = sievePoster;
+        this.resourceLocator = resourceLocator;
+        factory = createFactory(log);
+        this.actionDispatcher = new ActionDispatcher();
+        this.log = log;
+    }
+
+    private SieveFactory createFactory(Log log) throws MessagingException {
+        try {
+            final ConfigurationManager configurationManager = new ConfigurationManager();
+            configurationManager.setLog(log);
+            return configurationManager.build();
+        } catch (SieveConfigurationException e) {
+            throw new MessagingException("Failed to load standard Sieve configuration.", e);
+        }
+    }
+
+    public void execute(MailAddress recipient, Mail mail) throws MessagingException {
+        Preconditions.checkNotNull(recipient, "Recipient for mail to be spooled cannot be null.");
+        Preconditions.checkNotNull(mail.getMessage(), "Mail message to be spooled cannot be null.");
+
+        sieveMessage(recipient, mail, log);
+        // If no exception was thrown the message was successfully stored in the mailbox
+        log.info("Local delivered mail " + mail.getName() + " sucessfully from " + DeliveryUtils.prettyPrint(mail.getSender()) + " to " + DeliveryUtils.prettyPrint(recipient)
+            + " in folder " + this.folder);
+    }
+
+    protected void sieveMessage(MailAddress recipient, Mail aMail, Log log) throws MessagingException {
+        try {
+            ResourceLocator.UserSieveInformation userSieveInformation = resourceLocator.get(getScriptUri(recipient));
+            sieveMessageEvaluate(recipient, aMail, userSieveInformation, log);
+        } catch (Exception ex) {
+            // SIEVE is a mail filtering protocol.
+            // Rejecting the mail because it cannot be filtered
+            // seems very unfriendly.
+            // So just log and store in INBOX
+            log.error("Cannot evaluate Sieve script. Storing mail in user INBOX.", ex);
+            storeMessageInbox(recipient, aMail);
+        }
+    }
+
+    private void sieveMessageEvaluate(MailAddress recipient, Mail aMail, ResourceLocator.UserSieveInformation userSieveInformation, Log log) throws MessagingException, IOException {
+        try {
+            SieveMailAdapter aMailAdapter = new SieveMailAdapter(aMail,
+                mailetContext, actionDispatcher, sievePoster, userSieveInformation.getScriptActivationDate(),
+                userSieveInformation.getScriptInterpretationDate(), recipient);
+            aMailAdapter.setLog(log);
+            // This logging operation is potentially costly
+            log.debug("Evaluating " + aMailAdapter.toString() + "against \"" + getScriptUri(recipient) + "\"");
+            factory.evaluate(aMailAdapter, factory.parse(userSieveInformation.getScriptContent()));
+        } catch (SieveException ex) {
+            handleFailure(recipient, aMail, ex);
+        }
+        catch (ParseException ex) {
+            handleFailure(recipient, aMail, ex);
+        }
+        catch (TokenMgrError ex) {
+            handleFailure(recipient, aMail, new SieveException(ex));
+        }
+    }
+
+    protected String getScriptUri(MailAddress m) {
+        return "//" + retrieveUserNameUsedForScriptStorage(m) + "/sieve";
+    }
+
+    protected void handleFailure(MailAddress recipient, Mail aMail, Exception ex) throws MessagingException, IOException {
+        mailetContext.sendMail(recipient, ImmutableList.of(recipient), SieveFailureMessageComposer.composeMessage(aMail, ex, recipient.toString()));
+    }
+
+    protected void storeMessageInbox(MailAddress mailAddress, Mail mail) throws MessagingException {
+        sievePoster.post("mailbox://" + retrieveUserNameUsedForScriptStorage(mailAddress) + "/", mail);
+    }
+
+    public String retrieveUserNameUsedForScriptStorage(MailAddress mailAddress) {
+        try {
+            if (usersRepos.supportVirtualHosting()) {
+                return mailAddress.asString();
+            } else {
+                return mailAddress.getLocalPart() + "@localhost";
+            }
+        } catch (UsersRepositoryException e) {
+            log.warn("Can not determine if virtual hosting is used for " + mailAddress.asPrettyString(), e);
+            return mailAddress.getLocalPart() + "@localhost";
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveMailStore.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveMailStore.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveMailStore.java
deleted file mode 100644
index fa13bf4..0000000
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveMailStore.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/****************************************************************
- * 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.jsieve.delivery;
-
-import java.io.IOException;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
-
-import org.apache.commons.logging.Log;
-import org.apache.james.transport.mailets.delivery.DeliveryUtils;
-import org.apache.james.transport.mailets.delivery.MailStore;
-import org.apache.james.transport.mailets.jsieve.ActionDispatcher;
-import org.apache.james.transport.mailets.jsieve.ResourceLocator;
-import org.apache.james.transport.mailets.jsieve.SieveMailAdapter;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.james.user.api.UsersRepositoryException;
-import org.apache.jsieve.ConfigurationManager;
-import org.apache.jsieve.SieveConfigurationException;
-import org.apache.jsieve.SieveFactory;
-import org.apache.jsieve.exception.SieveException;
-import org.apache.jsieve.parser.generated.ParseException;
-import org.apache.jsieve.parser.generated.TokenMgrError;
-import org.apache.mailet.Mail;
-import org.apache.mailet.MailAddress;
-import org.apache.mailet.MailetContext;
-
-import com.google.common.base.Preconditions;
-
-public class SieveMailStore implements MailStore {
-
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    public static class Builder {
-        private MailetContext mailetContext;
-        private UsersRepository usersRepos;
-        private SievePoster sievePoster;
-        private String folder;
-        private ResourceLocator resourceLocator;
-        private Log log;
-
-        public Builder folder(String folder) {
-            this.folder = folder;
-            return this;
-        }
-
-        public Builder usersRepository(UsersRepository usersRepository) {
-            this.usersRepos = usersRepository;
-            return this;
-        }
-
-        public Builder sievePoster(SievePoster sievePoster) {
-            this.sievePoster = sievePoster;
-            return this;
-        }
-
-        public Builder mailetContext(MailetContext mailetContext) {
-            this.mailetContext = mailetContext;
-            return this;
-        }
-
-        public Builder resourceLocator(ResourceLocator resourceLocator) {
-            this.resourceLocator = resourceLocator;
-            return this;
-        }
-
-        public Builder log(Log log) {
-            this.log = log;
-            return this;
-        }
-
-        public SieveMailStore build() throws MessagingException {
-            Preconditions.checkNotNull(mailetContext);
-            Preconditions.checkNotNull(usersRepos);
-            Preconditions.checkNotNull(folder);
-            Preconditions.checkNotNull(resourceLocator);
-            Preconditions.checkNotNull(log);
-            Preconditions.checkNotNull(sievePoster);
-            return new SieveMailStore(mailetContext, usersRepos, sievePoster, folder, resourceLocator, log);
-        }
-    }
-
-    private final MailetContext mailetContext;
-    private final UsersRepository usersRepos;
-    private final SievePoster sievePoster;
-    private final String folder;
-    private final ResourceLocator resourceLocator;
-    private final SieveFactory factory;
-    private final ActionDispatcher actionDispatcher;
-    private final Log log;
-
-    public SieveMailStore(MailetContext mailetContext, UsersRepository usersRepos, SievePoster sievePoster, String folder,
-                          ResourceLocator resourceLocator, Log log) throws MessagingException {
-        this.mailetContext = mailetContext;
-        this.usersRepos = usersRepos;
-        this.sievePoster = sievePoster;
-        this.folder = folder;
-        this.resourceLocator = resourceLocator;
-        factory = createFactory(log);
-        this.actionDispatcher = new ActionDispatcher();
-        this.log = log;
-    }
-
-    private SieveFactory createFactory(Log log) throws MessagingException {
-        try {
-            final ConfigurationManager configurationManager = new ConfigurationManager();
-            configurationManager.setLog(log);
-            return configurationManager.build();
-        } catch (SieveConfigurationException e) {
-            throw new MessagingException("Failed to load standard Sieve configuration.", e);
-        }
-    }
-
-    public void storeMail(MailAddress recipient, Mail mail) throws MessagingException {
-        Preconditions.checkNotNull(recipient, "Recipient for mail to be spooled cannot be null.");
-        Preconditions.checkNotNull(mail.getMessage(), "Mail message to be spooled cannot be null.");
-
-        sieveMessage(recipient, mail, log);
-        // If no exception was thrown the message was successfully stored in the mailbox
-        log.info("Local delivered mail " + mail.getName() + " sucessfully from " + DeliveryUtils.prettyPrint(mail.getSender()) + " to " + DeliveryUtils.prettyPrint(recipient)
-            + " in folder " + this.folder);
-    }
-
-    protected void sieveMessage(MailAddress recipient, Mail aMail, Log log) throws MessagingException {
-        try {
-            ResourceLocator.UserSieveInformation userSieveInformation = resourceLocator.get(getScriptUri(recipient));
-            sieveMessageEvaluate(recipient, aMail, userSieveInformation, log);
-        } catch (Exception ex) {
-            // SIEVE is a mail filtering protocol.
-            // Rejecting the mail because it cannot be filtered
-            // seems very unfriendly.
-            // So just log and store in INBOX
-            log.error("Cannot evaluate Sieve script. Storing mail in user INBOX.", ex);
-            storeMessageInbox(recipient, aMail.getMessage());
-        }
-    }
-
-    private void sieveMessageEvaluate(MailAddress recipient, Mail aMail, ResourceLocator.UserSieveInformation userSieveInformation, Log log) throws MessagingException, IOException {
-        try {
-            SieveMailAdapter aMailAdapter = new SieveMailAdapter(aMail,
-                mailetContext, actionDispatcher, sievePoster, userSieveInformation.getScriptActivationDate(),
-                userSieveInformation.getScriptInterpretationDate(), recipient);
-            aMailAdapter.setLog(log);
-            // This logging operation is potentially costly
-            log.debug("Evaluating " + aMailAdapter.toString() + "against \"" + getScriptUri(recipient) + "\"");
-            factory.evaluate(aMailAdapter, factory.parse(userSieveInformation.getScriptContent()));
-        } catch (SieveException ex) {
-            handleFailure(recipient, aMail, ex);
-        }
-        catch (ParseException ex) {
-            handleFailure(recipient, aMail, ex);
-        }
-        catch (TokenMgrError ex) {
-            handleFailure(recipient, aMail, new SieveException(ex));
-        }
-    }
-
-    protected String getScriptUri(MailAddress m) {
-        return "//" + retrieveUserNameUsedForScriptStorage(m) + "/sieve";
-    }
-
-    protected void handleFailure(MailAddress recipient, Mail aMail, Exception ex) throws MessagingException, IOException {
-        storeMessageInbox(recipient, SieveFailureMessageComposer.composeMessage(aMail, ex, recipient.toString()));
-    }
-
-    protected void storeMessageInbox(MailAddress mailAddress, MimeMessage message) throws MessagingException {
-        sievePoster.post("mailbox://" + retrieveUserNameUsedForScriptStorage(mailAddress) + "/", message);
-    }
-
-    public String retrieveUserNameUsedForScriptStorage(MailAddress mailAddress) {
-        try {
-            if (usersRepos.supportVirtualHosting()) {
-                return mailAddress.asString();
-            } else {
-                return mailAddress.getLocalPart() + "@localhost";
-            }
-        } catch (UsersRepositoryException e) {
-            log.warn("Can not determine if virtual hosting is used for " + mailAddress.asPrettyString(), e);
-            return mailAddress.getLocalPart() + "@localhost";
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SievePoster.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SievePoster.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SievePoster.java
index 9717df5..b0ca0ae 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SievePoster.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SievePoster.java
@@ -20,28 +20,25 @@
 package org.apache.james.transport.mailets.jsieve.delivery;
 
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 
-import org.apache.james.transport.mailets.delivery.MailboxAppender;
+import org.apache.james.transport.mailets.delivery.MailStore;
 import org.apache.james.transport.mailets.jsieve.Poster;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 
 public class SievePoster implements Poster {
-
-    private final MailboxAppender mailboxAppender;
     private final String folder;
-    private final UsersRepository usersRepos;
+    private final UsersRepository usersRepository;
 
-    public SievePoster(MailboxAppender mailboxAppender, String folder, UsersRepository usersRepos) {
-        this.mailboxAppender = mailboxAppender;
+    public SievePoster(UsersRepository usersRepository, String folder) {
+        this.usersRepository = usersRepository;
         this.folder = folder;
-        this.usersRepos = usersRepos;
     }
 
     @Override
-    public void post(String url, MimeMessage mail) throws MessagingException {
+    public void post(String url, Mail mail) throws MessagingException {
         int endOfScheme = url.indexOf(':');
         if (endOfScheme < 0) {
             throw new MessagingException("Malformed URI");
@@ -49,7 +46,8 @@ public class SievePoster implements Poster {
             String scheme = url.substring(0, endOfScheme);
             if (scheme.equals("mailbox")) {
                 UserAndPath userAndPath = retrieveUserAndPath(url, endOfScheme);
-                mailboxAppender.appendAndUseSlashAsSeparator(mail, userAndPath.user, userAndPath.path, folder);
+
+                mail.setAttribute(MailStore.DELIVERY_PATH_PREFIX + userAndPath.user, userAndPath.path);
             } else {
                 throw new MessagingException("Unsupported protocol");
             }
@@ -88,7 +86,7 @@ public class SievePoster implements Poster {
         String user = url.substring(startOfUser, endOfUser).toLowerCase();
         // Check if we should use the full email address as username
         try {
-            return usersRepos.getUser(new MailAddress(user, host));
+            return usersRepository.getUser(new MailAddress(user, host));
         } catch (UsersRepositoryException e) {
             throw new MessagingException("Unable to accessUsersRepository", e);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
index 9931bcf..05e9653 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
@@ -21,14 +21,12 @@ package org.apache.james.transport.mailets.delivery;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Collection;
 import java.util.Date;
 import java.util.Properties;
 
@@ -49,82 +47,39 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.rrt.api.RecipientRewriteTable;
-import org.apache.james.sieverepository.api.SieveRepository;
-import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
 import org.apache.james.transport.mailets.LocalDelivery;
-import org.apache.james.transport.mailets.SieveLocalDelivery;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
-import org.apache.mailet.Mailet;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
 import org.slf4j.Logger;
 
 import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
 
-@RunWith(Parameterized.class)
 public class LocalDeliveryTest {
 
     public static final String RECEIVER_DOMAIN_COM = "receiver@domain.com";
+    private UsersRepository usersRepository;
+    private MailboxManager mailboxManager;
+    private MailboxSession.User user;
+    private FakeMailetConfig config;
+    private LocalDelivery testee;
 
-    public static class Parameter {
-        private final UsersRepository usersRepository;
-        private final MailboxManager mailboxManager;
-        private final SieveRepository sieveRepository;
-        private final Mailet mailet;
-        private final MailboxSession.User user;
-
-        public Parameter(UsersRepository usersRepository, MailboxManager mailboxManager, SieveRepository sieveRepository,
-                         Mailet mailet, MailboxSession.User user) {
-            this.usersRepository = usersRepository;
-            this.mailboxManager = mailboxManager;
-            this.sieveRepository = sieveRepository;
-            this.mailet = mailet;
-            this.user = user;
-        }
-
-        public UsersRepository getUsersRepository() {
-            return usersRepository;
-        }
-
-        public MailboxManager getMailboxManager() {
-            return mailboxManager;
-        }
-
-        public SieveRepository getSieveRepository() {
-            return sieveRepository;
-        }
-
-        public Mailet getMailet() {
-            return mailet;
-        }
-
-        public MailboxSession.User getUser() {
-            return user;
-        }
-    }
-
-    @Parameterized.Parameters
-    public static Collection<Object[]> getLocalDeliveryClasses() {
-        SieveRepository sieveRepository = mock(SieveRepository.class);
-        UsersRepository usersRepository = mock(UsersRepository.class);
-        MailboxManager mailboxManager = mock(MailboxManager.class);
+    @Before
+    public void setUp() {
+        usersRepository = mock(UsersRepository.class);
+        mailboxManager = mock(MailboxManager.class);
         RecipientRewriteTable recipientRewriteTable = mock(RecipientRewriteTable.class);
         DomainList domainList = mock(DomainList.class);
 
-        SieveLocalDelivery sieveLocalDelivery = new SieveLocalDelivery(usersRepository, mailboxManager, sieveRepository,
-            recipientRewriteTable, domainList);
 
-        LocalDelivery localDelivery = new LocalDelivery(recipientRewriteTable, usersRepository, mailboxManager, domainList);
+        testee = new LocalDelivery(recipientRewriteTable, usersRepository, mailboxManager, domainList);
 
-        MailboxSession.User user = mock(MailboxSession.User.class);
+        user = mock(MailboxSession.User.class);
         MailboxSession session = mock(MailboxSession.class);
         when(session.getPathDelimiter()).thenReturn('.');
         try {
@@ -134,18 +89,6 @@ public class LocalDeliveryTest {
         }
         when(session.getUser()).thenReturn(user);
 
-        return ImmutableList.of(
-            new Object[]{new Parameter(usersRepository, mailboxManager, sieveRepository, sieveLocalDelivery, user)},
-            new Object[]{new Parameter(usersRepository, mailboxManager, sieveRepository, localDelivery, user)}
-        );
-    }
-
-    @Parameterized.Parameter
-    public Parameter parameter;
-    private FakeMailetConfig config;
-
-    @Before
-    public void setUp() {
         config = new FakeMailetConfig("Local delivery", FakeMailContext.builder().logger(mock(Logger.class)).build());
     }
 
@@ -156,16 +99,15 @@ public class LocalDeliveryTest {
         MailboxPath inbox = new MailboxPath("#private", username, "INBOX");
         MessageManager messageManager = mock(MessageManager.class);
 
-        when(parameter.getUsersRepository().supportVirtualHosting()).thenReturn(true);
-        when(parameter.getUsersRepository().getUser(new MailAddress(username))).thenReturn(username);
-        doThrow(new ScriptNotFoundException()).when(parameter.getSieveRepository()).getActive(username);
-        when(parameter.getMailboxManager().getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
-        when(parameter.getUser().getUserName()).thenReturn(username);
+        when(usersRepository.supportVirtualHosting()).thenReturn(true);
+        when(usersRepository.getUser(new MailAddress(username))).thenReturn(username);
+        when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
+        when(user.getUserName()).thenReturn(username);
 
         // When
         Mail mail = createMail();
-        parameter.getMailet().init(config);
-        parameter.getMailet().service(mail);
+        testee.init(config);
+        testee.service(mail);
 
         // Then
         verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class));
@@ -177,17 +119,16 @@ public class LocalDeliveryTest {
         String username = "receiver";
         MailboxPath inbox = new MailboxPath("#private", username, "INBOX");
         MessageManager messageManager = mock(MessageManager.class);
-        when(parameter.getUsersRepository().supportVirtualHosting()).thenReturn(false);
-        when(parameter.getUsersRepository().getUser(new MailAddress("receiver@localhost"))).thenReturn(username);
-        when(parameter.getUsersRepository().getUser(new MailAddress(RECEIVER_DOMAIN_COM))).thenReturn(username);
-        doThrow(new ScriptNotFoundException()).when(parameter.getSieveRepository()).getActive(username);
-        when(parameter.getMailboxManager().getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
-        when(parameter.getUser().getUserName()).thenReturn(username);
+        when(usersRepository.supportVirtualHosting()).thenReturn(false);
+        when(usersRepository.getUser(new MailAddress("receiver@localhost"))).thenReturn(username);
+        when(usersRepository.getUser(new MailAddress(RECEIVER_DOMAIN_COM))).thenReturn(username);
+        when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
+        when(user.getUserName()).thenReturn(username);
 
         // When
         Mail mail = createMail();
-        parameter.getMailet().init(config);
-        parameter.getMailet().service(mail);
+        testee.init(config);
+        testee.service(mail);
 
         // Then
         verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class));

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
index 3c70b96..be24ca1 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
@@ -52,7 +52,6 @@ import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 
 import com.google.common.base.Charsets;
-import com.google.common.collect.ImmutableList;
 
 public class MailDispatcherTest {
     private FakeMailContext fakeMailContext;

http://git-wip-us.apache.org/repos/asf/james-project/blob/71accd66/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
index 184f0ea..d4b7e6c 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.mock;
 import java.util.Properties;
 
 import javax.activation.DataHandler;
+import javax.mail.MessagingException;
 import javax.mail.Multipart;
 import javax.mail.Session;
 import javax.mail.internet.MimeBodyPart;
@@ -57,7 +58,6 @@ public class MailboxAppenderTest {
 
     public static final String USER = "user";
     public static final String FOLDER = "folder";
-    public static final String FALLBACK_FOLDER = "fallback_folder";
     public static final String EMPTY_FOLDER = "";
 
     @Rule public ExpectedException expectedException = ExpectedException.none();
@@ -107,17 +107,6 @@ public class MailboxAppenderTest {
     }
 
     @Test
-    public void appendAndUseSlashAsSeparatorShouldAddMessageToDesiredMailbox() throws Exception {
-        testee.appendAndUseSlashAsSeparator(mimeMessage, USER, FOLDER, FALLBACK_FOLDER);
-
-        MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FOLDER), session)
-            .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session);
-
-        assertThat(messages).hasSize(1);
-    }
-
-
-    @Test
     public void appendShouldAddMessageToDesiredMailboxWhenMailboxExists() throws Exception {
         MailboxPath mailboxPath = new MailboxPath("#private", USER, FOLDER);
         mailboxManager.createMailbox(mailboxPath, session);
@@ -131,43 +120,27 @@ public class MailboxAppenderTest {
     }
 
     @Test
-    public void appendAndUseSlashAsSeparatorShouldAddMessageToDesiredMailboxWhenMailboxExists() throws Exception {
-        MailboxPath mailboxPath = new MailboxPath("#private", USER, FOLDER);
-        mailboxManager.createMailbox(mailboxPath, session);
-
-        testee.appendAndUseSlashAsSeparator(mimeMessage, USER, FOLDER, FALLBACK_FOLDER);
-
-        MessageResultIterator messages = mailboxManager.getMailbox(mailboxPath, session)
-            .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session);
-
-        assertThat(messages).hasSize(1);
-    }
-
-    @Test
-    public void appendAndUseSlashAsSeparatorShouldNotAppendToEmptyFolder() throws Exception {
-        testee.appendAndUseSlashAsSeparator(mimeMessage, USER, EMPTY_FOLDER, FALLBACK_FOLDER);
-
-        expectedException.expect(MailboxNotFoundException.class);
+    public void appendShouldNotAppendToEmptyFolder() throws Exception {
+        expectedException.expect(MessagingException.class);
 
-        mailboxManager.getMailbox(new MailboxPath("#private", USER, EMPTY_FOLDER), session);
+        testee.append(mimeMessage, USER, EMPTY_FOLDER);
     }
 
-
     @Test
-    public void appendAndUseSlashAsSeparatorShouldAppendToFallback() throws Exception {
-        testee.appendAndUseSlashAsSeparator(mimeMessage, USER, EMPTY_FOLDER, FALLBACK_FOLDER);
+    public void appendShouldRemovePathSeparatorAsFirstChar() throws Exception {
+        testee.append(mimeMessage, USER, "." + FOLDER);
 
-        MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FALLBACK_FOLDER), session)
+        MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FOLDER), session)
             .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session);
 
         assertThat(messages).hasSize(1);
     }
 
     @Test
-    public void appendAndUseSlashAsSeparatorShouldRemovePathSeparatorAsFirstChar() throws Exception {
-        testee.appendAndUseSlashAsSeparator(mimeMessage, USER, "." + FOLDER, FALLBACK_FOLDER);
+    public void appendShouldReplaceSlashBySeparator() throws Exception {
+        testee.append(mimeMessage, USER, FOLDER + "/any");
 
-        MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FOLDER), session)
+        MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FOLDER + ".any"), session)
             .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session);
 
         assertThat(messages).hasSize(1);


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