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

Reply via email to