You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2024/10/30 03:41:55 UTC
(james-project) 19/37: JAMES-2182 ListProcessor: extract ListRequest -> MailboxQuery convertion to PathConverter
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 <bt...@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-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org