Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 475 → Rev 476

/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");
/impl/src/web/layout/searchForm.jsp
39,6 → 39,7
%>
<td class="searchTab">
<html:form action="/search" method="post">
<input type="hidden" name="from" value="home"/>
<input type="hidden" name="dispatch" value="search"/>
<table>
<tr>
78,6 → 79,7
%>
<html:form action="/search" method="post">
<input type="hidden" name="dispatch" value="search"/>
<input type="hidden" name="from" value="intranet"/>
<div class="searchTab">
<html:image page="/imgs/lupa.gif" altKey="search"/><input type="text" class="small" name="query" value="<%=query%>"/> <input type="submit" value=">>">
</div>