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 4c2b38406c5f76204a7aefb15f8620da6101c570 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Wed Oct 9 09:25:32 2024 +0200 JAMES-2182 Inject NamespaceSupplier into its processor Guice implementors can then very easily overwrite the namespace definition --- .../james/imap/processor/DefaultProcessor.java | 2 +- .../james/imap/processor/NamespaceProcessor.java | 56 ++++---------------- .../james/imap/processor/NamespaceSupplier.java | 61 ++++++++++++++++++++++ .../james/modules/protocols/IMAPServerModule.java | 2 + 4 files changed, 75 insertions(+), 46 deletions(-) diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java index 7671f54f66..08a87d0dc9 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java @@ -86,7 +86,7 @@ public class DefaultProcessor implements ImapProcessor { builder.add(new ListProcessor<>(mailboxManager, statusResponseFactory, metricFactory, subscriptionManager, statusProcessor, mailboxTyper)); builder.add(new SearchProcessor(mailboxManager, statusResponseFactory, metricFactory)); builder.add(new SelectProcessor(mailboxManager, eventBus, statusResponseFactory, metricFactory)); - builder.add(new NamespaceProcessor(mailboxManager, statusResponseFactory, metricFactory)); + builder.add(new NamespaceProcessor(mailboxManager, statusResponseFactory, metricFactory, new NamespaceSupplier.Default())); builder.add(new FetchProcessor(mailboxManager, statusResponseFactory, metricFactory)); builder.add(new StartTLSProcessor(statusResponseFactory)); builder.add(new UnselectProcessor(mailboxManager, statusResponseFactory, metricFactory)); diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java index 03ad9e5f52..1541a9ec86 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java @@ -20,8 +20,6 @@ package org.apache.james.imap.processor; import static org.apache.james.imap.api.ImapConstants.SUPPORTS_NAMESPACES; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; import jakarta.inject.Inject; @@ -46,59 +44,27 @@ import reactor.core.publisher.Mono; public class NamespaceProcessor extends AbstractMailboxProcessor<NamespaceRequest> implements CapabilityImplementingProcessor { private static final List<Capability> CAPS = ImmutableList.of(SUPPORTS_NAMESPACES); + private final NamespaceSupplier namespaceSupplier; + + @Inject - public NamespaceProcessor(MailboxManager mailboxManager, StatusResponseFactory factory, MetricFactory metricFactory) { + public NamespaceProcessor(MailboxManager mailboxManager, StatusResponseFactory factory, MetricFactory metricFactory, NamespaceSupplier namespaceSupplier) { super(NamespaceRequest.class, mailboxManager, factory, metricFactory); + this.namespaceSupplier = namespaceSupplier; } @Override protected Mono<Void> processRequestReactive(NamespaceRequest request, ImapSession session, Responder responder) { MailboxSession mailboxSession = session.getMailboxSession(); - List<NamespaceResponse.Namespace> personalNamespaces = buildPersonalNamespaces(mailboxSession); - List<NamespaceResponse.Namespace> otherUsersNamespaces = buildOtherUsersSpaces(mailboxSession); - List<NamespaceResponse.Namespace> sharedNamespaces = buildSharedNamespaces(mailboxSession); - NamespaceResponse response = new NamespaceResponse(personalNamespaces, otherUsersNamespaces, sharedNamespaces); - responder.respond(response); - return unsolicitedResponses(session, responder, false) - .then(Mono.fromRunnable(() -> okComplete(request, responder))); - } - /** - * Builds personal namespaces from the session. - * - * @param mailboxSession - * not null - * @return personal namespaces, not null - */ - private List<NamespaceResponse.Namespace> buildPersonalNamespaces(MailboxSession mailboxSession) { - final List<NamespaceResponse.Namespace> personalSpaces = new ArrayList<>(); - String personal = ""; - personalSpaces.add(new NamespaceResponse.Namespace(personal, mailboxSession.getPathDelimiter())); - return personalSpaces; - } + NamespaceResponse response = new NamespaceResponse(namespaceSupplier.personalNamespaces(mailboxSession), + namespaceSupplier.otherUsersNamespaces(mailboxSession), + namespaceSupplier.sharedNamespaces(mailboxSession)); - private List<NamespaceResponse.Namespace> buildOtherUsersSpaces(MailboxSession mailboxSession) { - final String otherUsersSpace = null; - final List<NamespaceResponse.Namespace> otherUsersSpaces; - if (otherUsersSpace == null) { - otherUsersSpaces = null; - } else { - otherUsersSpaces = new ArrayList<>(1); - otherUsersSpaces.add(new NamespaceResponse.Namespace(otherUsersSpace, mailboxSession.getPathDelimiter())); - } - return otherUsersSpaces; - } + responder.respond(response); - private List<NamespaceResponse.Namespace> buildSharedNamespaces(MailboxSession mailboxSession) { - List<NamespaceResponse.Namespace> sharedNamespaces = null; - final Collection<String> sharedSpaces = new ArrayList<>(); - if (!sharedSpaces.isEmpty()) { - sharedNamespaces = new ArrayList<>(sharedSpaces.size()); - for (String space : sharedSpaces) { - sharedNamespaces.add(new NamespaceResponse.Namespace(space, mailboxSession.getPathDelimiter())); - } - } - return sharedNamespaces; + return unsolicitedResponses(session, responder, false) + .then(Mono.fromRunnable(() -> okComplete(request, responder))); } @Override diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceSupplier.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceSupplier.java new file mode 100644 index 0000000000..90fe3c91ad --- /dev/null +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceSupplier.java @@ -0,0 +1,61 @@ +package org.apache.james.imap.processor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.james.imap.message.response.NamespaceResponse; +import org.apache.james.imap.message.response.NamespaceResponse.Namespace; +import org.apache.james.mailbox.MailboxSession; + +import com.google.common.collect.ImmutableList; + +public interface NamespaceSupplier { + class Default implements NamespaceSupplier { + @Override + public Collection<Namespace> personalNamespaces(MailboxSession session) { + return ImmutableList.of(new NamespaceResponse.Namespace("", session.getPathDelimiter())); + } + + @Override + public Collection<Namespace> otherUsersNamespaces(MailboxSession session) { + return ImmutableList.of(); + } + + @Override + public Collection<Namespace> sharedNamespaces(MailboxSession session) { + return ImmutableList.of(); + } + } + + /** + * Gets the <a href='http://www.isi.edu/in-notes/rfc2342.txt' rel='tag'>RFC + * 2342</a> personal namespace for the current session.<br> + * Note that though servers may offer multiple personal namespaces, support + * is not offered through this API. This decision may be revised if + * reasonable use cases emerge. + * + * @return Personal Namespace, not null + */ + Collection<Namespace> personalNamespaces(MailboxSession session); + + /** + * Gets the <a href='http://www.isi.edu/in-notes/rfc2342.txt' rel='tag'>RFC + * 2342</a> other users namespace for the current session.<br> + * Note that though servers may offer multiple other users namespaces, + * support is not offered through this API. This decision may be revised if + * reasonable use cases emerge. + * + * @return Other Users Namespace or null when there is non available + */ + Collection<Namespace> otherUsersNamespaces(MailboxSession session); + + /** + * Iterates the <a href='http://www.isi.edu/in-notes/rfc2342.txt' + * rel='tag'>RFC 2342</a> Shared Namespaces available for the current + * session. + * + * @return not null though possibly empty + */ + Collection<Namespace> sharedNamespaces(MailboxSession session); +} diff --git a/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java b/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java index afa81f402c..d5f33d874a 100644 --- a/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java +++ b/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java @@ -56,6 +56,7 @@ import org.apache.james.imap.processor.CapabilityImplementingProcessor; import org.apache.james.imap.processor.CapabilityProcessor; import org.apache.james.imap.processor.DefaultProcessor; import org.apache.james.imap.processor.EnableProcessor; +import org.apache.james.imap.processor.NamespaceSupplier; import org.apache.james.imap.processor.PermitEnableCapabilityProcessor; import org.apache.james.imap.processor.SelectProcessor; import org.apache.james.imap.processor.StatusProcessor; @@ -104,6 +105,7 @@ public class IMAPServerModule extends AbstractModule { bind(SelectProcessor.class).in(Scopes.SINGLETON); bind(StatusProcessor.class).in(Scopes.SINGLETON); bind(EnableProcessor.class).in(Scopes.SINGLETON); + bind(NamespaceSupplier.class).to(NamespaceSupplier.Default.class).in(Scopes.SINGLETON); bind(MailboxTyper.class).to(DefaultMailboxTyper.class).in(Scopes.SINGLETON); Multibinder.newSetBinder(binder(), GuiceProbe.class).addBinding().to(ImapGuiceProbe.class); --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org