NIHVIVO-3729 Don't fetch the FreemarkerConfiguration only to pass it through 6 levels of calls. Instead, get it from the FreemarkerConfigurationLoader when you need it.

This commit is contained in:
j2blake 2012-04-20 20:51:36 +00:00
parent 981ac675c9
commit 91b2f03780
7 changed files with 61 additions and 86 deletions

View file

@ -69,22 +69,14 @@ public abstract class VitroAjaxController extends HttpServlet {
return Actions.AUTHORIZED; return Actions.AUTHORIZED;
} }
/**
* Returns the current Freemarker Configuration so the controller can process
* its data through a template.
*/
protected final Configuration getFreemarkerConfiguration(VitroRequest vreq) {
return FreemarkerConfigurationLoader.getConfig(vreq);
}
/** /**
* Process data through a Freemarker template and output the result. * Process data through a Freemarker template and output the result.
*/ */
protected void writeTemplate(String templateName, Map<String, Object> map, protected void writeTemplate(String templateName, Map<String, Object> map,
Configuration config, HttpServletRequest request, HttpServletResponse response) { VitroRequest vreq, HttpServletResponse response) {
Template template = null; Configuration config = FreemarkerConfigurationLoader.getConfig(vreq);
try { try {
template = config.getTemplate(templateName); Template template = config.getTemplate(templateName);
PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter();
template.process(map, out); template.process(map, out);
} catch (Exception e) { } catch (Exception e) {
@ -92,12 +84,13 @@ public abstract class VitroAjaxController extends HttpServlet {
} }
} }
protected void doError(HttpServletResponse response, String errorMsg, int httpstatus){ protected void doError(HttpServletResponse response, String errorMsg,
int httpstatus) {
response.setStatus(httpstatus); response.setStatus(httpstatus);
try { try {
response.getWriter().write(errorMsg); response.getWriter().write(errorMsg);
} catch (IOException e) { } catch (IOException e) {
log.debug("IO exception during output",e ); log.debug("IO exception during output", e);
} }
} }
} }

View file

@ -32,7 +32,6 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessing
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailFactory; import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailFactory;
import freemarker.template.Configuration;
public class ContactMailController extends FreemarkerHttpServlet { public class ContactMailController extends FreemarkerHttpServlet {
private static final Log log = LogFactory private static final Log log = LogFactory
@ -112,15 +111,14 @@ public class ContactMailController extends FreemarkerHttpServlet {
String originalReferer = getOriginalRefererFromSession(vreq); String originalReferer = getOriginalRefererFromSession(vreq);
Configuration config = FreemarkerConfigurationLoader.getConfig(vreq);
String msgText = composeEmail(webusername, webuseremail, comments, String msgText = composeEmail(webusername, webuseremail, comments,
deliveryfrom, originalReferer, vreq.getRemoteAddr(), config, vreq); deliveryfrom, originalReferer, vreq.getRemoteAddr(), vreq);
try { try {
// Write the message to the journal file // Write the message to the journal file
FileWriter fw = new FileWriter(locateTheJournalFile(vreq),true); FileWriter fw = new FileWriter(locateTheJournalFile(vreq),true);
PrintWriter outFile = new PrintWriter(fw); PrintWriter outFile = new PrintWriter(fw);
writeBackupCopy(outFile, msgText, config, vreq); writeBackupCopy(outFile, msgText, vreq);
try { try {
// Send the message // Send the message
@ -222,7 +220,7 @@ public class ContactMailController extends FreemarkerHttpServlet {
private String composeEmail(String webusername, String webuseremail, private String composeEmail(String webusername, String webuseremail,
String comments, String deliveryfrom, String comments, String deliveryfrom,
String originalReferer, String ipAddr, Configuration config, String originalReferer, String ipAddr,
HttpServletRequest request) { HttpServletRequest request) {
Map<String, Object> email = new HashMap<String, Object>(); Map<String, Object> email = new HashMap<String, Object>();
@ -238,7 +236,7 @@ public class ContactMailController extends FreemarkerHttpServlet {
} }
try { try {
return processTemplateToString(template, email, config, request); return processTemplateToString(template, email, request);
} catch (TemplateProcessingException e) { } catch (TemplateProcessingException e) {
log.error("Error processing email text through template: " + e.getMessage(), e); log.error("Error processing email text through template: " + e.getMessage(), e);
return null; return null;
@ -246,7 +244,7 @@ public class ContactMailController extends FreemarkerHttpServlet {
} }
private void writeBackupCopy(PrintWriter outFile, String msgText, private void writeBackupCopy(PrintWriter outFile, String msgText,
Configuration config, HttpServletRequest request) { HttpServletRequest request) {
Map<String, Object> backup = new HashMap<String, Object>(); Map<String, Object> backup = new HashMap<String, Object>();
String template = TEMPLATE_BACKUP; String template = TEMPLATE_BACKUP;
@ -256,7 +254,7 @@ public class ContactMailController extends FreemarkerHttpServlet {
backup.put("msgText", msgText); backup.put("msgText", msgText);
try { try {
String backupText = processTemplateToString(template, backup, config, request); String backupText = processTemplateToString(template, backup, request);
outFile.print(backupText); outFile.print(backupText);
outFile.flush(); outFile.flush();
//outFile.close(); //outFile.close();

View file

@ -2,7 +2,6 @@
package edu.cornell.mannlib.vitro.webapp.controller.freemarker; package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
@ -14,7 +13,6 @@ 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.TemplateProcessingHelper.TemplateProcessingException; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import freemarker.template.Configuration;
/** /**
* TEMPORARY for transition from JSP to FreeMarker. Once transition * TEMPORARY for transition from JSP to FreeMarker. Once transition
@ -34,34 +32,33 @@ public class FreemarkerComponentGenerator extends FreemarkerHttpServlet {
// Mimic what FreemarkerHttpServlet does for a new request // Mimic what FreemarkerHttpServlet does for a new request
VitroRequest vreq = new VitroRequest(request); VitroRequest vreq = new VitroRequest(request);
FreemarkerConfiguration config = getConfig(vreq);
Map<String, Object> map = getPageTemplateValues(vreq); Map<String, Object> map = getPageTemplateValues(vreq);
request.setAttribute("ftl_head", getHead("head", map, config, vreq)); request.setAttribute("ftl_head", getHead("head", map, vreq));
request.setAttribute("ftl_identity", get("identity", map, config, vreq)); request.setAttribute("ftl_identity", get("identity", map, vreq));
request.setAttribute("ftl_menu", get("menu", map, config, vreq)); request.setAttribute("ftl_menu", get("menu", map, vreq));
request.setAttribute("ftl_search", get("search", map, config, vreq)); request.setAttribute("ftl_search", get("search", map, vreq));
request.setAttribute("ftl_footer", get("footer", map, config, vreq)); request.setAttribute("ftl_footer", get("footer", map, vreq));
request.setAttribute("ftl_googleAnalytics", get("googleAnalytics", map, config, vreq)); request.setAttribute("ftl_googleAnalytics", get("googleAnalytics", map, vreq));
} }
private String get(String templateName, Map<String, Object> root, Configuration config, HttpServletRequest request) { private String get(String templateName, Map<String, Object> root, HttpServletRequest request) {
templateName += ".ftl"; templateName += ".ftl";
try { try {
return processTemplate(templateName, root, config, request).toString(); return processTemplate(templateName, root, request).toString();
} catch (TemplateProcessingException e) { } catch (TemplateProcessingException e) {
log.error("Error processing template " + templateName + ": " + e.getMessage(), e); log.error("Error processing template " + templateName + ": " + e.getMessage(), e);
return null; return null;
} }
} }
private String getHead(String templateName, Map<String, Object> root, Configuration config, HttpServletRequest request) { private String getHead(String templateName, Map<String, Object> root, HttpServletRequest request) {
// The Freemarker head template displays the page title in the <title> tag. Get the value out of the request. // The Freemarker head template displays the page title in the <title> tag. Get the value out of the request.
String title = (String) request.getAttribute("title"); String title = (String) request.getAttribute("title");
if (!StringUtils.isEmpty(title)) { if (!StringUtils.isEmpty(title)) {
root.put("title", title); root.put("title", title);
} }
return get(templateName, root, config, request); return get(templateName, root, request);
} }
// RY We need the servlet context in getConfig(). For some reason using the method inherited from // RY We need the servlet context in getConfig(). For some reason using the method inherited from

View file

@ -41,7 +41,6 @@ import edu.cornell.mannlib.vitro.webapp.web.templatemodels.Tags;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.User; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.User;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu.MainMenu; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu.MainMenu;
import freemarker.ext.beans.BeansWrapper; import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper; import freemarker.template.DefaultObjectWrapper;
import freemarker.template.TemplateModel; import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException; import freemarker.template.TemplateModelException;
@ -100,8 +99,6 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
return; return;
} }
FreemarkerConfiguration config = getConfig(vreq);
responseValues = processRequest(vreq); responseValues = processRequest(vreq);
doResponse(vreq, response, responseValues); doResponse(vreq, response, responseValues);
@ -195,10 +192,6 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
doGet(request, response); doGet(request, response);
} }
protected FreemarkerConfiguration getConfig(VitroRequest vreq) {
return FreemarkerConfigurationLoader.getConfig(vreq);
}
/** /**
* By default, a page requires authorization for no actions. * By default, a page requires authorization for no actions.
* Subclasses that require authorization to process their page will override * Subclasses that require authorization to process their page will override
@ -248,8 +241,6 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
protected void doTemplate(VitroRequest vreq, HttpServletResponse response, protected void doTemplate(VitroRequest vreq, HttpServletResponse response,
ResponseValues values) throws TemplateProcessingException { ResponseValues values) throws TemplateProcessingException {
Configuration config = getConfig(vreq);
Map<String, Object> templateDataModel = new HashMap<String, Object>(); Map<String, Object> templateDataModel = new HashMap<String, Object>();
templateDataModel.putAll(getPageTemplateValues(vreq)); templateDataModel.putAll(getPageTemplateValues(vreq));
@ -264,7 +255,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
if (bodyTemplate != null) { if (bodyTemplate != null) {
// Tell the template and any directives it uses that we're processing a body template. // Tell the template and any directives it uses that we're processing a body template.
templateDataModel.put("templateType", BODY_TEMPLATE_TYPE); templateDataModel.put("templateType", BODY_TEMPLATE_TYPE);
bodyString = processTemplateToString(bodyTemplate, templateDataModel, config, vreq); bodyString = processTemplateToString(bodyTemplate, templateDataModel, vreq);
} else { } else {
// The subcontroller has not defined a body template. All markup for the page // The subcontroller has not defined a body template. All markup for the page
// is specified in the main page template. // is specified in the main page template.
@ -275,7 +266,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
// Tell the template and any directives it uses that we're processing a page template. // Tell the template and any directives it uses that we're processing a page template.
templateDataModel.put("templateType", PAGE_TEMPLATE_TYPE); templateDataModel.put("templateType", PAGE_TEMPLATE_TYPE);
writePage(templateDataModel, config, vreq, response, values.getStatusCode(), values); writePage(templateDataModel, vreq, response, values.getStatusCode(), values);
} }
protected void doRedirect(HttpServletRequest request, HttpServletResponse response, ResponseValues values) protected void doRedirect(HttpServletRequest request, HttpServletResponse response, ResponseValues values)
@ -484,29 +475,29 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
return siteName; return siteName;
} }
protected StringWriter processTemplate(String templateName, Map<String, Object> map, Configuration config, protected StringWriter processTemplate(String templateName, Map<String, Object> map,
HttpServletRequest request) throws TemplateProcessingException { HttpServletRequest request) throws TemplateProcessingException {
TemplateProcessingHelper helper = new TemplateProcessingHelper(config, request, getServletContext()); TemplateProcessingHelper helper = new TemplateProcessingHelper(request, getServletContext());
return helper.processTemplate(templateName, map); return helper.processTemplate(templateName, map);
} }
protected StringWriter processTemplate(ResponseValues values, Configuration config, protected StringWriter processTemplate(ResponseValues values,
HttpServletRequest request) throws TemplateProcessingException { HttpServletRequest request) throws TemplateProcessingException {
return processTemplate(values.getTemplateName(), values.getMap(), config, request); return processTemplate(values.getTemplateName(), values.getMap(), request);
} }
// In fact, we can put StringWriter objects directly into the data model, so perhaps we should eliminate the processTemplateToString() methods. // In fact, we can put StringWriter objects directly into the data model, so perhaps we should eliminate the processTemplateToString() methods.
protected String processTemplateToString(String templateName, Map<String, Object> map, Configuration config, protected String processTemplateToString(String templateName, Map<String, Object> map,
HttpServletRequest request) throws TemplateProcessingException { HttpServletRequest request) throws TemplateProcessingException {
return processTemplate(templateName, map, config, request).toString(); return processTemplate(templateName, map, request).toString();
} }
protected String processTemplateToString(ResponseValues values, Configuration config, protected String processTemplateToString(ResponseValues values,
HttpServletRequest request) throws TemplateProcessingException { HttpServletRequest request) throws TemplateProcessingException {
return processTemplate(values, config, request).toString(); return processTemplate(values, request).toString();
} }
protected void writePage(Map<String, Object> root, Configuration config, HttpServletRequest request, protected void writePage(Map<String, Object> root, HttpServletRequest request,
HttpServletResponse response, int statusCode, ResponseValues rv) throws TemplateProcessingException { HttpServletResponse response, int statusCode, ResponseValues rv) throws TemplateProcessingException {
// For an error page, use the standard page template rather than a special one, in case that is the source // For an error page, use the standard page template rather than a special one, in case that is the source
@ -514,17 +505,17 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
// less likely. // less likely.
String pageTemplateName = String pageTemplateName =
rv instanceof ExceptionResponseValues ? Template.PAGE_DEFAULT.toString() : getPageTemplateName(); rv instanceof ExceptionResponseValues ? Template.PAGE_DEFAULT.toString() : getPageTemplateName();
writeTemplate(pageTemplateName, root, config, request, response, statusCode); writeTemplate(pageTemplateName, root, request, response, statusCode);
} }
protected void writeTemplate(String templateName, Map<String, Object> map, Configuration config, protected void writeTemplate(String templateName, Map<String, Object> map,
HttpServletRequest request, HttpServletResponse response) throws TemplateProcessingException { HttpServletRequest request, HttpServletResponse response) throws TemplateProcessingException {
writeTemplate(templateName, map, config, request, response, 0); writeTemplate(templateName, map, request, response, 0);
} }
protected void writeTemplate(String templateName, Map<String, Object> map, Configuration config, protected void writeTemplate(String templateName, Map<String, Object> map,
HttpServletRequest request, HttpServletResponse response, int statusCode) throws TemplateProcessingException { HttpServletRequest request, HttpServletResponse response, int statusCode) throws TemplateProcessingException {
StringWriter sw = processTemplate(templateName, map, config, request); StringWriter sw = processTemplate(templateName, map, request);
write(sw, response, statusCode); write(sw, response, statusCode);
} }

View file

@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import freemarker.core.Environment; import freemarker.core.Environment;
import freemarker.template.Configuration; import freemarker.template.Configuration;
@ -27,8 +28,8 @@ public class TemplateProcessingHelper {
private HttpServletRequest request = null; private HttpServletRequest request = null;
private ServletContext context = null; private ServletContext context = null;
public TemplateProcessingHelper(Configuration config, HttpServletRequest request, ServletContext context) { public TemplateProcessingHelper(HttpServletRequest request, ServletContext context) {
this.config = config; this.config = FreemarkerConfigurationLoader.getConfig(new VitroRequest(request));
this.request = request; this.request = request;
this.context = context; this.context = context;
} }

View file

@ -18,7 +18,6 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServ
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.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State; import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State;
import freemarker.template.Configuration;
/** /**
* A temporary means of displaying the Login templates within the SiteAdmin * A temporary means of displaying the Login templates within the SiteAdmin
@ -164,13 +163,11 @@ public class LoginTemplateHelper extends LoginTemplateHelperBase {
*/ */
private String doTemplate(VitroRequest vreq, TemplateResponseValues values) throws TemplateProcessingException { private String doTemplate(VitroRequest vreq, TemplateResponseValues values) throws TemplateProcessingException {
// Set it up like FreeMarkerHttpServlet.doGet() would do. // Set it up like FreeMarkerHttpServlet.doGet() would do.
Configuration config = getConfig(vreq);
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.putAll(getPageTemplateValues(vreq)); map.putAll(getPageTemplateValues(vreq));
map.putAll(values.getMap()); map.putAll(values.getMap());
return processTemplateToString(values.getTemplateName(), map, config, vreq); return processTemplateToString(values.getTemplateName(), map, vreq);
} }
/** /**

View file

@ -51,7 +51,6 @@ import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQueryFactory;
import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup; import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.LinkTemplateModel; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.LinkTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.searchresult.IndividualSearchResult; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.searchresult.IndividualSearchResult;
import freemarker.template.Configuration;
/** /**
* Paged search controller that uses Solr * Paged search controller that uses Solr
@ -104,12 +103,11 @@ public class PagedSearchController extends FreemarkerHttpServlet {
super.doGet(vreq,response); super.doGet(vreq,response);
}else{ }else{
try { try {
Configuration config = getConfig(vreq);
ResponseValues rvalues = processRequest(vreq); ResponseValues rvalues = processRequest(vreq);
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml;charset=UTF-8"); response.setContentType("text/xml;charset=UTF-8");
writeTemplate(rvalues.getTemplateName(), rvalues.getMap(), config, request, response); writeTemplate(rvalues.getTemplateName(), rvalues.getMap(), request, response);
} catch (Exception e) { } catch (Exception e) {
log.error(e, e); log.error(e, e);
} }