/impl/src/java/pt/estgp/estgweb/services/common/QueryLanguageChars.java |
---|
New file |
0,0 → 1,94 |
package pt.estgp.estgweb.services.common; |
import org.apache.lucene.queryParser.QueryParser; |
import org.apache.lucene.queryParser.ParseException; |
import org.apache.lucene.analysis.SimpleAnalyzer; |
import org.apache.log4j.Logger; |
/** |
* @author Jorge Machado |
* @date 20/Nov/2009 |
* @time 10:32:07 |
* @email machadofisher@gmail.com |
*/ |
public enum QueryLanguageChars { |
SLASH_ESCAPE("\"",false), |
PLUS("+",false), |
MINUS("-",false), |
ANDe ("&&",false), |
OR("||",false), |
EXCL("!",false), |
BRACKET_L("(",true), |
BRACKET_R(")",true), |
CHAV_L("{",false), |
CHAV_R("}",false), |
RECT_BRACKETS_L("[",false), |
RECT_BRACKETS_R("]",false), |
CIRCUNFLEX("^",false), |
QUOTE("\"",false), |
TIL("~",false), |
ASTRISK("*",false), |
QUESTION_MARK("?",false), |
TWO_DOTS(":",true); |
String chars; |
boolean usual; |
private static final Logger logger = Logger.getLogger(QueryLanguageChars.class); |
private QueryLanguageChars(String chars, boolean usual) |
{ |
this.usual = usual; |
this.chars = chars; |
} |
public static String escape(String string) |
{ |
for(QueryLanguageChars chars: values()) |
{ |
string = string.replace(chars.chars,"\\" + chars.chars); |
} |
logger.info("Final Escaped Query: " + string); |
return string; |
} |
public static boolean containsSpecialNotUsual(String string) |
{ |
for(QueryLanguageChars chars: values()) |
{ |
if(!chars.usual && string.indexOf(chars.chars) >= 0) |
return true; |
} |
return false; |
} |
public static boolean contains(String string) |
{ |
for(QueryLanguageChars chars: values()) |
{ |
if(string.indexOf(chars.chars) >= 0) |
return true; |
} |
return false; |
} |
static QueryParser queryParser = new QueryParser("",new SimpleAnalyzer()); |
public static boolean isValid(String query) |
{ |
if(query == null) |
return false; |
try { |
queryParser.parse(query); |
return true; |
} catch (ParseException e) { |
logger.info("bad query for SruSearchService:" + query + " -> " + e.toString()); |
logger.debug(e,e); |
} |
return false; |
} |
} |
/impl/src/java/pt/estgp/estgweb/services/srusources/SruSourcesCommonServices.java |
---|
11,6 → 11,10 |
import pt.estgp.estgweb.utils.RoleManager; |
import pt.estgp.estgweb.utils.Dom4jUtil; |
import org.apache.log4j.Logger; |
import org.apache.lucene.queryParser.QueryParser; |
import org.apache.lucene.queryParser.ParseException; |
import org.apache.lucene.analysis.SimpleAnalyzer; |
import org.apache.lucene.analysis.Analyzer; |
import org.dom4j.Document; |
import org.dom4j.XPath; |
import org.dom4j.Element; |
53,6 → 57,19 |
public List<ISearchResults> searchList(String moduleInternalKey, String from, String search, SearchTypeEnum searchType, int page, int maxResults, UserSession userSession) |
{ |
boolean containsSpecialChars = false; |
if(from != null) |
{ |
if(!QueryLanguageChars.isValid(search)) |
return null; |
if(QueryLanguageChars.containsSpecialNotUsual(search)) |
{ |
containsSpecialChars = true; |
} |
} |
// if(searchType == SearchTypeEnum.ExactPhrase && search.indexOf("AND") < 0) |
// search = "\"" + search + "\""; |
// if(searchType == SearchTypeEnum.AllWords && search) |
// search = search.replace("(","\\(").replace(")","\\)").replace("[","\\[").replace("]","\\]").replace("{","\\{").replace("}","\\}").replace(":","\\:").replace("^","\\^"); |
List<ISearchResults> searchResults = new ArrayList<ISearchResults>(); |
74,6 → 91,7 |
sruSources.add(sruSource); |
} |
//filtering the admited sources |
admitedSources = new ArrayList<SruSourceView>(); |
for(SruSource source: sruSources) |
114,7 → 132,10 |
} |
String finalQuery = "(" + collectionQuery.toString() + ") AND (" + search + ")"; |
logger.info("Sru server " + sruSourceView.getName() + " final query: " + finalQuery); |
String sruRequest = sruSourceView.getUrl() + "?query=" + URLEncoder.encode(finalQuery,"UTF-8") + "&verb=getSRUResponseWithThisQueryPhraseBoost&startRecord=" + ((page*maxResults)+1) + "&maximumRecords=" + maxResults; |
String service = "getSRUResponseWithThisQueryPhraseBoost"; |
if(containsSpecialChars) |
service = "getSRUResponseWithThisQuery"; |
String sruRequest = sruSourceView.getUrl() + "?query=" + URLEncoder.encode(finalQuery,"UTF-8") + "&verb=" + service + "&startRecord=" + ((page*maxResults)+1) + "&maximumRecords=" + maxResults; |
URL url = new URL(sruRequest); |
Document dom = Dom4jUtil.parse(url); |
284,4 → 305,8 |
{ |
//To change body of implemented methods use File | Settings | File Templates. |
} |
} |
/impl/src/java/pt/estgp/estgweb/web/controllers/commons/CommonsController.java |
---|
47,9 → 47,18 |
{ |
try |
{ |
String query = request.getParameter("query"); |
if(query != null && query.trim().length() > 0) |
{ |
if(!QueryLanguageChars.isValid(request.getParameter("query"))) |
query = QueryLanguageChars.escape(query); |
} |
IServiceManager sm = ServiceManager.getInstance(); |
String[] names = new String[]{}; |
Object[] args = new Object[]{request.getParameter("from"), request.getParameter("query"), SearchTypeEnum.parse(request.getParameter("searchType"))}; |
Object[] args = new Object[]{request.getParameter("from"), query, SearchTypeEnum.parse(request.getParameter("searchType"))}; |
ICommonSearchResults commonSearchResults = (ICommonSearchResults) sm.execute(RequestUtils.getRequester(request, response), "CommonServicesSearch", args, names); |
request.setAttribute("ICommonSearchResults", commonSearchResults); |
return mapping.findForward("searchResults"); |