[GitHub] flink pull request #4958: [FLINK-8000] Sort Rest handler URLS in RestServerE...
Github user asfgit closed the pull request at: https://github.com/apache/flink/pull/4958 ---
[GitHub] flink pull request #4958: [FLINK-8000] Sort Rest handler URLS in RestServerE...
Github user zentol commented on a diff in the pull request: https://github.com/apache/flink/pull/4958#discussion_r149382049 --- Diff: flink-runtime/src/main/java/org/apache/flink/runtime/rest/RestServerEndpoint.java --- @@ -268,4 +287,69 @@ private static void registerHandler(Router router, Tuple2The 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 +* /:* +* +* IMPORTANT: This comparator is highly specific to how Netty path parameter are encoded. Namely +* via a preceding ':' character. +*/ + static final class RestHandlerUrlComparator implements Comparator>, Serializable { + + private static final long serialVersionUID = 2388466767835547926L; + + private static final Comparator CASE_INSENSITIVE_ORDER = new CaseInsensitiveOrderComparator(); + + static final RestHandlerUrlComparator INSTANCE = new RestHandlerUrlComparator(); + + @Override + public int compare( + Tuple2 o1, + Tuple2 o2) { + return CASE_INSENSITIVE_ORDER.compare(o1.f0.getTargetRestEndpointURL(), o2.f0.getTargetRestEndpointURL()); + } + + static final class CaseInsensitiveOrderComparator implements Comparator, 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 -- Found another note in `String#regionMatches`: ``` // Unfortunately, conversion to uppercase does not work properly // for the Georgian alphabet, which has strange rules about case // conversion. So we need to make one last check before // exiting. ``` TIL, +1 to merge. ---
[GitHub] flink pull request #4958: [FLINK-8000] Sort Rest handler URLS in RestServerE...
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, Tuple2The 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 +* /:* +* +* IMPORTANT: This comparator is highly specific to how Netty path parameter are encoded. Namely +* via a preceding ':' character. +*/ + static final class RestHandlerUrlComparator implements Comparator>, Serializable { + + private static final long serialVersionUID = 2388466767835547926L; + + private static final Comparator CASE_INSENSITIVE_ORDER = new CaseInsensitiveOrderComparator(); + + static final RestHandlerUrlComparator INSTANCE = new RestHandlerUrlComparator(); + + @Override + public int compare( + Tuple2 o1, + Tuple2 o2) { + return CASE_INSENSITIVE_ORDER.compare(o1.f0.getTargetRestEndpointURL(), o2.f0.getTargetRestEndpointURL()); + } + + static final class CaseInsensitiveOrderComparator implements Comparator, 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` ``` *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. ``` ---
[GitHub] flink pull request #4958: [FLINK-8000] Sort Rest handler URLS in RestServerE...
Github user zentol commented on a diff in the pull request: https://github.com/apache/flink/pull/4958#discussion_r149325305 --- Diff: flink-runtime/src/main/java/org/apache/flink/runtime/rest/RestServerEndpoint.java --- @@ -268,4 +287,69 @@ private static void registerHandler(Router router, Tuple2The 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 +* /:* +* +* IMPORTANT: This comparator is highly specific to how Netty path parameter are encoded. Namely +* via a preceding ':' character. +*/ + static final class RestHandlerUrlComparator implements Comparator>, Serializable { + + private static final long serialVersionUID = 2388466767835547926L; + + private static final Comparator CASE_INSENSITIVE_ORDER = new CaseInsensitiveOrderComparator(); + + static final RestHandlerUrlComparator INSTANCE = new RestHandlerUrlComparator(); + + @Override + public int compare( + Tuple2 o1, + Tuple2 o2) { + return CASE_INSENSITIVE_ORDER.compare(o1.f0.getTargetRestEndpointURL(), o2.f0.getTargetRestEndpointURL()); + } + + static final class CaseInsensitiveOrderComparator implements Comparator, 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 -- why are we checking both lower case (example edge case)? ---
[GitHub] flink pull request #4958: [FLINK-8000] Sort Rest handler URLS in RestServerE...
GitHub user tillrohrmann opened a pull request: https://github.com/apache/flink/pull/4958 [FLINK-8000] Sort Rest handler URLS in RestServerEndpoint ## What is the purpose of the change Introduce special `RestHandlerUrlComparator` to sort REST URLs such that URLs with path parameters are sorted after those without or fewer. E.g. the following order would be established ``` /jobs /jobs/overview /jobs/:jobid /jobs/:jobid/config /:* ``` ## Brief change log - Introduce `RestHandlerUrlComparator` - Sort list of returned rest handlers in `RestServerEndpoint` before registering them ## Verifying this change - `RestServerEndpointTest#testRestHandlerUrlSorting` ## Does this pull request potentially affect one of the following parts: - Dependencies (does it add or upgrade a dependency): (no) - The public API, i.e., is any changed class annotated with `@Public(Evolving)`: (no) - The serializers: (no) - The runtime per-record code paths (performance sensitive): (no) - Anything that affects deployment or recovery: JobManager (and its components), Checkpointing, Yarn/Mesos, ZooKeeper: (no) - The S3 file system connector: (no) ## Documentation - Does this pull request introduce a new feature? (no) - If yes, how is the feature documented? (not applicable) You can merge this pull request into a Git repository by running: $ git pull https://github.com/tillrohrmann/flink sortRestHandlerUrls Alternatively you can review and apply these changes as the patch at: https://github.com/apache/flink/pull/4958.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #4958 commit d1c436ef0e9e446004e21e3c6be6173d15aba359 Author: Till RohrmannDate: 2017-11-04T13:56:11Z [FLINK-8000] Sort Rest handler URLS in RestServerEndpoint Introduce special RestHandlerUrlComparator to sort REST URLs such that URLs with path parameters are sorted after those without or fewer. E.g. the following order would be established /jobs /jobs/overview /jobs/:jobid /jobs/:jobid/config /:* ---