NIHVIVO-1394 As a necessary first step to calling a template from a controller which will add to the data model used by page and body templates, provide BaseTemplateModelDirective with its own template processing methods, to separate from TemplateProcessingHelper, which will only be available to FreemarkerHttpServlet.

This commit is contained in:
rjy7 2010-11-23 16:10:05 +00:00
parent a0225f1cc9
commit 70fe857329
6 changed files with 66 additions and 35 deletions

View file

@ -57,7 +57,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
TITLED_ERROR_MESSAGE("error-titled.ftl"), TITLED_ERROR_MESSAGE("error-titled.ftl"),
MESSAGE("message.ftl"), MESSAGE("message.ftl"),
TITLED_MESSAGE("message-titled.ftl"), TITLED_MESSAGE("message-titled.ftl"),
PAGE_DEFAULT("page.ftl"); PAGE_DEFAULT("page.ftl"),
SETUP("setup.ftl");
private final String filename; private final String filename;
@ -162,15 +163,17 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
Configuration config = getConfig(vreq); Configuration config = getConfig(vreq);
Map<String, Object> bodyMap = values.getMap(); Map<String, Object> bodyMap = values.getMap();
TemplateProcessingHelper helper = new TemplateProcessingHelper(config, vreq, getServletContext());
// We can't use shared variables in the Freemarker configuration to store anything // We can't use shared variables in the Freemarker configuration to store anything
// except theme-specific data, because multiple portals or apps might share the same theme. So instead // except theme-specific data, because multiple portals or apps might share the same theme. So instead
// just put the shared variables in both root and body. // just put the shared variables in both root and body.
Map<String, Object> sharedVariables = getSharedVariables(vreq, bodyMap); Map<String, Object> sharedVariables = getSharedVariables(vreq, bodyMap);
//helper.processSetupTemplate(config, vreq, sharedVariables);
// root is the map used to create the page shell - header, footer, menus, etc. // root is the map used to create the page shell - header, footer, menus, etc.
Map<String, Object> root = new HashMap<String, Object>(sharedVariables); Map<String, Object> root = new HashMap<String, Object>(sharedVariables);
root.putAll(getPageTemplateValues(vreq)); root.putAll(getPageTemplateValues(vreq));
// 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.
root.put("templateType", PAGE_TEMPLATE_TYPE); root.put("templateType", PAGE_TEMPLATE_TYPE);
@ -198,6 +201,11 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
writePage(root, config, vreq, response); writePage(root, config, vreq, response);
} }
private void processSetupTemplate(Configuration config, HttpServletRequest request, Map<String, Object> map) {
TemplateProcessingHelper helper = new TemplateProcessingHelper(config, request, getServletContext());
helper.processTemplate(Template.SETUP.toString(), map);
}
protected void doRedirect(HttpServletRequest request, HttpServletResponse response, ResponseValues values) protected void doRedirect(HttpServletRequest request, HttpServletResponse response, ResponseValues values)
throws ServletException, IOException { throws ServletException, IOException {
String redirectUrl = values.getRedirectUrl(); String redirectUrl = values.getRedirectUrl();

View file

@ -26,28 +26,30 @@ public class TemplateProcessingHelper {
private Configuration config = null; private Configuration config = null;
private HttpServletRequest request = null; private HttpServletRequest request = null;
private ServletContext context = null; private ServletContext context = null;
//private Map<String, Object> templateDataModel = null;
public TemplateProcessingHelper(Configuration config, HttpServletRequest request, ServletContext context) { TemplateProcessingHelper(Configuration config, HttpServletRequest request, ServletContext context) {
this.config = config; this.config = config;
this.request = request; this.request = request;
this.context = context; this.context = context;
//this.templateDataModel = new HashMap<String, Object>();
} }
public StringWriter processTemplate(String templateName, Map<String, Object> map) { protected StringWriter processTemplate(String templateName, Map<String, Object> map) {
Template template = getTemplate(templateName); Template template = getTemplate(templateName);
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
processTemplate(template, map, sw); processTemplate(template, map, sw);
return sw; return sw;
} }
public StringWriter processTemplate(ResponseValues values) { protected StringWriter processTemplate(ResponseValues values) {
if (values == null) { if (values == null) {
return null; return null;
} }
return processTemplate(values.getTemplateName(), values.getMap()); return processTemplate(values.getTemplateName(), values.getMap());
} }
public void processTemplate(Template template, Map<String, Object> map, Writer writer) { private void processTemplate(Template template, Map<String, Object> map, Writer writer) {
try { try {
Environment env = template.createProcessingEnvironment(map, writer); Environment env = template.createProcessingEnvironment(map, writer);
@ -64,15 +66,15 @@ public class TemplateProcessingHelper {
} }
// 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.
public String processTemplateToString(String templateName, Map<String, Object> map) { protected String processTemplateToString(String templateName, Map<String, Object> map) {
return processTemplate(templateName, map).toString(); return processTemplate(templateName, map).toString();
} }
public String processTemplateToString(ResponseValues values) { protected String processTemplateToString(ResponseValues values) {
return processTemplate(values).toString(); return processTemplate(values).toString();
} }
public Template getTemplate(String templateName) { private Template getTemplate(String templateName) {
Template template = null; Template template = null;
try { try {
template = config.getTemplate(templateName); template = config.getTemplate(templateName);

View file

@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.web.directives; package edu.cornell.mannlib.vitro.webapp.web.directives;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -14,7 +16,9 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper;
import freemarker.core.Environment; import freemarker.core.Environment;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
public abstract class BaseTemplateDirectiveModel implements TemplateDirectiveModel { public abstract class BaseTemplateDirectiveModel implements TemplateDirectiveModel {
@ -38,18 +42,32 @@ public abstract class BaseTemplateDirectiveModel implements TemplateDirectiveMod
return directiveName; return directiveName;
} }
protected String mergeToHelpTemplate(Map<String, Object> map, Environment environment) { protected String mergeToHelpTemplate(Map<String, Object> map, Environment env) {
TemplateProcessingHelper helper = getFreemarkerHelper(environment); return processTemplateToString("help-directive.ftl", map, env);
return helper.processTemplateToString("help-directive.ftl", map);
} }
public static TemplateProcessingHelper getFreemarkerHelper(Environment env) { public static String processTemplateToString(String templateName, Map<String, Object> map, Environment env) {
Configuration config = env.getConfiguration(); Template template = getTemplate(templateName, env);
// In a directive, custom attributes for request and context are available in the Environment. StringWriter sw = new StringWriter();
// They are put there when the enclosing template is processed. try {
HttpServletRequest request = (HttpServletRequest) env.getCustomAttribute("request"); template.process(map, sw);
ServletContext context = (ServletContext) env.getCustomAttribute("context"); } catch (TemplateException e) {
return new TemplateProcessingHelper(config, request, context); log.error("Template Exception creating processing environment", e);
} catch (IOException e) {
log.error("IOException creating processing environment", e);
}
return sw.toString();
}
private static Template getTemplate(String templateName, Environment env) {
Template template = null;
try {
template = env.getConfiguration().getTemplate(templateName);
} catch (IOException e) {
// RY Should probably throw this error instead.
log.error("Cannot get template " + templateName, e);
}
return template;
} }
} }

View file

@ -27,20 +27,19 @@ public class DumpHelper {
private static final Log log = LogFactory.getLog(DumpHelper.class); private static final Log log = LogFactory.getLog(DumpHelper.class);
private Environment environment = null; private Environment env = null;
public DumpHelper(Environment env) { public DumpHelper(Environment env) {
environment = env; this.env = env;
} }
public String getVariableDump(String varName) { public String getVariableDump(String varName) {
Map<String, Object> map = getVariableDumpData(varName); Map<String, Object> map = getVariableDumpData(varName);
TemplateProcessingHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment); return BaseTemplateDirectiveModel.processTemplateToString("dump-var.ftl", map, env);
return helper.processTemplateToString("dump-var.ftl", map);
} }
public Map<String, Object> getVariableDumpData(String varName) { public Map<String, Object> getVariableDumpData(String varName) {
TemplateHashModel dataModel = environment.getDataModel(); TemplateHashModel dataModel = env.getDataModel();
TemplateModel tm = null; TemplateModel tm = null;
try { try {
@ -115,10 +114,8 @@ public class DumpHelper {
} }
public void writeDump(String templateName, Map<String, Object> map, String modelName) { public void writeDump(String templateName, Map<String, Object> map, String modelName) {
String output = BaseTemplateDirectiveModel.processTemplateToString(templateName, map, env);
TemplateProcessingHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment); Writer out = env.getOut();
String output = helper.processTemplateToString(templateName, map);
Writer out = environment.getOut();
try { try {
out.write(output); out.write(output);
} catch (IOException e) { } catch (IOException e) {

View file

@ -12,15 +12,16 @@
<p><strong>Comments:</strong> ${comments}</p> <p><strong>Comments:</strong> ${comments}</p>
</#if> </#if>
<p><strong>Parameters:</strong></p> <p><strong>Parameters: </strong>
<#if params?? && params?keys?has_content> <#if params?? && params?keys?has_content>
</p>
<ul> <ul>
<#list params?keys as param> <#list params?keys as param>
<li><strong>${param}:</strong> ${params[param]}</li> <li><strong>${param}:</strong> ${params[param]}</li>
</#list> </#list>
</ul> </ul>
<#else> <#else>
<p>none</p> none</p>
</#if> </#if>
<br /> <br />

View file

@ -7,3 +7,8 @@
<@widget name="test" /> <@widget name="test" />
${stylesheets.add("/css/testfrombody.css")} ${stylesheets.add("/css/testfrombody.css")}
${scripts.add("/js/jstest.js")}
${bodyClass}
<ul><@list.firstLastList><li>apples</li><li>bananas</li></@list.firstLastList></ul>