From 252763e3b109f14bdde49e024c63e5081c0459c8 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Thu, 11 Nov 2010 16:04:22 +0000 Subject: [PATCH] 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). --- .../freemarker/FreemarkerHttpServlet.java | 3 +- .../freemarker/TemplateProcessingHelper.java | 15 +++++--- .../web/directives/WidgetDirective.java | 10 +++--- .../vitro/webapp/web/widgets/LoginWidget.java | 5 +-- .../vitro/webapp/web/widgets/TestWidget.java | 5 +-- .../vitro/webapp/web/widgets/Widget.java | 35 ++++++++++++------- 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index b9de38980..34942ddc9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -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 map; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java index c0549c2bb..876968d66 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java @@ -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 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 map, Writer writer) { @@ -61,9 +68,9 @@ public class TemplateProcessingHelper { return processTemplate(templateName, map).toString(); } -// public String processTemplateToString(String templateName, Map map) { -// return processTemplate(templateName, map).toString(); -// } + public String processTemplateToString(ResponseValues values) { + return processTemplate(values).toString(); + } public Template getTemplate(String templateName) { Template template = null; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/WidgetDirective.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/WidgetDirective.java index 4a91f6a70..98891fd9f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/WidgetDirective.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/WidgetDirective.java @@ -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); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/LoginWidget.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/LoginWidget.java index c3dc5b190..d522c25a6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/LoginWidget.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/LoginWidget.java @@ -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 getDataModel() { + protected TemplateResponseValues getTemplateResponseValues() { Map map = new HashMap(); map.put("fruit", "bananas"); - return map; + return new TemplateResponseValues (markupTemplateName(), map); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/TestWidget.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/TestWidget.java index 018c4a699..4c5331c0b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/TestWidget.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/TestWidget.java @@ -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 getDataModel() { + protected TemplateResponseValues getTemplateResponseValues() { Map map = new HashMap(); map.put("fruit", "bananas"); - return map; + return new TemplateResponseValues (markupTemplateName(), map); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/Widget.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/Widget.java index 977667427..50991a030 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/Widget.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/Widget.java @@ -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 map = new HashMap(); - TemplateHashModel dataModel = env.getDataModel(); + TemplateHashModel dataModel = env.getDataModel(); + Map map = new HashMap(); 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 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 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. \ No newline at end of file