This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit a37894bda2fee6362abdb3a3a4a64145e55730ec
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Wed Oct 9 21:57:52 2024 +0200

    JAMES-2182 ListProcessor: extract ListRequest -> MailboxQuery convertion to 
PathConverter
    
    This allows customization...
---
 .../org/apache/james/imap/main/PathConverter.java  | 79 ++++++++++++++++++++++
 .../apache/james/imap/processor/ListProcessor.java | 79 +---------------------
 2 files changed, 81 insertions(+), 77 deletions(-)

diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java 
b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
index 8a53728fa7..4eabd621b0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
@@ -23,10 +23,14 @@ import java.util.List;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.Username;
+import org.apache.james.imap.api.display.ModifiedUtf7;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedRegex;
+import org.apache.james.mailbox.model.search.Wildcard;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -158,9 +162,84 @@ public interface PathConverter {
                 return joinMailboxPath(path, session);
             }
         }
+
+        public MailboxQuery mailboxQuery(String finalReferencename, String 
mailboxName, ImapSession session) {
+            MailboxSession mailboxSession = session.getMailboxSession();
+            String decodedMailboxName = 
ModifiedUtf7.decodeModifiedUTF7(mailboxName);
+            if (finalReferencename.isEmpty()) {
+                if (mailboxName.equals("*")) {
+                    return MailboxQuery.builder()
+                        .matchesAllMailboxNames()
+                        .build();
+                }
+                return MailboxQuery.builder()
+                    .expression(new PrefixedRegex(
+                        "",
+                        decodedMailboxName,
+                        mailboxSession.getPathDelimiter()))
+                    .build();
+            }
+
+            MailboxPath basePath = computeBasePath(session, 
finalReferencename);
+            if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE)
+                && basePath.getUser() == null) {
+
+                int separatorPosition = 
decodedMailboxName.indexOf(mailboxSession.getPathDelimiter());
+                if (separatorPosition >= 0) {
+                    // interpret first part as the user
+                    Username username = 
Username.of(decodedMailboxName.substring(0, separatorPosition));
+                    return MailboxQuery.builder()
+                        .namespace(MailboxConstants.USER_NAMESPACE)
+                        .username(username)
+                        .expression(new PrefixedRegex(
+                            basePath.getName(),
+                            decodedMailboxName.substring(separatorPosition + 
1),
+                            mailboxSession.getPathDelimiter()))
+                        .build();
+                }
+
+                return MailboxQuery.builder()
+                    .namespace(MailboxConstants.USER_NAMESPACE)
+                    .expression(new PrefixedRegex(
+                        basePath.getName(),
+                        decodedMailboxName,
+                        mailboxSession.getPathDelimiter()))
+                    .build();
+            }
+            if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE)
+                && basePath.getUser().equals(mailboxSession.getUser())
+                && basePath.getName().isEmpty()
+                && mailboxName.equals("*")) {
+
+                return MailboxQuery.builder()
+                    .userAndNamespaceFrom(basePath)
+                    .expression(Wildcard.INSTANCE)
+                    .build();
+            }
+
+            return MailboxQuery.builder()
+                .userAndNamespaceFrom(basePath)
+                .expression(new PrefixedRegex(
+                    basePath.getName(),
+                    decodedMailboxName,
+                    mailboxSession.getPathDelimiter()))
+                .build();
+        }
+
+        private MailboxPath computeBasePath(ImapSession session, String 
finalReferencename) {
+            String decodedName = 
ModifiedUtf7.decodeModifiedUTF7(finalReferencename);
+            boolean isRelative = !finalReferencename.startsWith("#");
+            if (isRelative) {
+                return MailboxPath.forUser(session.getUserName(), decodedName);
+            } else {
+                return buildFullPath(decodedName);
+            }
+        }
     }
 
     MailboxPath buildFullPath(String mailboxName);
 
     String mailboxName(boolean relative, MailboxPath path, MailboxSession 
session);
+
+    MailboxQuery mailboxQuery(String finalReferencename, String mailboxName, 
ImapSession session);
 }
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 4642620d44..fcb1a48aa6 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
@@ -36,7 +36,6 @@ import jakarta.inject.Inject;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
-import org.apache.james.core.Username;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.display.ModifiedUtf7;
 import org.apache.james.imap.api.message.Capability;
@@ -62,8 +61,6 @@ import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery;
-import org.apache.james.mailbox.model.search.PrefixedRegex;
-import org.apache.james.mailbox.model.search.Wildcard;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
 import org.apache.james.util.ReactorUtils;
@@ -196,7 +193,8 @@ public class ListProcessor<T extends ListRequest> extends 
AbstractMailboxProcess
         // Should the namespace section be returned or not?
         boolean isRelative = ((request.getBaseReferenceName() + 
request.getMailboxPattern()).charAt(0) != 
MailboxConstants.NAMESPACE_PREFIX_CHAR);
 
-        MailboxQuery mailboxQuery = 
mailboxQuery(request.getBaseReferenceName(), request.getMailboxPattern(), 
mailboxSession, session, isRelative);
+        MailboxQuery mailboxQuery = pathConverterFactory.forSession(session)
+            .mailboxQuery(request.getBaseReferenceName(), 
request.getMailboxPattern(), session);
 
         if (request.selectSubscribed()) {
             return processWithSubscribed(session, request, responder, 
mailboxSession, isRelative, mailboxQuery);
@@ -331,79 +329,6 @@ public class ListProcessor<T extends ListRequest> extends 
AbstractMailboxProcess
         return metaData.getResolvedAcls().getEntries().get(entryKey);
     }
 
-    private MailboxQuery mailboxQuery(String finalReferencename, String 
mailboxName, MailboxSession mailboxSession,
-                                      ImapSession session, boolean isRelative) 
{
-        String decodedMailboxName = 
ModifiedUtf7.decodeModifiedUTF7(mailboxName);
-        if (finalReferencename.isEmpty()) {
-            if (mailboxName.equals("*")) {
-                return MailboxQuery.builder()
-                    .matchesAllMailboxNames()
-                    .build();
-            }
-            return MailboxQuery.builder()
-                .expression(new PrefixedRegex(
-                    "",
-                    decodedMailboxName,
-                    mailboxSession.getPathDelimiter()))
-                .build();
-        }
-
-        MailboxPath basePath = computeBasePath(session, finalReferencename, 
isRelative);
-        if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE)
-            && basePath.getUser() == null) {
-
-            int separatorPosition = 
decodedMailboxName.indexOf(mailboxSession.getPathDelimiter());
-            if (separatorPosition >= 0) {
-                // interpret first part as the user
-                Username username = 
Username.of(decodedMailboxName.substring(0, separatorPosition));
-                return MailboxQuery.builder()
-                    .namespace(MailboxConstants.USER_NAMESPACE)
-                    .username(username)
-                    .expression(new PrefixedRegex(
-                        basePath.getName(),
-                        decodedMailboxName.substring(separatorPosition + 1),
-                        mailboxSession.getPathDelimiter()))
-                    .build();
-            }
-
-            return MailboxQuery.builder()
-                .namespace(MailboxConstants.USER_NAMESPACE)
-                .expression(new PrefixedRegex(
-                    basePath.getName(),
-                    decodedMailboxName,
-                    mailboxSession.getPathDelimiter()))
-                .build();
-        }
-        if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE)
-            && basePath.getUser().equals(mailboxSession.getUser())
-            && basePath.getName().isEmpty()
-            && mailboxName.equals("*")) {
-
-            return MailboxQuery.builder()
-                .userAndNamespaceFrom(basePath)
-                .expression(Wildcard.INSTANCE)
-                .build();
-        }
-
-        return MailboxQuery.builder()
-            .userAndNamespaceFrom(basePath)
-            .expression(new PrefixedRegex(
-                basePath.getName(),
-                decodedMailboxName,
-                mailboxSession.getPathDelimiter()))
-            .build();
-    }
-
-    private MailboxPath computeBasePath(ImapSession session, String 
finalReferencename, boolean isRelative) {
-        String decodedName = 
ModifiedUtf7.decodeModifiedUTF7(finalReferencename);
-        if (isRelative) {
-            return MailboxPath.forUser(session.getUserName(), decodedName);
-        } else {
-            return 
pathConverterFactory.forSession(session).buildFullPath(decodedName);
-        }
-    }
-
-
     /**
      * retrieve mailboxType for specified mailboxPath using provided
      * MailboxTyper


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to