1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts2.dispatcher;
22
23 import java.io.Serializable;
24 import java.util.AbstractMap;
25 import java.util.Collections;
26 import java.util.Enumeration;
27 import java.util.HashSet;
28 import java.util.Map;
29 import java.util.Set;
30
31 import javax.servlet.http.HttpServletRequest;
32 import javax.servlet.http.HttpSession;
33
34
35 /***
36 * A simple implementation of the {@link java.util.Map} interface to handle a collection of HTTP session
37 * attributes. The {@link #entrySet()} method enumerates over all session attributes and creates a Set of entries.
38 * Note, this will occur lazily - only when the entry set is asked for.
39 *
40 */
41 public class SessionMap extends AbstractMap implements Serializable {
42
43 private static final long serialVersionUID = 4678843241638046854L;
44
45 protected HttpSession session;
46 protected Set<Object> entries;
47 protected HttpServletRequest request;
48
49
50 /***
51 * Creates a new session map given a http servlet request. Note, ths enumeration of request
52 * attributes will occur when the map entries are asked for.
53 *
54 * @param request the http servlet request object.
55 */
56 public SessionMap(HttpServletRequest request) {
57
58
59
60 this.request = request;
61 this.session = request.getSession(false);
62 }
63
64 /***
65 * Invalidate the http session.
66 */
67 public void invalidate() {
68 if (session == null) {
69 return;
70 }
71
72 synchronized (session) {
73 session.invalidate();
74 session = null;
75 entries = null;
76 }
77 }
78
79 /***
80 * Removes all attributes from the session as well as clears entries in this
81 * map.
82 */
83 public void clear() {
84 if (session == null ) {
85 return;
86 }
87
88 synchronized (session) {
89 entries = null;
90 Enumeration<String> attributeNamesEnum = session.getAttributeNames();
91 while(attributeNamesEnum.hasMoreElements()) {
92 session.removeAttribute(attributeNamesEnum.nextElement());
93 }
94 }
95
96 }
97
98 /***
99 * Returns a Set of attributes from the http session.
100 *
101 * @return a Set of attributes from the http session.
102 */
103 public Set entrySet() {
104 if (session == null) {
105 return Collections.EMPTY_SET;
106 }
107
108 synchronized (session) {
109 if (entries == null) {
110 entries = new HashSet<Object>();
111
112 Enumeration enumeration = session.getAttributeNames();
113
114 while (enumeration.hasMoreElements()) {
115 final String key = enumeration.nextElement().toString();
116 final Object value = session.getAttribute(key);
117 entries.add(new Map.Entry() {
118 public boolean equals(Object obj) {
119 Map.Entry entry = (Map.Entry) obj;
120
121 return ((key == null) ? (entry.getKey() == null) : key.equals(entry.getKey())) && ((value == null) ? (entry.getValue() == null) : value.equals(entry.getValue()));
122 }
123
124 public int hashCode() {
125 return ((key == null) ? 0 : key.hashCode()) ^ ((value == null) ? 0 : value.hashCode());
126 }
127
128 public Object getKey() {
129 return key;
130 }
131
132 public Object getValue() {
133 return value;
134 }
135
136 public Object setValue(Object obj) {
137 session.setAttribute(key.toString(), obj);
138
139 return value;
140 }
141 });
142 }
143 }
144 }
145
146 return entries;
147 }
148
149 /***
150 * Returns the session attribute associated with the given key or <tt>null</tt> if it doesn't exist.
151 *
152 * @param key the name of the session attribute.
153 * @return the session attribute or <tt>null</tt> if it doesn't exist.
154 */
155 public Object get(Object key) {
156 if (session == null) {
157 return null;
158 }
159
160 synchronized (session) {
161 return session.getAttribute(key.toString());
162 }
163 }
164
165 /***
166 * Saves an attribute in the session.
167 *
168 * @param key the name of the session attribute.
169 * @param value the value to set.
170 * @return the object that was just set.
171 */
172 public Object put(Object key, Object value) {
173 synchronized (this) {
174 if (session == null) {
175 session = request.getSession(true);
176 }
177 }
178
179 synchronized (session) {
180 entries = null;
181 session.setAttribute(key.toString(), value);
182
183 return get(key);
184 }
185 }
186
187 /***
188 * Removes the specified session attribute.
189 *
190 * @param key the name of the attribute to remove.
191 * @return the value that was removed or <tt>null</tt> if the value was not found (and hence, not removed).
192 */
193 public Object remove(Object key) {
194 if (session == null) {
195 return null;
196 }
197
198 synchronized (session) {
199 entries = null;
200
201 Object value = get(key);
202 session.removeAttribute(key.toString());
203
204 return value;
205 }
206 }
207 }