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 String templateName;
|
||||||
private final Map<String, Object> map;
|
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.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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
Loading…
Add table
Reference in a new issue