You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/05/18 14:24:16 UTC

[james-project] 04/07: [PERFORMANCE] JMAPServer should generate JMAP routes once

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 06852c794088093041d80725b341163c0c4dbdad
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun May 16 14:29:46 2021 +0700

    [PERFORMANCE] JMAPServer should generate JMAP routes once
    
    It was generating it for each requests. Each endpoints needs
    to initialize its own URI parser.
    
    Also the version was parsed for each routes and not just
    once per request.
---
 .../main/java/org/apache/james/jmap/JMAPServer.java | 21 +++++++++++++++++----
 .../java/org/apache/james/jmap/VersionParser.java   |  4 ++++
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java
index 6e9b290..4a9b86d 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java
@@ -28,10 +28,14 @@ import java.util.Set;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.util.Port;
 import org.slf4j.LoggerFactory;
 
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.Multimap;
+
 import reactor.netty.DisposableServer;
 import reactor.netty.http.server.HttpServer;
 import reactor.netty.http.server.HttpServerRequest;
@@ -40,16 +44,24 @@ public class JMAPServer implements Startable {
     private static final int RANDOM_PORT = 0;
 
     private final JMAPConfiguration configuration;
-    private final Set<JMAPRoutesHandler> jmapRoutesHandlers;
     private final VersionParser versionParser;
+    private final Multimap<Version, JMAPRoute> routes;
     private Optional<DisposableServer> server;
 
     @Inject
     public JMAPServer(JMAPConfiguration configuration, Set<JMAPRoutesHandler> jmapRoutesHandlers, VersionParser versionParser) {
         this.configuration = configuration;
-        this.jmapRoutesHandlers = jmapRoutesHandlers;
         this.versionParser = versionParser;
         this.server = Optional.empty();
+
+        this.routes = versionParser.getSupportedVersions()
+            .stream()
+            .flatMap(version -> jmapRoutesHandlers.stream()
+                .flatMap(handler -> handler.routes(version)
+                    .map(route -> Pair.of(version, route))))
+            .collect(Guavate.toImmutableListMultimap(
+                Pair::getKey,
+                Pair::getValue));
     }
 
     public Port getPort() {
@@ -76,8 +88,9 @@ public class JMAPServer implements Startable {
 
     private JMAPRoute.Action handleVersionRoute(HttpServerRequest request) {
         try {
-            return jmapRoutesHandlers.stream()
-                .flatMap(jmapRoutesHandler -> jmapRoutesHandler.routes(versionParser.parseRequestVersionHeader(request)))
+            Version version = versionParser.parseRequestVersionHeader(request);
+
+            return routes.get(version).stream()
                 .filter(jmapRoute -> jmapRoute.matches(request))
                 .map(JMAPRoute::getAction)
                 .findFirst()
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/VersionParser.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/VersionParser.java
index 1e9c8ac..88603e4 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/VersionParser.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/VersionParser.java
@@ -50,6 +50,10 @@ public class VersionParser {
         this.supportedVersions = supportedVersions;
     }
 
+    public Set<Version> getSupportedVersions() {
+        return supportedVersions;
+    }
+
     @VisibleForTesting
     Version parse(String version) {
         Preconditions.checkNotNull(version);

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