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