NIHVIVO-1304 Widget subclasses return TemplateResponseValues object to allow for greater flexibility in determining the template to be invoked in difference cases (e.g., for the login widget).
This commit is contained in:
parent
7ad822efce
commit
252763e3b1
6 changed files with 48 additions and 25 deletions
|
@ -544,7 +544,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
|
|||
}
|
||||
}
|
||||
|
||||
protected static class TemplateResponseValues extends BaseResponseValues {
|
||||
// This class is also used by WidgetDirective, so is public.
|
||||
public static class TemplateResponseValues extends BaseResponseValues {
|
||||
private final String templateName;
|
||||
private final Map<String, Object> map;
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues;
|
||||
import freemarker.core.Environment;
|
||||
import freemarker.template.Configuration;
|
||||
import freemarker.template.Template;
|
||||
|
@ -33,12 +34,18 @@ public class TemplateProcessingHelper {
|
|||
}
|
||||
|
||||
public StringWriter processTemplate(String templateName, Map<String, Object> map) {
|
||||
|
||||
Template template = getTemplate(templateName);
|
||||
StringWriter sw = new StringWriter();
|
||||
processTemplate(template, map, sw);
|
||||
return sw;
|
||||
}
|
||||
|
||||
public StringWriter processTemplate(ResponseValues values) {
|
||||
if (values == null) {
|
||||
return null;
|
||||
}
|
||||
return processTemplate(values.getTemplateName(), values.getMap());
|
||||
}
|
||||
|
||||
public void processTemplate(Template template, Map<String, Object> map, Writer writer) {
|
||||
|
||||
|
@ -61,9 +68,9 @@ public class TemplateProcessingHelper {
|
|||
return processTemplate(templateName, map).toString();
|
||||
}
|
||||
|
||||
// public String processTemplateToString(String templateName, Map<String, Object> map) {
|
||||
// return processTemplate(templateName, map).toString();
|
||||
// }
|
||||
public String processTemplateToString(ResponseValues values) {
|
||||
return processTemplate(values).toString();
|
||||
}
|
||||
|
||||
public Template getTemplate(String templateName) {
|
||||
Template template = null;
|
||||
|
|
|
@ -12,17 +12,15 @@ import org.apache.commons.logging.Log;
|
|||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues;
|
||||
import edu.cornell.mannlib.vitro.webapp.utils.StringUtils;
|
||||
import edu.cornell.mannlib.vitro.webapp.web.widgets.Widget;
|
||||
import freemarker.core.Environment;
|
||||
import freemarker.template.SimpleScalar;
|
||||
import freemarker.template.TemplateDirectiveBody;
|
||||
import freemarker.template.TemplateDirectiveModel;
|
||||
import freemarker.template.TemplateException;
|
||||
import freemarker.template.TemplateModel;
|
||||
import freemarker.template.TemplateModelException;
|
||||
import freemarker.template.TemplateScalarModel;
|
||||
|
||||
public class WidgetDirective extends BaseTemplateDirectiveModel {
|
||||
|
||||
|
@ -73,9 +71,13 @@ public class WidgetDirective extends BaseTemplateDirectiveModel {
|
|||
Constructor<?> widgetConstructor = widgetClass.getConstructor(new Class[]{Environment.class, String.class});
|
||||
Widget widget = (Widget) widgetConstructor.newInstance(env, widgetName);
|
||||
Method method = widgetClass.getMethod(methodName);
|
||||
|
||||
// Right now it seems to me that we will always be producing a string for the widget calls. If we need greater
|
||||
// flexibility, we can return a ResponseValues object and deal with different types here.
|
||||
String output = (String) method.invoke(widget);
|
||||
|
||||
String templateType = env.getDataModel().get("templateType").toString();
|
||||
// If we're in the body template, automatically invoke the doAssets method, so it
|
||||
// If we're in the body template, automatically invoke the doAssets() method, so it
|
||||
// doesn't need to be called explicitly.
|
||||
if ("doMarkup".equals(methodName) && FreemarkerHttpServlet.BODY_TEMPLATE_TYPE.equals(templateType)) {
|
||||
output += widgetClass.getMethod("doAssets").invoke(widget);
|
||||
|
|
|
@ -8,6 +8,7 @@ import java.util.Map;
|
|||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues;
|
||||
import freemarker.core.Environment;
|
||||
|
||||
public class LoginWidget extends Widget {
|
||||
|
@ -19,10 +20,10 @@ public class LoginWidget extends Widget {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected Map<String, Object> getDataModel() {
|
||||
protected TemplateResponseValues getTemplateResponseValues() {
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
map.put("fruit", "bananas");
|
||||
return map;
|
||||
return new TemplateResponseValues (markupTemplateName(), map);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ package edu.cornell.mannlib.vitro.webapp.web.widgets;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues;
|
||||
import freemarker.core.Environment;
|
||||
|
||||
public class TestWidget extends Widget {
|
||||
|
@ -14,10 +15,10 @@ public class TestWidget extends Widget {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected Map<String, Object> getDataModel() {
|
||||
protected TemplateResponseValues getTemplateResponseValues() {
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
map.put("fruit", "bananas");
|
||||
return map;
|
||||
return new TemplateResponseValues (markupTemplateName(), map);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper;
|
||||
import freemarker.cache.TemplateLoader;
|
||||
import freemarker.core.Environment;
|
||||
|
@ -47,8 +48,8 @@ public abstract class Widget {
|
|||
}
|
||||
|
||||
public String doAssets() {
|
||||
String templateName = "widget-" + name + "-assets.ftl";
|
||||
|
||||
String templateName = assetsTemplateName();
|
||||
|
||||
// Allow the assets template to be absent without generating an error.
|
||||
TemplateLoader templateLoader = env.getConfiguration().getTemplateLoader();
|
||||
try {
|
||||
|
@ -59,8 +60,8 @@ public abstract class Widget {
|
|||
log.error("Error finding template source", e);
|
||||
}
|
||||
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
TemplateHashModel dataModel = env.getDataModel();
|
||||
TemplateHashModel dataModel = env.getDataModel();
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
|
||||
try {
|
||||
map.put("stylesheets", dataModel.get("stylesheets"));
|
||||
|
@ -70,19 +71,29 @@ public abstract class Widget {
|
|||
log.error("Error getting asset values from data model.");
|
||||
}
|
||||
|
||||
return helper.processTemplateToString(templateName, map);
|
||||
return helper.processTemplateToString(templateName, map);
|
||||
}
|
||||
|
||||
// Default assets template name. Can be overridden by subclasses.
|
||||
protected String assetsTemplateName() {
|
||||
return "widget-" + name + "-assets.ftl";
|
||||
}
|
||||
|
||||
public String doMarkup() {
|
||||
String templateName = "widget-" + name + "-markup.ftl";
|
||||
Map<String, Object> map = getDataModel();
|
||||
return helper.processTemplateToString(templateName, map);
|
||||
TemplateResponseValues values = getTemplateResponseValues();
|
||||
return helper.processTemplateToString(values);
|
||||
}
|
||||
|
||||
// Default markup template name. Can be overridden in subclasses, or assigned
|
||||
// differently in the subclass doMarkup() method. For example, LoginWidget will
|
||||
// select a template according to login processing status.
|
||||
protected String markupTemplateName() {
|
||||
return "widget-" + name + "-markup.ftl";
|
||||
}
|
||||
|
||||
protected abstract TemplateResponseValues getTemplateResponseValues();
|
||||
|
||||
protected abstract Map<String, Object> getDataModel();
|
||||
|
||||
// # You can capture the output of an arbitrary part of the template into a context variable.
|
||||
// # You can interpret arbitrary context variable as if it were a template definition.
|
||||
}
|
||||
|
||||
//# You can capture the output of an arbitrary part of the template into a context variable.
|
||||
//# You can interpret arbitrary context variable as if it were a template definition.
|
Loading…
Add table
Reference in a new issue