From 3820eae31f9db2016ac8d9576ed2346cda41fc9b Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 19 Sep 2018 16:26:24 +0200 Subject: [PATCH] WW-4963 Implements new ServletRequestAware interface that uses withRequest instead of setRequest --- .../struts2/action/ServletRequestAware.java | 39 +++++++++++++++++++ .../interceptor/ServletConfigInterceptor.java | 5 +++ .../interceptor/ServletRequestAware.java | 4 ++ .../ServletConfigInterceptorTest.java | 16 ++++++++ 4 files changed, 64 insertions(+) create mode 100644 core/src/main/java/org/apache/struts2/action/ServletRequestAware.java diff --git a/core/src/main/java/org/apache/struts2/action/ServletRequestAware.java b/core/src/main/java/org/apache/struts2/action/ServletRequestAware.java new file mode 100644 index 000000000..115bff35e --- /dev/null +++ b/core/src/main/java/org/apache/struts2/action/ServletRequestAware.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.action; + +import javax.servlet.http.HttpServletRequest; + +/** + * All Actions that want to have access to the servlet request object must implement this interface. + * + * This interface is only relevant if the Action is used in a servlet environment. + * + * Note that using this interface makes the Action tied to a servlet environment, so it should be + * avoided if possible since things like unit testing will become more difficult. + */ +public interface ServletRequestAware { + + /** + * Applies the HTTP request object in implementing classes. + * + * @param request the HTTP request. + */ + void withServletRequest(HttpServletRequest request); +} diff --git a/core/src/main/java/org/apache/struts2/interceptor/ServletConfigInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/ServletConfigInterceptor.java index bd017d07b..e5b9aa432 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/ServletConfigInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/ServletConfigInterceptor.java @@ -128,6 +128,11 @@ public class ServletConfigInterceptor extends AbstractInterceptor implements Str ((ServletRequestAware) action).setServletRequest(request); } + if (action instanceof org.apache.struts2.action.ServletRequestAware) { + HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); + ((org.apache.struts2.action.ServletRequestAware) action).withServletRequest(request); + } + if (action instanceof ServletResponseAware) { HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE); ((ServletResponseAware) action).setServletResponse(response); diff --git a/core/src/main/java/org/apache/struts2/interceptor/ServletRequestAware.java b/core/src/main/java/org/apache/struts2/interceptor/ServletRequestAware.java index 20a6039dd..7c9da3032 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/ServletRequestAware.java +++ b/core/src/main/java/org/apache/struts2/interceptor/ServletRequestAware.java @@ -33,13 +33,17 @@ import javax.servlet.http.HttpServletRequest; * Note that using this interface makes the Action tied to a servlet environment, so it should be * avoided if possible since things like unit testing will become more difficult. *

+ * @deprecated please use {@link org.apache.struts2.action.ServletRequestAware} instead */ +@Deprecated public interface ServletRequestAware { /** * Sets the HTTP request object in implementing classes. * * @param request the HTTP request. + * @deprecated please use {@link org.apache.struts2.action.ServletRequestAware#withServletRequest(HttpServletRequest)} */ + @Deprecated public void setServletRequest(HttpServletRequest request); } diff --git a/core/src/test/java/org/apache/struts2/interceptor/ServletConfigInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/ServletConfigInterceptorTest.java index 34353c87f..dfecbfe15 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/ServletConfigInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/ServletConfigInterceptorTest.java @@ -64,6 +64,22 @@ public class ServletConfigInterceptorTest extends StrutsInternalTestCase { verify(mock); } + public void testActionServletRequestAware() throws Exception { + org.apache.struts2.action.ServletRequestAware mock = createMock(org.apache.struts2.action.ServletRequestAware.class); + + MockHttpServletRequest req = new MockHttpServletRequest(); + + MockActionInvocation mai = createActionInvocation(mock); + mai.getInvocationContext().put(StrutsStatics.HTTP_REQUEST, req); + + mock.withServletRequest(req); + expectLastCall(); + + replay(mock); + interceptor.intercept(mai); + verify(mock); + } + public void testServletResponseAware() throws Exception { ServletResponseAware mock = (ServletResponseAware) createMock(ServletResponseAware.class);