diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java index c6bc10185..db5672af9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java @@ -5,6 +5,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -319,4 +320,54 @@ public class FreemarkerConfiguration extends Configuration { } } + // ---------------------------------------------------------------------- + // Request info and overrides + // ---------------------------------------------------------------------- + + private ThreadLocal reqInfo = new ThreadLocal<>(); + + void setRequestInfo(HttpServletRequest req) { + reqInfo.set(new FreemarkerRequestInfo(req)); + } + + @Override + public Object getCustomAttribute(String name) { + if ("request".equals(name)) { + return reqInfo.get().getRequest(); + } else { + return super.getCustomAttribute(name); + } + } + + @Override + public String[] getCustomAttributeNames() { + String[] nameArray = super.getCustomAttributeNames(); + Set nameSet = new HashSet(Arrays.asList(nameArray)); + nameSet.add("request"); + return nameSet.toArray(new String[nameSet.size()]); + } + + @Override + public Locale getLocale() { + return reqInfo.get().getLocale(); + } + + + + public static class FreemarkerRequestInfo { + private final HttpServletRequest req; + + public FreemarkerRequestInfo(HttpServletRequest req) { + this.req = req; + } + + public HttpServletRequest getRequest() { + return req; + } + + public Locale getLocale() { + return req.getLocale(); + } + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java index b4e206181..340686d19 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java @@ -21,7 +21,9 @@ public class FreemarkerConfigurationLoader { public static FreemarkerConfiguration getConfig(VitroRequest vreq) { String themeDir = getThemeDir(vreq.getAppBean()); - return getConfigForTheme(themeDir, vreq.getAppBean(), vreq.getSession().getServletContext()); + FreemarkerConfiguration config = getConfigForTheme(themeDir, vreq.getAppBean(), vreq.getSession().getServletContext()); + config.setRequestInfo(vreq); + return config; } private static String getThemeDir(ApplicationBean appBean) { 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 c1fd229f3..52fb2f343 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 @@ -46,14 +46,6 @@ public class TemplateProcessingHelper { try { Environment env = template.createProcessingEnvironment(map, writer); - // Add request and servlet context as custom attributes of the environment, so they - // can be used in directives. - env.setCustomAttribute("request", request); - env.setCustomAttribute("context", context); - - // Set the Locale from the request into the environment, so date builtins will be - // Locale-dependent - env.setLocale(request.getLocale()); // Define a setup template to be included by every page template String templateType = (String) map.get("templateType"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java index 0dd14a2f3..1b3cd9a53 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java @@ -30,8 +30,6 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfiguration; import edu.cornell.mannlib.vitro.webapp.web.directives.EmailDirective; -import freemarker.core.Environment; -import freemarker.template.Template; import freemarker.template.TemplateException; /** @@ -144,14 +142,8 @@ public class FreemarkerEmailMessage { bodyMap.put("email", new EmailDirective(this)); try { - Template template = config.getTemplate(templateName); - - Environment env = template.createProcessingEnvironment(bodyMap, + config.getTemplate(templateName).process(bodyMap, new StringWriter()); - env.setCustomAttribute("request", vreq); - env.setCustomAttribute("context", vreq.getSession() - .getServletContext()); - env.process(); } catch (TemplateException e) { log.error(e, e); } catch (IOException e) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java index dfcc0156b..fde6152b1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java @@ -84,8 +84,6 @@ public class FreemarkerProcessingServiceImpl implements // can be used in directives. Environment env = template.createProcessingEnvironment(map, writer); env.setCustomAttribute("request", req); - env.setCustomAttribute("context", req.getSession() - .getServletContext()); env.process(); return writer.toString(); } catch (TemplateException e) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/IndividualShortViewDirective.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/IndividualShortViewDirective.java index d12f5c0b7..fac33222c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/IndividualShortViewDirective.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/IndividualShortViewDirective.java @@ -77,10 +77,10 @@ public class IndividualShortViewDirective extends BaseTemplateDirectiveModel { private void renderShortView(Individual individual, ShortViewContext svContext) { Environment env = Environment.getCurrentEnvironment(); + HttpServletRequest request = (HttpServletRequest) env + .getCustomAttribute("request"); + ServletContext ctx = request.getSession().getServletContext(); - ServletContext ctx = (ServletContext) env.getCustomAttribute("context"); - VitroRequest vreq = new VitroRequest( - (HttpServletRequest) env.getCustomAttribute("request")); ShortViewService svs = ShortViewServiceSetup.getService(ctx); if (svs == null) { log.warn("ShortViewService was not initialized properly."); @@ -88,7 +88,7 @@ public class IndividualShortViewDirective extends BaseTemplateDirectiveModel { } TemplateAndSupplementalData svInfo = svs.getShortViewInfo(individual, - svContext, vreq); + svContext, new VitroRequest(request)); ObjectWrapper objectWrapper = env.getConfiguration().getObjectWrapper(); 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 e7e2741d5..9f82c1910 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 @@ -10,7 +10,6 @@ import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; -import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; @@ -57,7 +56,7 @@ public abstract class Widget { public String doMarkup(Environment env, Map params) { HttpServletRequest request = (HttpServletRequest) env.getCustomAttribute("request"); - ServletContext context = (ServletContext) env.getCustomAttribute("context"); + ServletContext context = request.getSession().getServletContext(); WidgetTemplateValues values = null; @@ -120,15 +119,7 @@ public abstract class Widget { // We need to give each widget macro template a unique key in the StringTemplateLoader, and check // if it's already there or else add it. Leave this for later. Template template = new Template("widget", new StringReader(templateString), env.getConfiguration()); - - // JB KLUGE The widget is processed in its own environment, which doesn't include these custom attributes. - // JB KLUGE Put them in. - Environment widgetEnv = template.createProcessingEnvironment(map, out); - ServletRequest request = (ServletRequest) env.getCustomAttribute("request"); - widgetEnv.setCustomAttribute("request", request); - widgetEnv.setCustomAttribute("context", env.getCustomAttribute("context")); - widgetEnv.setLocale(request.getLocale()); - widgetEnv.process(); + template.process(map, out); } catch (Exception e) { log.error("Could not process widget " + widgetName, e); }