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:
rjy7 2010-11-11 16:04:22 +00:00
parent 7ad822efce
commit 252763e3b1
6 changed files with 48 additions and 25 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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.