From 70fe8573296d740b670934fac0d1355386cef922 Mon Sep 17 00:00:00 2001
From: rjy7
Date: Tue, 23 Nov 2010 16:10:05 +0000
Subject: [PATCH] NIHVIVO-1394 As a necessary first step to calling a template
from a controller which will add to the data model used by page and body
templates, provide BaseTemplateModelDirective with its own template
processing methods, to separate from TemplateProcessingHelper, which will
only be available to FreemarkerHttpServlet.
---
.../freemarker/FreemarkerHttpServlet.java | 18 ++++++---
.../freemarker/TemplateProcessingHelper.java | 18 +++++----
.../BaseTemplateDirectiveModel.java | 40 ++++++++++++++-----
.../web/directives/dump/DumpHelper.java | 15 +++----
.../body/partials/dump/help-directive.ftl | 5 ++-
webapp/web/templates/freemarker/body/test.ftl | 5 +++
6 files changed, 66 insertions(+), 35 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 5ef15d567..861bc718f 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
@@ -57,7 +57,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
TITLED_ERROR_MESSAGE("error-titled.ftl"),
MESSAGE("message.ftl"),
TITLED_MESSAGE("message-titled.ftl"),
- PAGE_DEFAULT("page.ftl");
+ PAGE_DEFAULT("page.ftl"),
+ SETUP("setup.ftl");
private final String filename;
@@ -162,19 +163,21 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
Configuration config = getConfig(vreq);
Map bodyMap = values.getMap();
+ TemplateProcessingHelper helper = new TemplateProcessingHelper(config, vreq, getServletContext());
// We can't use shared variables in the Freemarker configuration to store anything
// except theme-specific data, because multiple portals or apps might share the same theme. So instead
// just put the shared variables in both root and body.
Map sharedVariables = getSharedVariables(vreq, bodyMap);
-
+
+ //helper.processSetupTemplate(config, vreq, sharedVariables);
+
// root is the map used to create the page shell - header, footer, menus, etc.
- Map root = new HashMap(sharedVariables);
-
+ Map root = new HashMap(sharedVariables);
root.putAll(getPageTemplateValues(vreq));
// Tell the template and any directives it uses that we're processing a page template.
root.put("templateType", PAGE_TEMPLATE_TYPE);
-
+
// Add the values that we got, and merge to the template.
String bodyTemplate = values.getTemplateName();
String bodyString;
@@ -198,6 +201,11 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
writePage(root, config, vreq, response);
}
+ private void processSetupTemplate(Configuration config, HttpServletRequest request, Map map) {
+ TemplateProcessingHelper helper = new TemplateProcessingHelper(config, request, getServletContext());
+ helper.processTemplate(Template.SETUP.toString(), map);
+ }
+
protected void doRedirect(HttpServletRequest request, HttpServletResponse response, ResponseValues values)
throws ServletException, IOException {
String redirectUrl = values.getRedirectUrl();
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 9d5b2590b..a3366e487 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
@@ -26,28 +26,30 @@ public class TemplateProcessingHelper {
private Configuration config = null;
private HttpServletRequest request = null;
private ServletContext context = null;
+ //private Map templateDataModel = null;
- public TemplateProcessingHelper(Configuration config, HttpServletRequest request, ServletContext context) {
+ TemplateProcessingHelper(Configuration config, HttpServletRequest request, ServletContext context) {
this.config = config;
this.request = request;
this.context = context;
+ //this.templateDataModel = new HashMap();
}
-
- public StringWriter processTemplate(String templateName, Map map) {
+
+ protected 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) {
+ protected StringWriter processTemplate(ResponseValues values) {
if (values == null) {
return null;
}
return processTemplate(values.getTemplateName(), values.getMap());
}
- public void processTemplate(Template template, Map map, Writer writer) {
+ private void processTemplate(Template template, Map map, Writer writer) {
try {
Environment env = template.createProcessingEnvironment(map, writer);
@@ -64,15 +66,15 @@ public class TemplateProcessingHelper {
}
// In fact, we can put StringWriter objects directly into the data model, so perhaps we should eliminate the processTemplateToString() methods.
- public String processTemplateToString(String templateName, Map map) {
+ protected String processTemplateToString(String templateName, Map map) {
return processTemplate(templateName, map).toString();
}
- public String processTemplateToString(ResponseValues values) {
+ protected String processTemplateToString(ResponseValues values) {
return processTemplate(values).toString();
}
- public Template getTemplate(String templateName) {
+ private Template getTemplate(String templateName) {
Template template = null;
try {
template = config.getTemplate(templateName);
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 4c472f69a..263b8dd75 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
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.web.directives;
+import java.io.IOException;
+import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
@@ -14,7 +16,9 @@ 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.Template;
import freemarker.template.TemplateDirectiveModel;
+import freemarker.template.TemplateException;
public abstract class BaseTemplateDirectiveModel implements TemplateDirectiveModel {
@@ -38,18 +42,32 @@ public abstract class BaseTemplateDirectiveModel implements TemplateDirectiveMod
return directiveName;
}
- protected String mergeToHelpTemplate(Map map, Environment environment) {
- TemplateProcessingHelper helper = getFreemarkerHelper(environment);
- return helper.processTemplateToString("help-directive.ftl", map);
+ protected String mergeToHelpTemplate(Map map, Environment env) {
+ return processTemplateToString("help-directive.ftl", map, 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 TemplateProcessingHelper(config, request, context);
+ public static String processTemplateToString(String templateName, Map map, Environment env) {
+ Template template = getTemplate(templateName, env);
+ StringWriter sw = new StringWriter();
+ try {
+ template.process(map, sw);
+ } catch (TemplateException e) {
+ log.error("Template Exception creating processing environment", e);
+ } catch (IOException e) {
+ log.error("IOException creating processing environment", e);
+ }
+ return sw.toString();
}
-
+
+ private static Template getTemplate(String templateName, Environment env) {
+ Template template = null;
+ try {
+ template = env.getConfiguration().getTemplate(templateName);
+ } catch (IOException e) {
+ // RY Should probably throw this error instead.
+ log.error("Cannot get template " + templateName, e);
+ }
+ return template;
+ }
+
}
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 24525f83c..74e9e222d 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
@@ -27,20 +27,19 @@ public class DumpHelper {
private static final Log log = LogFactory.getLog(DumpHelper.class);
- private Environment environment = null;
+ private Environment env = null;
public DumpHelper(Environment env) {
- environment = env;
+ this.env = env;
}
public String getVariableDump(String varName) {
Map map = getVariableDumpData(varName);
- TemplateProcessingHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment);
- return helper.processTemplateToString("dump-var.ftl", map);
+ return BaseTemplateDirectiveModel.processTemplateToString("dump-var.ftl", map, env);
}
public Map getVariableDumpData(String varName) {
- TemplateHashModel dataModel = environment.getDataModel();
+ TemplateHashModel dataModel = env.getDataModel();
TemplateModel tm = null;
try {
@@ -115,10 +114,8 @@ public class DumpHelper {
}
public void writeDump(String templateName, Map map, String modelName) {
-
- TemplateProcessingHelper helper = BaseTemplateDirectiveModel.getFreemarkerHelper(environment);
- String output = helper.processTemplateToString(templateName, map);
- Writer out = environment.getOut();
+ String output = BaseTemplateDirectiveModel.processTemplateToString(templateName, map, env);
+ Writer out = env.getOut();
try {
out.write(output);
} catch (IOException e) {
diff --git a/webapp/web/templates/freemarker/body/partials/dump/help-directive.ftl b/webapp/web/templates/freemarker/body/partials/dump/help-directive.ftl
index 65fb7dd00..e54c1c081 100644
--- a/webapp/web/templates/freemarker/body/partials/dump/help-directive.ftl
+++ b/webapp/web/templates/freemarker/body/partials/dump/help-directive.ftl
@@ -12,15 +12,16 @@
Comments: ${comments}
#if>
- Parameters:
+ Parameters:
<#if params?? && params?keys?has_content>
+
<#list params?keys as param>
- ${param}: ${params[param]}
#list>
<#else>
- none
+ none
#if>
diff --git a/webapp/web/templates/freemarker/body/test.ftl b/webapp/web/templates/freemarker/body/test.ftl
index 42e773781..83f9eb889 100644
--- a/webapp/web/templates/freemarker/body/test.ftl
+++ b/webapp/web/templates/freemarker/body/test.ftl
@@ -7,3 +7,8 @@
<@widget name="test" />
${stylesheets.add("/css/testfrombody.css")}
+${scripts.add("/js/jstest.js")}
+
+${bodyClass}
+
+<@list.firstLastList>- apples
- bananas
@list.firstLastList>