19 package org.sleuthkit.autopsy.keywordsearch.multicase;
 
   21 import javax.annotation.concurrent.Immutable;
 
   28 final class SearchQuery {
 
   30     private static final String SEARCH_TERM_CHARS_TO_ESCAPE = 
"/+-&|!(){}[]^\"~*?:\\";
 
   31     private static final String SOLR_DOC_CONTENT_STR_FIELD = Server.
Schema.CONTENT_STR.toString(); 
 
   32     private final String searchTerm;
 
   40     SearchQuery(QueryType queryType, String searchTerm) {
 
   43                 this.searchTerm = prepareExactMatchSearchTerm(searchTerm);
 
   46                 this.searchTerm = prepareSubstringSearchTerm(searchTerm);
 
   49                 this.searchTerm = prepareRegexSearchTerm(searchTerm);
 
   52                 this.searchTerm = searchTerm;
 
   62     String getSearchTerm() {
 
   74     private static String prepareExactMatchSearchTerm(String searchTerm) {
 
   75         String escapedSearchTerm = escapeSearchTerm(searchTerm);
 
   76         if (!searchTerm.startsWith(
"\"")) {
 
   77             escapedSearchTerm = 
"\"" + escapedSearchTerm;
 
   79         if (!searchTerm.endsWith(
"\"")) {
 
   80             escapedSearchTerm += 
"\"";
 
   82         return escapedSearchTerm;
 
   93     private static String prepareRegexSearchTerm(String searchTerm) {
 
  102         String regexSearchTerm = SOLR_DOC_CONTENT_STR_FIELD
 
  104                 + (searchTerm.startsWith(
".*") ? 
"" : 
".*")
 
  105                 + searchTerm.toLowerCase()
 
  106                 + (searchTerm.endsWith(
".*") ? 
"" : 
".*")
 
  108         return regexSearchTerm;
 
  119     private static String prepareSubstringSearchTerm(String searchTerm) {
 
  120         String escapedSearchTerm = escapeSearchTerm(searchTerm);
 
  121         return prepareRegexSearchTerm(escapedSearchTerm);
 
  131     public static String escapeSearchTerm(String searchTerm) {
 
  132         String rawSearchTerm = searchTerm.trim();
 
  133         if (0 == rawSearchTerm.length()) {
 
  134             return rawSearchTerm;
 
  136         StringBuilder escapedSearchTerm = 
new StringBuilder(rawSearchTerm.length());
 
  137         for (
int i = 0; i < rawSearchTerm.length(); ++i) {
 
  138             final char nextChar = rawSearchTerm.charAt(i);
 
  139             if (SEARCH_TERM_CHARS_TO_ESCAPE.contains(Character.toString(nextChar))) {
 
  140                 escapedSearchTerm.append(
"\\");
 
  142             escapedSearchTerm.append(nextChar);
 
  144         return escapedSearchTerm.toString();