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]

Reply via email to