FREEMARKER-55: Adding test for Application attributes.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/8e8c724b Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/8e8c724b Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/8e8c724b Branch: refs/heads/3 Commit: 8e8c724b6f2ae003c67c4bc0c41fb026c0b9f6ad Parents: 36b0694 Author: Woonsan Ko <woon...@apache.org> Authored: Thu Jun 29 01:21:40 2017 -0400 Committer: Woonsan Ko <woon...@apache.org> Committed: Thu Jun 29 01:21:40 2017 -0400 ---------------------------------------------------------------------- .../spring/web/view/FreemarkerView.java | 93 +++++++++++++++++++- .../spring/web/view/FreemarkerViewTest.java | 10 +-- 2 files changed, 95 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8e8c724b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerView.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerView.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerView.java index 21b2a60..934a458 100644 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerView.java +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerView.java @@ -18,8 +18,17 @@ */ package org.apache.freemarker.spring.web.view; +import java.io.IOException; +import java.util.Collections; +import java.util.Enumeration; import java.util.Map; +import javax.servlet.GenericServlet; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -35,12 +44,40 @@ import org.apache.freemarker.servlet.jsp.TaglibFactory; public class FreemarkerView extends AbstractFreemarkerView { + private PageContextServletConfig pageContextServletConfig; + + private PageContextServlet pageContextServlet; + private ServletContextHashModel servletContextModel; private TaglibFactory taglibFactory; + public PageContextServlet getPageContextServlet() { + // TODO: proper locking... + if (pageContextServlet == null) { + pageContextServlet = new PageContextServlet(); + pageContextServletConfig = new PageContextServletConfig(getServletContext(), getBeanName()); + + try { + pageContextServlet.init(pageContextServletConfig); + } catch (ServletException e) { + // never happen + } + } + + return pageContextServlet; + } + + public void setPageContextServlet(PageContextServlet pageContextServlet) { + this.pageContextServlet = pageContextServlet; + } + public ServletContextHashModel getServletContextModel() { - // TODO + // TODO: proper locking... + if (servletContextModel == null) { + servletContextModel = new ServletContextHashModel(getPageContextServlet(), getObjectWrapperForModel()); + } + return servletContextModel; } @@ -62,8 +99,10 @@ public class FreemarkerView extends AbstractFreemarkerView { HttpServletRequest request, HttpServletResponse response) { AllHttpScopesHashModel model = new AllHttpScopesHashModel(objectWrapperForModel, getServletContext(), request); model.putUnlistedModel(FreemarkerServlet.KEY_APPLICATION, getServletContextModel()); - model.putUnlistedModel(FreemarkerServlet.KEY_SESSION, getHttpSessionModel(objectWrapperForModel, request, response)); - model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST, new HttpRequestHashModel(request, response, objectWrapperForModel)); + model.putUnlistedModel(FreemarkerServlet.KEY_SESSION, + getHttpSessionModel(objectWrapperForModel, request, response)); + model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST, + new HttpRequestHashModel(request, response, objectWrapperForModel)); model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST_PARAMETERS, new HttpRequestParametersHashModel(request, objectWrapperForModel)); model.putUnlistedModel(FreemarkerServlet.KEY_JSP_TAGLIBS, getTaglibFactory()); @@ -77,4 +116,52 @@ public class FreemarkerView extends AbstractFreemarkerView { HttpSessionHashModel sessionModel = new HttpSessionHashModel(null, request, response, objectWrapperForModel); return sessionModel; } + + /** + * Extending {@link GenericServlet} for {@link PageContext#getPage()} in JSP Tag Library support. + */ + @SuppressWarnings("serial") + private static class PageContextServlet extends GenericServlet { + + @Override + public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + // Do nothing + } + + } + + /** + * {@link ServletConfig} for {@link PageContextServlet}. + */ + private class PageContextServletConfig implements ServletConfig { + + private ServletContext servletContext; + private String servletName; + + public PageContextServletConfig(ServletContext servletContext, String servletName) { + this.servletContext = servletContext; + this.servletName = servletName; + } + + @Override + public String getServletName() { + return servletName; + } + + @Override + public ServletContext getServletContext() { + return servletContext; + } + + @Override + public String getInitParameter(String name) { + return null; + } + + @Override + public Enumeration<String> getInitParameterNames() { + return Collections.enumeration(Collections.<String> emptySet()); + } + } + } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8e8c724b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java index 0435004..4f21e58 100644 --- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java +++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java @@ -93,12 +93,12 @@ public class FreemarkerViewTest { request.setPathInfo(";mypathinfo"); request.addParameter("token1", "value1"); request.setSession(session); - request.setAttribute("visitorCount", visitorCount); + request.setAttribute("promotion", "Fresh blue berries"); // TODO: Add 'Application.attributeName' example, too. templateLoader.putTemplate("default-model.ftl", - "${name!}, you have ${Session.itemCountInCart!0} items in cart. " - + "BTW, you're ${Request.visitorCount}th visitor. " + "${name!}, you have ${Session.itemCountInCart!0} items in cart. " + "Hot deal: ${Request.promotion}. " + + "BTW, you're ${Application.visitorCount}th visitor. " + "(token1: ${RequestParameters['token1']!})"); FreemarkerView view = new FreemarkerView(); @@ -112,8 +112,8 @@ public class FreemarkerViewTest { final long count = visitorCount.incrementAndGet(); MockHttpServletResponse response = new MockHttpServletResponse(); view.render(model, request, response); - assertEquals("Dan, you have 3 items in cart. BTW, you're " + count + "th visitor. (token1: value1)", - response.getContentAsString()); + assertEquals("Dan, you have 3 items in cart. Hot deal: Fresh blue berries. BTW, you're " + count + + "th visitor. (token1: value1)", response.getContentAsString()); } @Test