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