You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rc...@apache.org on 2020/04/10 02:02:22 UTC

[james-project] 14/15: JAMES-3092 Set up parameter resolving

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 a27dcdb0ded3379847a290cec596b416fb4fb39b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Apr 3 10:35:05 2020 +0700

    JAMES-3092 Set up parameter resolving
---
 .../main/java/org/apache/james/jmap/Endpoint.java  |  4 +++
 .../main/java/org/apache/james/jmap/JMAPRoute.java |  9 ++++++-
 .../org/apache/james/jmap/UriPathTemplate.java     | 30 ++++++++++++++++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/Endpoint.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/Endpoint.java
index 222d40b..a1a3f8c 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/Endpoint.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/Endpoint.java
@@ -48,6 +48,10 @@ public class Endpoint {
             && uriPathTemplate.matches(request.uri());
     }
 
+    UriPathTemplate getUriPathTemplate() {
+        return uriPathTemplate;
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof Endpoint) {
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPRoute.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPRoute.java
index 8ad8ecf..d81e47b 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPRoute.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPRoute.java
@@ -58,7 +58,14 @@ public class JMAPRoute {
             }
 
             private JMAPRoute build(Action action) {
-                return new JMAPRoute(endpoint, action);
+                return new JMAPRoute(endpoint, actionWithParameterResolving(action));
+            }
+
+            Action actionWithParameterResolving(Action action) {
+                return (req, res) ->
+                    action.handleRequest(
+                        req.paramsResolver(s -> endpoint.getUriPathTemplate().match(s)),
+                        res);
             }
         }
     }
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/UriPathTemplate.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/UriPathTemplate.java
index a9b3759..6c158a9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/UriPathTemplate.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/UriPathTemplate.java
@@ -136,4 +136,34 @@ public class UriPathTemplate {
         return m;
     }
 
+    /**
+     * Matches the template against the given {@code uri} returning a map of path
+     * parameters extracted from the uri, keyed by the names in the template. If the
+     * uri does not match, or there are no path parameters, an empty map is returned.
+     *
+     * @param uri The uri to match
+     *
+     * @return the path parameters from the uri. Never {@code null}.
+     */
+    final Map<String, String> match(String uri) {
+        Map<String, String> pathParameters = vars.get(uri);
+        if (null != pathParameters) {
+            return pathParameters;
+        }
+
+        pathParameters = new HashMap<>();
+        Matcher m = matcher(uri);
+        if (m.matches()) {
+            int i = 1;
+            for (String name : pathVariables) {
+                String val = m.group(i++);
+                pathParameters.put(name, val);
+            }
+        }
+        synchronized (vars) {
+            vars.put(uri, pathParameters);
+        }
+
+        return pathParameters;
+    }
 }


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