001 package com.mockrunner.mock.web;
002
003 import java.util.ArrayList;
004 import java.util.Enumeration;
005 import java.util.HashMap;
006 import java.util.Iterator;
007 import java.util.List;
008 import java.util.Map;
009 import java.util.Vector;
010
011 import javax.servlet.ServletContext;
012 import javax.servlet.http.HttpSession;
013 import javax.servlet.http.HttpSessionAttributeListener;
014 import javax.servlet.http.HttpSessionBindingEvent;
015 import javax.servlet.http.HttpSessionBindingListener;
016 import javax.servlet.http.HttpSessionContext;
017
018 /**
019 * Mock implementation of <code>HttpSession</code>.
020 */
021 public class MockHttpSession implements HttpSession
022 {
023 private HashMap attributes;
024 private String sessionId;
025 private boolean isNew;
026 private boolean isValid;
027 private long creationTime;
028 private ServletContext servletContext;
029 private int maxInactiveInterval;
030 private List attributeListener;
031
032 public MockHttpSession()
033 {
034 resetAll();
035 }
036
037 /**
038 * Resets the state of this object to the default values
039 */
040 public synchronized void resetAll()
041 {
042 attributes = new HashMap();
043 isValid = true;
044 creationTime = System.currentTimeMillis();
045 sessionId = new Double(Math.random()).toString();
046 maxInactiveInterval = -1;
047 attributeListener = new ArrayList();
048 }
049
050 public synchronized void addAttributeListener(HttpSessionAttributeListener listener)
051 {
052 attributeListener.add(listener);
053 }
054
055 /**
056 * Set the <code>ServletContext</code>.
057 * @param servletContext the <code>ServletContext</code>
058 */
059 public synchronized void setupServletContext(ServletContext servletContext)
060 {
061 this.servletContext = servletContext;
062 }
063
064 public synchronized ServletContext getServletContext()
065 {
066 return servletContext;
067 }
068
069 public synchronized boolean isValid()
070 {
071 return isValid;
072 }
073
074 public synchronized boolean isNew()
075 {
076 return isNew;
077 }
078
079 public synchronized void setUpIsNew(boolean isNew)
080 {
081 this.isNew = isNew;
082 }
083
084 public synchronized long getCreationTime()
085 {
086 return creationTime;
087 }
088
089 public synchronized void invalidate()
090 {
091 if (!isValid) throw new IllegalStateException("session invalid");
092 isValid = false;
093 Map clone = new HashMap(attributes);
094 Iterator keys = clone.keySet().iterator();
095 while (keys.hasNext())
096 {
097 doRemoveAttribute((String)keys.next());
098 }
099 }
100
101 public synchronized String getId()
102 {
103 return sessionId;
104 }
105
106 public synchronized Object getValue(String key)
107 {
108 if (!isValid) throw new IllegalStateException("session invalid");
109 return getAttribute(key);
110 }
111
112 public synchronized String[] getValueNames()
113 {
114 if (!isValid) throw new IllegalStateException("session invalid");
115 Vector attKeys = new Vector(attributes.keySet());
116 return (String[]) attKeys.toArray();
117 }
118
119 public synchronized void putValue(String key, Object value)
120 {
121 if (!isValid) throw new IllegalStateException("session invalid");
122 setAttribute(key, value);
123 }
124
125 public synchronized void removeValue(String key)
126 {
127 if (!isValid) throw new IllegalStateException("session invalid");
128 removeAttribute(key);
129 }
130
131 public synchronized void clearAttributes()
132 {
133 attributes.clear();
134 }
135
136 public synchronized Object getAttribute(String key)
137 {
138 if (!isValid) throw new IllegalStateException("session invalid");
139 return attributes.get(key);
140 }
141
142 public synchronized Enumeration getAttributeNames()
143 {
144 if (!isValid) throw new IllegalStateException("session invalid");
145 Vector attKeys = new Vector(attributes.keySet());
146 return attKeys.elements();
147 }
148
149 public synchronized void removeAttribute(String key)
150 {
151 if (!isValid) throw new IllegalStateException("session invalid");
152 doRemoveAttribute(key);
153 }
154
155 private void doRemoveAttribute(String key)
156 {
157 Object value = attributes.get(key);
158 attributes.remove(key);
159 if(null != value)
160 {
161 callValueUnboundMethod(key, value);
162 callAttributeListenersRemovedMethod(key, value);
163 }
164 }
165
166 public synchronized void setAttribute(String key, Object value)
167 {
168 if (!isValid) throw new IllegalStateException("session invalid");
169 Object oldValue = attributes.get(key);
170 if(null == value)
171 {
172 attributes.remove(key);
173 }
174 else
175 {
176 attributes.put(key, value);
177 }
178 handleBindingListenerCalls(key, value, oldValue);
179 handleAttributeListenerCalls(key, value, oldValue);
180 }
181
182 private synchronized void handleBindingListenerCalls(String key, Object value, Object oldValue)
183 {
184 if(oldValue != null)
185 {
186 callValueUnboundMethod(key, oldValue);
187 }
188 if(value != null)
189 {
190 callValueBoundMethod(key, value);
191 }
192 }
193
194 private synchronized void handleAttributeListenerCalls(String key, Object value, Object oldValue)
195 {
196 if(null != oldValue)
197 {
198 if(value != null)
199 {
200 callAttributeListenersReplacedMethod(key, oldValue);
201 }
202 else
203 {
204 callAttributeListenersRemovedMethod(key, oldValue);
205 }
206 }
207 else
208 {
209 if(value != null)
210 {
211 callAttributeListenersAddedMethod(key, value);
212 }
213
214 }
215 }
216
217 public synchronized long getLastAccessedTime()
218 {
219 return System.currentTimeMillis();
220 }
221
222 public synchronized void setMaxInactiveInterval(int maxInactiveInterval)
223 {
224 this.maxInactiveInterval = maxInactiveInterval;
225 }
226
227 public synchronized int getMaxInactiveInterval()
228 {
229 return maxInactiveInterval;
230 }
231
232 public synchronized HttpSessionContext getSessionContext()
233 {
234 return new MockSessionContext();
235 }
236
237 private synchronized void callAttributeListenersAddedMethod(String key, Object value)
238 {
239 for(int ii = 0; ii < attributeListener.size(); ii++)
240 {
241 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
242 ((HttpSessionAttributeListener)attributeListener.get(ii)).attributeAdded(event);
243 }
244 }
245
246 private synchronized void callAttributeListenersReplacedMethod(String key, Object value)
247 {
248 for(int ii = 0; ii < attributeListener.size(); ii++)
249 {
250 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
251 ((HttpSessionAttributeListener)attributeListener.get(ii)).attributeReplaced(event);
252 }
253 }
254
255 private synchronized void callAttributeListenersRemovedMethod(String key, Object value)
256 {
257 for(int ii = 0; ii < attributeListener.size(); ii++)
258 {
259 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
260 ((HttpSessionAttributeListener)attributeListener.get(ii)).attributeRemoved(event);
261 }
262 }
263
264 private synchronized void callValueBoundMethod(String key, Object value)
265 {
266 if (value instanceof HttpSessionBindingListener)
267 {
268 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
269 ((HttpSessionBindingListener) value).valueBound(event);
270 }
271 }
272
273 private synchronized void callValueUnboundMethod(String key, Object value)
274 {
275 if (value instanceof HttpSessionBindingListener)
276 {
277 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
278 ((HttpSessionBindingListener) value).valueUnbound(event);
279 }
280 }
281 }