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

Reply via email to