[ 
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)

Reply via email to