mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-01-27 01:39:09 +01:00
fix bug with some special chars
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user