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 String templateName;
private final Map<String, Object> map; 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.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues;
import freemarker.core.Environment; import freemarker.core.Environment;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.Template; import freemarker.template.Template;
@ -33,12 +34,18 @@ public class TemplateProcessingHelper {
} }
public StringWriter processTemplate(String templateName, Map<String, Object> map) { public 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) {
if (values == null) {
return null;
}
return processTemplate(values.getTemplateName(), values.getMap());
}
public void processTemplate(Template template, Map<String, Object> map, Writer writer) { public void processTemplate(Template template, Map<String, Object> map, Writer writer) {
@ -61,9 +68,9 @@ public class TemplateProcessingHelper {
return processTemplate(templateName, map).toString(); return processTemplate(templateName, map).toString();
} }
// public String processTemplateToString(String templateName, Map<String, Object> map) { public String processTemplateToString(ResponseValues values) {
// return processTemplate(templateName, map).toString(); return processTemplate(values).toString();
// } }
public Template getTemplate(String templateName) { public Template getTemplate(String templateName) {
Template template = null; Template template = null;

View file

@ -12,17 +12,15 @@ 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.freemarker.FreemarkerHttpServlet; 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.utils.StringUtils;
import edu.cornell.mannlib.vitro.webapp.web.widgets.Widget; import edu.cornell.mannlib.vitro.webapp.web.widgets.Widget;
import freemarker.core.Environment; import freemarker.core.Environment;
import freemarker.template.SimpleScalar; import freemarker.template.SimpleScalar;
import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
import freemarker.template.TemplateModel; import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException; import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
public class WidgetDirective extends BaseTemplateDirectiveModel { public class WidgetDirective extends BaseTemplateDirectiveModel {
@ -73,9 +71,13 @@ public class WidgetDirective extends BaseTemplateDirectiveModel {
Constructor<?> widgetConstructor = widgetClass.getConstructor(new Class[]{Environment.class, String.class}); Constructor<?> widgetConstructor = widgetClass.getConstructor(new Class[]{Environment.class, String.class});
Widget widget = (Widget) widgetConstructor.newInstance(env, widgetName); Widget widget = (Widget) widgetConstructor.newInstance(env, widgetName);
Method method = widgetClass.getMethod(methodName); 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 output = (String) method.invoke(widget);
String templateType = env.getDataModel().get("templateType").toString(); 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. // doesn't need to be called explicitly.
if ("doMarkup".equals(methodName) && FreemarkerHttpServlet.BODY_TEMPLATE_TYPE.equals(templateType)) { if ("doMarkup".equals(methodName) && FreemarkerHttpServlet.BODY_TEMPLATE_TYPE.equals(templateType)) {
output += widgetClass.getMethod("doAssets").invoke(widget); 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.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues;
import freemarker.core.Environment; import freemarker.core.Environment;
public class LoginWidget extends Widget { public class LoginWidget extends Widget {
@ -19,10 +20,10 @@ public class LoginWidget extends Widget {
} }
@Override @Override
protected Map<String, Object> getDataModel() { protected TemplateResponseValues getTemplateResponseValues() {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put("fruit", "bananas"); 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.HashMap;
import java.util.Map; import java.util.Map;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues;
import freemarker.core.Environment; import freemarker.core.Environment;
public class TestWidget extends Widget { public class TestWidget extends Widget {
@ -14,10 +15,10 @@ public class TestWidget extends Widget {
} }
@Override @Override
protected Map<String, Object> getDataModel() { protected TemplateResponseValues getTemplateResponseValues() {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put("fruit", "bananas"); 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.Log;
import org.apache.commons.logging.LogFactory; 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 edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper;
import freemarker.cache.TemplateLoader; import freemarker.cache.TemplateLoader;
import freemarker.core.Environment; import freemarker.core.Environment;
@ -47,8 +48,8 @@ public abstract class Widget {
} }
public String doAssets() { public String doAssets() {
String templateName = "widget-" + name + "-assets.ftl"; String templateName = assetsTemplateName();
// Allow the assets template to be absent without generating an error. // Allow the assets template to be absent without generating an error.
TemplateLoader templateLoader = env.getConfiguration().getTemplateLoader(); TemplateLoader templateLoader = env.getConfiguration().getTemplateLoader();
try { try {
@ -59,8 +60,8 @@ public abstract class Widget {
log.error("Error finding template source", e); 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 { try {
map.put("stylesheets", dataModel.get("stylesheets")); map.put("stylesheets", dataModel.get("stylesheets"));
@ -70,19 +71,29 @@ public abstract class Widget {
log.error("Error getting asset values from data model."); 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() { public String doMarkup() {
String templateName = "widget-" + name + "-markup.ftl"; TemplateResponseValues values = getTemplateResponseValues();
Map<String, Object> map = getDataModel(); return helper.processTemplateToString(values);
return helper.processTemplateToString(templateName, map);
} }
// 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.