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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
