[
https://issues.apache.org/jira/browse/FLINK-8000?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16242081#comment-16242081
]
ASF GitHub Bot commented on FLINK-8000:
---------------------------------------
Github user tillrohrmann commented on a diff in the pull request:
https://github.com/apache/flink/pull/4958#discussion_r149379485
--- Diff:
flink-runtime/src/main/java/org/apache/flink/runtime/rest/RestServerEndpoint.java
---
@@ -268,4 +287,69 @@ private static void registerHandler(Router router,
Tuple2<RestHandlerSpecificati
throw new RuntimeException("Unsupported http
method: " + specificationHandler.f0.getHttpMethod() + '.');
}
}
+
+ /**
+ * Comparator for Rest URLs.
+ *
+ * <p>The comparator orders the Rest URLs such that URLs with path
parameters are ordered behind
+ * those without parameters. E.g.:
+ * /jobs
+ * /jobs/overview
+ * /jobs/:jobid
+ * /jobs/:jobid/config
+ * /:*
+ *
+ * <p>IMPORTANT: This comparator is highly specific to how Netty path
parameter are encoded. Namely
+ * via a preceding ':' character.
+ */
+ static final class RestHandlerUrlComparator implements
Comparator<Tuple2<RestHandlerSpecification, ChannelInboundHandler>>,
Serializable {
+
+ private static final long serialVersionUID =
2388466767835547926L;
+
+ private static final Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsensitiveOrderComparator();
+
+ static final RestHandlerUrlComparator INSTANCE = new
RestHandlerUrlComparator();
+
+ @Override
+ public int compare(
+ Tuple2<RestHandlerSpecification,
ChannelInboundHandler> o1,
+ Tuple2<RestHandlerSpecification,
ChannelInboundHandler> o2) {
+ return
CASE_INSENSITIVE_ORDER.compare(o1.f0.getTargetRestEndpointURL(),
o2.f0.getTargetRestEndpointURL());
+ }
+
+ static final class CaseInsensitiveOrderComparator implements
Comparator<String>, Serializable {
+ private static final long serialVersionUID =
8550835445193437027L;
+
+ @Override
+ public int compare(String s1, String s2) {
+ int n1 = s1.length();
+ int n2 = s2.length();
+ int min = Math.min(n1, n2);
+ for (int i = 0; i < min; i++) {
+ char c1 = s1.charAt(i);
+ char c2 = s2.charAt(i);
+ if (c1 != c2) {
+ c1 = Character.toUpperCase(c1);
+ c2 = Character.toUpperCase(c2);
+ if (c1 != c2) {
+ c1 =
Character.toLowerCase(c1);
--- End diff --
That's how the `String#compareToIgnoreCase` is implemented.
I assume that this is due to a note in `Character.toUpperCase` and
`Character.toLowerCase`
```
*<p>Note that
* {@code Character.isUpperCase(Character.toUpperCase(codePoint))}
* does not always return {@code true} for some ranges of
* characters, particularly those that are symbols or ideographs.
```
> Sort REST handler URLs in RestServerEndpoint
> --------------------------------------------
>
> Key: FLINK-8000
> URL: https://issues.apache.org/jira/browse/FLINK-8000
> Project: Flink
> Issue Type: Improvement
> Components: REST
> Affects Versions: 1.4.0
> Reporter: Till Rohrmann
> Assignee: Till Rohrmann
> Priority: Minor
> Labels: flip-6
>
> In order to make the {{RestServerEndpoint}} more easily extendable, we should
> automatically sort the returned list of rest handler when calling
> {{RestServerEndpoint#initializeHandlers}}. That way the order in which the
> handlers are added to the list is independent of the actual registration
> order. This is, for example, important for the static file server which
> always needs to be registered last.
> I propose to add a special {{String}} {{Comparator}} which considers the
> charactor {{':'}} to be the character with the largest value. That way we
> should get always the following sort order:
> - URLs without path parameters have precedence over similar URLs where parts
> are replaced by path parameters (e.g. {{/jobs/overview}}, {{/jobs/:jobid}}
> and {{/jobs/:jobid/config}}, {{/jobs/:jobid/vertices/:vertexId}})
> - Prefixes are sorted before URLs containing the prefix (e.g. {{/jobs}},
> {{/jobs/overview}})
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)