From 8dc645cfb6f72fa3ea053e718a55aef9c120fe81 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Wed, 10 Nov 2010 19:50:28 +0000 Subject: [PATCH] NIHVIVO-1304 Initial implementation of Widget directive. Requires two templates, one for assets and one for markup; would like to combine into a single template with two macros instead. --- webapp/config/web.xml | 11 +- .../freemarker/FreemarkerHttpServlet.java | 11 +- .../freemarker/SamplesController.java | 105 ++++++++++++++++++ ...per.java => TemplateProcessingHelper.java} | 8 +- .../controller/freemarker/TestController.java | 62 +---------- .../BaseTemplateDirectiveModel.java | 8 +- .../web/directives/WidgetDirective.java | 98 ++++++++++++++++ .../web/directives/dump/DumpHelper.java | 6 +- .../widgets/BaseWidgetDirective.java | 49 -------- .../vitro/webapp/web/widgets/LoginWidget.java | 28 +++++ .../vitro/webapp/web/widgets/TestWidget.java | 23 ++++ .../vitro/webapp/web/widgets/Widget.java | 73 ++++++++++++ .../freemarker/body/partials/dump/dump.ftl | 2 +- .../web/templates/freemarker/body/samples.ftl | 69 ++++++++++++ webapp/web/templates/freemarker/body/test.ftl | 62 +---------- .../widgets/test/widget-test-assets.ftl | 5 + .../widgets/test/widget-test-markup.ftl | 5 + .../freemarker/widgets/widget-login.ftl | 2 +- 18 files changed, 440 insertions(+), 187 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SamplesController.java rename webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/{FreemarkerHelper.java => TemplateProcessingHelper.java} (89%) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/WidgetDirective.java delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/widgets/BaseWidgetDirective.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/LoginWidget.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/TestWidget.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/Widget.java create mode 100644 webapp/web/templates/freemarker/body/samples.ftl create mode 100644 webapp/web/templates/freemarker/widgets/test/widget-test-assets.ftl create mode 100644 webapp/web/templates/freemarker/widgets/test/widget-test-markup.ftl diff --git a/webapp/config/web.xml b/webapp/config/web.xml index e7fca4777..b70191043 100644 --- a/webapp/config/web.xml +++ b/webapp/config/web.xml @@ -354,7 +354,16 @@ FreemarkerTestController /freemarkertest - + + + FreemarkerSamplesController + edu.cornell.mannlib.vitro.webapp.controller.freemarker.SamplesController + + + FreemarkerSamplesController + /freemarkersamples + + FakeSelfEditController edu.cornell.mannlib.vitro.webapp.controller.FakeSelfEditController 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 0d11449f1..b9de38980 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 @@ -46,6 +46,9 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(FreemarkerHttpServlet.class); private static final int FILTER_SECURITY_LEVEL = LoginStatusBean.EDITOR; + + public static final String PAGE_TEMPLATE_TYPE = "page"; + public static final String BODY_TEMPLATE_TYPE = "body"; protected enum Template { STANDARD_ERROR("error-standard.ftl"), @@ -159,7 +162,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { root.putAll(getPageTemplateValues(vreq)); // Tell the template and any directives it uses that we're processing a page template. - root.put("templateType", "page"); + root.put("templateType", PAGE_TEMPLATE_TYPE); // Add the values that we got, and merge to the template. String bodyTemplate = values.getTemplateName(); @@ -172,7 +175,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { Map body = new HashMap(sharedVariables); body.putAll(bodyMap); // Tell the template and any directives it uses that we're processing a body template. - body.put("templateType", "body"); + body.put("templateType", BODY_TEMPLATE_TYPE); bodyString = processTemplateToString(bodyTemplate, body, config, vreq); } else { // The subcontroller has not defined a body template. All markup for the page @@ -343,7 +346,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { map.put("dumpAll", new edu.cornell.mannlib.vitro.webapp.web.directives.dump.DumpAllDirective()); map.put("help", new edu.cornell.mannlib.vitro.webapp.web.directives.dump.HelpDirective()); //map.put("url", new edu.cornell.mannlib.vitro.webapp.web.directives.UrlDirective()); - map.put("widget", new edu.cornell.mannlib.vitro.webapp.web.directives.widgets.BaseWidgetDirective()); + map.put("widget", new edu.cornell.mannlib.vitro.webapp.web.directives.WidgetDirective()); return map; } @@ -438,7 +441,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { protected StringWriter processTemplate(String templateName, Map map, Configuration config, HttpServletRequest request) { - FreemarkerHelper helper = new FreemarkerHelper(config, request, getServletContext()); + TemplateProcessingHelper helper = new TemplateProcessingHelper(config, request, getServletContext()); return helper.processTemplate(templateName, map); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SamplesController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SamplesController.java new file mode 100644 index 000000000..2e60dfaf5 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SamplesController.java @@ -0,0 +1,105 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.controller.freemarker; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.beans.Portal; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues; +import freemarker.template.Configuration; + +/** + * Freemarker controller and template samples. + * @author rjy7 + * + */ +public class SamplesController extends FreemarkerHttpServlet { + + private static final long serialVersionUID = 1L; + private static final Log log = LogFactory.getLog(SamplesController.class); + private static final String TEMPLATE_DEFAULT = "samples.ftl"; + + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + Portal portal = vreq.getPortal(); + + Map body = new HashMap(); + // Test of #list directive in template on undefined, null, and empty values. + // Basic idea: empty list okay, null or undefined value not okay. + List apples = new ArrayList(); // no error + // List apples = null; // error + body.put("apples", apples); // without this: error + + Calendar cal = Calendar.getInstance(); + Date now = cal.getTime(); + body.put("now", now); + // In template: ${now?date}, ${now?datetime}, ${now?time} + + // You can add to a collection AFTER putting it in the template data model. + // The data model contains a reference to the collection, not a copy. + List fruit = new ArrayList(); + fruit.add("apples"); + fruit.add("bananas"); + body.put("fruit", fruit); + fruit.add("oranges"); + + // But you cannot modify a scalar after putting it in the data model - the + // template still gets the old value + String animal = "elephant"; + body.put("animal", animal); + animal = "camel"; + + // Because the data model contains a reference to the collection, changing + // one also changes the other. + List animals = new ArrayList(); + animals.add("elephant"); + animals.add("tiger"); + Map zoo1 = new HashMap(); + Map zoo2 = new HashMap(); + zoo1.put("animals", animals); + zoo2.put("animals", animals); + zoo1.get("animals").add("monkey"); + body.put("zoo1", zoo1); + body.put("zoo2", zoo2); + + // Test recursive dump - array of arrays +// String[] fruitArray = { "apples", "bananas", "strawberries" }; +// String[] animalArray = { "cat", "dog", "mouse" }; +// String[] dayArray = { "Monday", "Tuesday", "Wednesday" }; +// String[][] arrays = { fruitArray, animalArray, dayArray }; +// body.put("arrays", arrays); + + body.put("trueStatement", true); + body.put("falseStatement", false); + + getBerries(body); + + body.put("bookTitle", "Pride and Prejudice"); + body.put("bookTitle", "Persuasion"); + + body.put("title", "Freemarker Samples"); + + return new TemplateResponseValues(TEMPLATE_DEFAULT, body); + } + + @Override + protected String getTitle(String siteName) { + return "Freemarker Samples"; + } + + private void getBerries(Map body) { + body.put("berries", "strawberries, raspberries, blueberries"); + } + +} + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java similarity index 89% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHelper.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java index cd2db6121..c0549c2bb 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java @@ -18,15 +18,15 @@ import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; -public class FreemarkerHelper { +public class TemplateProcessingHelper { - private static final Log log = LogFactory.getLog(FreemarkerHelper.class); + private static final Log log = LogFactory.getLog(TemplateProcessingHelper.class); private Configuration config = null; private HttpServletRequest request = null; private ServletContext context = null; - public FreemarkerHelper(Configuration config, HttpServletRequest request, ServletContext context) { + public TemplateProcessingHelper(Configuration config, HttpServletRequest request, ServletContext context) { this.config = config; this.request = request; this.context = context; @@ -65,7 +65,7 @@ public class FreemarkerHelper { // return processTemplate(templateName, map).toString(); // } - private Template getTemplate(String templateName) { + public Template getTemplate(String templateName) { Template template = null; try { template = config.getTemplate(templateName); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java index 62ce3bdac..22c3a01c8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java @@ -19,7 +19,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServ import freemarker.template.Configuration; /** - * A place for storing test cases. + * Freemarker controller and template sandbox. * @author rjy7 * */ @@ -31,63 +31,11 @@ public class TestController extends FreemarkerHttpServlet { @Override protected ResponseValues processRequest(VitroRequest vreq) { - Portal portal = vreq.getPortal(); + //Portal portal = vreq.getPortal(); Map body = new HashMap(); - // Test of #list directive in template on undefined, null, and empty values. - // Basic idea: empty list okay, null or undefined value not okay. - List apples = new ArrayList(); // no error - // List apples = null; // error - body.put("apples", apples); // without this: error - Calendar cal = Calendar.getInstance(); - Date now = cal.getTime(); - body.put("now", now); - // In template: ${now?date}, ${now?datetime}, ${now?time} - - // You can add to a collection AFTER putting it in the template data model. - // The data model contains a reference to the collection, not a copy. - List fruit = new ArrayList(); - fruit.add("apples"); - fruit.add("bananas"); - body.put("fruit", fruit); - fruit.add("oranges"); - - // But you cannot modify a scalar after putting it in the data model - the - // template still gets the old value - String animal = "elephant"; - body.put("animal", animal); - animal = "camel"; - - // Because the data model contains a reference to the collection, changing - // one also changes the other. - List animals = new ArrayList(); - animals.add("elephant"); - animals.add("tiger"); - Map zoo1 = new HashMap(); - Map zoo2 = new HashMap(); - zoo1.put("animals", animals); - zoo2.put("animals", animals); - zoo1.get("animals").add("monkey"); - body.put("zoo1", zoo1); - body.put("zoo2", zoo2); - - // Test recursive dump - array of arrays -// String[] fruitArray = { "apples", "bananas", "strawberries" }; -// String[] animalArray = { "cat", "dog", "mouse" }; -// String[] dayArray = { "Monday", "Tuesday", "Wednesday" }; -// String[][] arrays = { fruitArray, animalArray, dayArray }; -// body.put("arrays", arrays); - - body.put("trueStatement", true); - body.put("falseStatement", false); - - getBerries(body); - - body.put("bookTitle", "Pride and Prejudice"); - body.put("bookTitle", "Persuasion"); - - body.put("title", "VIVO Test"); + body.put("title", "Freemarker Test"); return new TemplateResponseValues(TEMPLATE_DEFAULT, body); } @@ -97,9 +45,5 @@ public class TestController extends FreemarkerHttpServlet { return "Test"; } - private void getBerries(Map body) { - body.put("berries", "strawberries, raspberries, blueberries"); - } - } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/BaseTemplateDirectiveModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/BaseTemplateDirectiveModel.java index 25f601820..4c472f69a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/BaseTemplateDirectiveModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/BaseTemplateDirectiveModel.java @@ -11,7 +11,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.FreemarkerHelper; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper; import freemarker.core.Environment; import freemarker.template.Configuration; import freemarker.template.TemplateDirectiveModel; @@ -39,17 +39,17 @@ public abstract class BaseTemplateDirectiveModel implements TemplateDirectiveMod } protected String mergeToHelpTemplate(Map map, Environment environment) { - FreemarkerHelper helper = getFreemarkerHelper(environment); + TemplateProcessingHelper helper = getFreemarkerHelper(environment); return helper.processTemplateToString("help-directive.ftl", map); } - public static FreemarkerHelper getFreemarkerHelper(Environment env) { + public static TemplateProcessingHelper getFreemarkerHelper(Environment env) { Configuration config = env.getConfiguration(); // In a directive, custom attributes for request and context are available in the Environment. // They are put there when the enclosing template is processed. HttpServletRequest request = (HttpServletRequest) env.getCustomAttribute("request"); ServletContext context = (ServletContext) env.getCustomAttribute("context"); - return new FreemarkerHelper(config, request, context); + return new TemplateProcessingHelper(config, request, context); } } 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 new file mode 100644 index 000000000..4a91f6a70 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/WidgetDirective.java @@ -0,0 +1,98 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.directives; + +import java.io.IOException; +import java.io.Writer; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +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; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper; +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 { + + private static final Log log = LogFactory.getLog(WidgetDirective.class); + private static final String WIDGET_PACKAGE = "edu.cornell.mannlib.vitro.webapp.web.widgets"; + + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, + TemplateDirectiveBody body) throws TemplateException, IOException { + + if (loopVars.length != 0) { + throw new TemplateModelException( + "The dump directive doesn't allow loop variables."); + } + if (body != null) { + throw new TemplateModelException( + "The dump directive doesn't allow nested content."); + } + + Object nameParam = params.get("name"); + if ( !(nameParam instanceof SimpleScalar)) { + throw new TemplateModelException( + "Value of parameter 'name' must be a string."); + } + String widgetName = nameParam.toString(); + + // Optional param + Object includeParam = params.get("include"); + String methodName; + // If include param is missing, or something other than "assets", + // assign default value "markup" + if (includeParam == null) { + methodName = "markup"; + } else { + methodName = includeParam.toString(); + if ( ! ("assets".equals(methodName)) ) { + methodName = "markup"; + } + } + methodName = "do" + StringUtils.capitalize(methodName); + + try { + String widgetClassName = WIDGET_PACKAGE + "." + StringUtils.capitalize(widgetName) + "Widget"; + Class widgetClass = Class.forName(widgetClassName); + // Use Constructor.newInstance() rather than Class.newInstance() so we can pass arguments + // to the constructor. + // Widget widget = (Widget) widgetClass.newInstance(); + Constructor widgetConstructor = widgetClass.getConstructor(new Class[]{Environment.class, String.class}); + Widget widget = (Widget) widgetConstructor.newInstance(env, widgetName); + Method method = widgetClass.getMethod(methodName); + 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 + // doesn't need to be called explicitly. + if ("doMarkup".equals(methodName) && FreemarkerHttpServlet.BODY_TEMPLATE_TYPE.equals(templateType)) { + output += widgetClass.getMethod("doAssets").invoke(widget); + } + + Writer out = env.getOut(); + out.write(output); + + } catch (ClassNotFoundException e) { + log.error("Widget " + widgetName + " not found."); + } catch (IOException e) { + log.error("Error writing output for widget " + widgetName, e); + } catch (Exception e) { + log.error("Error invoking widget " + widgetName, e); + } + + } + + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java index e2aaadbb1..0cc856092 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java @@ -10,7 +10,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.FreemarkerHelper; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper; import edu.cornell.mannlib.vitro.webapp.web.directives.BaseTemplateDirectiveModel; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; import freemarker.core.Environment; @@ -36,7 +36,7 @@ public class DumpHelper { public String getVariableDump(String varName) { Map map = getVariableDumpData(varName); - FreemarkerHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment); + TemplateProcessingHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment); return helper.processTemplateToString("dump-var.ftl", map); } @@ -106,7 +106,7 @@ public class DumpHelper { public void writeDump(String templateName, Map map, String modelName) { - FreemarkerHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment); + TemplateProcessingHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment); String output = helper.processTemplateToString(templateName, map); Writer out = environment.getOut(); try { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/widgets/BaseWidgetDirective.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/widgets/BaseWidgetDirective.java deleted file mode 100644 index 9a6a5ead4..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/widgets/BaseWidgetDirective.java +++ /dev/null @@ -1,49 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.web.directives.widgets; - -import java.io.IOException; -import java.util.Map; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import edu.cornell.mannlib.vitro.webapp.web.directives.BaseTemplateDirectiveModel; -import freemarker.core.Environment; -import freemarker.ext.servlet.AllHttpScopesHashModel; -import freemarker.template.SimpleScalar; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; - -public class BaseWidgetDirective extends BaseTemplateDirectiveModel { - - private static final Log log = LogFactory.getLog(BaseWidgetDirective.class); - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - - if (loopVars.length != 0) { - throw new TemplateModelException( - "The dump directive doesn't allow loop variables."); - } - if (body != null) { - throw new TemplateModelException( - "The dump directive doesn't allow nested content."); - } - - Object o = params.get("name"); - if ( !(o instanceof SimpleScalar)) { - throw new TemplateModelException( - "Value of parameter 'name' must be a string."); - } - - AllHttpScopesHashModel dataModel = (AllHttpScopesHashModel)(env.getDataModel()); - - System.out.println("In widget " + o.toString()); - - } - -} 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 new file mode 100644 index 000000000..c3dc5b190 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/LoginWidget.java @@ -0,0 +1,28 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.widgets; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import freemarker.core.Environment; + +public class LoginWidget extends Widget { + + private static final Log log = LogFactory.getLog(LoginWidget.class); + + public LoginWidget(Environment env, String name) { + super(env, name); + } + + @Override + protected Map getDataModel() { + Map map = new HashMap(); + map.put("fruit", "bananas"); + return 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 new file mode 100644 index 000000000..018c4a699 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/TestWidget.java @@ -0,0 +1,23 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.widgets; + +import java.util.HashMap; +import java.util.Map; + +import freemarker.core.Environment; + +public class TestWidget extends Widget { + + public TestWidget(Environment env, String name) { + super(env, name); + } + + @Override + protected Map getDataModel() { + Map map = new HashMap(); + map.put("fruit", "bananas"); + return 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 new file mode 100644 index 000000000..e64c8121c --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/Widget.java @@ -0,0 +1,73 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.widgets; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletContext; +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.TemplateProcessingHelper; +import freemarker.core.Environment; +import freemarker.template.Configuration; +import freemarker.template.TemplateHashModel; +import freemarker.template.TemplateModelException; + +public abstract class Widget { + + private static final Log log = LogFactory.getLog(Widget.class); + + protected Environment env = null; + private TemplateProcessingHelper helper = null; + private String name = null; + +// protected TemplateDirectiveModel directive = null; +// protected Macro markupMacro = null; +// protected Macro assetsMacro = null; + + public Widget(Environment env, String name) { + this.env = env; + this.name = name; + Configuration config = env.getConfiguration(); + HttpServletRequest request = (HttpServletRequest) env.getCustomAttribute("request"); + ServletContext context = (ServletContext) env.getCustomAttribute("context"); + this.helper = new TemplateProcessingHelper(config, request, context); + + //this.directive = directive; + //Template template = getTemplate(); + //Map templateMacros = template.getMacros(); + //markupMacro = (Macro) templateMacros.get("markup"); + //assetsMacro = (Macro) templateMacros.get("assets"); + } + + public String doAssets() { + String templateName = "widget-" + name + "-assets.ftl"; + Map map = new HashMap(); + TemplateHashModel dataModel = env.getDataModel(); + try { + map.put("stylesheets", dataModel.get("stylesheets")); + map.put("scripts", dataModel.get("scripts")); + map.put("headScripts", dataModel.get("headScripts")); + } catch (TemplateModelException e) { + log.error("Error getting asset values from data model."); + } + return helper.processTemplateToString(templateName, map); + } + + public String doMarkup() { + String templateName = "widget-" + name + "-markup.ftl"; + Map map = getDataModel(); + return helper.processTemplateToString(templateName, map); + } + + + + 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. +} diff --git a/webapp/web/templates/freemarker/body/partials/dump/dump.ftl b/webapp/web/templates/freemarker/body/partials/dump/dump.ftl index 4cdbf4c4a..a65e09141 100644 --- a/webapp/web/templates/freemarker/body/partials/dump/dump.ftl +++ b/webapp/web/templates/freemarker/body/partials/dump/dump.ftl @@ -8,4 +8,4 @@ ${var} -${stylesheets.add("/css/dump.css")} \ No newline at end of file +${stylesheets.add("/css/dump.css")} diff --git a/webapp/web/templates/freemarker/body/samples.ftl b/webapp/web/templates/freemarker/body/samples.ftl new file mode 100644 index 000000000..f44dfddc5 --- /dev/null +++ b/webapp/web/templates/freemarker/body/samples.ftl @@ -0,0 +1,69 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- FreeMarker samples --> + +

${title}

+ +

Dates

+
    +
  • ${now?datetime}
  • +
  • ${now?date}
  • +
  • ${now?time}
  • +
+ +

Apples

+
    +<#list apples as apple> +
  • ${apple}
  • + +
+ +

Fruit

+
    +<#list fruit as f> +
  • ${f}
  • + +
+ +

Animal: ${animal}

+ +

Book Title: ${bookTitle}

+ + +

Zoo 1

+
    +<#list zoo1.animals as animal> +
  • ${animal}
  • + +
+ +

Zoo 2

+
    +<#list zoo2.animals as animal> +
  • ${animal}
  • + +
+ +

Berries: ${berries}

+ +<@dump var="now" /> +<@dump var="urls" /> +<@dump var="fruit" /> +<@dump var="trueStatement" /> +<@dump var="zoo1" /> + +${stylesheets.addFromTheme("/css/sstest.css", "/css/sstest2.css")} +${scripts.addFromTheme("/js/jstest.js")} +${scripts.add("/js/script1.js", "/js/script2.js", "/js/script3.js")} + + +<@dumpAll /> + +<@help directive="dump" /> + +<@describe var="stylesheets" /> + +<@describe var="scripts" /> + +<@describe var="headScripts" /> + diff --git a/webapp/web/templates/freemarker/body/test.ftl b/webapp/web/templates/freemarker/body/test.ftl index 78503e814..a46320a8c 100644 --- a/webapp/web/templates/freemarker/body/test.ftl +++ b/webapp/web/templates/freemarker/body/test.ftl @@ -4,66 +4,6 @@

${title}

-

Dates

-
    -
  • ${now?datetime}
  • -
  • ${now?date}
  • -
  • ${now?time}
  • -
- -

Apples

-
    -<#list apples as apple> -
  • ${apple}
  • - -
- -

Fruit

-
    -<#list fruit as f> -
  • ${f}
  • - -
- -

Animal: ${animal}

- -

Book Title: ${bookTitle}

+<@widget name="test" /> -

Zoo 1

-
    -<#list zoo1.animals as animal> -
  • ${animal}
  • - -
- -

Zoo 2

-
    -<#list zoo2.animals as animal> -
  • ${animal}
  • - -
- -

Berries: ${berries}

- -<@dump var="now" /> -<@dump var="urls" /> -<@dump var="fruit" /> -<@dump var="trueStatement" /> -<@dump var="zoo1" /> - -${stylesheets.addFromTheme("/css/sstest.css", "/css/sstest2.css")} -${scripts.addFromTheme("/js/jstest.js")} -${scripts.add("/js/script1.js", "/js/script2.js", "/js/script3.js")} - - -<@dumpAll /> - -<@help directive="dump" /> - -<@describe var="stylesheets" /> - -<@describe var="scripts" /> - -<@describe var="headScripts" /> - diff --git a/webapp/web/templates/freemarker/widgets/test/widget-test-assets.ftl b/webapp/web/templates/freemarker/widgets/test/widget-test-assets.ftl new file mode 100644 index 000000000..bfb83d06f --- /dev/null +++ b/webapp/web/templates/freemarker/widgets/test/widget-test-assets.ftl @@ -0,0 +1,5 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +${stylesheets.add("/css/test.css")} +${scripts.add("/js/testscript.js")} +${headScripts.add("/js/testheadscript.js")} \ No newline at end of file diff --git a/webapp/web/templates/freemarker/widgets/test/widget-test-markup.ftl b/webapp/web/templates/freemarker/widgets/test/widget-test-markup.ftl new file mode 100644 index 000000000..0bcfe10af --- /dev/null +++ b/webapp/web/templates/freemarker/widgets/test/widget-test-markup.ftl @@ -0,0 +1,5 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +

This is the test widget.

+ +

${fruit}

\ No newline at end of file diff --git a/webapp/web/templates/freemarker/widgets/widget-login.ftl b/webapp/web/templates/freemarker/widgets/widget-login.ftl index 8800261a5..67b73b55d 100644 --- a/webapp/web/templates/freemarker/widgets/widget-login.ftl +++ b/webapp/web/templates/freemarker/widgets/widget-login.ftl @@ -4,7 +4,7 @@ <#macro assets> <#if ! loginName??> - ${stylesheets.add("/css/login.css")} + ${stylesheets.add("/css/login.css")} <#-- define any js files needed for the login widget ${scripts.add("")} ${headScripts.add("")} -->