From 01d401ea1498671458ac59ef1e7f84961a5cdcc9 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:29:40 +0100 Subject: [PATCH 01/11] Removes duplicated ServletContext passed via parameters --- .../apache/struts2/dispatcher/Dispatcher.java | 77 +++++++++++++++---- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index 032df3617..863c94b1f 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -494,6 +494,16 @@ public class Dispatcher { return new ConfigurationManager(name); } + /** + * @deprecated use version without ServletContext param + */ + @Deprecated + public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, + ActionMapping mapping) throws ServletException { + + serviceAction(request, response, mapping); + } + /** * Load Action class for mapping and invoke the appropriate Action method, or go directly to the Result. *

@@ -509,12 +519,13 @@ public class Dispatcher { * @param mapping the action mapping object * @throws ServletException when an unknown error occurs (not a 404, but typically something that * would end up as a 5xx by the servlet container) - * @param context Our ServletContext object + * + * @since 2.3.17 */ - public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, - ActionMapping mapping) throws ServletException { + public void serviceAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) + throws ServletException { - Map extraContext = createContextMap(request, response, mapping, context); + Map extraContext = createContextMap(request, response, mapping); // If there was a previous value stack, then create a new copy and pass it in to be used by the new Action ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); @@ -586,17 +597,28 @@ public class Dispatcher { } } + /** + * @deprecated use version without servletContext param + */ + @Deprecated + public Map createContextMap(HttpServletRequest request, HttpServletResponse response, + ActionMapping mapping, ServletContext context) { + + return createContextMap(request, response, mapping); + } + /** * Create a context map containing all the wrapped request objects * * @param request The servlet request * @param response The servlet response * @param mapping The action mapping - * @param context The servlet context * @return A map of context objects + * + * @since 2.3.17 */ public Map createContextMap(HttpServletRequest request, HttpServletResponse response, - ActionMapping mapping, ServletContext context) { + ActionMapping mapping) { // request map wrapping the http request objects Map requestMap = new RequestMap(request); @@ -608,9 +630,9 @@ public class Dispatcher { Map session = new SessionMap(request); // application map wrapping the ServletContext - Map application = new ApplicationMap(context); + Map application = new ApplicationMap(servletContext); - Map extraContext = createContextMap(requestMap, params, session, application, request, response, context); + Map extraContext = createContextMap(requestMap, params, session, application, request, response); if (mapping != null) { extraContext.put(ServletActionContext.ACTION_MAPPING, mapping); @@ -618,6 +640,21 @@ public class Dispatcher { return extraContext; } + /** + * @deprecated use version without ServletContext param + */ + @Deprecated + public HashMap createContextMap(Map requestMap, + Map parameterMap, + Map sessionMap, + Map applicationMap, + HttpServletRequest request, + HttpServletResponse response, + ServletContext servletContext) { + + return createContextMap(requestMap, parameterMap, sessionMap, applicationMap, request, response); + } + /** * Merge all application and servlet attributes into a single HashMap to represent the entire * Action context. @@ -628,16 +665,16 @@ public class Dispatcher { * @param applicationMap a Map of all servlet context attributes. * @param request the HttpServletRequest object. * @param response the HttpServletResponse object. - * @param servletContext the ServletContextmapping object. * @return a HashMap representing the Action context. + * + * @since 2.3.17 */ public HashMap createContextMap(Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap, HttpServletRequest request, - HttpServletResponse response, - ServletContext servletContext) { + HttpServletResponse response) { HashMap extraContext = new HashMap(); extraContext.put(ActionContext.PARAMETERS, new HashMap(parameterMap)); extraContext.put(ActionContext.SESSION, sessionMap); @@ -672,9 +709,8 @@ public class Dispatcher { * Return the path to save uploaded files to (this is configurable). * * @return the path to save uploaded files to - * @param servletContext Our ServletContext */ - private String getSaveDir(ServletContext servletContext) { + private String getSaveDir() { String saveDir = multipartSaveDir.trim(); if (saveDir.equals("")) { @@ -762,6 +798,14 @@ public class Dispatcher { } } + /** + * @deprecated use version without ServletContext param + */ + @Deprecated + public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException { + return wrapRequest(request); + } + /** * Wrap and return the given request or return the original request object. *

@@ -771,12 +815,13 @@ public class Dispatcher { * flexible - look first to that object before overriding this method to handle multipart data. * * @param request the HttpServletRequest object. - * @param servletContext Our ServletContext object * @return a wrapped request or original request. * @see org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper * @throws java.io.IOException on any error. + * + * @since 2.3.17 */ - public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException { + public HttpServletRequest wrapRequest(HttpServletRequest request) throws IOException { // don't wrap more than once if (request instanceof StrutsRequestWrapper) { return request; @@ -786,7 +831,7 @@ public class Dispatcher { if (content_type != null && content_type.contains("multipart/form-data")) { MultiPartRequest mpr = getMultiPartRequest(); LocaleProvider provider = getContainer().getInstance(LocaleProvider.class); - request = new MultiPartRequestWrapper(mpr, request, getSaveDir(servletContext), provider); + request = new MultiPartRequestWrapper(mpr, request, getSaveDir(), provider); } else { request = new StrutsRequestWrapper(request, disableRequestAttributeValueStackLookup); } From 8746fd1f1cc2d4998663687115f5d04629f5786d Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:31:56 +0100 Subject: [PATCH 02/11] Deprecates constructors based on ServletContext and introduces new one instead --- .../struts2/dispatcher/ng/ExecuteOperations.java | 10 +++++++--- .../struts2/dispatcher/ng/PrepareOperations.java | 11 +++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ng/ExecuteOperations.java b/core/src/main/java/org/apache/struts2/dispatcher/ng/ExecuteOperations.java index 7ca3d6a2f..0c94249ea 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ng/ExecuteOperations.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ng/ExecuteOperations.java @@ -35,12 +35,16 @@ import java.io.IOException; * Contains execution operations for filters */ public class ExecuteOperations { - private ServletContext servletContext; + private Dispatcher dispatcher; + @Deprecated public ExecuteOperations(ServletContext servletContext, Dispatcher dispatcher) { this.dispatcher = dispatcher; - this.servletContext = servletContext; + } + + public ExecuteOperations(Dispatcher dispatcher) { + this.dispatcher = dispatcher; } /** @@ -74,6 +78,6 @@ public class ExecuteOperations { * @throws ServletException */ public void executeAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException { - dispatcher.serviceAction(request, response, servletContext, mapping); + dispatcher.serviceAction(request, response, mapping); } } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ng/PrepareOperations.java b/core/src/main/java/org/apache/struts2/dispatcher/ng/PrepareOperations.java index a26a8b2d5..ccf21c7c1 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ng/PrepareOperations.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ng/PrepareOperations.java @@ -47,15 +47,18 @@ public class PrepareOperations { private static final Logger LOG = LoggerFactory.getLogger(PrepareOperations.class); - private ServletContext servletContext; private Dispatcher dispatcher; private static final String STRUTS_ACTION_MAPPING_KEY = "struts.actionMapping"; public static final String CLEANUP_RECURSION_COUNTER = "__cleanup_recursion_counter"; private Logger log = LoggerFactory.getLogger(PrepareOperations.class); + @Deprecated public PrepareOperations(ServletContext servletContext, Dispatcher dispatcher) { this.dispatcher = dispatcher; - this.servletContext = servletContext; + } + + public PrepareOperations(Dispatcher dispatcher) { + this.dispatcher = dispatcher; } /** @@ -75,7 +78,7 @@ public class PrepareOperations { ctx = new ActionContext(new HashMap(oldContext.getContextMap())); } else { ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack(); - stack.getContext().putAll(dispatcher.createContextMap(request, response, null, servletContext)); + stack.getContext().putAll(dispatcher.createContextMap(request, response, null)); ctx = new ActionContext(stack.getContext()); } request.setAttribute(CLEANUP_RECURSION_COUNTER, counter); @@ -131,7 +134,7 @@ public class PrepareOperations { try { // Wrap request first, just in case it is multipart/form-data // parameters might not be accessible through before encoding (ww-1278) - request = dispatcher.wrapRequest(request, servletContext); + request = dispatcher.wrapRequest(request); } catch (IOException e) { throw new ServletException("Could not wrap servlet request with MultipartRequestWrapper!", e); } From ba0eda0c5469dabb4b48461a2a013397ee633302 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:32:19 +0100 Subject: [PATCH 03/11] Uses new constructors of Prepare and Execution without ServletContext --- .../struts2/dispatcher/ng/filter/StrutsExecuteFilter.java | 4 ++-- .../dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java | 4 ++-- .../struts2/dispatcher/ng/filter/StrutsPrepareFilter.java | 2 +- .../apache/struts2/dispatcher/ng/listener/StrutsListener.java | 2 +- .../apache/struts2/dispatcher/ng/servlet/StrutsServlet.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsExecuteFilter.java b/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsExecuteFilter.java index bd522bbe8..7f8164f9d 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsExecuteFilter.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsExecuteFilter.java @@ -57,8 +57,8 @@ public class StrutsExecuteFilter implements StrutsStatics, Filter { Dispatcher dispatcher = init.findDispatcherOnThread(); init.initStaticContentLoader(new FilterHostConfig(filterConfig), dispatcher); - prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); - execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); + prepare = new PrepareOperations(dispatcher); + execute = new ExecuteOperations(dispatcher); } } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java b/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java index 1c3d3b4ae..970d8e7c9 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java @@ -57,8 +57,8 @@ public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter { dispatcher = init.initDispatcher(config); init.initStaticContentLoader(config, dispatcher); - prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); - execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); + prepare = new PrepareOperations(dispatcher); + execute = new ExecuteOperations(dispatcher); this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); postInit(dispatcher, filterConfig); diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareFilter.java b/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareFilter.java index ea0e51077..27ce17ea3 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareFilter.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareFilter.java @@ -55,7 +55,7 @@ public class StrutsPrepareFilter implements StrutsStatics, Filter { init.initLogging(config); dispatcher = init.initDispatcher(config); - prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); + prepare = new PrepareOperations(dispatcher); this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); postInit(dispatcher, filterConfig); diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ng/listener/StrutsListener.java b/core/src/main/java/org/apache/struts2/dispatcher/ng/listener/StrutsListener.java index 113d026ee..92c49ac39 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ng/listener/StrutsListener.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ng/listener/StrutsListener.java @@ -46,7 +46,7 @@ public class StrutsListener implements ServletContextListener { dispatcher = init.initDispatcher(config); init.initStaticContentLoader(config, dispatcher); - prepare = new PrepareOperations(config.getServletContext(), dispatcher); + prepare = new PrepareOperations(dispatcher); sce.getServletContext().setAttribute(StrutsStatics.SERVLET_DISPATCHER, dispatcher); } finally { if (dispatcher != null) { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ng/servlet/StrutsServlet.java b/core/src/main/java/org/apache/struts2/dispatcher/ng/servlet/StrutsServlet.java index 9ea669f94..19c8c73b3 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ng/servlet/StrutsServlet.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ng/servlet/StrutsServlet.java @@ -54,8 +54,8 @@ public class StrutsServlet extends HttpServlet { dispatcher = init.initDispatcher(config); init.initStaticContentLoader(config, dispatcher); - prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); - execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); + prepare = new PrepareOperations(dispatcher); + execute = new ExecuteOperations(dispatcher); } finally { if (dispatcher != null) { dispatcher.cleanUpAfterInit(); From a2e97a9ca41aeb9b6c8be68744dccb0b8c67f81d Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:32:42 +0100 Subject: [PATCH 04/11] Uses the new versions of methods without ServletContext --- .../java/org/apache/struts2/dispatcher/FilterDispatcher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java index 970311ce5..22fc05177 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java @@ -361,7 +361,7 @@ public class FilterDispatcher implements StrutsStatics, Filter { try { // Wrap request first, just in case it is multipart/form-data // parameters might not be accessible through before encoding (ww-1278) - request = dispatcher.wrapRequest(request, getServletContext()); + request = dispatcher.wrapRequest(request); } catch (IOException e) { String message = "Could not wrap servlet request with MultipartRequestWrapper!"; log.error(message, e); @@ -431,7 +431,7 @@ public class FilterDispatcher implements StrutsStatics, Filter { return; } - dispatcher.serviceAction(request, response, servletContext, mapping); + dispatcher.serviceAction(request, response, mapping); } finally { dispatcher.cleanUpRequest(request); From 4a4d04164a31dc5b905eca1f345c6d2a26472c30 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:33:38 +0100 Subject: [PATCH 05/11] Uses the new versions of methods without ServletContext --- .../struts2/components/ActionComponent.java | 41 ++++++++----------- .../apache/struts2/views/jsp/TagUtils.java | 23 +++++------ 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/components/ActionComponent.java b/core/src/main/java/org/apache/struts2/components/ActionComponent.java index 5eb703563..f18445461 100644 --- a/core/src/main/java/org/apache/struts2/components/ActionComponent.java +++ b/core/src/main/java/org/apache/struts2/components/ActionComponent.java @@ -21,17 +21,15 @@ package org.apache.struts2.components; -import java.io.IOException; -import java.io.Writer; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.PageContext; - +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.ActionProxyFactory; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.ValueStackFactory; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsException; import org.apache.struts2.StrutsStatics; @@ -43,15 +41,14 @@ import org.apache.struts2.views.annotations.StrutsTag; import org.apache.struts2.views.annotations.StrutsTagAttribute; import org.apache.struts2.views.jsp.TagUtils; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionProxy; -import com.opensymphony.xwork2.ActionProxyFactory; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.util.logging.Logger; -import com.opensymphony.xwork2.util.logging.LoggerFactory; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.jsp.PageContext; +import java.io.IOException; +import java.io.Writer; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; /** * @@ -188,7 +185,6 @@ public class ActionComponent extends ContextBean { Map newParams = createParametersForContext(); ActionContext ctx = new ActionContext(stack.getContext()); - ServletContext servletContext = (ServletContext) ctx.get(ServletActionContext.SERVLET_CONTEXT); PageContext pageContext = (PageContext) ctx.get(ServletActionContext.PAGE_CONTEXT); Map session = ctx.getSession(); Map application = ctx.getApplication(); @@ -199,8 +195,7 @@ public class ActionComponent extends ContextBean { session, application, req, - res, - servletContext); + res); ValueStack newStack = valueStackFactory.createValueStack(stack); extraContext.put(ActionContext.VALUE_STACK, newStack); diff --git a/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java b/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java index a4a2848d2..ab7abea1f 100644 --- a/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java +++ b/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java @@ -21,12 +21,11 @@ package org.apache.struts2.views.jsp; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.PageContext; - +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.config.ConfigurationException; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.ValueStackFactory; import org.apache.struts2.RequestUtils; import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.ApplicationMap; @@ -37,11 +36,10 @@ import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.dispatcher.mapper.ActionMapping; import org.apache.struts2.util.AttributeMap; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.config.ConfigurationException; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.ValueStackFactory; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.jsp.PageContext; +import java.util.Map; /** @@ -67,8 +65,7 @@ public class TagUtils { new SessionMap(req), new ApplicationMap(pageContext.getServletContext()), req, - res, - pageContext.getServletContext()); + res); extraContext.put(ServletActionContext.PAGE_CONTEXT, pageContext); stack.getContext().putAll(extraContext); req.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack); From d4ddd74ebed3a68fab70ddb9bb86ce5efa9ea65b Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:34:03 +0100 Subject: [PATCH 06/11] Updates tests to new version of methods without ServletContext --- .../dispatcher/FilterDispatcherTest.java | 4 +- .../apache/struts2/dispatcher/FilterTest.java | 4 +- .../freemarker/FreeMarkerResultTest.java | 204 +------------- .../FreemarkerResultMockedTest.java | 262 ++++++++++++++++++ .../struts2/views/jsp/AbstractTagTest.java | 3 +- .../apache/struts2/views/jsp/URLTagTest.java | 3 +- 6 files changed, 280 insertions(+), 200 deletions(-) create mode 100644 core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java diff --git a/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java index 2c2d747ba..4449e40d4 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java @@ -122,7 +122,7 @@ public class FilterDispatcherTest extends StrutsInternalTestCase { return request; } - public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException { + public void serviceAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException { serviceRequest = true; } @@ -152,7 +152,7 @@ public class FilterDispatcherTest extends StrutsInternalTestCase { return request; } - public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException { + public void serviceAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException { serviceRequest = true; // if we set the chracter encoding AFTER we do wrap request, we will get // a failing test diff --git a/core/src/test/java/org/apache/struts2/dispatcher/FilterTest.java b/core/src/test/java/org/apache/struts2/dispatcher/FilterTest.java index 04b5c945d..12f9a64ab 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/FilterTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/FilterTest.java @@ -313,10 +313,10 @@ public class FilterTest extends StrutsInternalTestCase { } @Override - public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException { + public void serviceAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException { service = true; } - + @Override public void cleanup() { cleanUp = true; diff --git a/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java b/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java index 62ab0eef3..d72182655 100644 --- a/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java +++ b/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java @@ -43,12 +43,14 @@ import javax.servlet.ServletContext; import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.util.HashMap; import static org.apache.struts2.views.jsp.AbstractUITagTest.normalize; /** * Test case for FreeMarkerResult. - * */ public class FreeMarkerResultTest extends StrutsInternalTestCase { @@ -62,54 +64,6 @@ public class FreeMarkerResultTest extends StrutsInternalTestCase { private FreemarkerManager mgr; private MockHttpServletRequest request; - public void testActionThatThrowsExceptionTag() throws Exception { - //get fm config to use it in mock servlet context - FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); - Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); - freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - - ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class); - File file = new File(FreeMarkerResultTest.class.getResource("callActionFreeMarker2.ftl").toURI()); - EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/callActionFreeMarker.ftl")).andReturn(file.getAbsolutePath()); - file = new File(FreeMarkerResultTest.class.getResource("nested.ftl").toURI()); - EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/nested.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); - EasyMock.replay(servletContext); - - freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); - ServletActionContext.setServletContext(servletContext); - - - request.setRequestURI("/tutorial/test2.action"); - ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); - dispatcher.serviceAction(request, response, servletContext, mapping); - assertEquals("beforenestedafter", stringWriter.toString()); - } - - public void testActionThatSucceedsTag() throws Exception { - //get fm config to use it in mock servlet context - FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); - Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); - freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - - ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class); - File file = new File(FreeMarkerResultTest.class.getResource("callActionFreeMarker2.ftl").toURI()); - EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/callActionFreeMarker2.ftl")).andReturn(file.getAbsolutePath()); - file = new File(FreeMarkerResultTest.class.getResource("nested.ftl").toURI()); - EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/nested.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); - EasyMock.replay(servletContext); - - freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); - ServletActionContext.setServletContext(servletContext); - - - request.setRequestURI("/tutorial/test5.action"); - ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); - dispatcher.serviceAction(request, response, servletContext, mapping); - assertEquals("beforenestedafter", stringWriter.toString()); - } - public void testWriteIfCompleted() throws Exception { FreemarkerResult result = new FreemarkerResult(); result.setLocation("someFreeMarkerFile.ftl"); @@ -138,21 +92,21 @@ public class FreeMarkerResultTest extends StrutsInternalTestCase { } public void testContentTypeIsNotOverwritten() throws Exception { - servletContext.setRealPath(new File(FreeMarkerResultTest.class.getResource( - "nested.ftl").toURI()).toURL().getFile()); + servletContext.setRealPath(new File(FreeMarkerResultTest.class.getResource( + "nested.ftl").toURI()).toURL().getFile()); FreemarkerResult result = new FreemarkerResult(); result.setLocation("nested.ftl"); result.setFreemarkerManager(mgr); - - response.setContentType("contenttype"); + + response.setContentType("contenttype"); result.execute(invocation); assertEquals("contenttype", response.getContentType()); } public void testDefaultContentType() throws Exception { - servletContext.setRealPath(new File(FreeMarkerResultTest.class.getResource( - "nested.ftl").toURI()).toURL().getFile()); + servletContext.setRealPath(new File(FreeMarkerResultTest.class.getResource( + "nested.ftl").toURI()).toURL().getFile()); FreemarkerResult result = new FreemarkerResult(); result.setLocation("nested.ftl"); @@ -164,8 +118,8 @@ public class FreeMarkerResultTest extends StrutsInternalTestCase { } public void testContentTypeFromTemplate() throws Exception { - servletContext.setRealPath(new File(FreeMarkerResultTest.class.getResource( - "something.ftl").toURI()).toURL().getFile()); + servletContext.setRealPath(new File(FreeMarkerResultTest.class.getResource( + "something.ftl").toURI()).toURL().getFile()); FreemarkerResult result = new FreemarkerResult(); result.setLocation("something.ftl"); @@ -176,140 +130,6 @@ public class FreeMarkerResultTest extends StrutsInternalTestCase { assertEquals("text/xml", response.getContentType()); } - public void testDynamicAttributesSupport() throws Exception { - //get fm config to use it in mock servlet context - FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); - Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); - freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - - ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class); - - File file = new File(FreeMarkerResultTest.class.getResource("dynaAttributes.ftl").toURI()); - EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/dynaAttributes.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/text.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/text.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/css.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/css.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/css.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/scripting-events.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/common-attributes.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/dynamic-attributes.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); - - EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); - EasyMock.replay(servletContext); - - freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); - ServletActionContext.setServletContext(servletContext); - - - request.setRequestURI("/tutorial/test6.action"); - ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); - dispatcher.serviceAction(request, response, servletContext, mapping); - - // TODO lukaszlenart: remove expectedJDK15 and if() after switching to Java 1.6 - String expectedJDK15 = - "" - + "" - + ""; - String expectedJDK16 = - "" - + "" - + "" - + ""; - - String result = stringWriter.toString(); - - if (result.contains("foo=\"bar\" placeholder=\"input\"")) { - assertEquals(expectedJDK15, result); - } else { - assertEquals(expectedJDK16, result); - } - } - - public void testManualListInTemplate() throws Exception { - FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); - Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); - freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - - ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class); - - File file = new File(FreeMarkerResultTest.class.getResource("manual-list.ftl").toURI()); - EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/manual-list.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/radiomap.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/radiomap.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/css.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/css.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/css.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/scripting-events.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/common-attributes.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/simple/dynamic-attributes.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); - EasyMock.expect(servletContext.getRealPath("/template/~~~simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); - - EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); - EasyMock.replay(servletContext); - - freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); - ServletActionContext.setServletContext(servletContext); - - - request.setRequestURI("/tutorial/test7.action"); - ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); - dispatcher.serviceAction(request, response, servletContext, mapping); - String expected = "\n" - + "\n" - + "\n" - + "\n" - + "\n"; - assertEquals(normalize(expected), normalize(stringWriter.toString())); - } - - public void testDynamicAttributesInTheme() throws Exception { - FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); - Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); - freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - - ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class); - - File file = new File(FreeMarkerResultTest.class.getResource("customTextField.ftl").toURI()); - EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/customTextField.ftl")).andReturn(file.getAbsolutePath()); - - file = new File(ClassLoaderUtil.getResource("template/test/text.ftl", getClass()).toURI()); - EasyMock.expect(servletContext.getRealPath("/template/test/text.ftl")).andReturn(file.getAbsolutePath()); - - EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); - EasyMock.replay(servletContext); - - freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); - ServletActionContext.setServletContext(servletContext); - - request.setRequestURI("/tutorial/test8.action"); - ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); - dispatcher.serviceAction(request, response, servletContext, mapping); - String expected = ""; - assertEquals(expected, stringWriter.toString()); - } - protected void setUp() throws Exception { super.setUp(); mgr = new FreemarkerManager(); @@ -345,7 +165,7 @@ public class FreeMarkerResultTest extends StrutsInternalTestCase { invocation.setStack(stack); invocation.setInvocationContext(context); servletContext.setRealPath(new File(FreeMarkerResultTest.class.getResource( - "someFreeMarkerFile.ftl").toURI()).toURL().getFile()); + "someFreeMarkerFile.ftl").toURI()).toURL().getFile()); } protected void tearDown() throws Exception { diff --git a/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java new file mode 100644 index 000000000..9a9584a22 --- /dev/null +++ b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java @@ -0,0 +1,262 @@ +package org.apache.struts2.views.freemarker; + +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.mock.MockActionInvocation; +import com.opensymphony.xwork2.util.ClassLoaderUtil; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory; +import freemarker.template.Configuration; +import freemarker.template.TemplateExceptionHandler; +import org.apache.struts2.ServletActionContext; +import org.apache.struts2.StrutsInternalTestCase; +import org.apache.struts2.StrutsStatics; +import org.apache.struts2.dispatcher.mapper.ActionMapper; +import org.apache.struts2.dispatcher.mapper.ActionMapping; +import org.apache.struts2.views.jsp.StrutsMockHttpServletResponse; +import org.easymock.EasyMock; +import org.springframework.mock.web.MockHttpServletRequest; + +import javax.servlet.ServletContext; +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.MalformedURLException; +import java.net.URISyntaxException; + +import static org.apache.struts2.views.jsp.AbstractUITagTest.normalize; + +public class FreemarkerResultMockedTest extends StrutsInternalTestCase { + + ValueStack stack; + MockActionInvocation invocation; + ActionContext context; + StrutsMockHttpServletResponse response; + PrintWriter writer; + StringWriter stringWriter; + ServletContext servletContext; + FreemarkerManager mgr; + MockHttpServletRequest request; + + public void testActionThatThrowsExceptionTag() throws Exception { + //get fm config to use it in mock servlet context + FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); + Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); + freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + + servletContext = EasyMock.createNiceMock(ServletContext.class); + File file = new File(FreeMarkerResultTest.class.getResource("callActionFreeMarker2.ftl").toURI()); + EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/callActionFreeMarker.ftl")).andReturn(file.getAbsolutePath()); + file = new File(FreeMarkerResultTest.class.getResource("nested.ftl").toURI()); + EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/nested.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); + EasyMock.replay(servletContext); + + freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); + ServletActionContext.setServletContext(servletContext); + + init(); + + request.setRequestURI("/tutorial/test2.action"); + ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); + dispatcher.serviceAction(request, response, mapping); + assertEquals("beforenestedafter", stringWriter.toString()); + } + + public void testActionThatSucceedsTag() throws Exception { + //get fm config to use it in mock servlet context + FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); + Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); + freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + + servletContext = EasyMock.createNiceMock(ServletContext.class); + File file = new File(FreeMarkerResultTest.class.getResource("callActionFreeMarker2.ftl").toURI()); + EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/callActionFreeMarker2.ftl")).andReturn(file.getAbsolutePath()); + file = new File(FreeMarkerResultTest.class.getResource("nested.ftl").toURI()); + EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/nested.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); + EasyMock.replay(servletContext); + + freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); + ServletActionContext.setServletContext(servletContext); + + init(); + + request.setRequestURI("/tutorial/test5.action"); + ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); + dispatcher.serviceAction(request, response, mapping); + assertEquals("beforenestedafter", stringWriter.toString()); + } + + public void testDynamicAttributesSupport() throws Exception { + //get fm config to use it in mock servlet context + FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); + Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); + freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + + servletContext = EasyMock.createNiceMock(ServletContext.class); + + File file = new File(FreeMarkerResultTest.class.getResource("dynaAttributes.ftl").toURI()); + EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/dynaAttributes.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/text.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/text.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/css.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/css.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/css.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/scripting-events.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/common-attributes.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/dynamic-attributes.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); + + EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); + EasyMock.replay(servletContext); + + freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); + ServletActionContext.setServletContext(servletContext); + + init(); + + request.setRequestURI("/tutorial/test6.action"); + ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); + dispatcher.serviceAction(request, response, mapping); + + // TODO lukaszlenart: remove expectedJDK15 and if() after switching to Java 1.6 + String expectedJDK15 = + "" + + "" + + ""; + String expectedJDK16 = + "" + + "" + + "" + + ""; + + String result = stringWriter.toString(); + + if (result.contains("foo=\"bar\" placeholder=\"input\"")) { + assertEquals(expectedJDK15, result); + } else { + assertEquals(expectedJDK16, result); + } + } + + public void testManualListInTemplate() throws Exception { + FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); + Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); + freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + + servletContext = EasyMock.createNiceMock(ServletContext.class); + + File file = new File(FreeMarkerResultTest.class.getResource("manual-list.ftl").toURI()); + EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/manual-list.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/radiomap.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/radiomap.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/css.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/css.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/css.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/scripting-events.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/scripting-events.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/common-attributes.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/common-attributes.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/simple/dynamic-attributes.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); + EasyMock.expect(servletContext.getRealPath("/template/~~~simple/dynamic-attributes.ftl")).andReturn(file.getAbsolutePath()); + + EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); + EasyMock.replay(servletContext); + + freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); + ServletActionContext.setServletContext(servletContext); + + init(); + + request.setRequestURI("/tutorial/test7.action"); + ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); + dispatcher.serviceAction(request, response, mapping); + String expected = "\n" + + "\n" + + "\n" + + "\n" + + "\n"; + assertEquals(normalize(expected), normalize(stringWriter.toString())); + } + + public void testDynamicAttributesInTheme() throws Exception { + FreemarkerManager freemarkerManager = container.getInstance(FreemarkerManager.class); + Configuration freemarkerConfig = freemarkerManager.getConfiguration(ServletActionContext.getServletContext()); + freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + + servletContext = EasyMock.createNiceMock(ServletContext.class); + + File file = new File(FreeMarkerResultTest.class.getResource("customTextField.ftl").toURI()); + EasyMock.expect(servletContext.getRealPath("/tutorial/org/apache/struts2/views/freemarker/customTextField.ftl")).andReturn(file.getAbsolutePath()); + + file = new File(ClassLoaderUtil.getResource("template/test/text.ftl", getClass()).toURI()); + EasyMock.expect(servletContext.getRealPath("/template/test/text.ftl")).andReturn(file.getAbsolutePath()); + + EasyMock.expect(servletContext.getAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY)).andReturn(freemarkerConfig).anyTimes(); + EasyMock.replay(servletContext); + + freemarkerConfig.setServletContextForTemplateLoading(servletContext, null); + ServletActionContext.setServletContext(servletContext); + + init(); + + request.setRequestURI("/tutorial/test8.action"); + ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager); + dispatcher.serviceAction(request, response, mapping); + String expected = ""; + assertEquals(expected, stringWriter.toString()); + } + + private void init() throws MalformedURLException, URISyntaxException { + mgr = new FreemarkerManager(); + mgr.setEncoding("UTF-8"); + + DefaultFileManagerFactory factory = new DefaultFileManagerFactory(); + container.inject(factory); + mgr.setFileManagerFactory(factory); + + FreemarkerThemeTemplateLoader themeLoader = new FreemarkerThemeTemplateLoader(); + container.inject(themeLoader); + mgr.setThemeTemplateLoader(themeLoader); + + stringWriter = new StringWriter(); + writer = new PrintWriter(stringWriter); + response = new StrutsMockHttpServletResponse(); + response.setWriter(writer); + request = new MockHttpServletRequest(); + stack = ActionContext.getContext().getValueStack(); + + context = new ActionContext(stack.getContext()); + context.put(StrutsStatics.HTTP_RESPONSE, response); + context.put(StrutsStatics.HTTP_REQUEST, request); + context.put(StrutsStatics.SERVLET_CONTEXT, servletContext); + + ServletActionContext.setServletContext(servletContext); + ServletActionContext.setRequest(request); + ServletActionContext.setResponse(response); + servletContext.setAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY, null); + + invocation = new MockActionInvocation(); + invocation.setStack(stack); + invocation.setInvocationContext(context); + } + +} diff --git a/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java index 98eadb6f1..36b04fa28 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java @@ -120,8 +120,7 @@ public abstract class AbstractTagTest extends StrutsInternalTestCase { session, new ApplicationMap(pageContext.getServletContext()), request, - response, - pageContext.getServletContext()); + response); // let's not set the locale -- there is a test that checks if Dispatcher actually picks this up... // ... but generally we want to just use no locale (let it stay system default) extraContext.remove(ActionContext.LOCALE); diff --git a/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java index 1a970ee1b..50bf5767f 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java @@ -555,8 +555,7 @@ public class URLTagTest extends AbstractUITagTest { session, new ApplicationMap(pageContext.getServletContext()), request, - response, - pageContext.getServletContext()); + response); // let's not set the locale -- there is a test that checks if Dispatcher actually picks this up... // ... but generally we want to just use no locale (let it stay system default) extraContext.remove(ActionContext.LOCALE); From ddd27197f5155f6089e2d5e3b82363f44752c57d Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:34:10 +0100 Subject: [PATCH 07/11] Updates tests to new version of methods without ServletContext --- .../org/apache/struts2/dojo/views/jsp/ui/AbstractTagTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/AbstractTagTest.java b/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/AbstractTagTest.java index e20722f60..a3bf45301 100644 --- a/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/AbstractTagTest.java +++ b/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/AbstractTagTest.java @@ -119,8 +119,7 @@ public abstract class AbstractTagTest extends StrutsTestCase { session, new ApplicationMap(pageContext.getServletContext()), request, - response, - pageContext.getServletContext()); + response); // let's not set the locale -- there is a test that checks if Dispatcher actually picks this up... // ... but generally we want to just use no locale (let it stay system default) extraContext.remove(ActionContext.LOCALE); From 9ff04d17a5edfeb9805d1485b29eda8d0dfa3ce8 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:34:47 +0100 Subject: [PATCH 08/11] Updates tests to new version of methods without ServletContext --- .../src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java | 2 +- .../junit/src/main/java/org/apache/struts2/StrutsTestCase.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java b/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java index 02fd69b81..7bf18b7a3 100644 --- a/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java +++ b/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java @@ -137,7 +137,7 @@ public abstract class StrutsJUnit4TestCase extends XWorkJUnit4TestCase { ActionMapping mapping = getActionMapping(request); assertNotNull(mapping); - Dispatcher.getInstance().serviceAction(request, response, servletContext, mapping); + Dispatcher.getInstance().serviceAction(request, response, mapping); if (response.getStatus() != HttpServletResponse.SC_OK) throw new ServletException("Error code [" + response.getStatus() + "], Error: [" diff --git a/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java b/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java index 3a145459c..de6f477ff 100644 --- a/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java +++ b/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java @@ -115,7 +115,7 @@ public abstract class StrutsTestCase extends XWorkTestCase { ActionMapping mapping = getActionMapping(request); assertNotNull(mapping); - Dispatcher.getInstance().serviceAction(request, response, servletContext, mapping); + Dispatcher.getInstance().serviceAction(request, response, mapping); if (response.getStatus() != HttpServletResponse.SC_OK) { throw new ServletException("Error code [" + response.getStatus() + "], Error: [" + response.getErrorMessage() + "]"); From 4da2ec65c706e1029b827f2ca36242e05d99fb63 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:35:20 +0100 Subject: [PATCH 09/11] Updates classes to use the new version of Dispatcher's methods without ServletContext --- .../org/apache/struts2/validators/DWRValidator.java | 12 +++--------- .../struts2/portlet/dispatcher/Jsr168Dispatcher.java | 7 ++++--- .../sitemesh/OldDecorator2NewStrutsDecorator.java | 2 +- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/plugins/dwr/src/main/java/org/apache/struts2/validators/DWRValidator.java b/plugins/dwr/src/main/java/org/apache/struts2/validators/DWRValidator.java index 8c9a2eb36..9d6f75055 100644 --- a/plugins/dwr/src/main/java/org/apache/struts2/validators/DWRValidator.java +++ b/plugins/dwr/src/main/java/org/apache/struts2/validators/DWRValidator.java @@ -32,22 +32,16 @@ import org.apache.struts2.dispatcher.ApplicationMap; import org.apache.struts2.dispatcher.Dispatcher; import org.apache.struts2.dispatcher.RequestMap; import org.apache.struts2.dispatcher.SessionMap; -import org.apache.struts2.dispatcher.mapper.ActionMapper; -import org.apache.struts2.dispatcher.mapper.ActionMapping; import uk.ltd.getahead.dwr.WebContextFactory; import com.opensymphony.xwork2.Action; -import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.DefaultActionInvocation; import com.opensymphony.xwork2.ValidationAware; import com.opensymphony.xwork2.ValidationAwareSupport; -import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.entities.ActionConfig; -import com.opensymphony.xwork2.config.entities.PackageConfig; -import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; @@ -69,8 +63,9 @@ import com.opensymphony.xwork2.util.logging.LoggerFactory; * */ public class DWRValidator { + private static final Logger LOG = LoggerFactory.getLogger(DWRValidator.class); - + public ValidationAwareSupport doPost(String namespace, String actionName, Map params) throws Exception { HttpServletRequest req = WebContextFactory.get().getHttpServletRequest(); ServletContext servletContext = WebContextFactory.get().getServletContext(); @@ -91,8 +86,7 @@ public class DWRValidator { session, application, req, - res, - servletContext); + res); try { ActionProxyFactory actionProxyFactory = du.getContainer().getInstance(ActionProxyFactory.class); diff --git a/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java index 349d81955..99da30165 100644 --- a/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java +++ b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java @@ -184,6 +184,7 @@ public class Jsr168Dispatcher extends GenericPortlet implements StrutsStatics { private Dispatcher dispatcherUtils; private ActionMapper actionMapper; private Container container; + private ServletContext servletContext; /** * Initialize the portlet with the init parameters from portlet.xml @@ -201,7 +202,8 @@ public class Jsr168Dispatcher extends GenericPortlet implements StrutsStatics { params.put(name, value); } - dispatcherUtils = new Dispatcher(new PortletServletContext(cfg.getPortletContext()), params); + servletContext = new PortletServletContext(cfg.getPortletContext()); + dispatcherUtils = new Dispatcher(servletContext, params); dispatcherUtils.init(); // For testability @@ -428,11 +430,10 @@ public class Jsr168Dispatcher extends GenericPortlet implements StrutsStatics { String actionName = null; String namespace; try { - ServletContext servletContext = new PortletServletContext(getPortletContext()); HttpServletRequest servletRequest = new PortletServletRequest(request, getPortletContext()); HttpServletResponse servletResponse = createPortletServletResponse(response); if (phase.isAction()) { - servletRequest = dispatcherUtils.wrapRequest(servletRequest, servletContext); + servletRequest = dispatcherUtils.wrapRequest(servletRequest); if (servletRequest instanceof MultiPartRequestWrapper) { // Multipart request. Request parameters are encoded in the multipart data, // so we need to manually add them to the parameter map. diff --git a/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java b/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java index 740095e20..9b86adb39 100644 --- a/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java +++ b/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java @@ -97,7 +97,7 @@ public abstract class OldDecorator2NewStrutsDecorator extends BaseWebAppDecorato if (ctx == null) { // ok, one isn't associated with the request, so let's create one using the current Dispatcher ValueStack vs = Dispatcher.getInstance().getContainer().getInstance(ValueStackFactory.class).createValueStack(); - vs.getContext().putAll(Dispatcher.getInstance().createContextMap(request, response, null, servletContext)); + vs.getContext().putAll(Dispatcher.getInstance().createContextMap(request, response, null)); ctx = new ActionContext(vs.getContext()); if (ctx.getActionInvocation() == null) { // put in a dummy ActionSupport so basic functionality still works From 8be797fccdd97cb53206892fe34862f3e7cf77d6 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 18 Feb 2014 07:58:26 +0100 Subject: [PATCH 10/11] Removes commented out if statment --- .../main/java/org/apache/struts2/dispatcher/Dispatcher.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index 863c94b1f..d45f706f2 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -479,9 +479,7 @@ public class Dispatcher { l.dispatcherInitialized(this); } } - //if (servletContext != null) { - errorHandler.init(servletContext); - //} + errorHandler.init(servletContext); } catch (Exception ex) { if (LOG.isErrorEnabled()) From c7ca91446b33689913aaab7243f1d6fc2c520220 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 18 Feb 2014 08:52:39 +0100 Subject: [PATCH 11/11] Increases ServletContext visibility --- .../java/org/apache/struts2/dispatcher/Dispatcher.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index d45f706f2..2cdf260eb 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -186,11 +186,14 @@ public class Dispatcher { dispatcherListeners.remove(listener); } - private ServletContext servletContext; - private Map initParams; - private ValueStackFactory valueStackFactory; + /** + * Keeps current reference to external world and must be protected to support class inheritance + */ + protected ServletContext servletContext; + protected Map initParams; + /** * Create the Dispatcher instance for a given ServletContext and set of initialization parameters. *