This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch eh in repository https://gitbox.apache.org/repos/asf/camel.git
commit e031046eadf2494b7b6b3ebc015468e9755cd1c9 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sat Oct 14 11:54:16 2023 +0200 CAMEL-19987: camel-core - Optimize EndpointHelper.matchEndpoint to avoid regexp in fast-mode --- .../org/apache/camel/support/EndpointHelper.java | 25 ++++++++++++++++------ .../org/apache/camel/support/PatternHelper.java | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java index 6c3da04c633..ae971a21714 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java @@ -235,18 +235,29 @@ public final class EndpointHelper { // normalize uri so we can do endpoint hits with minor mistakes and parameters is not in the same order uri = normalizeEndpointUri(uri); - // we need to test with and without scheme separators (//) - boolean match = PatternHelper.matchPattern(toggleUriSchemeSeparators(uri), pattern); + // do fast matching without regexp first + boolean match = doMatchEndpoint(uri, pattern, false); if (!match) { - match = PatternHelper.matchPattern(uri, pattern); + // this is slower as pattern is compiled as regexp + match = doMatchEndpoint(uri, pattern, true); } - if (!match && pattern != null && pattern.contains("?")) { - // try normalizing the pattern as a uri for exact matching, so parameters are ordered the same as in the endpoint uri + return match; + } + + private static boolean doMatchEndpoint(String uri, String pattern, boolean regexp) { + String toggleUri = null; + boolean match = regexp ? PatternHelper.matchRegex(uri, pattern) : PatternHelper.matchPattern(uri, pattern); + if (!match) { + toggleUri = toggleUriSchemeSeparators(uri); + match = regexp ? PatternHelper.matchRegex(toggleUri, pattern) : PatternHelper.matchPattern(toggleUri, pattern); + } + if (!match && !regexp && pattern != null && pattern.contains("?")) { + // this is only need to be done once (in fast mode when regexp=false) + // try normalizing the pattern as an uri for exact matching, so parameters are ordered the same as in the endpoint uri try { pattern = URISupport.normalizeUri(pattern); // try both with and without scheme separators (//) - match = toggleUriSchemeSeparators(uri).equalsIgnoreCase(pattern); - return match || uri.equalsIgnoreCase(pattern); + return uri.equalsIgnoreCase(pattern) || toggleUri.equalsIgnoreCase(pattern); } catch (URISyntaxException e) { // cannot normalize and original match failed return false; diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PatternHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/PatternHelper.java index e490f7e6a51..a716b860ea5 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/PatternHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/PatternHelper.java @@ -116,7 +116,7 @@ public final class PatternHelper { * @param pattern a pattern to match * @return <tt>true</tt> if match, <tt>false</tt> otherwise. */ - private static boolean matchRegex(String name, String pattern) { + public static boolean matchRegex(String name, String pattern) { // match by regular expression try { Pattern compiled = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);