JAMES-1854 Rework SievePoster

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

Branch: refs/heads/master
Commit: 135f8e1dc714da4cd76d3006f0cf1992aefba7d0
Parents: ca85c52
Author: Benoit Tellier <[email protected]>
Authored: Thu Oct 27 22:04:40 2016 +0200
Committer: Benoit Tellier <[email protected]>
Committed: Fri Nov 18 18:46:46 2016 +0700

----------------------------------------------------------------------
 .../mailets/delivery/LocalDelivery.java         |  10 +-
 .../mailets/delivery/SieveMailStorer.java       |  18 +-
 .../transport/mailets/delivery/SievePoster.java | 212 +++++++++++--------
 .../mailets/delivery/ToRecipientFolder.java     |  10 +-
 4 files changed, 132 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/135f8e1d/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java
index 47a96ae..08fce5d 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java
@@ -19,6 +19,10 @@
 
 package org.apache.james.transport.mailets.delivery;
 
+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;
@@ -28,13 +32,8 @@ import 
org.apache.james.transport.mailets.ResourceLocatorImpl;
 import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.mailet.Mail;
-import org.apache.mailet.MailetConfig;
 import org.apache.mailet.base.GenericMailet;
 
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.mail.MessagingException;
-
 /**
  * Receives a Mail from the Queue and takes care of delivery of the
  * message to local inboxes.
@@ -105,7 +104,6 @@ public class LocalDelivery extends GenericMailet {
             .mailStorer(SieveMailStorer.builder()
                 .sievePoster(new SievePoster(mailboxManager, folder, 
usersRepository, getMailetContext()))
                 .usersRepository(usersRepository)
-                .mailboxManager(mailboxManager)
                 
.resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, 
sieveRepository))
                 .mailetContext(getMailetContext())
                 .folder(folder)

http://git-wip-us.apache.org/repos/asf/james-project/blob/135f8e1d/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java
index 56736ba..5cfd2c0 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java
@@ -26,7 +26,6 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.commons.logging.Log;
-import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.transport.mailets.jsieve.ActionDispatcher;
 import org.apache.james.transport.mailets.jsieve.ResourceLocator;
 import org.apache.james.transport.mailets.jsieve.SieveMailAdapter;
@@ -56,7 +55,6 @@ public class SieveMailStorer implements MailStorer {
         private String folder;
         private ResourceLocator resourceLocator;
         private Log log;
-        private MailboxManager mailboxManager;
 
         public Builder folder(String folder) {
             this.folder = folder;
@@ -88,11 +86,6 @@ public class SieveMailStorer implements MailStorer {
             return this;
         }
 
-        public Builder mailboxManager(MailboxManager mailboxManager) {
-            this.mailboxManager = mailboxManager;
-            return this;
-        }
-
         public SieveMailStorer build() throws MessagingException {
             Preconditions.checkNotNull(mailetContext);
             Preconditions.checkNotNull(usersRepos);
@@ -100,10 +93,8 @@ public class SieveMailStorer implements MailStorer {
             Preconditions.checkNotNull(resourceLocator);
             Preconditions.checkNotNull(log);
             Preconditions.checkNotNull(sievePoster);
-            return new SieveMailStorer(mailetContext, usersRepos, 
mailboxManager, folder, resourceLocator, log);
+            return new SieveMailStorer(mailetContext, usersRepos, sievePoster, 
folder, resourceLocator, log);
         }
-
-
     }
 
     private final MailetContext mailetContext;
@@ -115,11 +106,11 @@ public class SieveMailStorer implements MailStorer {
     private final ActionDispatcher actionDispatcher;
     private final Log log;
 
-    public SieveMailStorer(MailetContext mailetContext, UsersRepository 
usersRepos, MailboxManager mailboxManager, String folder,
+    public SieveMailStorer(MailetContext mailetContext, UsersRepository 
usersRepos, SievePoster sievePoster, String folder,
                            ResourceLocator resourceLocator, Log log) throws 
MessagingException {
         this.mailetContext = mailetContext;
         this.usersRepos = usersRepos;
-        this.sievePoster = new SievePoster(mailboxManager, folder, usersRepos, 
mailetContext);
+        this.sievePoster = sievePoster;
         this.folder = folder;
         this.resourceLocator = resourceLocator;
         try {
@@ -190,7 +181,4 @@ public class SieveMailStorer implements MailStorer {
     protected void storeMessageInbox(String username, MimeMessage message) 
throws MessagingException {
         sievePoster.post("mailbox://" + username + "/", message);
     }
-
-
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/135f8e1d/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java
index c4595d1..c287689 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java
@@ -1,7 +1,27 @@
+/****************************************************************
+ * 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.delivery;
 
 import java.util.Date;
 
+import javax.mail.Flags;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
@@ -19,8 +39,13 @@ import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.mailet.MailetContext;
 
+import com.google.common.base.Strings;
+
 public class SievePoster implements Poster {
 
+    private static final boolean IS_RECENT = true;
+    private static final Flags FLAGS = null;
+
     private final MailboxManager mailboxManager;
     private final String folder;
     private final UsersRepository usersRepos;
@@ -35,107 +60,112 @@ public class SievePoster implements Poster {
 
     @Override
     public void post(String url, MimeMessage mail) throws MessagingException {
-
         final int endOfScheme = url.indexOf(':');
-
         if (endOfScheme < 0) {
             throw new MessagingException("Malformed URI");
+        } else {
+            final String scheme = url.substring(0, endOfScheme);
+            if (scheme.equals("mailbox")) {
+                handleMailboxProtocol(url, mail, endOfScheme);
+            } else {
+                throw new MessagingException("Unsupported protocol");
+            }
         }
+    }
 
-        else {
+    private void handleMailboxProtocol(String url, MimeMessage mail, int 
endOfScheme) throws MessagingException {
+        int startOfUser = endOfScheme + 3;
+        int endOfUser = url.indexOf('@', startOfUser);
+        int startOfHost = endOfUser + 1;
+        int endOfHost = url.indexOf('/', startOfHost);
+        if (endOfUser < 0) {
+            // TODO: When user missing, append to a default location
+            throw new MessagingException("Shared mailbox is not supported");
+        } else {
+            String host = url.substring(startOfHost, endOfHost);
+            String user = parseUser(url, startOfUser, endOfUser, host);
+            String urlPath = parseUrlPath(url, endOfHost);
+
+            MailboxSession session = createMailboxSession(user);
+            appendMessageToMailboxWithSession(mail, user, session, 
parseDestinationMailboxPath(user, urlPath, session));
+        }
+    }
 
-            final String scheme = url.substring(0, endOfScheme);
-            if ("mailbox".equals(scheme)) {
-                int startOfUser = endOfScheme + 3;
-                int endOfUser = url.indexOf('@', startOfUser);
-                if (endOfUser < 0) {
-                    // TODO: When user missing, append to a default location
-                    throw new MessagingException("Shared mailbox is not 
supported");
-                } else {
-                    // lowerCase the user - see
-                    // https://issues.apache.org/jira/browse/JAMES-1369
-                    String user = url.substring(startOfUser, 
endOfUser).toLowerCase();
-                    int startOfHost = endOfUser + 1;
-                    int endOfHost = url.indexOf('/', startOfHost);
-                    String host = url.substring(startOfHost, endOfHost);
-                    String urlPath;
-                    int length = url.length();
-                    if (endOfHost + 1 == length) {
-                        urlPath = this.folder;
-                    } else {
-                        urlPath = url.substring(endOfHost, length);
-                    }
-
-                    // Check if we should use the full email address as 
username
-                    try {
-                        if (usersRepos.supportVirtualHosting()) {
-                            user = user + "@" + host;
-                        }
-                    } catch (UsersRepositoryException e) {
-                        throw new MessagingException("Unable to 
accessUsersRepository", e);
-                    }
-
-                    MailboxSession session;
-                    try {
-                        session = mailboxManager.createSystemSession(user, new 
MailetContextLog(mailetContext));
-                    } catch (BadCredentialsException e) {
-                        throw new MessagingException("Unable to authenticate 
to mailbox", e);
-                    } catch (MailboxException e) {
-                        throw new MessagingException("Can not access mailbox", 
e);
-                    }
-
-                    // Start processing request
-                    mailboxManager.startProcessingRequest(session);
-
-                    // This allows Sieve scripts to use a standard delimiter
-                    // regardless of mailbox implementation
-                    String destination = urlPath.replace('/', 
session.getPathDelimiter());
-
-                    if (destination == null || "".equals(destination)) {
-                        destination = this.folder;
-                    }
-                    if (destination.startsWith(session.getPathDelimiter() + 
""))
-                        destination = destination.substring(1);
-
-                    // Use the MailboxSession to construct the MailboxPath - 
See
-                    // JAMES-1326
-                    final MailboxPath path = new 
MailboxPath(MailboxConstants.USER_NAMESPACE, user, destination);
-                    try {
-                        if (this.folder.equalsIgnoreCase(destination) && 
!(mailboxManager.mailboxExists(path, session))) {
-                            mailboxManager.createMailbox(path, session);
-                        }
-                        final MessageManager mailbox = 
mailboxManager.getMailbox(path, session);
-                        if (mailbox == null) {
-                            final String error = "Mailbox for user " + user + 
" was not found on this server.";
-                            throw new MessagingException(error);
-                        }
-
-                        mailbox.appendMessage(new 
MimeMessageInputStream(mail), new Date(), session, true, null);
-
-                    } catch (MailboxException e) {
-                        throw new MessagingException("Unable to access 
mailbox.", e);
-                    } finally {
-                        session.close();
-                        try {
-                            mailboxManager.logout(session, true);
-                        } catch (MailboxException e) {
-                            throw new MessagingException("Can logout from 
mailbox", e);
-                        }
-
-                        // Stop processing request
-                        mailboxManager.endProcessingRequest(session);
-
-                    }
-                }
+    private String parseUrlPath(String url, int endOfHost) {
+        String urlPath;
+        int length = url.length();
+        if (endOfHost + 1 == length) {
+            urlPath = this.folder;
+        } else {
+            urlPath = url.substring(endOfHost, length);
+        }
+        return urlPath;
+    }
 
+    private String parseUser(String url, int startOfUser, int endOfUser, 
String host) throws MessagingException {
+        // lowerCase the user - see
+        // https://issues.apache.org/jira/browse/JAMES-1369
+        String user = url.substring(startOfUser, endOfUser).toLowerCase();
+        // Check if we should use the full email address as username
+        try {
+            if (usersRepos.supportVirtualHosting()) {
+                return user + "@" + host;
             }
+            return user;
+        } catch (UsersRepositoryException e) {
+            throw new MessagingException("Unable to accessUsersRepository", e);
+        }
+    }
 
-            else {
-                // TODO: add support for more protocols
-                // TODO: - for example mailto: for forwarding over SMTP
-                // TODO: - for example xmpp: for forwarding over Jabber
-                throw new MessagingException("Unsupported protocol");
+    private void appendMessageToMailboxWithSession(MimeMessage mail, String 
user, MailboxSession session, MailboxPath path) throws MessagingException {
+        mailboxManager.startProcessingRequest(session);
+        try {
+            appendMessageToMailbox(mail, user, session, path);
+        } catch (MailboxException e) {
+            throw new MessagingException("Unable to access mailbox.", e);
+        } finally {
+            session.close();
+            try {
+                mailboxManager.logout(session, true);
+            } catch (MailboxException e) {
+                throw new MessagingException("Can logout from mailbox", e);
             }
+            mailboxManager.endProcessingRequest(session);
+        }
+    }
+
+    private void appendMessageToMailbox(MimeMessage mail, String user, 
MailboxSession session, MailboxPath path) throws MailboxException, 
MessagingException {
+        if (this.folder.equalsIgnoreCase(path.getName()) && 
!(mailboxManager.mailboxExists(path, session))) {
+            mailboxManager.createMailbox(path, session);
+        }
+        final MessageManager mailbox = mailboxManager.getMailbox(path, 
session);
+        if (mailbox == null) {
+            throw new MessagingException("Mailbox for user " + user + " was 
not found on this server.");
+        }
+        mailbox.appendMessage(new MimeMessageInputStream(mail), new Date(), 
session, IS_RECENT, FLAGS);
+    }
+
+    private MailboxPath parseDestinationMailboxPath(String user, String 
urlPath, MailboxSession session) {
+        // This allows Sieve scripts to use a standard delimiter
+        // regardless of mailbox implementation
+        String destination = urlPath.replace('/', session.getPathDelimiter());
+        if (Strings.isNullOrEmpty(destination)) {
+            destination = this.folder;
+        }
+        if (destination.charAt(0) == session.getPathDelimiter()) {
+            destination = destination.substring(1);
+        }
+        // Use the MailboxSession to construct the MailboxPath - See JAMES-1326
+        return new MailboxPath(MailboxConstants.USER_NAMESPACE, user, 
destination);
+    }
+
+    private MailboxSession createMailboxSession(String user) throws 
MessagingException {
+        try {
+            return mailboxManager.createSystemSession(user, new 
MailetContextLog(mailetContext));
+        } catch (BadCredentialsException e) {
+            throw new MessagingException("Unable to authenticate to mailbox", 
e);
+        } catch (MailboxException e) {
+            throw new MessagingException("Can not access mailbox", e);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/135f8e1d/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java
index e791d9a..9e8ba2d 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java
@@ -18,6 +18,10 @@
  ****************************************************************/
 package org.apache.james.transport.mailets.delivery;
 
+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.sieverepository.api.SieveRepository;
@@ -25,13 +29,8 @@ import 
org.apache.james.transport.mailets.ResourceLocatorImpl;
 import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.mailet.Mail;
-import org.apache.mailet.MailetConfig;
 import org.apache.mailet.base.GenericMailet;
 
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.mail.MessagingException;
-
 /**
  * Receives a Mail from the Queue and takes care to deliver the message
  * to a defined folder of the recipient(s).
@@ -95,7 +94,6 @@ public class ToRecipientFolder extends GenericMailet {
                 .usersRepository(usersRepository)
                 
.resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, 
sieveRepository))
                 .mailetContext(getMailetContext())
-                .mailboxManager(mailboxManager)
                 .folder(folder)
                 .log(log)
                 .build())


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

Reply via email to