JAMES-1670 ToRecipientFolder mailet should use init 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/49a9cd91 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/49a9cd91 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/49a9cd91
Branch: refs/heads/master Commit: 49a9cd9140d6bbc2c987f5c960e5aca932a8c409 Parents: 813af4a Author: akaplan <akaplan@192.168.1.26> Authored: Thu Jan 28 20:45:40 2016 +0200 Committer: Benoit Tellier <btell...@linagora.com> Committed: Tue Mar 1 11:04:41 2016 +0700 ---------------------------------------------------------------------- .../transport/mailets/ToRecipientFolder.java | 14 +- .../mailets/delivery/RecipientFolderTest.java | 197 +++++++++++++++++++ server/src/site/xdoc/dev-provided-mailets.xml | 20 ++ 3 files changed, 228 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/49a9cd91/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java index 4e227e0..8e51172 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java @@ -56,6 +56,9 @@ public class ToRecipientFolder extends GenericMailet { private MailboxManager mailboxManager; private SieveRepository sieveRepository; private UsersRepository usersRepository; + + private String folder; + private boolean consume; @Inject public void setMailboxManager(@Named("mailboxmanager")MailboxManager mailboxManager) { @@ -63,8 +66,8 @@ public class ToRecipientFolder extends GenericMailet { } @Inject - public void setSetUsersRepository(SieveRepository setUsersRepository) { - this.sieveRepository = setUsersRepository; + public void setSieveRepository(SieveRepository sieveRepository) { + this.sieveRepository = sieveRepository; } @Inject @@ -83,13 +86,18 @@ public class ToRecipientFolder extends GenericMailet { public void service(Mail mail) throws MessagingException { if (!mail.getState().equals(Mail.GHOST)) { sieveMailet.service(mail); + if (consume) { + mail.setState(Mail.GHOST); + } } } @Override public void init() throws MessagingException { super.init(); - sieveMailet = new SieveMailet(usersRepository, mailboxManager, sieveRepository, "INBOX"); + this.folder = getInitParameter("folder", "INBOX"); + this.consume = getInitParameter("consume", false); + sieveMailet = new SieveMailet(usersRepository, mailboxManager, sieveRepository, this.folder); sieveMailet.init(new MailetConfig() { @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/49a9cd91/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/RecipientFolderTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/RecipientFolderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/RecipientFolderTest.java new file mode 100644 index 0000000..6adcb7c --- /dev/null +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/RecipientFolderTest.java @@ -0,0 +1,197 @@ +/** + * ************************************************************** + * 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 static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.common.collect.Lists; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.sieverepository.api.SieveRepository; +import org.apache.james.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.MailAddress; +import org.apache.mailet.base.test.FakeMail; +import org.apache.mailet.base.test.FakeMailetConfig; +import org.junit.Before; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.slf4j.Logger; + +import javax.activation.DataHandler; +import javax.mail.Flags; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.util.ByteArrayDataSource; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Date; +import java.util.Properties; +import javax.mail.internet.ParseException; +import org.apache.james.transport.mailets.ToProcessor; +import org.apache.james.transport.mailets.ToRecipientFolder; +import org.apache.mailet.Mailet; +import org.apache.mailet.base.test.FakeMailContext; +import org.junit.Assert; + +public class RecipientFolderTest { + + private UsersRepository usersRepository; + private MailboxManager mailboxManager; + private SieveRepository sieveRepository; + private ToRecipientFolder recipientFolder; + private FakeMailetConfig mailetConfig; + + private String folder = null; + + private String consume = null; + + private void setFolder(String folder) { + this.folder = folder; + } + + private void setConsume(String consume) { + this.consume = consume; + } + + @Before + public void setUp() throws Exception { + sieveRepository = mock(SieveRepository.class); + usersRepository = mock(UsersRepository.class); + mailboxManager = mock(MailboxManager.class); + + mailetConfig = new FakeMailetConfig("RecipientFolderTest", + new FakeMailContext()); + + recipientFolder = new ToRecipientFolder(); + recipientFolder.setMailboxManager(mailboxManager); + recipientFolder.setUsersRepository(usersRepository); + recipientFolder.setSieveRepository(sieveRepository); + + setFolder("Junk"); + setConsume("true"); + + if (folder != null) { + mailetConfig.setProperty("folder", folder); + } + if (consume != null) { + mailetConfig.setProperty("consume", consume); + } + recipientFolder.init(mailetConfig); + + } + + @Test + public void initParameterTesting() throws Exception { + + Mail mail = createMail(); + recipientFolder.service(mail); + Assert.assertEquals("Junk", recipientFolder.getInitParameter("folder")); + } + + // test if ToRecipientFolder works + @Test + public void ToRecipientFolderConsumeTest() throws Exception { + + Mail mail = createMail(); + recipientFolder.service(mail); + + Assert.assertEquals(Boolean.valueOf(consume), mail.getState().equals(Mail.GHOST)); + } + + @Test + public void mailShouldBeWellReceivedByDefaultToUserWhenvirtualHostingIsTurnedOn() throws Exception { + + when(usersRepository.supportVirtualHosting()).thenAnswer(new Answer<Boolean>() { + @Override + public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable { + return true; + } + }); + recipientTest(); + } + + private void recipientTest() throws Exception { + + MailboxPath junkbox = new MailboxPath("#private", "recei...@domain.com", "Junk"); + final MessageManager messageManager = mock(MessageManager.class); + when(mailboxManager.getMailbox(eq(junkbox), any(MailboxSession.class))).thenAnswer(new Answer<MessageManager>() { + @Override + public MessageManager answer(InvocationOnMock invocationOnMock) throws Throwable { + return messageManager; + } + }); + final MailboxSession session = mock(MailboxSession.class); + when(session.getPathDelimiter()).thenAnswer(new Answer<Character>() { + @Override + public Character answer(InvocationOnMock invocationOnMock) throws Throwable { + return '.'; + } + }); + when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenAnswer(new Answer<MailboxSession>() { + @Override + public MailboxSession answer(InvocationOnMock invocationOnMock) throws Throwable { + return session; + } + }); + + Mail mail = createMail(); + + recipientFolder.init(mailetConfig); + recipientFolder.service(mail); + + verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); + + } + + private Mail createMail() throws MessagingException, IOException { + MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties())); + message.setSubject("Subject"); + message.setSender(new InternetAddress("sen...@any.com")); + message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("recei...@domain.com")); + MimeMultipart multipart = new MimeMultipart(); + MimeBodyPart scriptPart = new MimeBodyPart(); + scriptPart.setDataHandler( + new DataHandler( + new ByteArrayDataSource( + "toto", + "application/sieve; charset=UTF-8") + )); + scriptPart.setDisposition(MimeBodyPart.ATTACHMENT); + scriptPart.setHeader("Content-Type", "application/sieve; charset=UTF-8"); + scriptPart.setFileName("file.txt"); + multipart.addBodyPart(scriptPart); + message.setContent(multipart); + message.saveChanges(); + Mail mail = new FakeMail(message); + mail.setState(Mail.DEFAULT); + mail.setRecipients(Lists.newArrayList(new MailAddress("recei...@domain.com"))); + return mail; + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/49a9cd91/server/src/site/xdoc/dev-provided-mailets.xml ---------------------------------------------------------------------- diff --git a/server/src/site/xdoc/dev-provided-mailets.xml b/server/src/site/xdoc/dev-provided-mailets.xml index 87a9acc..ac1ad54 100644 --- a/server/src/site/xdoc/dev-provided-mailets.xml +++ b/server/src/site/xdoc/dev-provided-mailets.xml @@ -578,6 +578,26 @@ Default is to not add a header.</li> </p> </subsection> +<subsection name="ToRecipientFolder"> + <p> + Description: Place a copy of the mail message in a folder of the recipient. It receives a Mail from the Queue and + takes care to deliver the message to a defined folder of the recipient(s). + </p> + + <p>Parameters: + <ul> + <li><strong>folder</strong> (required) - The folder name of the Recipient mailbox in which the mail will be copied.</li> + <li><strong>consume</strong> (optional) - flag true or false: will tell is the mail will be further processed by the upcoming processor mailets, or not</li> + </ul> + </p> + +<source> +<mailet match="RecipientIsLocal" class="ToRecipientFolder"> + <folder>Junk</folder> + <consume>false</consume> +</mailet> +</source> + <subsection name="ToRepository"> <p>Places a copy of the message in the specified repository.</p> --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org