JAMES-1869 Mailbox with long name just has error on Cassandra
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/19604d20 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/19604d20 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/19604d20 Branch: refs/heads/master Commit: 19604d20d6fa97ed440401edc0ae7fcfec0e9194 Parents: e943623 Author: Quynh Nguyen <[email protected]> Authored: Tue Jan 24 13:37:34 2017 +0700 Committer: Antoine Duprat <[email protected]> Committed: Thu Jan 26 12:58:22 2017 +0100 ---------------------------------------------------------------------- .../cassandra/mail/CassandraMailboxMapper.java | 23 +++++++++++++++----- .../mailbox/store/StoreMailboxManager.java | 9 -------- .../mpt/imapmailbox/suite/SelectedInbox.java | 5 ----- .../james/imap/processor/CreateProcessor.java | 2 +- .../james/imap/processor/DeleteProcessor.java | 2 +- .../james/imap/processor/RenameProcessor.java | 2 +- 6 files changed, 21 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/19604d20/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java index 1e81978..c2f824e 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java @@ -37,6 +37,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang3.StringUtils; import org.apache.james.backends.cassandra.init.CassandraTypesProvider; import org.apache.james.backends.cassandra.utils.CassandraUtils; import org.apache.james.mailbox.cassandra.CassandraId; @@ -44,6 +45,7 @@ import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable; import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.MailboxBase; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.exception.TooLongMailboxNameException; import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; @@ -54,6 +56,7 @@ import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; +import com.datastax.driver.core.exceptions.InvalidQueryException; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.google.common.base.Preconditions; @@ -63,6 +66,9 @@ import com.google.common.base.Preconditions; public class CassandraMailboxMapper implements MailboxMapper { public static final String WILDCARD = "%"; + + public static final String VALUES_MAY_NOT_BE_LARGER_THAN_64_K = "Index expression values may not be larger than 64K"; + private final Session session; private final int maxRetry; private final CassandraTypesProvider typesProvider; @@ -84,11 +90,18 @@ public class CassandraMailboxMapper implements MailboxMapper { @Override public Mailbox findMailboxByPath(MailboxPath path) throws MailboxException { - ResultSet resultSet = session.execute(select(FIELDS).from(TABLE_NAME).where(eq(PATH, path.toString()))); - if (resultSet.isExhausted()) { - throw new MailboxNotFoundException(path); - } else { - return mailbox(resultSet.one()); + try { + ResultSet resultSet = session.execute(select(FIELDS).from(TABLE_NAME).where(eq(PATH, path.toString()))); + if (resultSet.isExhausted()) { + throw new MailboxNotFoundException(path); + } else { + return mailbox(resultSet.one()); + } + } catch (InvalidQueryException e) { + if (StringUtils.containsIgnoreCase(e.getMessage(), VALUES_MAY_NOT_BE_LARGER_THAN_64_K)) { + throw new TooLongMailboxNameException("too long mailbox name"); + } + throw new MailboxException("It has error with cassandra storage", e); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/19604d20/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index 67bb7ef..376c99e 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -506,7 +506,6 @@ public class StoreMailboxManager implements MailboxManager { if (length == 0) { mailboxSession.getLog().warn("Ignoring mailbox with empty name"); } else { - validateMailboxName(mailboxPath.getName()); if (mailboxPath.getName().charAt(length - 1) == getDelimiter()) mailboxPath.setName(mailboxPath.getName().substring(0, length - 1)); if (mailboxExists(mailboxPath, mailboxSession)) @@ -544,7 +543,6 @@ public class StoreMailboxManager implements MailboxManager { @Override public void deleteMailbox(final MailboxPath mailboxPath, final MailboxSession session) throws MailboxException { session.getLog().info("deleteMailbox " + mailboxPath); - validateMailboxName(mailboxPath.getName()); final MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session); Mailbox mailbox = mapper.execute(new Mapper.Transaction<Mailbox>() { @@ -573,7 +571,6 @@ public class StoreMailboxManager implements MailboxManager { final Logger log = session.getLog(); if (log.isDebugEnabled()) log.debug("renameMailbox " + from + " to " + to); - validateMailboxName(to.getName()); if (mailboxExists(to, session)) { throw new MailboxExistsException(to.toString()); } @@ -914,10 +911,4 @@ public class StoreMailboxManager implements MailboxManager { Mailbox mailbox = mapper.findMailboxByPath(mailboxPath); return mapper.hasChildren(mailbox, session.getPathDelimiter()); } - - private void validateMailboxName(String mailboxName) throws MailboxNameException { - if (mailboxName.length() >= MailboxConstants.DEFAULT_LIMIT_MAILBOX_NAME_LENGTH) { - throw new TooLongMailboxNameException("too long mailbox name"); - } - } } http://git-wip-us.apache.org/repos/asf/james-project/blob/19604d20/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/SelectedInbox.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/SelectedInbox.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/SelectedInbox.java index 82c822e..c76d4be 100644 --- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/SelectedInbox.java +++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/SelectedInbox.java @@ -62,11 +62,6 @@ public class SelectedInbox extends BaseSelectedInbox { } @Test - public void testWithLongMailboxNameUS() throws Exception { - scriptTest("CreateWithLongName", Locale.US); - } - - @Test public void testExamineEmptyUS() throws Exception { scriptTest("ExamineEmpty", Locale.US); } http://git-wip-us.apache.org/repos/asf/james-project/blob/19604d20/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java index 2908013..81f08a7 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java @@ -60,7 +60,7 @@ public class CreateProcessor extends AbstractMailboxProcessor<CreateRequest> { no(command, tag, responder, HumanReadableText.MAILBOX_EXISTS); } catch (TooLongMailboxNameException e) { if (session.getLog().isDebugEnabled()) { - session.getLog().debug("The mailbox name is over limit: " + mailboxPath.getName(), e); + session.getLog().debug("The mailbox name length is over limit: " + mailboxPath.getName(), e); } taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME); } catch (MailboxException e) { http://git-wip-us.apache.org/repos/asf/james-project/blob/19604d20/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java index 06ec75b..1c64a67 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java @@ -65,7 +65,7 @@ public class DeleteProcessor extends AbstractMailboxProcessor<DeleteRequest> { no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX); } catch (TooLongMailboxNameException e) { if (session.getLog().isDebugEnabled()) { - session.getLog().debug("The mailbox name is over limit: " + mailboxPath.getName(), e); + session.getLog().debug("The mailbox name length is over limit: " + mailboxPath.getName(), e); } taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME); } catch (MailboxException e) { http://git-wip-us.apache.org/repos/asf/james-project/blob/19604d20/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java index 751b940..3f7f08b 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java @@ -76,7 +76,7 @@ public class RenameProcessor extends AbstractMailboxProcessor<RenameRequest> { no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND); } catch (TooLongMailboxNameException e) { if (session.getLog().isDebugEnabled()) { - session.getLog().debug("The mailbox name is over limit: " + newPath.getName(), e); + session.getLog().debug("The mailbox name length is over limit: " + newPath.getName(), e); } taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME); } catch (MailboxException e) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
