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 696c62c0e4e26513a8cbd678e9820dc83b528d76
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Sun Nov 17 09:50:45 2024 +0100

    JAMES-4090 Propose a generic framework to use disconnector outside of the 
protocol-api
---
 core/pom.xml                                       |  4 +++
 .../java/org/apache/james/core/Disconnector.java   | 29 ++++++++++++++--------
 .../james/modules/protocols/IMAPServerModule.java  |  3 +++
 .../james/modules/protocols/SMTPServerModule.java  |  2 ++
 .../james/modules/server/ServerRouteModule.java    |  7 ++++++
 .../apache/james/imapserver/netty/IMAPServer.java  |  6 +++--
 .../james/imapserver/netty/IMAPServerFactory.java  | 12 ++++++++-
 .../james/imapserver/netty/IMAPServerTest.java     |  2 +-
 .../protocols/lib/netty/CertificateReloadable.java |  4 ---
 .../apache/james/smtpserver/netty/SMTPServer.java  |  5 ++--
 .../james/smtpserver/netty/SMTPServerFactory.java  | 11 +++++++-
 .../protocols/webadmin/ProtocolServerRoutes.java   | 10 ++++----
 12 files changed, 69 insertions(+), 26 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index 4f26db199f..03bc742762 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -57,6 +57,10 @@
             <groupId>jakarta.annotation</groupId>
             <artifactId>jakarta.annotation-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>jakarta.inject</groupId>
+            <artifactId>jakarta.inject-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
diff --git 
a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java
 b/core/src/main/java/org/apache/james/core/Disconnector.java
similarity index 65%
copy from 
server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java
copy to core/src/main/java/org/apache/james/core/Disconnector.java
index 212cceedca..cd22b01046 100644
--- 
a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java
+++ b/core/src/main/java/org/apache/james/core/Disconnector.java
@@ -16,22 +16,31 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.protocols.lib.netty;
 
-import java.util.stream.Stream;
+package org.apache.james.core;
 
-import org.apache.james.core.Username;
+import java.util.Set;
 
-public interface CertificateReloadable {
-    interface Factory {
-        Stream<? extends CertificateReloadable> certificatesReloadable();
-    }
+import jakarta.inject.Inject;
+
+public interface Disconnector {
+    Disconnector NOOP = user -> {
+
+    };
 
-    void reloadSSLCertificate() throws Exception;
+    void disconnect(Username username);
 
-    int getPort();
+    class CompositeDisconnector implements Disconnector {
+        private final Set<Disconnector> disconnectorSet;
 
-    default void logout(Username user) {
+        @Inject
+        public CompositeDisconnector(Set<Disconnector> disconnectorSet) {
+            this.disconnectorSet = disconnectorSet;
+        }
 
+        @Override
+        public void disconnect(Username username) {
+            disconnectorSet.forEach(disconnector -> 
disconnector.disconnect(username));
+        }
     }
 }
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 617f75630f..b79d43afa8 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
@@ -28,6 +28,7 @@ import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.ProtocolConfigurationSanitizer;
 import org.apache.james.RunArguments;
+import org.apache.james.core.Disconnector;
 import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.imap.ImapSuite;
@@ -116,6 +117,8 @@ public class IMAPServerModule extends AbstractModule {
         
bind(ConnectionCheckFactory.class).to(ConnectionCheckFactoryImpl.class);
 
         Multibinder.newSetBinder(binder(), 
HealthCheck.class).addBinding().to(IMAPHealthCheck.class);
+
+        Multibinder.newSetBinder(binder(), 
Disconnector.class).addBinding().to(IMAPServerFactory.class);
     }
 
     @Provides
diff --git 
a/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java
 
b/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java
index b4f6b08e3c..9612eb0bf6 100644
--- 
a/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java
+++ 
b/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java
@@ -21,6 +21,7 @@ package org.apache.james.modules.protocols;
 
 import org.apache.james.ProtocolConfigurationSanitizer;
 import org.apache.james.RunArguments;
+import org.apache.james.core.Disconnector;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.lifecycle.api.ConfigurationSanitizer;
 import org.apache.james.protocols.lib.netty.CertificateReloadable;
@@ -46,6 +47,7 @@ public class SMTPServerModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), 
GuiceProbe.class).addBinding().to(SmtpGuiceProbe.class);
 
         Multibinder.newSetBinder(binder(), 
CertificateReloadable.Factory.class).addBinding().to(SMTPServerFactory.class);
+        Multibinder.newSetBinder(binder(), 
Disconnector.class).addBinding().to(SMTPServerFactory.class);
     }
 
     @ProvidesIntoSet
diff --git 
a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java
 
b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java
index a8c20b902f..7d34b6114b 100644
--- 
a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java
+++ 
b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java
@@ -19,11 +19,13 @@
 
 package org.apache.james.modules.server;
 
+import org.apache.james.core.Disconnector;
 import org.apache.james.protocols.lib.netty.AbstractServerFactory;
 import org.apache.james.protocols.webadmin.ProtocolServerRoutes;
 import org.apache.james.webadmin.Routes;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
 
 public class ServerRouteModule extends AbstractModule {
@@ -34,5 +36,10 @@ public class ServerRouteModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), Routes.class)
             .addBinding()
             .to(ProtocolServerRoutes.class);
+
+        Multibinder.newSetBinder(binder(), Disconnector.class);
+
+        bind(Disconnector.class).to(Disconnector.CompositeDisconnector.class);
+        bind(Disconnector.CompositeDisconnector.class).in(Scopes.SINGLETON);
     }
 }
diff --git 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
index b929758a56..01b0ec4b6f 100644
--- 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
+++ 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
@@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
+import org.apache.james.core.Disconnector;
 import org.apache.james.core.Username;
 import org.apache.james.imap.api.ConnectionCheck;
 import org.apache.james.imap.api.ImapConfiguration;
@@ -68,7 +69,7 @@ import io.netty.util.concurrent.GlobalEventExecutor;
 /**
  * NIO IMAP Server which use Netty.
  */
-public class IMAPServer extends AbstractConfigurableAsyncServer implements 
ImapConstants, IMAPServerMBean, NettyConstants {
+public class IMAPServer extends AbstractConfigurableAsyncServer implements 
ImapConstants, IMAPServerMBean, NettyConstants, Disconnector {
     private static final Logger LOG = 
LoggerFactory.getLogger(IMAPServer.class);
 
     public static class AuthenticationConfiguration {
@@ -197,7 +198,8 @@ public class IMAPServer extends 
AbstractConfigurableAsyncServer implements ImapC
         processor.configure(imapConfiguration);
     }
 
-    public void logout(Username user) {
+    @Override
+    public void disconnect(Username user) {
         imapChannelGroup.stream()
             .filter(channel -> 
Optional.ofNullable(channel.attr(IMAP_SESSION_ATTRIBUTE_KEY).get())
                 .flatMap(session -> Optional.ofNullable(session.getUserName()))
diff --git 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
index ca6a97ff42..7880a634e9 100644
--- 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
+++ 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
@@ -25,6 +25,8 @@ import jakarta.inject.Inject;
 
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.tree.ImmutableNode;
+import org.apache.james.core.Disconnector;
+import org.apache.james.core.Username;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.imap.ImapSuite;
 import org.apache.james.imap.api.ConnectionCheckFactory;
@@ -38,7 +40,7 @@ import 
org.apache.james.protocols.lib.netty.AbstractServerFactory;
 
 import com.github.fge.lambdas.functions.ThrowingFunction;
 
-public class IMAPServerFactory extends AbstractServerFactory {
+public class IMAPServerFactory extends AbstractServerFactory implements 
Disconnector {
 
     protected final FileSystem fileSystem;
     protected final ThrowingFunction<HierarchicalConfiguration<ImmutableNode>, 
ImapSuite> imapSuiteProvider;
@@ -94,4 +96,12 @@ public class IMAPServerFactory extends AbstractServerFactory 
{
             .map(IMAPServer.class::cast)
             .toList();
     }
+
+    @Override
+    public void disconnect(Username username) {
+        getServers()
+            .stream()
+            .map(server -> (IMAPServer) server)
+            .forEach(imapServer -> imapServer.disconnect(username));
+    }
 }
diff --git 
a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
 
b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
index f2896fbaf2..d467988fbd 100644
--- 
a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
+++ 
b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
@@ -253,7 +253,7 @@ class IMAPServerTest {
             testIMAPClient.connect("127.0.0.1", port)
                 .login(USER.asString(), USER_PASS);
 
-            imapServer.logout(USER);
+            imapServer.disconnect(USER);
 
             assertThatThrownBy(() -> testIMAPClient
                 .append("INBOX", SMALL_MESSAGE));
diff --git 
a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java
 
b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java
index 212cceedca..9fdf4195cf 100644
--- 
a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java
+++ 
b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java
@@ -30,8 +30,4 @@ public interface CertificateReloadable {
     void reloadSSLCertificate() throws Exception;
 
     int getPort();
-
-    default void logout(Username user) {
-
-    }
 }
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
index 5ed535b7d3..b56c28f904 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
@@ -33,6 +33,7 @@ import jakarta.inject.Inject;
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
+import org.apache.james.core.Disconnector;
 import org.apache.james.core.Username;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.library.netmatcher.NetMatcher;
@@ -66,7 +67,7 @@ import io.netty.util.concurrent.GlobalEventExecutor;
 /**
  * NIO SMTPServer which use Netty
  */
-public class SMTPServer extends AbstractProtocolAsyncServer implements 
SMTPServerMBean {
+public class SMTPServer extends AbstractProtocolAsyncServer implements 
SMTPServerMBean, Disconnector {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(SMTPServer.class);
     private SMTPProtocol transport;
 
@@ -425,7 +426,7 @@ public class SMTPServer extends AbstractProtocolAsyncServer 
implements SMTPServe
     }
 
     @Override
-    public void logout(Username user) {
+    public void disconnect(Username user) {
         smtpChannelGroup.stream()
             .filter(channel -> {
                 if (channel.attr(SESSION_ATTRIBUTE_KEY).get() instanceof 
SMTPSession smtpSession) {
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java
index 80562cd7a3..644ae1acc4 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java
@@ -26,6 +26,8 @@ import jakarta.inject.Inject;
 
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.tree.ImmutableNode;
+import org.apache.james.core.Disconnector;
+import org.apache.james.core.Username;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.metrics.api.MetricFactory;
@@ -33,7 +35,7 @@ import 
org.apache.james.protocols.lib.handler.ProtocolHandlerLoader;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.lib.netty.AbstractServerFactory;
 
-public class SMTPServerFactory extends AbstractServerFactory {
+public class SMTPServerFactory extends AbstractServerFactory implements 
Disconnector {
 
     protected final DNSService dns;
     protected final ProtocolHandlerLoader loader;
@@ -71,4 +73,11 @@ public class SMTPServerFactory extends AbstractServerFactory 
{
         return servers;
     }
 
+    @Override
+    public void disconnect(Username username) {
+        getServers()
+            .stream()
+            .map(server -> (SMTPServer) server)
+            .forEach(smtpServer -> smtpServer.disconnect(username));
+    }
 }
diff --git 
a/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
 
b/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
index 00aebd1528..9dffaa7d53 100644
--- 
a/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import jakarta.inject.Inject;
 
+import org.apache.james.core.Disconnector;
 import org.apache.james.core.Username;
 import org.apache.james.protocols.lib.netty.CertificateReloadable;
 import org.apache.james.util.Port;
@@ -43,10 +44,12 @@ public class ProtocolServerRoutes implements Routes {
     public static final String SERVERS = "servers";
 
     private final Set<CertificateReloadable.Factory> servers;
+    private final Disconnector disconnector;
 
     @Inject
-    public ProtocolServerRoutes(Set<CertificateReloadable.Factory> servers) {
+    public ProtocolServerRoutes(Set<CertificateReloadable.Factory> servers, 
Disconnector disconnector) {
         this.servers = servers;
+        this.disconnector = disconnector;
     }
 
     @Override
@@ -77,10 +80,7 @@ public class ProtocolServerRoutes implements Routes {
         });
 
         service.delete(SERVERS + "/users/:user", (request, response) -> {
-            Username username = Username.of(request.params("user"));
-            servers.stream()
-                .flatMap(CertificateReloadable.Factory::certificatesReloadable)
-                .forEach(s -> s.logout(username));
+            disconnector.disconnect(Username.of(request.params("user")));
 
             return Responses.returnNoContent(response);
         });


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

Reply via email to