From 9b7bc962820707a20a23a51d1960f45b7cc6dfd2 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 9 Mar 2014 14:20:43 +0100 Subject: [PATCH] fix bug with some special chars --- .../java/sonia/scm/search/SearchUtil.java | 100 ++++++++++++++++-- .../java/sonia/scm/search/SearchUtilTest.java | 6 ++ 2 files changed, 100 insertions(+), 6 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java index c65af09250..90c65e3456 100644 --- a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java +++ b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java @@ -35,6 +35,9 @@ package sonia.scm.search; //~--- non-JDK imports -------------------------------------------------------- +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import sonia.scm.TransformFilter; import sonia.scm.util.Util; @@ -45,7 +48,6 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Locale; -import java.util.regex.Pattern; /** * @@ -54,6 +56,14 @@ import java.util.regex.Pattern; public final class SearchUtil { + /** + * the logger for SearchUtil + */ + private static final Logger logger = + LoggerFactory.getLogger(SearchUtil.class); + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * @@ -181,6 +191,77 @@ public final class SearchUtil return items; } + /** + * Method description + * + * + * @param pattern + * @param c + */ + private static void appendChar(StringBuilder pattern, char c) + { + switch (c) + { + case '*' : + pattern.append(".*"); + + break; + + case '?' : + pattern.append("."); + + break; + + case '(' : + pattern.append("\\("); + + break; + + case ')' : + pattern.append("\\)"); + + break; + + case '{' : + pattern.append("\\{"); + + break; + + case '}' : + pattern.append("\\}"); + + break; + + case '[' : + pattern.append("\\["); + + break; + + case ']' : + pattern.append("\\]"); + + break; + + case '|' : + pattern.append("\\|"); + + break; + + case '.' : + pattern.append("\\."); + + break; + + case '\\' : + pattern.append("\\\\"); + + break; + + default : + pattern.append(c); + } + } + /** * Method description * @@ -193,19 +274,26 @@ public final class SearchUtil { String query = request.getQuery().trim(); + StringBuilder pattern = new StringBuilder(); + if (request.isIgnoreCase()) { + pattern.append("(?i)"); query = query.toLowerCase(Locale.ENGLISH); } - query = query.replace("\\", "\\\\").replace("*", ".*").replace("?", "."); - query = ".*".concat(query).concat(".*"); + pattern.append(".*"); - if (request.isIgnoreCase()) + for (char c : query.toCharArray()) { - query = "(?i)".concat(query); + appendChar(pattern, c); } - return query; + pattern.append(".*"); + + logger.trace("converted query \"{}\" to regex pattern \"{}\"", + request.getQuery(), pattern); + + return pattern.toString(); } } diff --git a/scm-core/src/test/java/sonia/scm/search/SearchUtilTest.java b/scm-core/src/test/java/sonia/scm/search/SearchUtilTest.java index 8aebfa9dbd..0588729a45 100644 --- a/scm-core/src/test/java/sonia/scm/search/SearchUtilTest.java +++ b/scm-core/src/test/java/sonia/scm/search/SearchUtilTest.java @@ -177,6 +177,12 @@ public class SearchUtilTest "testhansolo")); assertFalse(SearchUtil.matchesAll(new SearchRequest("test\\hansolo"), "test\\hnsolo")); + assertTrue(SearchUtil.matchesAll(new SearchRequest("{test,hansolo} tst"), + "{test,hansolo} tst")); + assertTrue(SearchUtil.matchesAll(new SearchRequest("(test,hansolo) tst"), + "(test,hansolo) tst")); + assertTrue(SearchUtil.matchesAll(new SearchRequest("[test,hansolo] tst"), + "[test,hansolo] tst")); } /**