JAMES-1854 SieveMailet should have static parameters
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7d311849 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7d311849 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7d311849 Branch: refs/heads/master Commit: 7d311849fe2a7ab2aa78ce1ce5c7c4864960578d Parents: c5bcdf8 Author: Benoit Tellier <[email protected]> Authored: Thu Oct 27 16:36:20 2016 +0200 Committer: Benoit Tellier <[email protected]> Committed: Fri Nov 18 18:46:46 2016 +0700 ---------------------------------------------------------------------- .../mailets/delivery/LocalDelivery.java | 50 ++--- .../transport/mailets/delivery/SieveMailet.java | 197 ++++++++++--------- .../mailets/delivery/ToRecipientFolder.java | 49 ++--- .../mailets/delivery/SieveMailetTest.java | 11 +- 4 files changed, 143 insertions(+), 164 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/7d311849/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 7fafbbe..b592354 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 @@ -107,46 +107,24 @@ public class LocalDelivery extends GenericMailet { /** * @see org.apache.mailet.base.GenericMailet#init() */ - public void init() throws MessagingException { - - super.init(); - + public void init(MailetConfig mailetConfig) throws MessagingException { + super.init(mailetConfig); recipientRewriteTable = new RecipientRewriteTable(); recipientRewriteTable.setDomainList(domainList); recipientRewriteTable.setRecipientRewriteTable(rrt); recipientRewriteTable.init(getMailetConfig()); - sieveMailet = new SieveMailet(usersRepository, - mailboxManager, - ResourceLocatorImpl.instanciate(usersRepository, sieveRepository), - "INBOX"); - sieveMailet.init(new MailetConfig() { - public String getInitParameter(String name) { - if ("addDeliveryHeader".equals(name)) { - return "Delivered-To"; - } else if ("resetReturnPath".equals(name)) { - return "true"; - } else { - return getMailetConfig().getInitParameter(name); - } - } - - public Iterator<String> getInitParameterNames() { - return Iterators.concat( - getMailetConfig().getInitParameterNames(), - Lists.newArrayList("addDeliveryHeader", "resetReturnPath").iterator()); - } - - public MailetContext getMailetContext() { - return getMailetConfig().getMailetContext(); - } - - public String getMailetName() { - return getMailetConfig().getMailetName(); - } - - }); - // Override the default value of "quiet" - sieveMailet.setQuiet(getInitParameter("quiet", true)); + sieveMailet = SieveMailet.builder() + .mailboxManager(mailboxManager) + .userRepository(usersRepository) + .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) + .consume(getInitParameter("consume", true)) + .deliveryHeader("Delivered-To") + .resetReturnPath(true) + .quiet(getInitParameter("quiet", false)) + .verbose(getInitParameter("verbose", false)) + .folder("INBOX") + .build(); + sieveMailet.init(mailetConfig); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/7d311849/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java index fd74dff..2b4bdc4 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java @@ -57,116 +57,130 @@ 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.MailetConfig; import org.apache.mailet.MailetException; import org.apache.mailet.base.GenericMailet; import org.apache.mailet.base.RFC2822Headers; +import com.google.common.base.Optional; + /** * Contains resource bindings. */ public class SieveMailet extends GenericMailet implements Poster { - private final UsersRepository usersRepos; - private final MailboxManager mailboxManager; - private final String folder; - private final ResourceLocator resourceLocator; - private String deliveryHeader; - private boolean resetReturnPath; - private Poster poster; - private ResourceLocator locator; - private boolean verbose = false; - private boolean consume = true; - private boolean quiet = true; - private SieveFactory factory; - private ActionDispatcher actionDispatcher; - private Log log; - - public SieveMailet(UsersRepository usersRepos, MailboxManager mailboxManager, ResourceLocator resourceLocator, String folder) { - this.usersRepos = usersRepos; - this.resourceLocator = resourceLocator; - this.mailboxManager = mailboxManager; - this.folder = folder; - } - @Override - public void init() throws MessagingException { + public static Builder builder() { + return new Builder(); + } - this.deliveryHeader = getInitParameter("addDeliveryHeader"); - this.resetReturnPath = getInitParameter("resetReturnPath", true); - this.consume = getInitParameter("consume", true); - this.verbose = getInitParameter("verbose", false); - this.quiet = getInitParameter("quiet", false); + public static class Builder { + private UsersRepository usersRepos; + private MailboxManager mailboxManager; + private String folder; + private ResourceLocator resourceLocator; + private String deliveryHeader; + private boolean resetReturnPath; + private boolean consume; + private Optional<Boolean> verbose = Optional.absent(); + private Optional<Boolean> quiet = Optional.absent(); + + public Builder userRepository(UsersRepository usersRepository) { + this.usersRepos = usersRepository; + return this; + } - actionDispatcher = new ActionDispatcher(); + public Builder mailboxManager(MailboxManager mailboxManager) { + this.mailboxManager = mailboxManager; + return this; + } - setLocator(resourceLocator); - setPoster(this); + public Builder folder(String folder) { + this.folder = folder; + return this; + } - if (poster == null || locator == null) { - throw new MailetException("Not initialised. Please ensure that the mailet container supports either" + - " setter or constructor injection"); + public Builder resourceLocator(ResourceLocator resourceLocator) { + this.resourceLocator = resourceLocator; + return this; } - try { - final ConfigurationManager configurationManager = new ConfigurationManager(); - final int logLevel; - if (verbose) { - logLevel = CommonsLoggingAdapter.TRACE; - } else if (quiet) { - logLevel = CommonsLoggingAdapter.FATAL; - } else { - logLevel = CommonsLoggingAdapter.WARN; - } - log = new CommonsLoggingAdapter(this, logLevel); - configurationManager.setLog(log); - factory = configurationManager.build(); - } catch (SieveConfigurationException e) { - throw new MessagingException("Failed to load standard Sieve configuration.", e); + public Builder deliveryHeader(String deliveryHeader) { + this.deliveryHeader = deliveryHeader; + return this; } - } - public ResourceLocator getLocator() { - return locator; - } + public Builder resetReturnPath(boolean resetReturnPath) { + this.resetReturnPath = resetReturnPath; + return this; + } - public void setLocator(ResourceLocator locator) { - this.locator = locator; - } + public Builder verbose(boolean verbose) { + this.verbose = Optional.of(verbose); + return this; + } - public Poster getPoster() { - return poster; - } + public Builder consume(boolean consume) { + this.consume = consume; + return this; + } - public void setPoster(Poster poster) { - this.poster = poster; - } + public Builder quiet(boolean quiet) { + this.quiet = Optional.of(quiet); + return this; + } - public boolean isConsume() { - return consume; - } + public SieveMailet build() throws MessagingException { + if (resourceLocator == null) { + throw new MailetException("Not initialised. Please ensure that the mailet container supports either setter or constructor injection"); + } + return new SieveMailet(usersRepos,mailboxManager, resourceLocator, folder, deliveryHeader, resetReturnPath, consume, verbose.or(false), quiet.or(false)); + } - public void setConsume(boolean consume) { - this.consume = consume; } - public boolean isVerbose() { - return verbose; - } + private final UsersRepository usersRepos; + private final MailboxManager mailboxManager; + private final String folder; + private final ResourceLocator resourceLocator; + private final String deliveryHeader; + private final boolean resetReturnPath; + private final boolean isInfo; + private final boolean verbose; + private final boolean consume; + private final SieveFactory factory; + private final ActionDispatcher actionDispatcher; + private final Log log; + + private SieveMailet(UsersRepository usersRepos, MailboxManager mailboxManager, ResourceLocator resourceLocator, String folder, String deliveryHeader, + boolean resetReturnPath, boolean consume, boolean verbose, boolean quiet) throws MessagingException { - public void setVerbose(boolean verbose) { + this.usersRepos = usersRepos; + this.resourceLocator = resourceLocator; + this.mailboxManager = mailboxManager; + this.folder = folder; + this.actionDispatcher = new ActionDispatcher(); + this.deliveryHeader = deliveryHeader; + this.resetReturnPath = resetReturnPath; + this.consume = consume; + this.isInfo = verbose || !quiet; this.verbose = verbose; + this.log = new CommonsLoggingAdapter(this, computeLogLevel(quiet, verbose)); + try { + final ConfigurationManager configurationManager = new ConfigurationManager(); + configurationManager.setLog(log); + factory = configurationManager.build(); + } catch (SieveConfigurationException e) { + throw new MessagingException("Failed to load standard Sieve configuration.", e); + } } - public boolean isQuiet() { - return quiet; - } - - public void setQuiet(boolean quiet) { - this.quiet = quiet; - } - - public boolean isInfoLoggingOn() { - return verbose || !quiet; + private int computeLogLevel(boolean quiet, boolean verbose) { + if (verbose) { + return CommonsLoggingAdapter.TRACE; + } else if (quiet) { + return CommonsLoggingAdapter.FATAL; + } else { + return CommonsLoggingAdapter.WARN; + } } protected String getUsername(MailAddress m) { @@ -177,7 +191,7 @@ public class SieveMailet extends GenericMailet implements Poster { return m.getLocalPart() + "@localhost"; } } catch (UsersRepositoryException e) { - log("Unable to access UsersRepository", e); + log.error("Unable to access UsersRepository", e); return m.getLocalPart() + "@localhost"; } @@ -202,7 +216,7 @@ public class SieveMailet extends GenericMailet implements Poster { } // If no exception was thrown the message was successfully stored in the // mailbox - log("Local delivered mail " + mail.getName() + " sucessfully from " + s + " to " + recipient.toString() + log.info("Local delivered mail " + mail.getName() + " sucessfully from " + s + " to " + recipient.toString() + " in folder " + this.folder); } @@ -379,7 +393,7 @@ public class SieveMailet extends GenericMailet implements Poster { } } } catch (Exception ex) { - log("Error while storing mail.", ex); + log.error("Error while storing mail.", ex); errors.add(recipient); } } @@ -404,15 +418,15 @@ public class SieveMailet extends GenericMailet implements Poster { protected void sieveMessage(MailAddress recipient, Mail aMail) throws MessagingException { String username = getUsername(recipient); try { - final ResourceLocator.UserSieveInformation userSieveInformation = locator.get(getScriptUri(recipient)); + final ResourceLocator.UserSieveInformation userSieveInformation = resourceLocator.get(getScriptUri(recipient)); sieveMessageEvaluate(recipient, aMail, userSieveInformation); } 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 - if (isInfoLoggingOn()) { - log("Cannot evaluate Sieve script. Storing mail in user INBOX.", ex); + if (isInfo) { + log.error("Cannot evaluate Sieve script. Storing mail in user INBOX.", ex); } storeMessageInbox(username, aMail.getMessage()); } @@ -421,12 +435,12 @@ public class SieveMailet extends GenericMailet implements Poster { private void sieveMessageEvaluate(MailAddress recipient, Mail aMail, ResourceLocator.UserSieveInformation userSieveInformation) throws MessagingException, IOException { try { SieveMailAdapter aMailAdapter = new SieveMailAdapter(aMail, - getMailetContext(), actionDispatcher, poster, userSieveInformation.getScriptActivationDate(), + getMailetContext(), actionDispatcher, this, userSieveInformation.getScriptActivationDate(), userSieveInformation.getScriptInterpretationDate(), recipient); aMailAdapter.setLog(log); // This logging operation is potentially costly if (verbose) { - log("Evaluating " + aMailAdapter.toString() + "against \"" + log.error("Evaluating " + aMailAdapter.toString() + "against \"" + getScriptUri(recipient) + "\""); } factory.evaluate(aMailAdapter, factory.parse(userSieveInformation.getScriptContent())); @@ -443,8 +457,7 @@ public class SieveMailet extends GenericMailet implements Poster { } protected void storeMessageInbox(String username, MimeMessage message) throws MessagingException { - String url = "mailbox://" + username + "/"; - poster.post(url, message); + post("mailbox://" + username + "/", message); } http://git-wip-us.apache.org/repos/asf/james-project/blob/7d311849/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 e5af0cb..36744f0 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 @@ -89,41 +89,20 @@ public class ToRecipientFolder extends GenericMailet { } @Override - public void init() throws MessagingException { - super.init(); - sieveMailet = new SieveMailet(usersRepository, mailboxManager, ResourceLocatorImpl.instanciate(usersRepository, sieveRepository), getInitParameter(FOLDER_PARAMETER, "INBOX")); - sieveMailet.init(new MailetConfig() { - - @Override - public String getInitParameter(String name) { - if ("addDeliveryHeader".equals(name)) { - return "Delivered-To"; - } else if ("resetReturnPath".equals(name)) { - return "true"; - } else { - return getMailetConfig().getInitParameter(name); - } - } - - @Override - public Iterator<String> getInitParameterNames() { - return Iterators.concat(getMailetConfig().getInitParameterNames(), - Arrays.asList("addDeliveryHeader", "resetReturnPath").iterator()); - } - - @Override - public MailetContext getMailetContext() { - return getMailetConfig().getMailetContext(); - } - - @Override - public String getMailetName() { - return getMailetConfig().getMailetName(); - } - - }); - sieveMailet.setQuiet(getInitParameter("quiet", true)); - sieveMailet.setConsume(getInitParameter(CONSUME_PARAMETER, false)); + public void init(MailetConfig mailetConfig) throws MessagingException { + super.init(mailetConfig); + sieveMailet = SieveMailet.builder() + .mailboxManager(mailboxManager) + .userRepository(usersRepository) + .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) + .deliveryHeader("Delivered-To") + .folder(getInitParameter(FOLDER_PARAMETER, "INBOX")) + .resetReturnPath(true) + .consume(getInitParameter(CONSUME_PARAMETER, false)) + .verbose(getInitParameter("verbose", false)) + .quiet(getInitParameter("quiet", true)) + .build(); + sieveMailet.init(mailetConfig); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/7d311849/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java index 1c69378..0e29313 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java @@ -102,7 +102,16 @@ public class SieveMailetTest { mailboxManager = mock(MailboxManager.class); fakeMailContext = FakeMailContext.defaultContext(); fakeMailetConfig = new FakeMailetConfig("sieveMailet", fakeMailContext); - sieveMailet = new SieveMailet(usersRepository, mailboxManager, resourceLocator, "INBOX"); + + sieveMailet = SieveMailet.builder() + .userRepository(usersRepository) + .mailboxManager(mailboxManager) + .resourceLocator(resourceLocator) + .folder("INBOX") + .deliveryHeader("DELIVERY_HEADER") + .resetReturnPath(true) + .consume(true) + .build(); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
