This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 913bbb9411caafc5d53355c044e58d4a72f1c012 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Tue Nov 12 14:25:00 2019 +0700 [Refactoring] ListProcessor is better looking after some methods extractions --- .../apache/james/imap/processor/ListProcessor.java | 127 +++++++++++---------- 1 file changed, 68 insertions(+), 59 deletions(-) diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java index e8dfdd6..851aa94 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java @@ -82,69 +82,13 @@ public class ListProcessor extends AbstractMailboxProcessor<ListRequest> { */ protected final void doProcess(String referenceName, String mailboxName, ImapSession session, String tag, ImapCommand command, Responder responder, MailboxTyper mailboxTyper) { String user = ImapSessionUtils.getUserName(session); - final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session); + MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session); try { - if (mailboxName.length() == 0) { - // An empty mailboxName signifies a request for the hierarchy - // delimiter and root name of the referenceName argument - - String referenceRoot; - if (referenceName.length() > 0 && referenceName.charAt(0) == MailboxConstants.NAMESPACE_PREFIX_CHAR) { - // A qualified reference name - get the root element - int firstDelimiter = referenceName.indexOf(mailboxSession.getPathDelimiter()); - if (firstDelimiter == -1) { - referenceRoot = referenceName; - } else { - referenceRoot = referenceName.substring(0, firstDelimiter); - } - referenceRoot = ModifiedUtf7.decodeModifiedUTF7(referenceRoot); - } else { - // A relative reference name, return "" to indicate it is - // non-rooted - referenceRoot = ""; - } - - responder.respond(createResponse( - MailboxMetaData.Children.CHILDREN_ALLOWED_BUT_UNKNOWN, - MailboxMetaData.Selectability.NOSELECT, - referenceRoot, - mailboxSession.getPathDelimiter(), - MailboxType.OTHER)); + respondNamespace(referenceName, responder, mailboxSession); } else { - // If the mailboxPattern is fully qualified, ignore the - // reference name. - String finalReferencename = referenceName; - if (mailboxName.charAt(0) == MailboxConstants.NAMESPACE_PREFIX_CHAR) { - finalReferencename = ""; - } - // Is the interpreted (combined) pattern relative? - // Should the namespace section be returned or not? - boolean isRelative = ((finalReferencename + mailboxName).charAt(0) != MailboxConstants.NAMESPACE_PREFIX_CHAR); - - finalReferencename = ModifiedUtf7.decodeModifiedUTF7(finalReferencename); - - MailboxPath basePath = null; - if (isRelative) { - basePath = MailboxPath.forUser(user, finalReferencename); - } else { - basePath = PathConverter.forSession(session).buildFullPath(finalReferencename); - } - - List<MailboxMetaData> results = getMailboxManager().search( - MailboxQuery.builder() - .userAndNamespaceFrom(basePath) - .expression(new PrefixedRegex( - basePath.getName(), - ModifiedUtf7.decodeModifiedUTF7(mailboxName), - mailboxSession.getPathDelimiter())) - .build(), mailboxSession); - for (MailboxMetaData metaData : results) { - processResult(responder, isRelative, metaData, getMailboxType(session, mailboxTyper, metaData.getPath())); - } + respondMailboxList(referenceName, mailboxName, session, responder, mailboxTyper, user, mailboxSession); } - - okComplete(command, tag, responder); } catch (MailboxException e) { LOGGER.error("List failed for mailboxName {} and user {}", mailboxName, user, e); @@ -152,6 +96,71 @@ public class ListProcessor extends AbstractMailboxProcessor<ListRequest> { } } + private void respondNamespace(String referenceName, Responder responder, MailboxSession mailboxSession) { + // An empty mailboxName signifies a request for the hierarchy + // delimiter and root name of the referenceName argument + String referenceRoot = ModifiedUtf7.decodeModifiedUTF7(computeReferenceRoot(referenceName, mailboxSession)); + + responder.respond(createResponse( + MailboxMetaData.Children.CHILDREN_ALLOWED_BUT_UNKNOWN, + MailboxMetaData.Selectability.NOSELECT, + referenceRoot, + mailboxSession.getPathDelimiter(), + MailboxType.OTHER)); + } + + private String computeReferenceRoot(String referenceName, MailboxSession mailboxSession) { + if (referenceName.length() > 0 && referenceName.charAt(0) == MailboxConstants.NAMESPACE_PREFIX_CHAR) { + // A qualified reference name - get the root element + int firstDelimiter = referenceName.indexOf(mailboxSession.getPathDelimiter()); + if (firstDelimiter == -1) { + return referenceName; + } else { + return referenceName.substring(0, firstDelimiter); + } + } else { + // A relative reference name, return "" to indicate it is + // non-rooted + return ""; + } + } + + private void respondMailboxList(String referenceName, String mailboxName, ImapSession session, Responder responder, MailboxTyper mailboxTyper, String user, MailboxSession mailboxSession) throws MailboxException { + // If the mailboxPattern is fully qualified, ignore the + // reference name. + String finalReferencename = referenceName; + if (mailboxName.charAt(0) == MailboxConstants.NAMESPACE_PREFIX_CHAR) { + finalReferencename = ""; + } + // Is the interpreted (combined) pattern relative? + // Should the namespace section be returned or not? + boolean isRelative = ((finalReferencename + mailboxName).charAt(0) != MailboxConstants.NAMESPACE_PREFIX_CHAR); + + MailboxPath basePath = computeBasePath(session, user, finalReferencename, isRelative); + + List<MailboxMetaData> results = getMailboxManager().search( + MailboxQuery.builder() + .userAndNamespaceFrom(basePath) + .expression(new PrefixedRegex( + basePath.getName(), + ModifiedUtf7.decodeModifiedUTF7(mailboxName), + mailboxSession.getPathDelimiter())) + .build(), mailboxSession); + + for (MailboxMetaData metaData : results) { + processResult(responder, isRelative, metaData, getMailboxType(session, mailboxTyper, metaData.getPath())); + } + } + + private MailboxPath computeBasePath(ImapSession session, String user, String finalReferencename, boolean isRelative) { + String decodedName = ModifiedUtf7.decodeModifiedUTF7(finalReferencename); + if (isRelative) { + return MailboxPath.forUser(user, decodedName); + } else { + return PathConverter.forSession(session).buildFullPath(decodedName); + } + } + private void processResult(Responder responder, boolean relative, MailboxMetaData listResult, MailboxType mailboxType) { final String mailboxName = mailboxName(relative, listResult.getPath(), listResult.getHierarchyDelimiter()); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org