flink-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (FLINK-8000) Sort REST handler URLs in RestServerEndpoint
Date Tue, 07 Nov 2017 14:21:01 GMT

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

Mime
View raw message