From ea75fadc9670d12ee4c6523a7d3d03ec1c5ead54 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 16 Feb 2014 18:36:45 +0100 Subject: [PATCH 01/80] WW-3887 Extracts dedicated interface (with default implementation) to handle errors --- .../org/apache/struts2/StrutsConstants.java | 2 + .../DefaultDispatcherErrorHandler.java | 110 ++++++++++++++++ .../apache/struts2/dispatcher/Dispatcher.java | 121 +++++------------- .../dispatcher/DispatcherErrorHandler.java | 29 +++++ core/src/main/resources/struts-default.xml | 4 + 5 files changed, 179 insertions(+), 87 deletions(-) create mode 100644 core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java create mode 100644 core/src/main/java/org/apache/struts2/dispatcher/DispatcherErrorHandler.java diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java index 1cb4ab578..3423ec8bd 100644 --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@ -279,4 +279,6 @@ public final class StrutsConstants { public static final String DEFAULT_TEMPLATE_TYPE_CONFIG_KEY = "struts.ui.templateSuffix"; + /** Allows override default DispatcherErrorHandler **/ + public static final String STRUTS_DISPATCHER_ERROR_HANDLER = "struts.dispatcher.errorHandler"; } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java b/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java new file mode 100644 index 000000000..b09c890a1 --- /dev/null +++ b/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java @@ -0,0 +1,110 @@ +package org.apache.struts2.dispatcher; + +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.location.Location; +import com.opensymphony.xwork2.util.location.LocationUtils; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; +import freemarker.template.Template; +import org.apache.struts2.StrutsConstants; +import org.apache.struts2.StrutsException; +import org.apache.struts2.views.freemarker.FreemarkerManager; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DefaultDispatcherErrorHandler implements DispatcherErrorHandler { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultDispatcherErrorHandler.class); + + private FreemarkerManager freemarkerManager; + private boolean devMode; + private Template template; + + @Inject + public void setFreemarkerManager(FreemarkerManager freemarkerManager) { + this.freemarkerManager = freemarkerManager; + } + + @Inject(StrutsConstants.STRUTS_DEVMODE) + public void setDevMode(String devMode) { + this.devMode = "true".equalsIgnoreCase(devMode); + } + + public void init(ServletContext ctx) { + try { + freemarker.template.Configuration config = freemarkerManager.getConfiguration(ctx); + template = config.getTemplate("/org/apache/struts2/dispatcher/error.ftl"); + } catch (IOException e) { + throw new StrutsException(e); + } + } + + public void handleError(HttpServletRequest request, HttpServletResponse response, int code, Exception e) { + Boolean devModeOverride = FilterDispatcher.getDevModeOverride(); + if (devModeOverride != null ? devModeOverride : devMode) { + if (LOG.isDebugEnabled()) { + LOG.debug("Exception occurred during processing request: #0", e, e.getMessage()); + } + try { + + List chain = new ArrayList(); + Throwable cur = e; + chain.add(cur); + while ((cur = cur.getCause()) != null) { + chain.add(cur); + } + + HashMap data = new HashMap(); + data.put("exception", e); + data.put("unknown", Location.UNKNOWN); + data.put("chain", chain); + data.put("locator", new Dispatcher.Locator()); + + Writer writer = new StringWriter(); + template.process(data, writer); + + response.setContentType("text/html"); + response.getWriter().write(writer.toString()); + response.getWriter().close(); + } catch (Exception exp) { + try { + if (LOG.isDebugEnabled()) { + LOG.debug("Cannot show problem report!", exp); + } + response.sendError(code, "Unable to show problem report:\n" + exp + "\n\n" + LocationUtils.getLocation(exp)); + } catch (IOException ex) { + // we're already sending an error, not much else we can do if more stuff breaks + } + } + } else { + try { + // WW-1977: Only put errors in the request when code is a 500 error + if (code == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) { + // WW-4103: Only logs error when application error occurred, not Struts error + if (LOG.isErrorEnabled()) { + LOG.error("Exception occurred during processing request: #0", e, e.getMessage()); + } + // send a http error response to use the servlet defined error handler + // make the exception availible to the web.xml defined error page + request.setAttribute("javax.servlet.error.exception", e); + + // for compatibility + request.setAttribute("javax.servlet.jsp.jspException", e); + } + + // send the error response + response.sendError(code, e.getMessage()); + } catch (IOException e1) { + // we're already sending an error, not much else we can do if more stuff breaks + } + } + } +} 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 9c490ac32..36d858d6a 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -21,20 +21,8 @@ package org.apache.struts2.dispatcher; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionProxy; -import com.opensymphony.xwork2.ActionProxyFactory; -import com.opensymphony.xwork2.FileManager; -import com.opensymphony.xwork2.FileManagerFactory; -import com.opensymphony.xwork2.LocaleProvider; -import com.opensymphony.xwork2.ObjectFactory; -import com.opensymphony.xwork2.Result; -import com.opensymphony.xwork2.config.Configuration; -import com.opensymphony.xwork2.config.ConfigurationException; -import com.opensymphony.xwork2.config.ConfigurationManager; -import com.opensymphony.xwork2.config.ConfigurationProvider; -import com.opensymphony.xwork2.config.FileManagerFactoryProvider; -import com.opensymphony.xwork2.config.FileManagerProvider; +import com.opensymphony.xwork2.*; +import com.opensymphony.xwork2.config.*; import com.opensymphony.xwork2.config.entities.InterceptorMapping; import com.opensymphony.xwork2.config.entities.InterceptorStackConfig; import com.opensymphony.xwork2.config.entities.PackageConfig; @@ -53,7 +41,6 @@ import com.opensymphony.xwork2.util.location.LocationUtils; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; import com.opensymphony.xwork2.util.profiling.UtilTimerStack; -import freemarker.template.Template; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsException; @@ -68,7 +55,6 @@ import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; import org.apache.struts2.util.AttributeMap; import org.apache.struts2.util.ObjectFactoryDestroyable; import org.apache.struts2.util.fs.JBossFileManager; -import org.apache.struts2.views.freemarker.FreemarkerManager; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -76,16 +62,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -168,6 +145,11 @@ public class Dispatcher { */ private boolean handleException; + /** + * Interface used to handle internal errors or missing resources + */ + private DispatcherErrorHandler errorHandler; + /** * Provide the dispatcher instance for the current thread. * @@ -280,6 +262,11 @@ public class Dispatcher { this.handleException = Boolean.parseBoolean(handleException); } + @Inject + public void setDispatcherErrorHandler(DispatcherErrorHandler errorHandler) { + this.errorHandler = errorHandler; + } + /** * Releases all instances bound to this dispatcher instance. */ @@ -492,6 +479,10 @@ public class Dispatcher { l.dispatcherInitialized(this); } } + //if (servletContext != null) { + errorHandler.init(servletContext); + //} + } catch (Exception ex) { if (LOG.isErrorEnabled()) LOG.error("Dispatcher initialization failed", ex); @@ -847,70 +838,26 @@ public class Dispatcher { * @param code the HttpServletResponse error code (see {@link javax.servlet.http.HttpServletResponse} for possible error codes). * @param e the Exception that is reported. * @param ctx the ServletContext object. + * + * @deprecated remove in version 3.0 - use version without ServletContext parameter */ + @Deprecated public void sendError(HttpServletRequest request, HttpServletResponse response, ServletContext ctx, int code, Exception e) { - Boolean devModeOverride = FilterDispatcher.getDevModeOverride(); - if (devModeOverride != null ? devModeOverride : devMode) { - if (LOG.isDebugEnabled()) { - LOG.debug("Exception occurred during processing request: #0", e, e.getMessage()); - } - try { - FreemarkerManager mgr = getContainer().getInstance(FreemarkerManager.class); + sendError(request, response, code, e); + } - freemarker.template.Configuration config = mgr.getConfiguration(ctx); - Template template = config.getTemplate("/org/apache/struts2/dispatcher/error.ftl"); - - List chain = new ArrayList(); - Throwable cur = e; - chain.add(cur); - while ((cur = cur.getCause()) != null) { - chain.add(cur); - } - - HashMap data = new HashMap(); - data.put("exception", e); - data.put("unknown", Location.UNKNOWN); - data.put("chain", chain); - data.put("locator", new Locator()); - - Writer writer = new StringWriter(); - template.process(data, writer); - - response.setContentType("text/html"); - response.getWriter().write(writer.toString()); - response.getWriter().close(); - } catch (Exception exp) { - try { - if (LOG.isDebugEnabled()) { - LOG.debug("Cannot show problem report!", exp); - } - response.sendError(code, "Unable to show problem report:\n" + exp + "\n\n" + LocationUtils.getLocation(exp)); - } catch (IOException ex) { - // we're already sending an error, not much else we can do if more stuff breaks - } - } - } else { - try { - // WW-1977: Only put errors in the request when code is a 500 error - if (code == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) { - // WW-4103: Only logs error when application error occurred, not Struts error - if (LOG.isErrorEnabled()) { - LOG.error("Exception occurred during processing request: #0", e, e.getMessage()); - } - // send a http error response to use the servlet defined error handler - // make the exception availible to the web.xml defined error page - request.setAttribute("javax.servlet.error.exception", e); - - // for compatibility - request.setAttribute("javax.servlet.jsp.jspException", e); - } - - // send the error response - response.sendError(code, e.getMessage()); - } catch (IOException e1) { - // we're already sending an error, not much else we can do if more stuff breaks - } - } + /** + * Send an HTTP error response code. + * + * @param request the HttpServletRequest object. + * @param response the HttpServletResponse object. + * @param code the HttpServletResponse error code (see {@link javax.servlet.http.HttpServletResponse} for possible error codes). + * @param e the Exception that is reported. + * + * @since 2.3.17 + */ + public void sendError(HttpServletRequest request, HttpServletResponse response, int code, Exception e) { + errorHandler.handleError(request, response, code, e); } /** diff --git a/core/src/main/java/org/apache/struts2/dispatcher/DispatcherErrorHandler.java b/core/src/main/java/org/apache/struts2/dispatcher/DispatcherErrorHandler.java new file mode 100644 index 000000000..fe8f6ecc7 --- /dev/null +++ b/core/src/main/java/org/apache/struts2/dispatcher/DispatcherErrorHandler.java @@ -0,0 +1,29 @@ +package org.apache.struts2.dispatcher; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Implementation of this interface is used to handle internal errors or missing resources. + * Basically it sends back HTTP error codes or error page depends on requirements. + */ +public interface DispatcherErrorHandler { + + /** + * Init instance after creating {@link org.apache.struts2.dispatcher.Dispatcher} + * @param ctx current {@link javax.servlet.ServletContext} + */ + public void init(ServletContext ctx); + + /** + * Handle passed error code or exception + * + * @param request current {@link javax.servlet.http.HttpServletRequest} + * @param response current {@link javax.servlet.http.HttpServletResponse} + * @param code HTTP Error Code, see {@link javax.servlet.http.HttpServletResponse} for possible error codes + * @param e Exception to report + */ + public void handleError(HttpServletRequest request, HttpServletResponse response, int code, Exception e); + +} diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index 635b241cb..c65963af8 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -132,6 +132,10 @@ + + + + From e98cd4005ac790311ab9be566bdcc4f2c34cc690 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 16 Feb 2014 18:37:17 +0100 Subject: [PATCH 02/80] WW-3887 Updates unit tests to match the new error handling mechanism --- .../config/DefaultBeanSelectionProvider.java | 3 +++ .../dispatcher/FilterDispatcherTest.java | 5 +++++ .../CodebehindUnknownHandlerTest.java | 2 ++ .../struts2/views/jsp/PortletUrlTagTest.java | 22 +++++++------------ 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java index c4d89032d..b6b5b4590 100644 --- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java @@ -60,6 +60,7 @@ import com.opensymphony.xwork2.util.reflection.ReflectionProvider; import com.opensymphony.xwork2.validator.ActionValidatorManager; import org.apache.struts2.StrutsConstants; import org.apache.struts2.components.UrlRenderer; +import org.apache.struts2.dispatcher.DispatcherErrorHandler; import org.apache.struts2.dispatcher.StaticContentLoader; import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.dispatcher.multipart.MultiPartRequest; @@ -380,6 +381,8 @@ public class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider alias(TextParser.class, StrutsConstants.STRUTS_EXPRESSION_PARSER, builder, props); + alias(DispatcherErrorHandler.class, StrutsConstants.STRUTS_DISPATCHER_ERROR_HANDLER, builder, props); + switchDevMode(props); // Convert Struts properties into XWork properties 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 0d2845604..3a6b761fe 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java @@ -125,6 +125,11 @@ public class FilterDispatcherTest extends StrutsInternalTestCase { public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException { serviceRequest = true; } + + @Override + public void sendError(HttpServletRequest request, HttpServletResponse response, ServletContext ctx, int code, Exception e) { + // NO-OP + } } public static class InnerDispatcher extends Dispatcher { diff --git a/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java b/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java index dada8161d..e6cff7965 100644 --- a/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java +++ b/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java @@ -29,6 +29,7 @@ import com.opensymphony.xwork2.config.entities.ResultTypeConfig; import com.opensymphony.xwork2.util.XWorkTestCaseHelper; import org.apache.struts2.StrutsTestCase; import org.apache.struts2.dispatcher.ServletDispatcherResult; +import org.springframework.mock.web.MockServletContext; import javax.servlet.ServletContext; import java.net.MalformedURLException; @@ -46,6 +47,7 @@ public class CodebehindUnknownHandlerTest extends StrutsTestCase { configuration = configurationManager.getConfiguration(); container = configuration.getContainer(); actionProxyFactory = container.getInstance(ActionProxyFactory.class); + servletContext = new MockServletContext(); initDispatcher(Collections.singletonMap("actionPackages", "foo.bar")); mockServletContext = new Mock(ServletContext.class); handler = new CodebehindUnknownHandler("codebehind-default", configuration); diff --git a/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java b/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java index 5f34cfc81..8bdb3fbcb 100644 --- a/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java +++ b/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java @@ -35,21 +35,14 @@ import org.apache.struts2.portlet.util.PortletUrlHelper; import org.jmock.Mock; import org.jmock.cglib.MockObjectTestCase; import org.jmock.core.Constraint; +import org.springframework.mock.web.MockServletContext; -import javax.portlet.PortletContext; -import javax.portlet.PortletMode; -import javax.portlet.PortletURL; -import javax.portlet.RenderRequest; -import javax.portlet.RenderResponse; -import javax.portlet.WindowState; +import javax.portlet.*; +import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; +import java.util.*; import static org.apache.struts2.StrutsStatics.STRUTS_PORTLET_CONTEXT; @@ -92,7 +85,8 @@ public class PortletUrlTagTest extends MockObjectTestCase { public void setUp() throws Exception { super.setUp(); - dispatcher = new Dispatcher(null, new HashMap()); + ServletContext servletContext = new MockServletContext(); + dispatcher = new Dispatcher(servletContext, new HashMap()); dispatcher.init(); Dispatcher.setInstance(dispatcher); @@ -100,7 +94,7 @@ public class PortletUrlTagTest extends MockObjectTestCase { stack.getContext().put(ActionContext.CONTAINER, dispatcher.getContainer()); ActionContext context = new ActionContext(stack.getContext()); ActionContext.setContext(context); - + mockActionInvocation = mock(ActionInvocation.class); mockActionProxy = mock(ActionProxy.class); mockHttpReq = mock(HttpServletRequest.class); @@ -111,7 +105,7 @@ public class PortletUrlTagTest extends MockObjectTestCase { mockPortletUrl = mock(PortletURL.class); mockJspWriter = new MockJspWriter(); mockCtx = mock(PortletContext.class); - + mockActionProxy.stubs().method("getNamespace").will(returnValue("/view")); mockActionInvocation.stubs().method("getProxy").will(returnValue( mockActionProxy.proxy())); From 51629304b3e7447a0b5669a85e16a6d43bff94a9 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 16 Feb 2014 19:17:48 +0100 Subject: [PATCH 03/80] Sets proper output directory for reports --- .../java/com/opensymphony/xwork2/TestNGXWorkTestCaseTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/TestNGXWorkTestCaseTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/TestNGXWorkTestCaseTest.java index 7ab7dc221..d13ac13b2 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/TestNGXWorkTestCaseTest.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/TestNGXWorkTestCaseTest.java @@ -27,6 +27,7 @@ public class TestNGXWorkTestCaseTest extends TestCase { TestListenerAdapter tla = new TestListenerAdapter(); TestNG testng = new TestNG(); testng.setTestClasses(new Class[] { RunTest.class }); + testng.setOutputDirectory("target/surefire-reports"); testng.addListener(tla); try { testng.run(); From ef733aa9ee0afc7199b630d67e8e057be6341e86 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 16 Feb 2014 20:08:30 +0100 Subject: [PATCH 04/80] WW-3887 Uses new version of Dispatcher#sendError --- .../main/java/org/apache/struts2/dispatcher/Dispatcher.java | 4 ++-- .../java/org/apache/struts2/dispatcher/FilterDispatcher.java | 2 +- .../org/apache/struts2/dispatcher/ng/PrepareOperations.java | 2 +- .../org/apache/struts2/dispatcher/FilterDispatcherTest.java | 2 +- 4 files changed, 5 insertions(+), 5 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 36d858d6a..57a3dab39 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -555,10 +555,10 @@ public class Dispatcher { } } catch (ConfigurationException e) { logConfigurationException(request, e); - sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e); + sendError(request, response, HttpServletResponse.SC_NOT_FOUND, e); } catch (Exception e) { if (handleException || devMode) { - sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); + sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); } else { throw new ServletException(e); } 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 6f38026ef..970311ce5 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java @@ -409,7 +409,7 @@ public class FilterDispatcher implements StrutsStatics, Filter { mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager()); } catch (Exception ex) { log.error("error getting ActionMapping", ex); - dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex); + dispatcher.sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex); return; } 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 93e105510..a26a8b2d5 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 @@ -163,7 +163,7 @@ public class PrepareOperations { request.setAttribute(STRUTS_ACTION_MAPPING_KEY, mapping); } } catch (Exception ex) { - dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex); + dispatcher.sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex); } } 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 3a6b761fe..2c2d747ba 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java @@ -127,7 +127,7 @@ public class FilterDispatcherTest extends StrutsInternalTestCase { } @Override - public void sendError(HttpServletRequest request, HttpServletResponse response, ServletContext ctx, int code, Exception e) { + public void sendError(HttpServletRequest request, HttpServletResponse response, int code, Exception e) { // NO-OP } } From 701f0a06d0f9ffb50ad9927e949d90e7f578a087 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 16 Feb 2014 20:15:37 +0100 Subject: [PATCH 05/80] WW-3887 Extracts methods --- .../DefaultDispatcherErrorHandler.java | 112 ++++++++++-------- 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java b/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java index b09c890a1..c093402f1 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java @@ -20,6 +20,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +/** + * Default implementation of {@link org.apache.struts2.dispatcher.DispatcherErrorHandler} + * which sends Error Report in devMode or {@link javax.servlet.http.HttpServletResponse#sendError} otherwise. + */ public class DefaultDispatcherErrorHandler implements DispatcherErrorHandler { private static final Logger LOG = LoggerFactory.getLogger(DefaultDispatcherErrorHandler.class); @@ -50,61 +54,71 @@ public class DefaultDispatcherErrorHandler implements DispatcherErrorHandler { public void handleError(HttpServletRequest request, HttpServletResponse response, int code, Exception e) { Boolean devModeOverride = FilterDispatcher.getDevModeOverride(); if (devModeOverride != null ? devModeOverride : devMode) { - if (LOG.isDebugEnabled()) { - LOG.debug("Exception occurred during processing request: #0", e, e.getMessage()); - } - try { - - List chain = new ArrayList(); - Throwable cur = e; - chain.add(cur); - while ((cur = cur.getCause()) != null) { - chain.add(cur); - } - - HashMap data = new HashMap(); - data.put("exception", e); - data.put("unknown", Location.UNKNOWN); - data.put("chain", chain); - data.put("locator", new Dispatcher.Locator()); - - Writer writer = new StringWriter(); - template.process(data, writer); - - response.setContentType("text/html"); - response.getWriter().write(writer.toString()); - response.getWriter().close(); - } catch (Exception exp) { - try { - if (LOG.isDebugEnabled()) { - LOG.debug("Cannot show problem report!", exp); - } - response.sendError(code, "Unable to show problem report:\n" + exp + "\n\n" + LocationUtils.getLocation(exp)); - } catch (IOException ex) { - // we're already sending an error, not much else we can do if more stuff breaks - } - } + handleErrorInDevMode(response, code, e); } else { - try { - // WW-1977: Only put errors in the request when code is a 500 error - if (code == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) { - // WW-4103: Only logs error when application error occurred, not Struts error - if (LOG.isErrorEnabled()) { - LOG.error("Exception occurred during processing request: #0", e, e.getMessage()); - } - // send a http error response to use the servlet defined error handler - // make the exception availible to the web.xml defined error page - request.setAttribute("javax.servlet.error.exception", e); + sendErrorResponse(request, response, code, e); + } + } - // for compatibility - request.setAttribute("javax.servlet.jsp.jspException", e); + protected void sendErrorResponse(HttpServletRequest request, HttpServletResponse response, int code, Exception e) { + try { + // WW-1977: Only put errors in the request when code is a 500 error + if (code == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) { + // WW-4103: Only logs error when application error occurred, not Struts error + if (LOG.isErrorEnabled()) { + LOG.error("Exception occurred during processing request: #0", e, e.getMessage()); } + // send a http error response to use the servlet defined error handler + // make the exception available to the web.xml defined error page + request.setAttribute("javax.servlet.error.exception", e); - // send the error response - response.sendError(code, e.getMessage()); - } catch (IOException e1) { + // for compatibility + request.setAttribute("javax.servlet.jsp.jspException", e); + } + + // send the error response + response.sendError(code, e.getMessage()); + } catch (IOException e1) { + // we're already sending an error, not much else we can do if more stuff breaks + } + } + + protected void handleErrorInDevMode(HttpServletResponse response, int code, Exception e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Exception occurred during processing request: #0", e, e.getMessage()); + } + try { + List chain = new ArrayList(); + Throwable cur = e; + chain.add(cur); + while ((cur = cur.getCause()) != null) { + chain.add(cur); + } + + Writer writer = new StringWriter(); + template.process(createReportData(e, chain), writer); + + response.setContentType("text/html"); + response.getWriter().write(writer.toString()); + response.getWriter().close(); + } catch (Exception exp) { + try { + if (LOG.isDebugEnabled()) { + LOG.debug("Cannot show problem report!", exp); + } + response.sendError(code, "Unable to show problem report:\n" + exp + "\n\n" + LocationUtils.getLocation(exp)); + } catch (IOException ex) { // we're already sending an error, not much else we can do if more stuff breaks } } } + + protected HashMap createReportData(Exception e, List chain) { + HashMap data = new HashMap(); + data.put("exception", e); + data.put("unknown", Location.UNKNOWN); + data.put("chain", chain); + data.put("locator", new Dispatcher.Locator()); + return data; + } } From 17a9a9d56b4c13ac5b328ae41b75e6e7531359d3 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 16 Feb 2014 20:21:07 +0100 Subject: [PATCH 06/80] WW-3887 Updates @see reference --- .../src/main/java/org/apache/struts2/dispatcher/Dispatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 57a3dab39..032df3617 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -70,7 +70,7 @@ import java.util.concurrent.CopyOnWriteArrayList; * of the primary dispatcher holds an instance of this dispatcher to be shared for * all requests. * - * @see org.apache.struts2.dispatcher.FilterDispatcher + * @see org.apache.struts2.dispatcher.ng.InitOperations */ public class Dispatcher { From 01d401ea1498671458ac59ef1e7f84961a5cdcc9 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 17 Feb 2014 09:29:40 +0100 Subject: [PATCH 07/80] 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 08/80] 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 09/80] 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 10/80] 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 11/80] 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 12/80] 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 13/80] 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 14/80] 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 15/80] 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 16/80] 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 17/80] 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. * From ff2a4063c2cae132f0a1432d6b9f11d4e9ea6efd Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 19 Feb 2014 10:22:36 +0100 Subject: [PATCH 18/80] WW-4292 Solves problem with failing tests --- .../org/apache/struts2/dispatcher/FilterDispatcherTest.java | 4 ++-- .../test/java/org/apache/struts2/dispatcher/FilterTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 4449e40d4..136c5c3df 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java @@ -117,7 +117,7 @@ public class FilterDispatcherTest extends StrutsInternalTestCase { } @Override - public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException { + public HttpServletRequest wrapRequest(HttpServletRequest request) throws IOException { wrappedRequest = true; return request; } @@ -142,7 +142,7 @@ public class FilterDispatcherTest extends StrutsInternalTestCase { } @Override - public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException { + public HttpServletRequest wrapRequest(HttpServletRequest request) throws IOException { wrappedRequest = 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 12f9a64ab..5d1647d37 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/FilterTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/FilterTest.java @@ -307,7 +307,7 @@ public class FilterTest extends StrutsInternalTestCase { } @Override - public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException { + public HttpServletRequest wrapRequest(HttpServletRequest request) throws IOException { wrapRequest = true; return request; } From 7d383d6d395cae318b505065df7dab9ce8c13fae Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 19 Feb 2014 16:28:54 +0100 Subject: [PATCH 19/80] WW-4286 Upgrades commons-fileupload to version 1.3.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4444e90b7..d1177998a 100644 --- a/pom.xml +++ b/pom.xml @@ -669,7 +669,7 @@ commons-fileupload commons-fileupload - 1.3 + 1.3.1 commons-io From 6b00db2d23acf93f83563715aa0deaeb0a245785 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 25 Feb 2014 10:56:53 +0100 Subject: [PATCH 20/80] Moves jsps under WEB-INF --- .../src/main/resources/example.xml | 6 +- .../{ => WEB-INF/jsp}/example/HelloWorld.jsp | 56 +++++++++---------- .../{ => WEB-INF/jsp}/example/Login.jsp | 30 +++++----- .../webapp/{ => WEB-INF/jsp}/example/Menu.jsp | 4 +- .../{ => WEB-INF/jsp}/example/Missing.jsp | 22 ++++---- .../{ => WEB-INF/jsp}/example/Register.jsp | 4 +- .../{ => WEB-INF/jsp}/example/Welcome.jsp | 36 ++++++------ 7 files changed, 79 insertions(+), 79 deletions(-) rename apps/jboss-blank/src/main/webapp/{ => WEB-INF/jsp}/example/HelloWorld.jsp (95%) rename apps/jboss-blank/src/main/webapp/{ => WEB-INF/jsp}/example/Login.jsp (95%) rename apps/jboss-blank/src/main/webapp/{ => WEB-INF/jsp}/example/Menu.jsp (73%) rename apps/jboss-blank/src/main/webapp/{ => WEB-INF/jsp}/example/Missing.jsp (95%) rename apps/jboss-blank/src/main/webapp/{ => WEB-INF/jsp}/example/Register.jsp (73%) rename apps/jboss-blank/src/main/webapp/{ => WEB-INF/jsp}/example/Welcome.jsp (95%) diff --git a/apps/jboss-blank/src/main/resources/example.xml b/apps/jboss-blank/src/main/resources/example.xml index e93d84e7b..d929de1c8 100644 --- a/apps/jboss-blank/src/main/resources/example.xml +++ b/apps/jboss-blank/src/main/resources/example.xml @@ -8,16 +8,16 @@ - /example/HelloWorld.jsp + /WEB-INF/jsp/example/HelloWorld.jsp - /example/Login.jsp + /WEB-INF/jsp/example/Login.jsp Menu - /example/{1}.jsp + /WEB-INF/jsp/example/{1}.jsp diff --git a/apps/jboss-blank/src/main/webapp/example/HelloWorld.jsp b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/HelloWorld.jsp similarity index 95% rename from apps/jboss-blank/src/main/webapp/example/HelloWorld.jsp rename to apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/HelloWorld.jsp index 5ca640283..938c76132 100644 --- a/apps/jboss-blank/src/main/webapp/example/HelloWorld.jsp +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/HelloWorld.jsp @@ -1,28 +1,28 @@ -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="s" uri="/struts-tags" %> - - - <s:text name="HelloWorld.message"/> - - - -

- -

Languages

-
    -
  • - - en - - English -
  • -
  • - - es - - Espanol -
  • -
- - - +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + + + <s:text name="HelloWorld.message"/> + + + +

+ +

Languages

+
    +
  • + + en + + English +
  • +
  • + + es + + Espanol +
  • +
+ + + diff --git a/apps/jboss-blank/src/main/webapp/example/Login.jsp b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Login.jsp similarity index 95% rename from apps/jboss-blank/src/main/webapp/example/Login.jsp rename to apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Login.jsp index 2b77ac2bf..6438080a3 100644 --- a/apps/jboss-blank/src/main/webapp/example/Login.jsp +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Login.jsp @@ -1,15 +1,15 @@ -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="s" uri="/struts-tags" %> - - - Sign On - - - - - - - - - - +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + + + Sign On + + + + + + + + + + diff --git a/apps/jboss-blank/src/main/webapp/example/Menu.jsp b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Menu.jsp similarity index 73% rename from apps/jboss-blank/src/main/webapp/example/Menu.jsp rename to apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Menu.jsp index 3fbc54be9..a74bd2c76 100644 --- a/apps/jboss-blank/src/main/webapp/example/Menu.jsp +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Menu.jsp @@ -1,3 +1,3 @@ -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="s" uri="/struts-tags" %> +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> \ No newline at end of file diff --git a/apps/jboss-blank/src/main/webapp/example/Missing.jsp b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Missing.jsp similarity index 95% rename from apps/jboss-blank/src/main/webapp/example/Missing.jsp rename to apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Missing.jsp index d2f002301..7c01ac9be 100644 --- a/apps/jboss-blank/src/main/webapp/example/Missing.jsp +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Missing.jsp @@ -1,11 +1,11 @@ -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="s" uri="/struts-tags" %> - -Missing Feature - - -

- -

- - +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + +Missing Feature + + +

+ +

+ + diff --git a/apps/jboss-blank/src/main/webapp/example/Register.jsp b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Register.jsp similarity index 73% rename from apps/jboss-blank/src/main/webapp/example/Register.jsp rename to apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Register.jsp index 3fbc54be9..a74bd2c76 100644 --- a/apps/jboss-blank/src/main/webapp/example/Register.jsp +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Register.jsp @@ -1,3 +1,3 @@ -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="s" uri="/struts-tags" %> +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> \ No newline at end of file diff --git a/apps/jboss-blank/src/main/webapp/example/Welcome.jsp b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Welcome.jsp similarity index 95% rename from apps/jboss-blank/src/main/webapp/example/Welcome.jsp rename to apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Welcome.jsp index 23ae4b862..64ffe9b10 100644 --- a/apps/jboss-blank/src/main/webapp/example/Welcome.jsp +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/jsp/example/Welcome.jsp @@ -1,18 +1,18 @@ -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="s" uri="/struts-tags" %> - - - Welcome - " rel="stylesheet" - type="text/css"/> - - - -

Commands

- - - - +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> + + + Welcome + " rel="stylesheet" + type="text/css"/> + + + +

Commands

+ + + + From 6f43464fcaab59e7345a3e394db4a969cf410d15 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 25 Feb 2014 10:57:21 +0100 Subject: [PATCH 21/80] Adds security constraints to block access to jsp files --- .../src/main/webapp/WEB-INF/web.xml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml b/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml index 490247991..88c6fc8e5 100644 --- a/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml @@ -17,4 +17,24 @@ index.html + + + No direct JSP access + + No-JSP + *.jsp + + + no-users + + + NONE + + + + + Don't assign users to this role + no-users + + From 5d0cf8baca45594ca7b6b4e7160e03f59cb258de Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 25 Feb 2014 11:08:29 +0100 Subject: [PATCH 22/80] Reverts validation of properties via dedicated SecurityJudge interface --- .../xwork2/interceptor/ParametersInterceptor.java | 8 -------- .../opensymphony/xwork2/ognl/OgnlValueStack.java | 4 ---- .../opensymphony/xwork2/ognl/PropertiesJudge.java | 7 ------- .../xwork2/ognl/SecurityMemberAccess.java | 13 +------------ .../xwork2/util/MemberAccessValueStack.java | 4 ---- 5 files changed, 1 insertion(+), 35 deletions(-) delete mode 100644 xwork-core/src/main/java/com/opensymphony/xwork2/ognl/PropertiesJudge.java diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java index 9dfae951a..75911a8b8 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java @@ -22,7 +22,6 @@ import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.ognl.PropertiesJudge; import com.opensymphony.xwork2.util.ArrayUtils; import com.opensymphony.xwork2.util.ClearableValueStack; import com.opensymphony.xwork2.util.LocalizedTextUtil; @@ -313,13 +312,6 @@ public class ParametersInterceptor extends MethodFilterInterceptor { MemberAccessValueStack accessValueStack = (MemberAccessValueStack) newStack; accessValueStack.setAcceptProperties(acceptParams); accessValueStack.setExcludeProperties(excludeParams); - if (action instanceof ParameterNameAware) { - accessValueStack.setPropertiesJudge(new PropertiesJudge() { - public boolean acceptProperty(String propertyName) { - return ((ParameterNameAware) action).acceptableParameterName(propertyName); - } - }); - } } for (Map.Entry entry : acceptableParameters.entrySet()) { diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java index 138db581a..76f0d3fb9 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java @@ -465,10 +465,6 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS securityMemberAccess.setAcceptProperties(acceptedProperties); } - public void setPropertiesJudge(PropertiesJudge judge) { - securityMemberAccess.setPropertiesJudge(judge); - } - public void setExcludeProperties(Set excludeProperties) { securityMemberAccess.setExcludeProperties(excludeProperties); } diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/PropertiesJudge.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/PropertiesJudge.java deleted file mode 100644 index ed27c0f42..000000000 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/PropertiesJudge.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.opensymphony.xwork2.ognl; - -public interface PropertiesJudge { - - boolean acceptProperty(String propertyName); - -} diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java index b6d3d3fbf..7bbcbda10 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java @@ -35,7 +35,6 @@ public class SecurityMemberAccess extends DefaultMemberAccess { private final boolean allowStaticMethodAccess; private Set excludeProperties = Collections.emptySet(); private Set acceptProperties = Collections.emptySet(); - private PropertiesJudge propertiesJudge; public SecurityMemberAccess(boolean method) { super(false); @@ -76,14 +75,7 @@ public class SecurityMemberAccess extends DefaultMemberAccess { } protected boolean isAcceptableProperty(String name) { - if ( name == null) { - return true; - } - - if ((!isExcluded(name)) && isAccepted(name) && (propertiesJudge == null || propertiesJudge.acceptProperty(name))) { - return true; - } - return false; + return name == null || ((!isExcluded(name)) && isAccepted(name)); } protected boolean isAccepted(String paramName) { @@ -123,7 +115,4 @@ public class SecurityMemberAccess extends DefaultMemberAccess { this.acceptProperties = acceptedProperties; } - public void setPropertiesJudge(PropertiesJudge judge) { - this.propertiesJudge = judge; - } } diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/util/MemberAccessValueStack.java b/xwork-core/src/main/java/com/opensymphony/xwork2/util/MemberAccessValueStack.java index 210d67ff9..51f4e489c 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/util/MemberAccessValueStack.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/util/MemberAccessValueStack.java @@ -1,7 +1,5 @@ package com.opensymphony.xwork2.util; -import com.opensymphony.xwork2.ognl.PropertiesJudge; - import java.util.Set; import java.util.regex.Pattern; @@ -15,6 +13,4 @@ public interface MemberAccessValueStack { void setAcceptProperties(Set acceptedProperties); - void setPropertiesJudge(PropertiesJudge judge); - } From 9c5177c961fb850b80089ef4113a17d361c23fa6 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Fri, 28 Feb 2014 10:11:46 +0100 Subject: [PATCH 23/80] WW-4266 Adds support for IBM JVM to reload resources --- .../com/opensymphony/xwork2/util/LocalizedTextUtil.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java b/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java index 1f7742830..8256cfb0d 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java @@ -791,7 +791,14 @@ public class LocalizedTextUtil { } if (!reloaded) { bundlesMap.clear(); - clearMap(ResourceBundle.class, null, "cacheList"); + try { + clearMap(ResourceBundle.class, null, "cacheList"); + } catch (NoSuchFieldException e) { + // happens in IBM JVM, that has a different ResourceBundle impl + // it has a 'cache' member + clearMap(ResourceBundle.class, null, "cache"); + } + // now, for the true and utter hack, if we're running in tomcat, clear // it's class loader resource cache as well. clearTomcatCache(); From 95b309a9b93eebadb589a335947598d815add80b Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 2 Mar 2014 21:13:38 +0100 Subject: [PATCH 24/80] Adds security constraints to web.xml to block access to pure JSP files --- apps/blank/src/main/webapp/WEB-INF/web.xml | 5 +++++ .../jboss-blank/src/main/webapp/WEB-INF/web.xml | 3 --- apps/mailreader/src/main/webapp/WEB-INF/web.xml | 17 +++++++++++++++++ apps/portlet/src/main/webapp/WEB-INF/web.xml | 17 +++++++++++++++++ .../src/main/webapp/WEB-INF/web.xml | 17 +++++++++++++++++ apps/showcase/src/main/webapp/WEB-INF/web.xml | 17 +++++++++++++++++ 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/apps/blank/src/main/webapp/WEB-INF/web.xml b/apps/blank/src/main/webapp/WEB-INF/web.xml index e8c0f4654..f15252bb9 100644 --- a/apps/blank/src/main/webapp/WEB-INF/web.xml +++ b/apps/blank/src/main/webapp/WEB-INF/web.xml @@ -31,4 +31,9 @@ + + Don't assign users to this role + no-users + + diff --git a/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml b/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml index 88c6fc8e5..d1cf0209c 100644 --- a/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml +++ b/apps/jboss-blank/src/main/webapp/WEB-INF/web.xml @@ -27,9 +27,6 @@ no-users - - NONE - diff --git a/apps/mailreader/src/main/webapp/WEB-INF/web.xml b/apps/mailreader/src/main/webapp/WEB-INF/web.xml index 9b35ec3ef..b01d86447 100644 --- a/apps/mailreader/src/main/webapp/WEB-INF/web.xml +++ b/apps/mailreader/src/main/webapp/WEB-INF/web.xml @@ -27,4 +27,21 @@ index.html + + + No direct JSP access + + No-JSP + *.jsp + + + no-users + + + + + Don't assign users to this role + no-users + + diff --git a/apps/portlet/src/main/webapp/WEB-INF/web.xml b/apps/portlet/src/main/webapp/WEB-INF/web.xml index f42441989..d4a3c79ff 100644 --- a/apps/portlet/src/main/webapp/WEB-INF/web.xml +++ b/apps/portlet/src/main/webapp/WEB-INF/web.xml @@ -28,4 +28,21 @@ + + + No direct JSP access + + No-JSP + *.jsp + + + no-users + + + + + Don't assign users to this role + no-users + + diff --git a/apps/rest-showcase/src/main/webapp/WEB-INF/web.xml b/apps/rest-showcase/src/main/webapp/WEB-INF/web.xml index d10c214cc..694c349c2 100644 --- a/apps/rest-showcase/src/main/webapp/WEB-INF/web.xml +++ b/apps/rest-showcase/src/main/webapp/WEB-INF/web.xml @@ -26,4 +26,21 @@ index.jsp + + + No direct JSP access + + No-JSP + *.jsp + + + no-users + + + + + Don't assign users to this role + no-users + + diff --git a/apps/showcase/src/main/webapp/WEB-INF/web.xml b/apps/showcase/src/main/webapp/WEB-INF/web.xml index 62335a4af..f3b88e916 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/web.xml +++ b/apps/showcase/src/main/webapp/WEB-INF/web.xml @@ -194,4 +194,21 @@ index.html + + + No direct JSP access + + No-JSP + *.jsp + + + no-users + + + + + Don't assign users to this role + no-users + + From d07e8044beef98222f0140adb0b4e2892b6bf166 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 2 Mar 2014 21:17:30 +0100 Subject: [PATCH 25/80] Moves mailreader related JSPs under WEB-INF --- apps/mailreader/src/main/java/mailreader-support.xml | 10 +++++----- .../main/webapp/{ => WEB-INF/jsp}/ChangePassword.jsp | 0 .../src/main/webapp/{ => WEB-INF/jsp}/Error.jsp | 0 .../src/main/webapp/{ => WEB-INF/jsp}/Footer.jsp | 0 .../src/main/webapp/{ => WEB-INF/jsp}/Login.jsp | 0 .../src/main/webapp/{ => WEB-INF/jsp}/MainMenu.jsp | 0 .../src/main/webapp/{ => WEB-INF/jsp}/Registration.jsp | 0 .../src/main/webapp/{ => WEB-INF/jsp}/Subscription.jsp | 0 .../src/main/webapp/{ => WEB-INF/jsp}/Welcome.jsp | 0 9 files changed, 5 insertions(+), 5 deletions(-) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/ChangePassword.jsp (100%) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/Error.jsp (100%) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/Footer.jsp (100%) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/Login.jsp (100%) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/MainMenu.jsp (100%) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/Registration.jsp (100%) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/Subscription.jsp (100%) rename apps/mailreader/src/main/webapp/{ => WEB-INF/jsp}/Welcome.jsp (100%) diff --git a/apps/mailreader/src/main/java/mailreader-support.xml b/apps/mailreader/src/main/java/mailreader-support.xml index a6995431e..2438cb4a7 100644 --- a/apps/mailreader/src/main/java/mailreader-support.xml +++ b/apps/mailreader/src/main/java/mailreader-support.xml @@ -12,7 +12,7 @@ - /Welcome.jsp + /WEB-INF/jsp/Welcome.jsp @@ -21,7 +21,7 @@ - /Login.jsp + /WEB-INF/jsp/Login.jsp Welcome MainMenu ChangePassword @@ -32,7 +32,7 @@ - /Registration.jsp + /WEB-INF/jsp/Registration.jsp MainMenu @@ -41,7 +41,7 @@ - /Subscription.jsp + /WEB-INF/jsp/Subscription.jsp Registration_input @@ -56,7 +56,7 @@ - /{1}.jsp + /WEB-INF/jsp/{1}.jsp diff --git a/apps/mailreader/src/main/webapp/ChangePassword.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/ChangePassword.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/ChangePassword.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/ChangePassword.jsp diff --git a/apps/mailreader/src/main/webapp/Error.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/Error.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/Error.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/Error.jsp diff --git a/apps/mailreader/src/main/webapp/Footer.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/Footer.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/Footer.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/Footer.jsp diff --git a/apps/mailreader/src/main/webapp/Login.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/Login.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/Login.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/Login.jsp diff --git a/apps/mailreader/src/main/webapp/MainMenu.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/MainMenu.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/MainMenu.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/MainMenu.jsp diff --git a/apps/mailreader/src/main/webapp/Registration.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/Registration.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/Registration.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/Registration.jsp diff --git a/apps/mailreader/src/main/webapp/Subscription.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/Subscription.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/Subscription.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/Subscription.jsp diff --git a/apps/mailreader/src/main/webapp/Welcome.jsp b/apps/mailreader/src/main/webapp/WEB-INF/jsp/Welcome.jsp similarity index 100% rename from apps/mailreader/src/main/webapp/Welcome.jsp rename to apps/mailreader/src/main/webapp/WEB-INF/jsp/Welcome.jsp From 65eb97514c635da87c60f2a7b0d6bbbdd79358ee Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 2 Mar 2014 22:02:49 +0100 Subject: [PATCH 26/80] Moves showcase related JSPs under WEB-INF --- .../main/resources/struts-actionchaining.xml | 2 +- .../src/main/resources/struts-ajax.xml | 42 +++++++------- .../src/main/resources/struts-chat.xml | 28 ++++----- .../src/main/resources/struts-conversion.xml | 40 ++++++------- .../src/main/resources/struts-fileupload.xml | 14 ++--- .../src/main/resources/struts-freemarker.xml | 4 +- .../src/main/resources/struts-hangman.xml | 18 +++--- .../src/main/resources/struts-integration.xml | 4 +- .../src/main/resources/struts-interactive.xml | 2 +- .../main/resources/struts-model-driven.xml | 4 +- .../src/main/resources/struts-tags-non-ui.xml | 54 +++++++++--------- .../src/main/resources/struts-tags-ui.xml | 42 +++++++------- .../src/main/resources/struts-tiles.xml | 2 +- .../src/main/resources/struts-token.xml | 24 ++++---- .../src/main/resources/struts-validation.xml | 30 +++++----- .../src/main/resources/struts-wait.xml | 12 ++-- apps/showcase/src/main/resources/struts.xml | 6 +- .../actionchaining/actionChainingResult.jsp | 0 .../webapp/{ => WEB-INF}/ajax/AjaxResult.jsp | 0 .../webapp/{ => WEB-INF}/ajax/AjaxResult2.js | 0 .../webapp/{ => WEB-INF}/ajax/AjaxResult3.jsp | 0 .../ajax/autocompleter/index.jsp | 2 +- .../webapp/{ => WEB-INF}/ajax/bind/index.jsp | 2 +- .../{ => WEB-INF}/ajax/commonInclude.jsp | 0 .../main/webapp/{ => WEB-INF}/ajax/footer.jsp | 2 +- .../main/webapp/{ => WEB-INF}/ajax/index.jsp | 0 .../webapp/{ => WEB-INF}/ajax/options.ftl | 0 .../{ => WEB-INF}/ajax/remotebutton/index.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example1.jsp | 2 +- .../ajax/remotediv/example10.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example2.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example3.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example4.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example5.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example6.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example7.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example8.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/example9.jsp | 2 +- .../{ => WEB-INF}/ajax/remotediv/index.jsp | 2 +- .../{ => WEB-INF}/ajax/remoteforms/index.jsp | 0 .../{ => WEB-INF}/ajax/remotelink/index.jsp | 2 +- .../ajax/tabbedpanel/example1.jsp | 2 +- .../ajax/tabbedpanel/example2.jsp | 2 +- .../ajax/tabbedpanel/example3.jsp | 2 +- .../ajax/tabbedpanel/example4.jsp | 2 +- .../ajax/tabbedpanel/example5.jsp | 2 +- .../ajax/tabbedpanel/example5Ok.jsp | 0 .../ajax/tabbedpanel/example6.jsp | 2 +- .../{ => WEB-INF}/ajax/tabbedpanel/index.jsp | 2 +- .../ajax/tabbedpanel/nodecorate/panel1.ftl | 0 .../ajax/tabbedpanel/nodecorate/panel2.ftl | 0 .../tabbedpanel/nodecorate/panel2Submit.ftl | 0 .../ajax/tabbedpanel/nodecorate/panel3.ftl | 0 .../tabbedpanel/nodecorate/panel3Submit.ftl | 0 .../main/webapp/{ => WEB-INF}/ajax/testjs.jsp | 0 .../{ => WEB-INF}/ajax/tree/getCategory.jsp | 0 .../ajax/tree/partialChunkHeader.jsp | 0 .../webapp/{ => WEB-INF}/ajax/tree/toggle.jsp | 0 .../webapp/{ => WEB-INF}/ajax/tree/tree.jsp | 0 .../{ => WEB-INF}/ajax/widgets/index.jsp | 2 +- .../webapp/{ => WEB-INF}/chat/chatLogin.ftl | 0 .../webapp/{ => WEB-INF}/chat/createRoom.ftl | 0 .../main/webapp/{ => WEB-INF}/chat/index.jsp | 0 .../chat/messagesAvailableInRoom.ftl | 0 .../{ => WEB-INF}/chat/roomSelection.ftl | 0 .../{ => WEB-INF}/chat/roomsAvailable.ftl | 0 .../chat/sendMessageToRoomResult.ftl | 0 .../webapp/{ => WEB-INF}/chat/showRoom.ftl | 0 .../{ => WEB-INF}/chat/usersAvailable.ftl | 0 .../chat/usersAvailableInRoom.ftl | 0 .../{ => WEB-INF}/conversion/Address.java.txt | 0 .../conversion/AddressAction.java.txt | 0 .../conversion/EnumTypeConverter.java.txt | 0 .../conversion/OperationsEnum.java.txt | 0 .../conversion/OperationsEnumAction.java.txt | 0 .../OperationsEnumActionConversion.txt | 0 .../{ => WEB-INF}/conversion/Person.java.txt | 0 .../conversion/PersonAction.java.txt | 0 .../conversion/enterAddressInfo.jsp | 0 .../conversion/enterOperations.jsp | 0 .../conversion/enterPersonInfo.jsp | 0 .../webapp/{ => WEB-INF}/conversion/index.jsp | 0 .../conversion/showAddressInfo.jsp | 0 .../conversion/showOperations.jsp | 0 .../conversion/showPersonInfo.jsp | 0 .../customTheme/ftlCustomTemplate.ftl | 0 .../customTheme/jspCustomTemplate.jsp | 0 .../src/main/webapp/{ => WEB-INF}/date.jsp | 0 .../{ => WEB-INF}/empmanager/editEmployee.jsp | 0 .../{ => WEB-INF}/empmanager/editSkill.jsp | 0 .../webapp/{ => WEB-INF}/empmanager/index.jsp | 0 .../empmanager/listEmployees.jsp | 0 .../{ => WEB-INF}/empmanager/listSkills.jsp | 0 .../{ => WEB-INF}/filedownload/index.jsp | 0 .../fileupload/multipleUploadUsingArray.jsp | 0 .../fileupload/multipleUploadUsingList.jsp | 0 .../fileupload/upload-success.jsp | 0 .../{ => WEB-INF}/fileupload/upload.jsp | 0 .../customFreemarkerManagerUsage.ftl | 0 .../webapp/{ => WEB-INF}/freemarker/index.jsp | 0 .../{ => WEB-INF}/freemarker/standardTags.ftl | 0 .../webapp/{ => WEB-INF}/hangman/blank.ftl | 0 .../{ => WEB-INF}/hangman/hangmanAjax.ftl | 0 .../{ => WEB-INF}/hangman/hangmanNonAjax.ftl | 0 .../hangman/updateCharacterAvailable.ftl | 0 .../{ => WEB-INF}/hangman/updateGuessLeft.ftl | 0 .../{ => WEB-INF}/hangman/updateScaffold.ftl | 0 .../hangman/updateVocabCharacters.ftl | 0 .../src/main/webapp/{ => WEB-INF}/help.jsp | 0 .../{ => WEB-INF}/integration/modelDriven.jsp | 0 .../integration/modelDrivenResult.jsp | 0 .../webapp/{ => WEB-INF}/interactive/demo.jsp | 0 .../interactive/example-action.jsp | 0 .../{ => WEB-INF}/interactive/index.jsp | 0 .../{ => WEB-INF}/interactive/jsp_0.jsp | 0 .../{ => WEB-INF}/interactive/jsp_1.jsp | 0 .../{ => WEB-INF}/interactive/jsp_2.jsp | 0 .../{ => WEB-INF}/interactive/jsp_3.jsp | 0 .../{ => WEB-INF}/interactive/jsp_4.jsp | 0 .../{ => WEB-INF}/interactive/ognl_0.jsp | 0 .../{ => WEB-INF}/interactive/ognl_1.jsp | 0 .../{ => WEB-INF}/interactive/ognl_2.jsp | 0 .../{ => WEB-INF}/interactive/ognl_3.jsp | 0 .../{ => WEB-INF}/interactive/ognl_4.jsp | 0 .../{ => WEB-INF}/interactive/ognl_5.jsp | 0 .../{ => WEB-INF}/interactive/ognl_6.jsp | 0 .../{ => WEB-INF}/interactive/ognl_7.jsp | 0 .../{ => WEB-INF}/interactive/ognl_8.jsp | 0 .../{ => WEB-INF}/jsf/employee/edit.jsp | 0 .../{ => WEB-INF}/jsf/employee/list.jsp | 0 .../main/webapp/{ => WEB-INF}/jsf/index.jsp | 0 .../{ => WEB-INF}/modelDriven/modelDriven.jsp | 0 .../modelDriven/modelDrivenResult.jsp | 0 .../{ => WEB-INF}/person/edit-person.jsp | 0 .../webapp/{ => WEB-INF}/person/index.jsp | 0 .../{ => WEB-INF}/person/list-people.ftl | 0 .../{ => WEB-INF}/person/new-person.ftl | 0 .../main/webapp/{ => WEB-INF}/showcase.jsp | 0 .../tags/non-ui/actionPrefix/actionPrefix.ftl | 0 .../actionPrefix/actionPrefixExample.ftl | 0 .../tags/non-ui/actionPrefix/methodPrefix.ftl | 0 .../tags/non-ui/actionPrefix/normalSubmit.ftl | 0 .../actionPrefix/redirectActionPrefix.ftl | 0 .../tags/non-ui/actionTag/includedPage.jsp | 0 .../tags/non-ui/actionTag/includedPage2.jsp | 0 .../tags/non-ui/actionTag/includedPage3.jsp | 0 .../non-ui/actionTag/showActionTagDemo.jsp | 0 .../webapp/{ => WEB-INF}/tags/non-ui/date.jsp | 0 .../{ => WEB-INF}/tags/non-ui/debug.jsp | 0 .../tags/non-ui/ifTag/testIf.ftl | 0 .../tags/non-ui/ifTag/testIf.jsp | 0 .../appendIteratorTagDemoResult.jsp | 0 .../iteratorGeneratorTagDemoResult.jsp | 0 .../mergeIteratorTagDemoResult.jsp | 0 .../iteratorTag/showAppendIteratorTagDemo.jsp | 0 .../showIteratorGeneratorTagDemo.jsp | 0 .../iteratorTag/showMergeIteratorTagDemo.jsp | 0 .../iteratorTag/subsetIteratorTagDemo.jsp | 0 .../subsetIteratorTagDemoResult.jsp | 0 .../tags/ui/actionTagExampleCalled.jsp | 2 +- .../tags/ui/actionTagExampleCalling.jsp | 46 +++++++-------- .../tags/ui/componentTagExample.jsp | 0 .../tags/ui/datepicker/index.jsp | 0 .../tags/ui/dynamicTreeSelect.jsp | 0 .../webapp/{ => WEB-INF}/tags/ui/example.jsp | 0 .../webapp/{ => WEB-INF}/tags/ui/example.vm | 0 .../{ => WEB-INF}/tags/ui/exampleSubmited.jsp | 0 .../{ => WEB-INF}/tags/ui/exampleSubmited.vm | 0 .../tags/ui/images/backgroundImage.jpg | Bin .../{ => WEB-INF}/tags/ui/images/leopard.jpg | Bin .../tags/ui/lotsOfOptiontransferselect.jsp | 0 .../ui/lotsOfOptiontransferselectSubmit.jsp | 0 .../{ => WEB-INF}/tags/ui/moreSelects.jsp | 0 .../tags/ui/moreSelectsSubmit.jsp | 0 .../tags/ui/staticTreeSelect.jsp | 0 .../tags/ui/timepicker/index.jsp | 0 .../tags/ui/treeExampleAjaxDynamic.ftl | 0 .../tags/ui/treeExampleAjaxDynamic.jsp | 0 .../tags/ui/treeExampleDynamic.jsp | 0 .../tags/ui/treeExampleStatic.jsp | 0 .../template/xhtml/mytemplate.jsp | 0 .../main/webapp/{ => WEB-INF}/tiles/body.ftl | 0 .../main/webapp/{ => WEB-INF}/tiles/body.jsp | 0 .../webapp/{ => WEB-INF}/tiles/header.jsp | 0 .../webapp/{ => WEB-INF}/tiles/layout.ftl | 0 .../webapp/{ => WEB-INF}/tiles/layout.jsp | 0 .../webapp/{ => WEB-INF}/token/doublePost.jsp | 0 .../webapp/{ => WEB-INF}/token/example1.jsp | 0 .../webapp/{ => WEB-INF}/token/example2.jsp | 0 .../webapp/{ => WEB-INF}/token/example3.jsp | 0 .../webapp/{ => WEB-INF}/token/example4.ftl | 0 .../main/webapp/{ => WEB-INF}/token/index.jsp | 0 .../{ => WEB-INF}/token/transferDone.jsp | 0 .../clientSideValidationExample.jsp | 0 .../validation/fieldValidatorsExample.jsp | 0 .../{ => WEB-INF}/validation/footer.jsp | 0 .../webapp/{ => WEB-INF}/validation/index.jsp | 0 .../validation/nonFieldValidatorsExample.jsp | 0 .../{ => WEB-INF}/validation/quiz-ajax.jsp | 0 .../{ => WEB-INF}/validation/quiz-basic.jsp | 0 .../validation/quiz-client-css.jsp | 0 .../{ => WEB-INF}/validation/quiz-client.jsp | 0 .../{ => WEB-INF}/validation/quiz-success.jsp | 0 .../storeErrorsAcrossRequestCancel.jsp | 0 .../storeErrorsAcrossRequestExample.jsp | 0 .../validation/storeErrorsAcrossRequestOk.jsp | 0 .../successClientSideValidationExample.jsp | 0 .../successFieldValidatorsExample.jsp | 0 .../successNonFieldValidatorsExample.jsp | 0 .../successVisitorValidatorsExample.jsp | 0 .../validation/visitorValidatorsExample.jsp | 0 .../main/webapp/{ => WEB-INF}/viewSource.jsp | 0 .../webapp/{ => WEB-INF}/wait/complete.jsp | 0 .../webapp/{ => WEB-INF}/wait/example1.jsp | 0 .../webapp/{ => WEB-INF}/wait/example2.jsp | 0 .../webapp/{ => WEB-INF}/wait/example3.jsp | 0 .../main/webapp/{ => WEB-INF}/wait/index.jsp | 0 .../main/webapp/{ => WEB-INF}/wait/wait.jsp | 0 .../main/webapp/{ => WEB-INF}/xslt/index.jsp | 0 219 files changed, 212 insertions(+), 212 deletions(-) rename apps/showcase/src/main/webapp/{ => WEB-INF}/actionchaining/actionChainingResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/AjaxResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/AjaxResult2.js (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/AjaxResult3.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/autocompleter/index.jsp (98%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/bind/index.jsp (96%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/commonInclude.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/footer.jsp (67%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/options.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotebutton/index.jsp (96%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example1.jsp (88%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example10.jsp (91%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example2.jsp (91%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example3.jsp (90%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example4.jsp (91%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example5.jsp (90%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example6.jsp (89%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example7.jsp (89%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example8.jsp (95%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/example9.jsp (96%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotediv/index.jsp (95%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remoteforms/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/remotelink/index.jsp (98%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/example1.jsp (98%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/example2.jsp (90%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/example3.jsp (96%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/example4.jsp (96%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/example5.jsp (93%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/example5Ok.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/example6.jsp (94%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/index.jsp (94%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/nodecorate/panel1.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/nodecorate/panel2.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/nodecorate/panel2Submit.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/nodecorate/panel3.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tabbedpanel/nodecorate/panel3Submit.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/testjs.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tree/getCategory.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tree/partialChunkHeader.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tree/toggle.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/tree/tree.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/ajax/widgets/index.jsp (94%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/chatLogin.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/createRoom.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/messagesAvailableInRoom.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/roomSelection.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/roomsAvailable.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/sendMessageToRoomResult.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/showRoom.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/usersAvailable.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/chat/usersAvailableInRoom.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/Address.java.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/AddressAction.java.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/EnumTypeConverter.java.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/OperationsEnum.java.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/OperationsEnumAction.java.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/OperationsEnumActionConversion.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/Person.java.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/PersonAction.java.txt (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/enterAddressInfo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/enterOperations.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/enterPersonInfo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/showAddressInfo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/showOperations.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/conversion/showPersonInfo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/customTemplateDir/customTheme/ftlCustomTemplate.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/customTemplateDir/customTheme/jspCustomTemplate.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/date.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/empmanager/editEmployee.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/empmanager/editSkill.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/empmanager/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/empmanager/listEmployees.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/empmanager/listSkills.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/filedownload/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/fileupload/multipleUploadUsingArray.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/fileupload/multipleUploadUsingList.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/fileupload/upload-success.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/fileupload/upload.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/freemarker/customFreemarkerManagerUsage.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/freemarker/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/freemarker/standardTags.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/hangman/blank.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/hangman/hangmanAjax.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/hangman/hangmanNonAjax.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/hangman/updateCharacterAvailable.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/hangman/updateGuessLeft.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/hangman/updateScaffold.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/hangman/updateVocabCharacters.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/help.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/integration/modelDriven.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/integration/modelDrivenResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/demo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/example-action.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/jsp_0.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/jsp_1.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/jsp_2.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/jsp_3.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/jsp_4.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_0.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_1.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_2.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_3.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_4.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_5.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_6.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_7.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/interactive/ognl_8.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/jsf/employee/edit.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/jsf/employee/list.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/jsf/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/modelDriven/modelDriven.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/modelDriven/modelDrivenResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/person/edit-person.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/person/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/person/list-people.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/person/new-person.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/showcase.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionPrefix/actionPrefix.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionPrefix/actionPrefixExample.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionPrefix/methodPrefix.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionPrefix/normalSubmit.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionPrefix/redirectActionPrefix.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionTag/includedPage.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionTag/includedPage2.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionTag/includedPage3.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/actionTag/showActionTagDemo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/date.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/debug.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/ifTag/testIf.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/ifTag/testIf.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/appendIteratorTagDemoResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/iteratorGeneratorTagDemoResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/mergeIteratorTagDemoResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/showAppendIteratorTagDemo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/showIteratorGeneratorTagDemo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/showMergeIteratorTagDemo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/subsetIteratorTagDemo.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/non-ui/iteratorTag/subsetIteratorTagDemoResult.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/actionTagExampleCalled.jsp (55%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/actionTagExampleCalling.jsp (94%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/componentTagExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/datepicker/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/dynamicTreeSelect.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/example.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/example.vm (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/exampleSubmited.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/exampleSubmited.vm (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/images/backgroundImage.jpg (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/images/leopard.jpg (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/lotsOfOptiontransferselect.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/lotsOfOptiontransferselectSubmit.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/moreSelects.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/moreSelectsSubmit.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/staticTreeSelect.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/timepicker/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/treeExampleAjaxDynamic.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/treeExampleAjaxDynamic.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/treeExampleDynamic.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tags/ui/treeExampleStatic.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/template/xhtml/mytemplate.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tiles/body.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tiles/body.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tiles/header.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tiles/layout.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/tiles/layout.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/token/doublePost.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/token/example1.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/token/example2.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/token/example3.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/token/example4.ftl (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/token/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/token/transferDone.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/clientSideValidationExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/fieldValidatorsExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/footer.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/nonFieldValidatorsExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/quiz-ajax.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/quiz-basic.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/quiz-client-css.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/quiz-client.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/quiz-success.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/storeErrorsAcrossRequestCancel.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/storeErrorsAcrossRequestExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/storeErrorsAcrossRequestOk.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/successClientSideValidationExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/successFieldValidatorsExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/successNonFieldValidatorsExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/successVisitorValidatorsExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/validation/visitorValidatorsExample.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/viewSource.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/wait/complete.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/wait/example1.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/wait/example2.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/wait/example3.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/wait/index.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/wait/wait.jsp (100%) rename apps/showcase/src/main/webapp/{ => WEB-INF}/xslt/index.jsp (100%) diff --git a/apps/showcase/src/main/resources/struts-actionchaining.xml b/apps/showcase/src/main/resources/struts-actionchaining.xml index bdefeb0a2..94d8b2857 100644 --- a/apps/showcase/src/main/resources/struts-actionchaining.xml +++ b/apps/showcase/src/main/resources/struts-actionchaining.xml @@ -12,7 +12,7 @@ actionChain3 - /actionchaining/actionChainingResult.jsp + /WEB-INF/actionchaining/actionChainingResult.jsp diff --git a/apps/showcase/src/main/resources/struts-ajax.xml b/apps/showcase/src/main/resources/struts-ajax.xml index 910112cf7..43d087686 100644 --- a/apps/showcase/src/main/resources/struts-ajax.xml +++ b/apps/showcase/src/main/resources/struts-ajax.xml @@ -6,27 +6,27 @@ - /ajax/AjaxResult.jsp + /WEB-INF/ajax/AjaxResult.jsp - /ajax/AjaxResult2.js + /WEB-INF/ajax/AjaxResult2.js - /ajax/AjaxResult3.jsp + /WEB-INF/ajax/AjaxResult3.jsp - /ajax/remoteforms/test2.jsp + /WEB-INF/ajax/remoteforms/test2.jsp - /ajax/remoteforms/test3.jsp + /WEB-INF/ajax/remoteforms/test3.jsp - /ajax/testjs.jsp + /WEB-INF/ajax/testjs.jsp @@ -34,54 +34,54 @@ - /ajax/tree/tree.jsp + /WEB-INF/ajax/tree/tree.jsp - /ajax/tree/getCategory.jsp + /WEB-INF/ajax/tree/getCategory.jsp - /ajax/tree/toggle.jsp + /WEB-INF/ajax/tree/toggle.jsp - /ajax/tabbedpanel/example4.ftl + /WEB-INF/ajax/tabbedpanel/example4.ftl - /ajax/tabbedpanel/example5.jsp - /ajax/tabbedpanel/example5Ok.jsp + /WEB-INF/ajax/tabbedpanel/example5.jsp + /WEB-INF/ajax/tabbedpanel/example5Ok.jsp - /ajax/tabbedpanel/nodecorate/panel1.ftl + /WEB-INF/ajax/tabbedpanel/nodecorate/panel1.ftl - /ajax/tabbedpanel/nodecorate/panel2.ftl + /WEB-INF/ajax/tabbedpanel/nodecorate/panel2.ftl - /ajax/tabbedpanel/nodecorate/panel3.ftl + /WEB-INF/ajax/tabbedpanel/nodecorate/panel3.ftl - /ajax/tabbedpanel/nodecorate/panel2Submit.ftl + /WEB-INF/ajax/tabbedpanel/nodecorate/panel2Submit.ftl - /ajax/tabbedpanel/nodecorate/panel3Submit.ftl + /WEB-INF/ajax/tabbedpanel/nodecorate/panel3Submit.ftl - /ajax/options.ftl + /WEB-INF/ajax/options.ftl - /validation/quiz-ajax.jsp - /validation/quiz-success.jsp + /WEB-INF/validation/quiz-ajax.jsp + /WEB-INF/validation/quiz-success.jsp - /tags/ui/treeExampleAjaxDynamic.ftl + /WEB-INF/tags/ui/treeExampleAjaxDynamic.ftl diff --git a/apps/showcase/src/main/resources/struts-chat.xml b/apps/showcase/src/main/resources/struts-chat.xml index 568b71a97..15ea15b1c 100644 --- a/apps/showcase/src/main/resources/struts-chat.xml +++ b/apps/showcase/src/main/resources/struts-chat.xml @@ -33,18 +33,18 @@ - /chat/chatLogin.ftl + /WEB-INF/chat/chatLogin.ftl - /chat/roomSelection.ftl + /WEB-INF/chat/roomSelection.ftl /chat/showRooms.action - /chat/chatLogin.ftl + /WEB-INF/chat/chatLogin.ftl @@ -54,12 +54,12 @@ - /chat/roomSelection.ftl + /WEB-INF/chat/roomSelection.ftl - /chat/showRoom.ftl + /WEB-INF/chat/showRoom.ftl @@ -100,35 +100,35 @@ - /chat/usersAvailable.ftl + /WEB-INF/chat/usersAvailable.ftl - /chat/roomsAvailable.ftl + /WEB-INF/chat/roomsAvailable.ftl - /chat/createRoom.ftl - /chat/createRoom.ftl + /WEB-INF/chat/createRoom.ftl + /WEB-INF/chat/createRoom.ftl - /chat/messagesAvailableInRoom.ftl - /chat/messagesAvailableInRoom.ftl + /WEB-INF/chat/messagesAvailableInRoom.ftl + /WEB-INF/chat/messagesAvailableInRoom.ftl - /chat/sendMessageToRoomResult.ftl - /chat/sendMessageToRoomResult.ftl + /WEB-INF/chat/sendMessageToRoomResult.ftl + /WEB-INF/chat/sendMessageToRoomResult.ftl - /chat/usersAvailableInRoom.ftl + /WEB-INF/chat/usersAvailableInRoom.ftl
diff --git a/apps/showcase/src/main/resources/struts-conversion.xml b/apps/showcase/src/main/resources/struts-conversion.xml index ad0b1a975..27dd6875f 100644 --- a/apps/showcase/src/main/resources/struts-conversion.xml +++ b/apps/showcase/src/main/resources/struts-conversion.xml @@ -9,65 +9,65 @@ - enterPersonInfo.jsp + /WEB-INF/conversion/enterPersonInfo.jsp - showPersonInfo.jsp - enterPersonInfo.jsp + /WEB-INF/conversion/showPersonInfo.jsp + /WEB-INF/conversion/enterPersonInfo.jsp - /conversion/enterPersonInfo.jsp + /WEB-INF/conversion/enterPersonInfo.jsp - /conversion/PersonAction.java.txt + /WEB-INF/conversion/PersonAction.java.txt - /conversion/Person.java.txt + /WEB-INF/conversion/Person.java.txt - enterAddressInfo.jsp + /WEB-INF/conversion/enterAddressInfo.jsp - showAddressInfo.jsp - enterAddressInfo.jsp + /WEB-INF/conversion/showAddressInfo.jsp + /WEB-INF/conversion/enterAddressInfo.jsp - /conversion/enterAddressInfo.jsp + /WEB-INF/conversion/enterAddressInfo.jsp - /conversion/AddressAction.java.txt + /WEB-INF/conversion/AddressAction.java.txt - /conversion/Address.java.txt + /WEB-INF/conversion/Address.java.txt - enterOperations.jsp + /WEB-INF/conversion/enterOperations.jsp - showOperations.jsp - enterOperations.jsp + /WEB-INF/conversion/showOperations.jsp + /WEB-INF/conversion/enterOperations.jsp - /conversion/enterOperations.jsp + /WEB-INF/conversion/enterOperations.jsp - /conversion/OperationsEnum.java.txt + /WEB-INF/conversion/OperationsEnum.java.txt - /conversion/OperationsEnumAction.java.txt + /WEB-INF/conversion/OperationsEnumAction.java.txt - /conversion/EnumTypeConverter.java.txt + /WEB-INF/conversion/EnumTypeConverter.java.txt - /conversion/OperationsEnumActionConversion.txt + /WEB-INF/conversion/OperationsEnumActionConversion.txt diff --git a/apps/showcase/src/main/resources/struts-fileupload.xml b/apps/showcase/src/main/resources/struts-fileupload.xml index 71071822e..5a81f614d 100644 --- a/apps/showcase/src/main/resources/struts-fileupload.xml +++ b/apps/showcase/src/main/resources/struts-fileupload.xml @@ -7,29 +7,29 @@ - upload.jsp + /WEB-INF/fileupload/upload.jsp - upload.jsp - upload-success.jsp + /WEB-INF/fileupload/upload.jsp + /WEB-INF/fileupload/upload-success.jsp - multipleUploadUsingList.jsp + /WEB-INF/fileupload/multipleUploadUsingList.jsp - multiple-success.jsp + /WEB-INF/fileupload/multiple-success.jsp - multipleUploadUsingArray.jsp + /WEB-INF/fileupload/multipleUploadUsingArray.jsp - multiple-success.jsp + /WEB-INF/fileupload/multiple-success.jsp diff --git a/apps/showcase/src/main/resources/struts-freemarker.xml b/apps/showcase/src/main/resources/struts-freemarker.xml index ae9334f13..8c70421cf 100644 --- a/apps/showcase/src/main/resources/struts-freemarker.xml +++ b/apps/showcase/src/main/resources/struts-freemarker.xml @@ -6,11 +6,11 @@ - /freemarker/customFreemarkerManagerUsage.ftl + /WEB-INF/freemarker/customFreemarkerManagerUsage.ftl - /freemarker/standardTags.ftl + /WEB-INF/freemarker/standardTags.ftl diff --git a/apps/showcase/src/main/resources/struts-hangman.xml b/apps/showcase/src/main/resources/struts-hangman.xml index 6c61a3db9..69abdbf7a 100644 --- a/apps/showcase/src/main/resources/struts-hangman.xml +++ b/apps/showcase/src/main/resources/struts-hangman.xml @@ -6,19 +6,19 @@ - /hangman/hangmanAjax.ftl + /WEB-INF/hangman/hangmanAjax.ftl - /hangman/hangmanNonAjax.ftl + /WEB-INF/hangman/hangmanNonAjax.ftl /hangman/test.ftl - /hangman/blank.ftl + /WEB-INF/hangman/blank.ftl - /hangman/hangmanNonAjax.ftl + /WEB-INF/hangman/hangmanNonAjax.ftl @@ -26,19 +26,19 @@ - /hangman/blank.ftl + /WEB-INF/hangman/blank.ftl - /hangman/updateVocabCharacters.ftl + /WEB-INF/hangman/updateVocabCharacters.ftl - /hangman/updateCharacterAvailable.ftl + /WEB-INF/hangman/updateCharacterAvailable.ftl - /hangman/updateScaffold.ftl + /WEB-INF/hangman/updateScaffold.ftl - /hangman/updateGuessLeft.ftl + /WEB-INF/hangman/updateGuessLeft.ftl diff --git a/apps/showcase/src/main/resources/struts-integration.xml b/apps/showcase/src/main/resources/struts-integration.xml index 71d2776a3..d251f7272 100644 --- a/apps/showcase/src/main/resources/struts-integration.xml +++ b/apps/showcase/src/main/resources/struts-integration.xml @@ -39,8 +39,8 @@ org.apache.struts2.showcase.integration.SaveGangsterAction true - modelDriven.jsp - modelDrivenResult.jsp + /WEB-INF/integration/modelDriven.jsp + /WEB-INF/integration/modelDrivenResult.jsp diff --git a/apps/showcase/src/main/resources/struts-interactive.xml b/apps/showcase/src/main/resources/struts-interactive.xml index 4c1d801f6..424aabb0d 100644 --- a/apps/showcase/src/main/resources/struts-interactive.xml +++ b/apps/showcase/src/main/resources/struts-interactive.xml @@ -9,7 +9,7 @@ - /interactive/demo.jsp + /WEB-INF/interactive/demo.jsp diff --git a/apps/showcase/src/main/resources/struts-model-driven.xml b/apps/showcase/src/main/resources/struts-model-driven.xml index cc085d18e..dc9b839a3 100644 --- a/apps/showcase/src/main/resources/struts-model-driven.xml +++ b/apps/showcase/src/main/resources/struts-model-driven.xml @@ -7,12 +7,12 @@ - modelDriven.jsp + /WEB-INF/modelDriven/modelDriven.jsp - modelDrivenResult.jsp + /WEB-INF/modelDriven/modelDrivenResult.jsp diff --git a/apps/showcase/src/main/resources/struts-tags-non-ui.xml b/apps/showcase/src/main/resources/struts-tags-non-ui.xml index 20c5a8dbb..c296fd202 100644 --- a/apps/showcase/src/main/resources/struts-tags-non-ui.xml +++ b/apps/showcase/src/main/resources/struts-tags-non-ui.xml @@ -11,19 +11,19 @@ - /tags/non-ui/actionTag/showActionTagDemo.jsp + /WEB-INF/tags/non-ui/actionTag/showActionTagDemo.jsp - /tags/non-ui/actionTag/includedPage.jsp + /WEB-INF/tags/non-ui/actionTag/includedPage.jsp - /tags/non-ui/actionTag/includedPage2.jsp + /WEB-INF/tags/non-ui/actionTag/includedPage2.jsp - /tags/non-ui/actionTag/includedPage3.jsp + /WEB-INF/tags/non-ui/actionTag/includedPage3.jsp - /tags/non-ui/actionTag/showActionTagDemo.jsp + /WEB-INF/tags/non-ui/actionTag/showActionTagDemo.jsp @@ -33,11 +33,11 @@ - /tags/non-ui/iteratorTag/showIteratorGeneratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/showIteratorGeneratorTagDemo.jsp - /tags/non-ui/iteratorTag/showIteratorGeneratorTagDemo.jsp - /tags/non-ui/iteratorTag/iteratorGeneratorTagDemoResult.jsp + /WEB-INF/tags/non-ui/iteratorTag/showIteratorGeneratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/iteratorGeneratorTagDemoResult.jsp @@ -47,11 +47,11 @@ - /tags/non-ui/iteratorTag/showAppendIteratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/showAppendIteratorTagDemo.jsp - /tag/non-ui/iteratorTag/showAppendIteratorTagDemo.jsp - /tags/non-ui/iteratorTag/appendIteratorTagDemoResult.jsp + /WEB-INF/tags/non-ui/iteratorTag/showAppendIteratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/appendIteratorTagDemoResult.jsp @@ -61,11 +61,11 @@ - /tags/non-ui/iteratorTag/showMergeIteratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/showMergeIteratorTagDemo.jsp - /tags/non-ui/iteratorTag/showMergeIteratorTagDemo.jsp - /tags/non-ui/iteratorTag/mergeIteratorTagDemoResult.jsp + /WEB-INF/tags/non-ui/iteratorTag/showMergeIteratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/mergeIteratorTagDemoResult.jsp @@ -74,11 +74,11 @@ - /tags/non-ui/iteratorTag/subsetIteratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/subsetIteratorTagDemo.jsp - /tags/non-ui/iteratorTag/subsetIteratorTagDemo.jsp - /tags/non-ui/iteratorTag/subsetIteratorTagDemoResult.jsp + /WEB-INF/tags/non-ui/iteratorTag/subsetIteratorTagDemo.jsp + /WEB-INF/tags/non-ui/iteratorTag/subsetIteratorTagDemoResult.jsp @@ -87,28 +87,28 @@ - /tags/non-ui/actionPrefix/actionPrefixExample.ftl + /WEB-INF/tags/non-ui/actionPrefix/actionPrefixExample.ftl - /tags/non-ui/actionPrefix/normalSubmit.ftl + /WEB-INF/tags/non-ui/actionPrefix/normalSubmit.ftl - /tags/non-ui/actionPrefix/methodPrefix.ftl + /WEB-INF/tags/non-ui/actionPrefix/methodPrefix.ftl - /tags/non-ui/actionPrefix/actionPrefix.ftl + /WEB-INF/tags/non-ui/actionPrefix/actionPrefix.ftl - /tags/non-ui/actionPrefix/redirectPrefix.ftl + /WEB-INF/tags/non-ui/actionPrefix/redirectPrefix.ftl - /tags/non-ui/actionPrefix/redirectActionPrefix.ftl + /WEB-INF/tags/non-ui/actionPrefix/redirectActionPrefix.ftl redirectActionPrefix - /tags/non-ui/actionPrefix/actionPrefixExample.ftl + /WEB-INF/tags/non-ui/actionPrefix/actionPrefixExample.ftl @@ -117,10 +117,10 @@ - /tags/non-ui/ifTag/testIf.jsp + /WEB-INF/tags/non-ui/ifTag/testIf.jsp - /tags/non-ui/ifTag/testIf.ftl + /WEB-INF/tags/non-ui/ifTag/testIf.ftl @@ -129,7 +129,7 @@ - /tags/non-ui/debug.jsp + /WEB-INF/tags/non-ui/debug.jsp diff --git a/apps/showcase/src/main/resources/struts-tags-ui.xml b/apps/showcase/src/main/resources/struts-tags-ui.xml index 449958fc5..563fbc1fc 100644 --- a/apps/showcase/src/main/resources/struts-tags-ui.xml +++ b/apps/showcase/src/main/resources/struts-tags-ui.xml @@ -6,57 +6,57 @@ - example.jsp - example.jsp + /WEB-INF/tags/ui/example.jsp + /WEB-INF/tags/ui/example.jsp - exampleSubmited.jsp - example.jsp + /WEB-INF/tags/ui/exampleSubmited.jsp + /WEB-INF/tags/ui/example.jsp - example.vm - example.vm + /WEB-INF/tags/ui/example.vm + /WEB-INF/tags/ui/example.vm - exampleSubmited.vm - example.vm + /WEB-INF/tags/ui/exampleSubmited.vm + /WEB-INF/tags/ui/example.vm - lotsOfOptiontransferselect.jsp + /WEB-INF/tags/ui/lotsOfOptiontransferselect.jsp - lotsOfOptiontransferselect.jsp - lotsOfOptiontransferselectSubmit.jsp + /WEB-INF/tags/ui/lotsOfOptiontransferselect.jsp + /WEB-INF/tags/ui/lotsOfOptiontransferselectSubmit.jsp - moreSelects.jsp + /WEB-INF/tags/ui/moreSelects.jsp - moreSelects.jsp - moreSelectsSubmit.jsp + /WEB-INF/tags/ui/moreSelects.jsp + /WEB-INF/tags/ui/moreSelectsSubmit.jsp - /tags/ui/treeExampleDynamic.jsp + /WEB-INF/tags/ui/treeExampleDynamic.jsp - /tags/ui/treeExampleAjaxDynamic.jsp + /WEB-INF/tags/ui/treeExampleAjaxDynamic.jsp - /tags/ui/componentTagExample.jsp + /WEB-INF/tags/ui/componentTagExample.jsp - /tags/ui/actionTagExampleCalled.jsp - /tags/ui/actionTagExampleCalling.jsp + /WEB-INF/tags/ui/actionTagExampleCalled.jsp + /WEB-INF/tags/ui/actionTagExampleCalling.jsp @@ -65,10 +65,10 @@ - /tags/ui/staticTreeSelect.jsp + /WEB-INF/tags/ui/staticTreeSelect.jsp - /tags/ui/dynamicTreeSelect.jsp + /WEB-INF/tags/ui/dynamicTreeSelect.jsp diff --git a/apps/showcase/src/main/resources/struts-tiles.xml b/apps/showcase/src/main/resources/struts-tiles.xml index d749d77b2..9fbe0258b 100644 --- a/apps/showcase/src/main/resources/struts-tiles.xml +++ b/apps/showcase/src/main/resources/struts-tiles.xml @@ -21,7 +21,7 @@ - /tiles/layout.jsp + /WEB-INF/tiles/layout.jsp /tiles/layout.jsp diff --git a/apps/showcase/src/main/resources/struts-token.xml b/apps/showcase/src/main/resources/struts-token.xml index 06f347730..d43435bd3 100644 --- a/apps/showcase/src/main/resources/struts-token.xml +++ b/apps/showcase/src/main/resources/struts-token.xml @@ -7,56 +7,56 @@ - example1.jsp + /WEB-INF/token/example1.jsp - doublePost.jsp - transferDone.jsp + /WEB-INF/token/doublePost.jsp + /WEB-INF/token/transferDone.jsp - example2.jsp + /WEB-INF/token/example2.jsp - doublePost.jsp - transferDone.jsp + /WEB-INF/token/doublePost.jsp + /WEB-INF/token/transferDone.jsp - example3.jsp + /WEB-INF/token/example3.jsp - doublePost.jsp - transferDone.jsp + /WEB-INF/token/doublePost.jsp + /WEB-INF/token/transferDone.jsp - example4.ftl + /WEB-INF/token/example4.ftl - doublePost.jsp - transferDone.jsp + /WEB-INF/token/doublePost.jsp + /WEB-INF/token/transferDone.jsp diff --git a/apps/showcase/src/main/resources/struts-validation.xml b/apps/showcase/src/main/resources/struts-validation.xml index 5351b1ebc..778a2109b 100755 --- a/apps/showcase/src/main/resources/struts-validation.xml +++ b/apps/showcase/src/main/resources/struts-validation.xml @@ -40,12 +40,12 @@ - /validation/fieldValidatorsExample.jsp + /WEB-INF/validation/fieldValidatorsExample.jsp - /validation/fieldValidatorsExample.jsp - /validation/successFieldValidatorsExample.jsp + /WEB-INF/validation/fieldValidatorsExample.jsp + /WEB-INF/validation/successFieldValidatorsExample.jsp @@ -55,12 +55,12 @@ - /validation/nonFieldValidatorsExample.jsp + /WEB-INF/validation/nonFieldValidatorsExample.jsp - /validation/nonFieldValidatorsExample.jsp - /validation/successNonFieldValidatorsExample.jsp + /WEB-INF/validation/nonFieldValidatorsExample.jsp + /WEB-INF/validation/successNonFieldValidatorsExample.jsp @@ -70,12 +70,12 @@ - /validation/visitorValidatorsExample.jsp + /WEB-INF/validation/visitorValidatorsExample.jsp - /validation/visitorValidatorsExample.jsp - /validation/successVisitorValidatorsExample.jsp + /WEB-INF/validation/visitorValidatorsExample.jsp + /WEB-INF/validation/successVisitorValidatorsExample.jsp @@ -85,12 +85,12 @@ - /validation/clientSideValidationExample.jsp + /WEB-INF/validation/clientSideValidationExample.jsp - /validation/clientSideValidationExample.jsp - /validation/successClientSideValidationExample.jsp + /WEB-INF/validation/clientSideValidationExample.jsp + /WEB-INF/validation/successClientSideValidationExample.jsp @@ -109,16 +109,16 @@ RETRIEVE - /validation/storeErrorsAcrossRequestExample.jsp + /WEB-INF/validation/storeErrorsAcrossRequestExample.jsp RETRIEVE - /validation/storeErrorsAcrossRequestOk.jsp + /WEB-INF/validation/storeErrorsAcrossRequestOk.jsp - /validation/storeErrorsAcrossRequestCancel.jsp + /WEB-INF/validation/storeErrorsAcrossRequestCancel.jsp diff --git a/apps/showcase/src/main/resources/struts-wait.xml b/apps/showcase/src/main/resources/struts-wait.xml index 521c2c754..8ea291124 100644 --- a/apps/showcase/src/main/resources/struts-wait.xml +++ b/apps/showcase/src/main/resources/struts-wait.xml @@ -9,8 +9,8 @@ - wait.jsp - complete.jsp + /WEB-INF/wait/wait.jsp + /WEB-INF/wait/complete.jsp @@ -18,8 +18,8 @@ 2000 - wait.jsp - complete.jsp + /WEB-INF/wait/wait.jsp + /WEB-INF/wait/complete.jsp @@ -28,8 +28,8 @@ 3000 1000 - wait.jsp - complete.jsp + /WEB-INF/wait/wait.jsp + /WEB-INF/wait/complete.jsp diff --git a/apps/showcase/src/main/resources/struts.xml b/apps/showcase/src/main/resources/struts.xml index 3c1ebf3a4..74c59c651 100644 --- a/apps/showcase/src/main/resources/struts.xml +++ b/apps/showcase/src/main/resources/struts.xml @@ -75,15 +75,15 @@ - showcase.jsp + ../webapp/WEB-INF/showcase.jsp - viewSource.jsp + ../webapp/WEB-INF/viewSource.jsp - /date.jsp + /WEB-INF/date.jsp diff --git a/apps/showcase/src/main/webapp/actionchaining/actionChainingResult.jsp b/apps/showcase/src/main/webapp/WEB-INF/actionchaining/actionChainingResult.jsp similarity index 100% rename from apps/showcase/src/main/webapp/actionchaining/actionChainingResult.jsp rename to apps/showcase/src/main/webapp/WEB-INF/actionchaining/actionChainingResult.jsp diff --git a/apps/showcase/src/main/webapp/ajax/AjaxResult.jsp b/apps/showcase/src/main/webapp/WEB-INF/ajax/AjaxResult.jsp similarity index 100% rename from apps/showcase/src/main/webapp/ajax/AjaxResult.jsp rename to apps/showcase/src/main/webapp/WEB-INF/ajax/AjaxResult.jsp diff --git a/apps/showcase/src/main/webapp/ajax/AjaxResult2.js b/apps/showcase/src/main/webapp/WEB-INF/ajax/AjaxResult2.js similarity index 100% rename from apps/showcase/src/main/webapp/ajax/AjaxResult2.js rename to apps/showcase/src/main/webapp/WEB-INF/ajax/AjaxResult2.js diff --git a/apps/showcase/src/main/webapp/ajax/AjaxResult3.jsp b/apps/showcase/src/main/webapp/WEB-INF/ajax/AjaxResult3.jsp similarity index 100% rename from apps/showcase/src/main/webapp/ajax/AjaxResult3.jsp rename to apps/showcase/src/main/webapp/WEB-INF/ajax/AjaxResult3.jsp diff --git a/apps/showcase/src/main/webapp/ajax/autocompleter/index.jsp b/apps/showcase/src/main/webapp/WEB-INF/ajax/autocompleter/index.jsp similarity index 98% rename from apps/showcase/src/main/webapp/ajax/autocompleter/index.jsp rename to apps/showcase/src/main/webapp/WEB-INF/ajax/autocompleter/index.jsp index 9079e7d3c..c67257fb1 100644 --- a/apps/showcase/src/main/webapp/ajax/autocompleter/index.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/ajax/autocompleter/index.jsp @@ -6,7 +6,7 @@ Ajax Examples - + diff --git a/apps/showcase/src/main/webapp/ajax/bind/index.jsp b/apps/showcase/src/main/webapp/WEB-INF/ajax/bind/index.jsp similarity index 96% rename from apps/showcase/src/main/webapp/ajax/bind/index.jsp rename to apps/showcase/src/main/webapp/WEB-INF/ajax/bind/index.jsp index 779e453af..046006cbb 100644 --- a/apps/showcase/src/main/webapp/ajax/bind/index.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/ajax/bind/index.jsp @@ -5,7 +5,7 @@ Bind Examples - +