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 public synchronized void setupServletContext(ServletContext servletContext)
056 {
057 this.servletContext = servletContext;
058 }
059
060 public synchronized ServletContext getServletContext()
061 {
062 return servletContext;
063 }
064
065 public synchronized boolean isValid()
066 {
067 return isValid;
068 }
069
070 public synchronized boolean isNew()
071 {
072 return isNew;
073 }
074
075 public synchronized void setUpIsNew(boolean isNew)
076 {
077 this.isNew = isNew;
078 }
079
080 public synchronized long getCreationTime()
081 {
082 return creationTime;
083 }
084
085 public synchronized void invalidate()
086 {
087 if (!isValid) throw new IllegalStateException("session invalid");
088 isValid = false;
089 Map clone = new HashMap(attributes);
090 Iterator keys = clone.keySet().iterator();
091 while (keys.hasNext())
092 {
093 doRemoveAttribute((String)keys.next());
094 }
095 }
096
097 public synchronized String getId()
098 {
099 return sessionId;
100 }
101
102 public synchronized Object getValue(String key)
103 {
104 if (!isValid) throw new IllegalStateException("session invalid");
105 return getAttribute(key);
106 }
107
108 public synchronized String[] getValueNames()
109 {
110 if (!isValid) throw new IllegalStateException("session invalid");
111 Vector attKeys = new Vector(attributes.keySet());
112 return (String[]) attKeys.toArray();
113 }
114
115 public synchronized void putValue(String key, Object value)
116 {
117 if (!isValid) throw new IllegalStateException("session invalid");
118 setAttribute(key, value);
119 }
120
121 public synchronized void removeValue(String key)
122 {
123 if (!isValid) throw new IllegalStateException("session invalid");
124 removeAttribute(key);
125 }
126
127 public synchronized void clearAttributes()
128 {
129 attributes.clear();
130 }
131
132 public synchronized Object getAttribute(String key)
133 {
134 if (!isValid) throw new IllegalStateException("session invalid");
135 return attributes.get(key);
136 }
137
138 public synchronized Enumeration getAttributeNames()
139 {
140 if (!isValid) throw new IllegalStateException("session invalid");
141 Vector attKeys = new Vector(attributes.keySet());
142 return attKeys.elements();
143 }
144
145 public synchronized void removeAttribute(String key)
146 {
147 if (!isValid) throw new IllegalStateException("session invalid");
148 doRemoveAttribute(key);
149 }
150
151 private void doRemoveAttribute(String key)
152 {
153 Object value = attributes.get(key);
154 attributes.remove(key);
155 if(null != value)
156 {
157 callValueUnboundMethod(key, value);
158 callAttributeListenersRemovedMethod(key, value);
159 }
160 }
161
162 public synchronized void setAttribute(String key, Object value)
163 {
164 if (!isValid) throw new IllegalStateException("session invalid");
165 Object oldValue = attributes.get(key);
166 if(null == value)
167 {
168 attributes.remove(key);
169 }
170 else
171 {
172 attributes.put(key, value);
173 }
174 handleBindingListenerCalls(key, value, oldValue);
175 handleAttributeListenerCalls(key, value, oldValue);
176 }
177
178 private synchronized void handleBindingListenerCalls(String key, Object value, Object oldValue)
179 {
180 if(oldValue != null)
181 {
182 callValueUnboundMethod(key, oldValue);
183 }
184 if(value != null)
185 {
186 callValueBoundMethod(key, value);
187 }
188 }
189
190 private synchronized void handleAttributeListenerCalls(String key, Object value, Object oldValue)
191 {
192 if(null != oldValue)
193 {
194 if(value != null)
195 {
196 callAttributeListenersReplacedMethod(key, oldValue);
197 }
198 else
199 {
200 callAttributeListenersRemovedMethod(key, oldValue);
201 }
202 }
203 else
204 {
205 if(value != null)
206 {
207 callAttributeListenersAddedMethod(key, value);
208 }
209
210 }
211 }
212
213 public synchronized long getLastAccessedTime()
214 {
215 return System.currentTimeMillis();
216 }
217
218 public synchronized void setMaxInactiveInterval(int maxInactiveInterval)
219 {
220 this.maxInactiveInterval = maxInactiveInterval;
221 }
222
223 public synchronized int getMaxInactiveInterval()
224 {
225 return maxInactiveInterval;
226 }
227
228 public synchronized HttpSessionContext getSessionContext()
229 {
230 return new MockSessionContext();
231 }
232
233 private synchronized void callAttributeListenersAddedMethod(String key, Object value)
234 {
235 for(int ii = 0; ii < attributeListener.size(); ii++)
236 {
237 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
238 ((HttpSessionAttributeListener)attributeListener.get(ii)).attributeAdded(event);
239 }
240 }
241
242 private synchronized void callAttributeListenersReplacedMethod(String key, Object value)
243 {
244 for(int ii = 0; ii < attributeListener.size(); ii++)
245 {
246 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
247 ((HttpSessionAttributeListener)attributeListener.get(ii)).attributeReplaced(event);
248 }
249 }
250
251 private synchronized void callAttributeListenersRemovedMethod(String key, Object value)
252 {
253 for(int ii = 0; ii < attributeListener.size(); ii++)
254 {
255 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
256 ((HttpSessionAttributeListener)attributeListener.get(ii)).attributeRemoved(event);
257 }
258 }
259
260 private synchronized void callValueBoundMethod(String key, Object value)
261 {
262 if (value instanceof HttpSessionBindingListener)
263 {
264 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
265 ((HttpSessionBindingListener) value).valueBound(event);
266 }
267 }
268
269 private synchronized void callValueUnboundMethod(String key, Object value)
270 {
271 if (value instanceof HttpSessionBindingListener)
272 {
273 HttpSessionBindingEvent event = new HttpSessionBindingEvent(this, key, value);
274 ((HttpSessionBindingListener) value).valueUnbound(event);
275 }
276 }
277 }