Repository: james-project Updated Branches: refs/heads/master 19d4dc0e7 -> 081102eab
JAMES-2081 Implement and document ImportEml CLI command Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c2a21ffc Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c2a21ffc Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c2a21ffc Branch: refs/heads/master Commit: c2a21ffc0d23d96893f447535dc243686a3eb70f Parents: 3a70ae8 Author: ilker yıldırım <ilker.c...@gmail.com> Authored: Tue Jul 4 16:50:48 2017 +0300 Committer: benwa <btell...@linagora.com> Committed: Mon Jul 10 14:58:09 2017 +0700 ---------------------------------------------------------------------- .../james/mailbox/store/probe/MailboxProbe.java | 2 + .../java/org/apache/james/cli/ServerCmd.java | 3 ++ .../james/cli/probe/impl/JmxMailboxProbe.java | 5 ++ .../java/org/apache/james/cli/type/CmdType.java | 1 + .../org/apache/james/cli/ServerCmdTest.java | 51 ++++++++++++++++++++ .../org/apache/james/cli/type/CmdTypeTest.java | 6 +++ .../apache/james/modules/MailboxProbeImpl.java | 15 ++++++ .../mailbox/MailboxManagerManagement.java | 29 ++++++++++- .../mailbox/MailboxManagerManagementMBean.java | 16 +++++- .../adapter/mailbox/MailboxManagementTest.java | 43 +++++++++++++++++ .../src/test/resources/eml/frnog.eml | 17 +++++++ src/site/markdown/server/manage-cli.md | 13 ++++- 12 files changed, 198 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/MailboxProbe.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/MailboxProbe.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/MailboxProbe.java index 2a64365..6878bb5 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/MailboxProbe.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/MailboxProbe.java @@ -40,6 +40,8 @@ public interface MailboxProbe { void deleteMailbox(String namespace, String user, String name); + void importEmlFileToMailbox(String namespace, String user, String name, String emlpath) throws Exception; + ComposedMessageId appendMessage(String username, MailboxPath mailboxPath, InputStream message, Date internalDate, boolean isRecent, Flags flags) throws MailboxException; http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java ---------------------------------------------------------------------- diff --git a/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java b/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java index efbf4b6..5ad4e79 100644 --- a/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java +++ b/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java @@ -266,6 +266,9 @@ public class ServerCmd { case DELETEMAILBOX: mailboxProbe.deleteMailbox(arguments[1], arguments[2], arguments[3]); break; + case IMPORTEML: + mailboxProbe.importEmlFileToMailbox(arguments[1], arguments[2], arguments[3], arguments[4]); + break; case GETSTORAGEQUOTA: printStorageQuota(arguments[1], quotaProbe.getStorageQuota(arguments[1]), printStream); break; http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxMailboxProbe.java ---------------------------------------------------------------------- diff --git a/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxMailboxProbe.java b/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxMailboxProbe.java index ab2efc3..b3b5cc5 100644 --- a/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxMailboxProbe.java +++ b/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxMailboxProbe.java @@ -84,6 +84,11 @@ public class JmxMailboxProbe implements MailboxProbe, JmxProbe { } @Override + public void importEmlFileToMailbox(String namespace, String user, String name, String emlpath) { + mailboxManagerManagement.importEmlFileToMailbox(namespace, user, name, emlpath); + } + + @Override public void reIndexMailbox(String namespace, String user, String name) throws Exception { reIndexerManagement.reIndex(namespace, user, name); } http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/cli/src/main/java/org/apache/james/cli/type/CmdType.java ---------------------------------------------------------------------- diff --git a/server/container/cli/src/main/java/org/apache/james/cli/type/CmdType.java b/server/container/cli/src/main/java/org/apache/james/cli/type/CmdType.java index 1858666..b94e0da 100644 --- a/server/container/cli/src/main/java/org/apache/james/cli/type/CmdType.java +++ b/server/container/cli/src/main/java/org/apache/james/cli/type/CmdType.java @@ -41,6 +41,7 @@ public enum CmdType { CREATEMAILBOX("CreateMailbox", "namespace", "user", "name"), LISTUSERMAILBOXES("ListUserMailboxes", "user"), DELETEMAILBOX("DeleteMailbox", "namespace", "user", "name"), + IMPORTEML("ImportEml", "namespace", "user", "name", "path"), GETSTORAGEQUOTA("GetStorageQuota", "quotaroot"), GETMESSAGECOUNTQUOTA("GetMessageCountQuota", "quotaroot"), GETQUOTAROOT("GetQuotaroot", "namespace", "user", "name"), http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java ---------------------------------------------------------------------- diff --git a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java index 570167b..f8281b2 100644 --- a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java +++ b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java @@ -332,7 +332,24 @@ public class ServerCmdTest { testee.executeCommandLine(commandLine); control.verify(); } + + @Test + public void importEmlFileToMailboxCommandShouldWork() throws Exception { + String user = "user@domain"; + String namespace = "#private"; + String name = "INBOX.test"; + String emlpath = "./src/test/resources/eml/frnog.eml"; + String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.IMPORTEML.getCommand(), namespace, user, name, emlpath}; + CommandLine commandLine = ServerCmd.parseCommandLine(arguments); + mailboxProbe.importEmlFileToMailbox(namespace, user, name, emlpath); + expectLastCall(); + + control.replay(); + testee.executeCommandLine(commandLine); + control.verify(); + } + @Test public void listUserMailboxesMappingsCommandShouldWork() throws Exception { String user = "user@domain"; @@ -811,6 +828,23 @@ public class ServerCmdTest { control.verify(); } } + + + @Test(expected = InvalidArgumentNumberException.class) + public void importEmlFileToMailboxCommandShouldThrowOnMissingArguments() throws Exception { + String user = "user@domain"; + String namespace = "#private"; + String name = "INBOX.test"; + String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.IMPORTEML.getCommand(), namespace, user, name}; + CommandLine commandLine = ServerCmd.parseCommandLine(arguments); + + control.replay(); + try { + testee.executeCommandLine(commandLine); + } finally { + control.verify(); + } + } @Test(expected = InvalidArgumentNumberException.class) public void listUserMailboxesMappingsCommandShouldThrowOnMissingArguments() throws Exception { @@ -1091,6 +1125,23 @@ public class ServerCmdTest { } @Test(expected = InvalidArgumentNumberException.class) + public void importEmlFileToMailboxCommandShouldThrowOnAdditionalArguments() throws Exception { + String user = "user@domain"; + String namespace = "#private"; + String name = "INBOX.test"; + String emlpath = "./src/test/resources/eml/frnog.eml"; + String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.IMPORTEML.getCommand(), namespace, user, name, emlpath, ADDITIONAL_ARGUMENT}; + CommandLine commandLine = ServerCmd.parseCommandLine(arguments); + + control.replay(); + try { + testee.executeCommandLine(commandLine); + } finally { + control.verify(); + } + } + + @Test(expected = InvalidArgumentNumberException.class) public void listUserMailboxesMappingsCommandShouldThrowOnAdditionalArguments() throws Exception { String user = "user@domain"; String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.LISTUSERMAILBOXES.getCommand(), user, ADDITIONAL_ARGUMENT }; http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/cli/src/test/java/org/apache/james/cli/type/CmdTypeTest.java ---------------------------------------------------------------------- diff --git a/server/container/cli/src/test/java/org/apache/james/cli/type/CmdTypeTest.java b/server/container/cli/src/test/java/org/apache/james/cli/type/CmdTypeTest.java index 3d66295..39b8d85 100644 --- a/server/container/cli/src/test/java/org/apache/james/cli/type/CmdTypeTest.java +++ b/server/container/cli/src/test/java/org/apache/james/cli/type/CmdTypeTest.java @@ -139,6 +139,12 @@ public class CmdTypeTest { } @Test + public void lookupImportEmlFileToMailboxShouldReturnEnumValue() { + assertThat(CmdType.lookup("ImportEml")) + .isEqualTo(CmdType.IMPORTEML); + } + + @Test public void lookupSetDefaultMaxStorageQuotaShouldReturnEnumValue() { assertThat(CmdType.lookup("setdefaultmaxstoragequota")).isEqualTo(CmdType.SETDEFAULTMAXSTORAGEQUOTA); } http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java ---------------------------------------------------------------------- diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java index b478977..445fa46 100644 --- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java +++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java @@ -19,6 +19,7 @@ package org.apache.james.modules; +import java.io.FileInputStream; import java.io.InputStream; import java.util.Collection; import java.util.Date; @@ -55,6 +56,7 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe { private final MailboxManager mailboxManager; private final MailboxMapperFactory mailboxMapperFactory; private final SubscriptionManager subscriptionManager; + public static final boolean RECENT = true; @Inject private MailboxProbeImpl(MailboxManager mailboxManager, MailboxMapperFactory mailboxMapperFactory, SubscriptionManager subscriptionManager) { @@ -145,6 +147,19 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe { } @Override + public void importEmlFileToMailbox(String namespace, String user, String name, String emlPath) throws Exception { + MailboxSession mailboxSession = mailboxManager.createSystemSession(user, LOGGER); + mailboxManager.startProcessingRequest(mailboxSession); + + MessageManager messageManager = mailboxManager.getMailbox(new MailboxPath(namespace, user, name), mailboxSession); + InputStream emlFileAsStream = new FileInputStream(emlPath); + messageManager.appendMessage(emlFileAsStream, new Date(), mailboxSession, RECENT, new Flags()); + + mailboxManager.endProcessingRequest(mailboxSession); + mailboxSession.close(); + } + + @Override public ComposedMessageId appendMessage(String username, MailboxPath mailboxPath, InputStream message, Date internalDate, boolean isRecent, Flags flags) throws MailboxException { http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java ---------------------------------------------------------------------- diff --git a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java index 098af84..5f794a8 100644 --- a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java +++ b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java @@ -18,19 +18,23 @@ ****************************************************************/ package org.apache.james.adapter.mailbox; +import java.io.FileInputStream; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.List; import javax.inject.Inject; import javax.inject.Named; +import javax.mail.Flags; import javax.management.NotCompliantMBeanException; import javax.management.StandardMBean; -import com.google.common.base.Preconditions; import org.apache.james.lifecycle.api.LogEnabled; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxMetaData; @@ -38,6 +42,8 @@ import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MailboxQuery; import org.slf4j.Logger; +import com.google.common.base.Preconditions; + /** * JMX managmenent for Mailboxes */ @@ -45,6 +51,7 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa private MailboxManager mailboxManager; private Logger log; + private static final boolean RECENT = true; @Inject public void setMailboxManager(@Named("mailboxmanager") MailboxManager mailboxManager) { @@ -142,6 +149,26 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa } } + @Override + public void importEmlFileToMailbox(String namespace, String user, String name, String emlPath) { + checkMailboxArguments(namespace, user, name); + checkString(emlPath, "email file path name"); + + MailboxSession session = null; + try { + session = mailboxManager.createSystemSession(user, log); + mailboxManager.startProcessingRequest(session); + MessageManager messageManager = mailboxManager.getMailbox(new MailboxPath(namespace, user, name), session); + InputStream emlFileAsStream = new FileInputStream(emlPath); + messageManager.appendMessage(emlFileAsStream, new Date(), + session, RECENT, new Flags()); + } catch (Exception e) { + log.error("Unable to create mailbox", e); + } finally { + closeSession(session); + } + } + private void closeSession(MailboxSession session) { if (session != null) { mailboxManager.endProcessingRequest(session); http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagementMBean.java ---------------------------------------------------------------------- diff --git a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagementMBean.java b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagementMBean.java index f36d295..9485075 100644 --- a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagementMBean.java +++ b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagementMBean.java @@ -58,4 +58,18 @@ public interface MailboxManagerManagementMBean { * @param name Name of the mailbox to delete */ void deleteMailbox(String namespace, String user, String name); -} \ No newline at end of file + + /** + * Import Eml File to the given mailbox + * + * @param namespace + * Namespace of the mailbox to import email file + * @param user + * User the mailbox to import email file belongs to + * @param name + * Name of the mailbox to import email file + * @param emlpath + * Name of the email file of this URL + */ + void importEmlFileToMailbox(String namespace, String user, String name, String emlpath); +} http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java ---------------------------------------------------------------------- diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java index 4c4cc42..30385cd 100644 --- a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java +++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java @@ -21,18 +21,26 @@ package org.apache.james.adapter.mailbox; import static org.assertj.core.api.Assertions.assertThat; +import java.io.File; +import java.io.FileInputStream; +import java.util.Iterator; + +import org.apache.commons.io.IOUtils; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; import org.apache.james.mailbox.acl.UnionMailboxACLResolver; import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.store.JVMMailboxPathLocker; import org.apache.james.mailbox.store.FakeAuthenticator; import org.apache.james.mailbox.store.FakeAuthorizator; import org.apache.james.mailbox.store.StoreMailboxManager; +import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.model.DefaultMessageId; import org.apache.james.mailbox.store.mail.model.Mailbox; +import org.apache.james.mailbox.store.mail.model.MailboxMessage; import org.apache.james.mailbox.store.mail.model.impl.MessageParser; import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; import org.junit.Before; @@ -40,11 +48,14 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Charsets; + public class MailboxManagementTest { private static final Logger LOGGER = LoggerFactory.getLogger(MailboxManagementTest.class); public static final String USER = "user"; public static final int UID_VALIDITY = 10; + public static final int LIMIT = 1; private MailboxManagerManagement mailboxManagerManagement; private InMemoryMailboxSessionMapperFactory inMemoryMapperFactory; @@ -236,6 +247,38 @@ public class MailboxManagementTest { assertThat(inMemoryMapperFactory.createMailboxMapper(session).list()).containsOnly(mailbox); } + @Test + public void importEmlFileToMailboxShouldImportEmlFileToGivenMailbox() throws Exception { + Mailbox mailbox = new SimpleMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, "name"), + UID_VALIDITY); + inMemoryMapperFactory.createMailboxMapper(session).save(mailbox); + String emlpath = ClassLoader.getSystemResource("eml/frnog.eml").getFile(); + mailboxManagerManagement.importEmlFileToMailbox(MailboxConstants.USER_NAMESPACE, USER, "name", emlpath); + + assertThat(inMemoryMapperFactory.getMessageMapper(session).countMessagesInMailbox(mailbox)).isEqualTo(1); + Iterator<MailboxMessage> iterator = inMemoryMapperFactory.getMessageMapper(session).findInMailbox(mailbox, + MessageRange.all(), MessageMapper.FetchType.Full, LIMIT); + MailboxMessage mailboxMessage = iterator.next(); + + assertThat(IOUtils.toString(new FileInputStream(new File(emlpath)), Charsets.UTF_8)) + .isEqualTo(IOUtils.toString(mailboxMessage.getFullContent(), Charsets.UTF_8)); + } + + @Test + public void importEmlFileToMailboxShouldNotImportEmlFileWithWrongPathToGivenMailbox() throws Exception { + Mailbox mailbox = new SimpleMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, "name"), + UID_VALIDITY); + inMemoryMapperFactory.createMailboxMapper(session).save(mailbox); + String emlpath = ClassLoader.getSystemResource("eml/frnog.eml").getFile(); + mailboxManagerManagement.importEmlFileToMailbox(MailboxConstants.USER_NAMESPACE, USER, "name", "wrong_path" + emlpath); + + assertThat(inMemoryMapperFactory.getMessageMapper(session).countMessagesInMailbox(mailbox)).isEqualTo(0); + Iterator<MailboxMessage> iterator = inMemoryMapperFactory.getMessageMapper(session).findInMailbox(mailbox, + MessageRange.all(), MessageMapper.FetchType.Full, LIMIT); + assertThat(iterator.hasNext()).isFalse(); + } + + @Test(expected = NullPointerException.class) public void deleteMailboxShouldThrowOnNullNamespace() { mailboxManagerManagement.deleteMailbox(null, "a", "a"); http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/server/container/mailbox-adapter/src/test/resources/eml/frnog.eml ---------------------------------------------------------------------- diff --git a/server/container/mailbox-adapter/src/test/resources/eml/frnog.eml b/server/container/mailbox-adapter/src/test/resources/eml/frnog.eml new file mode 100644 index 0000000..ed3ec46 --- /dev/null +++ b/server/container/mailbox-adapter/src/test/resources/eml/frnog.eml @@ -0,0 +1,17 @@ +Message-ID: <556D7ED7.2090108> +Date: Tue, 2 Jun 2015 12:00:55 +0200 +From: sender <sen...@domain.com> +MIME-Version: 1.0 +To: <l...@james.org> +Content-Type: text/plain; charset="utf-8"; format=flowed +Content-Transfer-Encoding: 8bit + +Bonjour + + +Je cherche un partenaire. + +Merci d'avance ! + + +Cordialement, http://git-wip-us.apache.org/repos/asf/james-project/blob/c2a21ffc/src/site/markdown/server/manage-cli.md ---------------------------------------------------------------------- diff --git a/src/site/markdown/server/manage-cli.md b/src/site/markdown/server/manage-cli.md index 3906f45..e528edf 100644 --- a/src/site/markdown/server/manage-cli.md +++ b/src/site/markdown/server/manage-cli.md @@ -140,9 +140,20 @@ He can list the mailboxes of a specific user: And finally can create a specific mailbox: ``` -{cli} CreateMailbox #private u...@domain.tld INBO.newFolder +{cli} CreateMailbox #private u...@domain.tld INBOX.newFolder ``` +## Adding a message in a mailbox + +The administrator can use the CLI to add a message in a mailbox. this can be done using: + +``` +{cli} ImportEml #private u...@domain.tld INBOX.newFolder /full/path/to/file.eml +``` + +This command will add a message having the content specified in file.eml (that needs to be at the EML format). It will get added +in the INBOX.subFolder mailbox belonging to user u...@domain.tld. + ## Managing mappings A mapping is a recipient rewritting rule. There is several kind of rewritting rules: --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org