This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch feature/WW-5333-attribute-map
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 2e9eb4d8bf48ed63a75c9bed4821706a365cc501
Author: Lukasz Lenart <lukaszlen...@apache.org>
AuthorDate: Sat Nov 4 15:50:59 2023 +0100

    WW-5333 Refactors AttributeMap
---
 .../java/org/apache/struts2/components/Set.java    | 14 +++-----
 .../struts2/{util => dispatcher}/AttributeMap.java | 42 +++++++++++-----------
 .../org/apache/struts2/dispatcher/Dispatcher.java  | 11 +++---
 .../apache/struts2/dispatcher/DispatcherScope.java | 29 +++++++++++++++
 .../org/apache/struts2/dispatcher/RequestMap.java  |  4 +--
 .../debugging/DebuggingInterceptor.java            | 16 +++++----
 .../org/apache/struts2/views/jsp/TagUtils.java     |  2 +-
 .../org/apache/struts2/views/util/ContextUtil.java |  7 ++--
 .../portlet/dispatcher/Jsr168Dispatcher.java       | 13 +++----
 9 files changed, 84 insertions(+), 54 deletions(-)

diff --git a/core/src/main/java/org/apache/struts2/components/Set.java 
b/core/src/main/java/org/apache/struts2/components/Set.java
index 8cb1ca461..c045cd8cb 100644
--- a/core/src/main/java/org/apache/struts2/components/Set.java
+++ b/core/src/main/java/org/apache/struts2/components/Set.java
@@ -20,6 +20,7 @@ package org.apache.struts2.components;
 
 import java.io.Writer;
 
+import org.apache.struts2.dispatcher.DispatcherScope;
 import org.apache.struts2.views.annotations.StrutsTag;
 import org.apache.struts2.views.annotations.StrutsTagAttribute;
 
@@ -53,16 +54,11 @@ import com.opensymphony.xwork2.util.ValueStack;
  * <!-- START SNIPPET: params -->
  *
  * <ul>
- *
  * <li>var* (String): The name of the new variable that is assigned the value 
of <i>value</i></li>
- *
  * <li>value (Object): The value that is assigned to the variable named 
<i>name</i></li>
- *
  * <li>scope (String): The scope in which to assign the variable. Can be 
<b>application</b>, <b>session</b>,
  * <b>request</b>, <b>page</b>, or <b>action</b>. By default it is 
<b>action</b>.</li>
- * 
  * <li>Note: With the <b>action</b> scope, the variable is <em>also</em> 
assigned to the <b>page</b> scope.
- *
  * </ul>
  *
  * <!-- END SNIPPET: params -->
@@ -107,16 +103,16 @@ public class Set extends ContextBean {
 
         body="";
 
-        if ("application".equalsIgnoreCase(scope)) {
+        if (DispatcherScope.APPLICATION.equalsIgnoreCase(scope)) {
             stack.setValue("#application['" + getVar() + "']", o);
-        } else if ("session".equalsIgnoreCase(scope)) {
+        } else if (DispatcherScope.SESSION.equalsIgnoreCase(scope)) {
             stack.setValue("#session['" + getVar() + "']", o);
-        } else if ("request".equalsIgnoreCase(scope)) {
+        } else if (DispatcherScope.REQUEST.equalsIgnoreCase(scope)) {
             stack.setValue("#request['" + getVar() + "']", o);
         } else if ("page".equalsIgnoreCase(scope)) {
             stack.setValue("#attr['" + getVar() + "']", o, false);
         } else {
-            // Default scope is action.  Note: The action acope handling also 
adds the var to the page scope.
+            // Default scope is action. Note: The action scope handling also 
adds the var to the page scope.
             stack.getContext().put(getVar(), o);
             stack.setValue("#attr['" + getVar() + "']", o, false);
         }
diff --git a/core/src/main/java/org/apache/struts2/util/AttributeMap.java 
b/core/src/main/java/org/apache/struts2/dispatcher/AttributeMap.java
similarity index 75%
rename from core/src/main/java/org/apache/struts2/util/AttributeMap.java
rename to core/src/main/java/org/apache/struts2/dispatcher/AttributeMap.java
index ea088b4af..848b34aff 100644
--- a/core/src/main/java/org/apache/struts2/util/AttributeMap.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/AttributeMap.java
@@ -16,11 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.struts2.util;
+package org.apache.struts2.dispatcher;
 
 import org.apache.struts2.ServletActionContext;
 
 import javax.servlet.jsp.PageContext;
+import java.util.AbstractMap;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
@@ -38,17 +39,16 @@ import java.util.Set;
  *   <li>Session scope</li>
  *   <li>Application scope</li>
  * </ul>
- *
+ * <p>
  * A object is searched in the order above, starting from page and ending at 
application scope.
- *
  */
-public class AttributeMap implements Map {
+public class AttributeMap extends AbstractMap<String, Object> {
 
     protected static final String UNSUPPORTED = "method makes no sense for a 
simplified map";
 
-    Map context;
+    private final Map<String, Object> context;
 
-    public AttributeMap(Map context) {
+    public AttributeMap(Map<String, Object> context) {
         this.context = context;
     }
 
@@ -73,8 +73,8 @@ public class AttributeMap implements Map {
     }
 
     @Override
-    public Set entrySet() {
-        return Collections.EMPTY_SET;
+    public Set<Map.Entry<String, Object>> entrySet() {
+        return Collections.unmodifiableSet(this.context.entrySet());
     }
 
     @Override
@@ -82,9 +82,9 @@ public class AttributeMap implements Map {
         PageContext pc = getPageContext();
 
         if (pc == null) {
-            Map request = (Map) context.get("request");
-            Map session = (Map) context.get("session");
-            Map application = (Map) context.get("application");
+            RequestMap request = (RequestMap) 
context.get(DispatcherScope.REQUEST);
+            SessionMap session = (SessionMap) 
context.get(DispatcherScope.SESSION);
+            ApplicationMap application = (ApplicationMap) 
context.get(DispatcherScope.APPLICATION);
 
             if ((request != null) && (request.get(key) != null)) {
                 return request.get(key);
@@ -105,15 +105,15 @@ public class AttributeMap implements Map {
     }
 
     @Override
-    public Set keySet() {
-        return Collections.EMPTY_SET;
+    public Set<String> keySet() {
+        return Collections.unmodifiableSet(this.context.keySet());
     }
 
     @Override
-    public Object put(Object key, Object value) {
+    public Object put(String key, Object value) {
         PageContext pc = getPageContext();
         if (pc != null) {
-            pc.setAttribute(key.toString(), value);
+            pc.setAttribute(key, value);
         }
 
         return null;
@@ -135,8 +135,8 @@ public class AttributeMap implements Map {
     }
 
     @Override
-    public Collection values() {
-        return Collections.EMPTY_SET;
+    public Collection<Object> values() {
+        return Collections.unmodifiableCollection(this.context.values());
     }
 
     private PageContext getPageContext() {
@@ -146,10 +146,10 @@ public class AttributeMap implements Map {
     @Override
     public String toString() {
         return "AttributeMap {" +
-                "request=" + toStringSafe(context.get("request")) +
-                ", session=" +  toStringSafe(context.get("session")) +
-                ", application=" + toStringSafe(context.get("application")) +
-                '}';
+            "request=" + toStringSafe(context.get(DispatcherScope.REQUEST)) +
+            ", session=" + toStringSafe(context.get(DispatcherScope.SESSION)) +
+            ", application=" + 
toStringSafe(context.get(DispatcherScope.APPLICATION)) +
+            '}';
     }
 
     private String toStringSafe(Object obj) {
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 51ae95d27..aacddd18f 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
@@ -67,7 +67,6 @@ import 
org.apache.struts2.config.StrutsXmlConfigurationProvider;
 import org.apache.struts2.dispatcher.mapper.ActionMapping;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
 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;
 
@@ -779,14 +778,14 @@ public class Dispatcher {
             .withServletResponse(response)
             .withServletContext(servletContext)
             // helpers to get access to request/session/application scope
-            .with("request", requestMap)
-            .with("session", sessionMap)
-            .with("application", applicationMap)
-            .with("parameters", parameters)
+            .with(DispatcherScope.REQUEST, requestMap)
+            .with(DispatcherScope.SESSION, sessionMap)
+            .with(DispatcherScope.APPLICATION, applicationMap)
+            .with(DispatcherScope.PARAMETERS, parameters)
             .getContextMap();
 
         AttributeMap attrMap = new AttributeMap(extraContext);
-        extraContext.put("attr", attrMap);
+        extraContext.put(DispatcherScope.ATTRIBUTES, attrMap);
 
         return extraContext;
     }
diff --git 
a/core/src/main/java/org/apache/struts2/dispatcher/DispatcherScope.java 
b/core/src/main/java/org/apache/struts2/dispatcher/DispatcherScope.java
new file mode 100644
index 000000000..2cceb892d
--- /dev/null
+++ b/core/src/main/java/org/apache/struts2/dispatcher/DispatcherScope.java
@@ -0,0 +1,29 @@
+/*
+ * 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.dispatcher;
+
+public interface DispatcherScope {
+
+    String REQUEST = "request";
+    String RESPONSE = "response";
+    String SESSION = "session";
+    String APPLICATION = "application";
+    String PARAMETERS = "parameters";
+    String ATTRIBUTES = "attr";
+}
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/RequestMap.java 
b/core/src/main/java/org/apache/struts2/dispatcher/RequestMap.java
index a75dffb75..b8e5b8e67 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/RequestMap.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/RequestMap.java
@@ -32,8 +32,9 @@ public class RequestMap extends AbstractMap<String, Object> 
implements Serializa
 
     private static final long serialVersionUID = -7675640869293787926L;
 
+    private final HttpServletRequest request;
+
     private Set<Entry<String, Object>> entries;
-    private HttpServletRequest request;
 
     /**
      * Saves the request to use as the backing for getting and setting values
@@ -44,7 +45,6 @@ public class RequestMap extends AbstractMap<String, Object> 
implements Serializa
         this.request = request;
     }
 
-
     /**
      * Removes all attributes from the request as well as clears entries in 
this map.
      */
diff --git 
a/core/src/main/java/org/apache/struts2/interceptor/debugging/DebuggingInterceptor.java
 
b/core/src/main/java/org/apache/struts2/interceptor/debugging/DebuggingInterceptor.java
index 62f871690..080b3136a 100644
--- 
a/core/src/main/java/org/apache/struts2/interceptor/debugging/DebuggingInterceptor.java
+++ 
b/core/src/main/java/org/apache/struts2/interceptor/debugging/DebuggingInterceptor.java
@@ -29,8 +29,10 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.StrutsConstants;
+import org.apache.struts2.dispatcher.DispatcherScope;
 import org.apache.struts2.dispatcher.Parameter;
 import org.apache.struts2.dispatcher.PrepareOperations;
+import org.apache.struts2.dispatcher.RequestMap;
 import org.apache.struts2.views.freemarker.FreemarkerManager;
 import org.apache.struts2.views.freemarker.FreemarkerResult;
 
@@ -97,11 +99,13 @@ public class DebuggingInterceptor extends 
AbstractInterceptor {
 
     private final static Logger LOG = 
LogManager.getLogger(DebuggingInterceptor.class);
 
-    private String[] ignorePrefixes = new String[]{"org.apache.struts.",
-        "com.opensymphony.xwork2.", "xwork."};
-    private String[] _ignoreKeys = new String[]{"application", "session",
-        "parameters", "request"};
-    private HashSet<String> ignoreKeys = new 
HashSet<>(Arrays.asList(_ignoreKeys));
+    private final String[] ignorePrefixes = new String[]{"org.apache.struts.", 
"com.opensymphony.xwork2.", "xwork."};
+    private final HashSet<String> ignoreKeys = new HashSet<>(Arrays.asList(
+        DispatcherScope.APPLICATION,
+        DispatcherScope.SESSION,
+        DispatcherScope.PARAMETERS,
+        DispatcherScope.REQUEST
+    ));
 
     private final static String XML_MODE = "xml";
     private final static String CONSOLE_MODE = "console";
@@ -319,7 +323,7 @@ public class DebuggingInterceptor extends 
AbstractInterceptor {
             }
         }
         writer.endNode();
-        Map<String, Object> requestMap = (Map<String, Object>) 
ctx.get("request");
+        RequestMap requestMap = (RequestMap) ctx.get(DispatcherScope.REQUEST);
         serializeIt(requestMap, "request", writer, 
filterValueStack(requestMap));
         serializeIt(ctx.getSession(), "session", writer, new ArrayList<>());
 
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 f813e00d1..044f5d1af 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
@@ -24,7 +24,7 @@ import com.opensymphony.xwork2.util.ValueStack;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.struts2.ServletActionContext;
-import org.apache.struts2.util.AttributeMap;
+import org.apache.struts2.dispatcher.AttributeMap;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.jsp.PageContext;
diff --git a/core/src/main/java/org/apache/struts2/views/util/ContextUtil.java 
b/core/src/main/java/org/apache/struts2/views/util/ContextUtil.java
index 4ab3c2786..8a35c456f 100644
--- a/core/src/main/java/org/apache/struts2/views/util/ContextUtil.java
+++ b/core/src/main/java/org/apache/struts2/views/util/ContextUtil.java
@@ -20,6 +20,7 @@ package org.apache.struts2.views.util;
 
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.util.ValueStack;
+import org.apache.struts2.dispatcher.DispatcherScope;
 import org.apache.struts2.util.StrutsUtil;
 
 import javax.servlet.http.HttpServletRequest;
@@ -31,9 +32,9 @@ import java.util.Map;
  * Value Stack's Context related Utilities.
  */
 public class ContextUtil {
-    public static final String REQUEST = "request";
-    public static final String RESPONSE = "response";
-    public static final String SESSION = "session";
+    public static final String REQUEST = DispatcherScope.REQUEST;
+    public static final String RESPONSE = DispatcherScope.RESPONSE;
+    public static final String SESSION = DispatcherScope.SESSION;
     public static final String BASE = "base";
     public static final String STACK = "stack";
     public static final String STRUTS = "struts";
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 cc7b00c5b..69e9b82e6 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
@@ -33,6 +33,7 @@ import org.apache.struts2.StrutsException;
 import org.apache.struts2.StrutsStatics;
 import org.apache.struts2.dispatcher.ApplicationMap;
 import org.apache.struts2.dispatcher.Dispatcher;
+import org.apache.struts2.dispatcher.DispatcherScope;
 import org.apache.struts2.dispatcher.HttpParameters;
 import org.apache.struts2.dispatcher.RequestMap;
 import org.apache.struts2.dispatcher.SessionMap;
@@ -48,7 +49,7 @@ import 
org.apache.struts2.portlet.context.PortletActionContext;
 import org.apache.struts2.portlet.servlet.PortletServletContext;
 import org.apache.struts2.portlet.servlet.PortletServletRequest;
 import org.apache.struts2.portlet.servlet.PortletServletResponse;
-import org.apache.struts2.util.AttributeMap;
+import org.apache.struts2.dispatcher.AttributeMap;
 
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
@@ -377,7 +378,7 @@ public class Jsr168Dispatcher extends GenericPortlet 
implements StrutsStatics {
         container.inject(servletRequest);
 
         // ServletActionContext
-        Map<String, Object> extraContext = ActionContext.of(new 
HashMap<String, Object>())
+        Map<String, Object> extraContext = ActionContext.of(new HashMap<>())
             .withServletRequest(servletRequest)
             .withServletResponse(servletResponse)
             .withServletContext(servletContext)
@@ -392,10 +393,10 @@ public class Jsr168Dispatcher extends GenericPortlet 
implements StrutsStatics {
             .with(PORTLET_NAMESPACE, portletNamespace)
             .with(DEFAULT_ACTION_FOR_MODE, 
actionMap.get(request.getPortletMode()))
             // helpers to get access to request/session/application scope
-            .with("request", requestMap)
-            .with("session", sessionMap)
-            .with("application", applicationMap)
-            .with("parameters", parameterMap)
+            .with(DispatcherScope.REQUEST, requestMap)
+            .with(DispatcherScope.SESSION, sessionMap)
+            .with(DispatcherScope.APPLICATION, applicationMap)
+            .with(DispatcherScope.PARAMETERS, parameterMap)
             .with(MODE_NAMESPACE_MAP, modeMap)
             .with(PortletConstants.DEFAULT_ACTION_MAP, actionMap)
             .with(PortletConstants.PHASE, phase)

Reply via email to