NIHVIVO-1521 AutocompleteController no longer extends FreemarkerHttpServlet.

This commit is contained in:
rjy7 2011-03-03 20:39:05 +00:00
parent 171548efef
commit a38a81b2e6
2 changed files with 63 additions and 21 deletions

View file

@ -3,18 +3,34 @@
package edu.cornell.mannlib.vitro.webapp.controller.ajax;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import edu.cornell.mannlib.vitro.webapp.search.controller.AutocompleteController;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* A base class for servlets that handle AJAX requests.
*/
public abstract class VitroAjaxController extends HttpServlet {
private static final Log log = LogFactory.getLog(VitroAjaxController.class);
/**
* Sub-classes must implement this method to verify that the user is
* authorized to execute this request.
@ -51,4 +67,30 @@ public abstract class VitroAjaxController extends HttpServlet {
doGet(req, resp);
}
/**
* Returns the current Freemarker Configuration so the controller can process
* its data through a template.
*/
protected final Configuration getFreemarkerConfiguration(VitroRequest vreq) {
ServletContext context = getServletContext();
FreemarkerConfigurationLoader loader =
FreemarkerConfigurationLoader.getFreemarkerConfigurationLoader(context);
return loader.getConfig(vreq);
}
/**
* Process data through a Freemarker template and output the result.
*/
protected void writeTemplate(String templateName, Map<String, Object> map,
Configuration config, HttpServletRequest request, HttpServletResponse response) {
Template template = null;
try {
template = config.getTemplate(templateName);
PrintWriter out = response.getWriter();
template.process(map, out);
} catch (Exception e) {
log.error(e, e);
}
}
}

View file

@ -29,8 +29,9 @@ import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import edu.cornell.mannlib.vedit.beans.LoginStatusBean;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.ajax.VitroAjaxController;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import edu.cornell.mannlib.vitro.webapp.flags.PortalFlag;
import edu.cornell.mannlib.vitro.webapp.search.SearchException;
@ -44,7 +45,7 @@ import freemarker.template.Configuration;
* through a Lucene search.
*/
public class AutocompleteController extends FreemarkerHttpServlet{
public class AutocompleteController extends VitroAjaxController {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(AutocompleteController.class);
@ -56,18 +57,12 @@ public class AutocompleteController extends FreemarkerHttpServlet{
String NORESULT_MSG = "";
private int defaultMaxSearchSize= 1000;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
protected void doRequest(VitroRequest vreq, HttpServletResponse response)
throws IOException, ServletException {
Map<String, Object> map = new HashMap<String, Object>();
VitroRequest vreq = new VitroRequest(request);
Configuration config = getConfig(vreq);
Configuration config = getFreemarkerConfiguration(vreq);
PortalFlag portalFlag = vreq.getPortalFlag();
try {
@ -76,7 +71,7 @@ public class AutocompleteController extends FreemarkerHttpServlet{
if( vreq.getWebappDaoFactory() == null
|| vreq.getWebappDaoFactory().getIndividualDao() == null ){
log.error("makeUsableBeans() could not get IndividualDao ");
doSearchError(map, config, request, response);
doSearchError(map, config, vreq, response);
return;
}
@ -88,7 +83,7 @@ public class AutocompleteController extends FreemarkerHttpServlet{
Query query = getQuery(vreq, portalFlag, analyzer, qtxt);
if (query == null ) {
log.debug("query for '" + qtxt +"' is null.");
doNoQuery(map, config, request, response);
doNoQuery(map, config, vreq, response);
return;
}
log.debug("query for '" + qtxt +"' is " + query.toString());
@ -106,20 +101,20 @@ public class AutocompleteController extends FreemarkerHttpServlet{
topDocs = searcherForRequest.search(query,null,maxHitSize);
}catch (Exception ex){
log.error(ex);
doFailedSearch(map, config, request, response);
doFailedSearch(map, config, vreq, response);
return;
}
}
if( topDocs == null || topDocs.scoreDocs == null){
log.error("topDocs for a search was null");
doFailedSearch(map, config, request, response);
doFailedSearch(map, config, vreq, response);
return;
}
int hitsLength = topDocs.scoreDocs.length;
if ( hitsLength < 1 ){
doFailedSearch(map, config, request, response);
doFailedSearch(map, config, vreq, response);
return;
}
log.debug("found "+hitsLength+" hits");
@ -140,14 +135,14 @@ public class AutocompleteController extends FreemarkerHttpServlet{
Collections.sort(results);
map.put("results", results);
writeTemplate(TEMPLATE_DEFAULT, map, config, request, response);
writeTemplate(TEMPLATE_DEFAULT, map, config, vreq, response);
} catch (TemplateProcessingException e) {
log.error(e, e);
} catch (Throwable e) {
log.error("AutocompleteController(): " + e);
try {
doSearchError(map, config, request, response);
doSearchError(map, config, vreq, response);
} catch (TemplateProcessingException e1) {
log.error(e1.getMessage(), e1);
}
@ -170,7 +165,7 @@ public class AutocompleteController extends FreemarkerHttpServlet{
return (Analyzer)obj;
}
private Query getQuery(VitroRequest request, PortalFlag portalState,
private Query getQuery(VitroRequest vreq, PortalFlag portalState,
Analyzer analyzer, String querystr) throws SearchException{
Query query = null;
@ -185,12 +180,12 @@ public class AutocompleteController extends FreemarkerHttpServlet{
return null;
}
query = makeNameQuery(querystr, analyzer, request);
query = makeNameQuery(querystr, analyzer, vreq);
// Filter by type
{
BooleanQuery boolQuery = new BooleanQuery();
String typeParam = (String) request.getParameter("type");
String typeParam = (String) vreq.getParameter("type");
boolQuery.add( new TermQuery(
new Term(VitroLuceneTermNames.RDFTYPE,
typeParam)),
@ -394,6 +389,11 @@ public class AutocompleteController extends FreemarkerHttpServlet{
}
}
@Override
protected boolean testIsAuthorized(HttpServletRequest request) {
return LoginStatusBean.getBean(request).isLoggedIn();
}
}