comparison src/org/eclipse/jetty/server/session/AbstractSession.java @ 802:3428c60d7cfc

replace jetty jars with source
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 07 Sep 2016 21:15:48 -0600
parents
children
comparison
equal deleted inserted replaced
801:6a21393191c1 802:3428c60d7cfc
1 //
2 // ========================================================================
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19 package org.eclipse.jetty.server.session;
20
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.Enumeration;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.Iterator;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Set;
30
31 import javax.servlet.ServletContext;
32 import javax.servlet.http.HttpServletRequest;
33 import javax.servlet.http.HttpSessionActivationListener;
34 import javax.servlet.http.HttpSessionBindingEvent;
35 import javax.servlet.http.HttpSessionBindingListener;
36 import javax.servlet.http.HttpSessionContext;
37 import javax.servlet.http.HttpSessionEvent;
38
39 import org.eclipse.jetty.util.log.Logger;
40
41 /**
42 *
43 * <p>
44 * Implements {@link javax.servlet.http.HttpSession} from the <code>javax.servlet</code> package.
45 * </p>
46 *
47 */
48 @SuppressWarnings("deprecation")
49 public abstract class AbstractSession implements AbstractSessionManager.SessionIf
50 {
51 final static Logger LOG = SessionHandler.LOG;
52
53 private final AbstractSessionManager _manager;
54 private final String _clusterId; // ID unique within cluster
55 private final String _nodeId; // ID unique within node
56 private final Map<String,Object> _attributes=new HashMap<String, Object>();
57 private boolean _idChanged;
58 private final long _created;
59 private long _cookieSet;
60 private long _accessed; // the time of the last access
61 private long _lastAccessed; // the time of the last access excluding this one
62 private boolean _invalid;
63 private boolean _doInvalidate;
64 private long _maxIdleMs;
65 private boolean _newSession;
66 private int _requests;
67
68
69
70 /* ------------------------------------------------------------- */
71 protected AbstractSession(AbstractSessionManager abstractSessionManager, HttpServletRequest request)
72 {
73 _manager = abstractSessionManager;
74
75 _newSession=true;
76 _created=System.currentTimeMillis();
77 _clusterId=_manager._sessionIdManager.newSessionId(request,_created);
78 _nodeId=_manager._sessionIdManager.getNodeId(_clusterId,request);
79 _accessed=_created;
80 _lastAccessed=_created;
81 _requests=1;
82 _maxIdleMs=_manager._dftMaxIdleSecs>0?_manager._dftMaxIdleSecs*1000L:-1;
83 if (LOG.isDebugEnabled())
84 LOG.debug("new session & id "+_nodeId+" "+_clusterId);
85 }
86
87 /* ------------------------------------------------------------- */
88 protected AbstractSession(AbstractSessionManager abstractSessionManager, long created, long accessed, String clusterId)
89 {
90 _manager = abstractSessionManager;
91 _created=created;
92 _clusterId=clusterId;
93 _nodeId=_manager._sessionIdManager.getNodeId(_clusterId,null);
94 _accessed=accessed;
95 _lastAccessed=accessed;
96 _requests=1;
97 _maxIdleMs=_manager._dftMaxIdleSecs>0?_manager._dftMaxIdleSecs*1000L:-1;
98 if (LOG.isDebugEnabled())
99 LOG.debug("new session "+_nodeId+" "+_clusterId);
100 }
101
102 /* ------------------------------------------------------------- */
103 /**
104 * asserts that the session is valid
105 */
106 protected void checkValid() throws IllegalStateException
107 {
108 if (_invalid)
109 throw new IllegalStateException();
110 }
111
112 /* ------------------------------------------------------------- */
113 public AbstractSession getSession()
114 {
115 return this;
116 }
117
118 /* ------------------------------------------------------------- */
119 public long getAccessed()
120 {
121 synchronized (this)
122 {
123 return _accessed;
124 }
125 }
126
127 /* ------------------------------------------------------------ */
128 public Object getAttribute(String name)
129 {
130 synchronized (this)
131 {
132 checkValid();
133 return _attributes.get(name);
134 }
135 }
136
137 /* ------------------------------------------------------------ */
138 public int getAttributes()
139 {
140 synchronized (this)
141 {
142 checkValid();
143 return _attributes.size();
144 }
145 }
146
147 /* ------------------------------------------------------------ */
148 @SuppressWarnings({ "unchecked" })
149 public Enumeration<String> getAttributeNames()
150 {
151 synchronized (this)
152 {
153 checkValid();
154 List<String> names=_attributes==null?Collections.EMPTY_LIST:new ArrayList<String>(_attributes.keySet());
155 return Collections.enumeration(names);
156 }
157 }
158
159 /* ------------------------------------------------------------ */
160 public Set<String> getNames()
161 {
162 synchronized (this)
163 {
164 return new HashSet<String>(_attributes.keySet());
165 }
166 }
167
168 /* ------------------------------------------------------------- */
169 public long getCookieSetTime()
170 {
171 return _cookieSet;
172 }
173
174 /* ------------------------------------------------------------- */
175 public long getCreationTime() throws IllegalStateException
176 {
177 return _created;
178 }
179
180 /* ------------------------------------------------------------ */
181 public String getId() throws IllegalStateException
182 {
183 return _manager._nodeIdInSessionId?_nodeId:_clusterId;
184 }
185
186 /* ------------------------------------------------------------- */
187 public String getNodeId()
188 {
189 return _nodeId;
190 }
191
192 /* ------------------------------------------------------------- */
193 public String getClusterId()
194 {
195 return _clusterId;
196 }
197
198 /* ------------------------------------------------------------- */
199 public long getLastAccessedTime() throws IllegalStateException
200 {
201 checkValid();
202 return _lastAccessed;
203 }
204
205 /* ------------------------------------------------------------- */
206 public void setLastAccessedTime(long time)
207 {
208 _lastAccessed = time;
209 }
210
211 /* ------------------------------------------------------------- */
212 public int getMaxInactiveInterval()
213 {
214 checkValid();
215 return (int)(_maxIdleMs/1000);
216 }
217
218 /* ------------------------------------------------------------ */
219 /*
220 * @see javax.servlet.http.HttpSession#getServletContext()
221 */
222 public ServletContext getServletContext()
223 {
224 return _manager._context;
225 }
226
227 /* ------------------------------------------------------------- */
228 @Deprecated
229 public HttpSessionContext getSessionContext() throws IllegalStateException
230 {
231 checkValid();
232 return AbstractSessionManager.__nullSessionContext;
233 }
234
235 /* ------------------------------------------------------------- */
236 /**
237 * @deprecated As of Version 2.2, this method is replaced by
238 * {@link #getAttribute}
239 */
240 @Deprecated
241 public Object getValue(String name) throws IllegalStateException
242 {
243 return getAttribute(name);
244 }
245
246 /* ------------------------------------------------------------- */
247 /**
248 * @deprecated As of Version 2.2, this method is replaced by
249 * {@link #getAttributeNames}
250 */
251 @Deprecated
252 public String[] getValueNames() throws IllegalStateException
253 {
254 synchronized(this)
255 {
256 checkValid();
257 if (_attributes==null)
258 return new String[0];
259 String[] a=new String[_attributes.size()];
260 return (String[])_attributes.keySet().toArray(a);
261 }
262 }
263
264 /* ------------------------------------------------------------ */
265 protected Map<String,Object> getAttributeMap ()
266 {
267 return _attributes;
268 }
269
270 /* ------------------------------------------------------------ */
271 protected void addAttributes(Map<String,Object> map)
272 {
273 _attributes.putAll(map);
274 }
275
276 /* ------------------------------------------------------------ */
277 protected boolean access(long time)
278 {
279 synchronized(this)
280 {
281 if (_invalid)
282 return false;
283 _newSession=false;
284 _lastAccessed=_accessed;
285 _accessed=time;
286
287 if (_maxIdleMs>0 && _lastAccessed>0 && _lastAccessed + _maxIdleMs < time)
288 {
289 invalidate();
290 return false;
291 }
292 _requests++;
293 return true;
294 }
295 }
296
297 /* ------------------------------------------------------------ */
298 protected void complete()
299 {
300 synchronized(this)
301 {
302 _requests--;
303 if (_doInvalidate && _requests<=0 )
304 doInvalidate();
305 }
306 }
307
308
309 /* ------------------------------------------------------------- */
310 protected void timeout() throws IllegalStateException
311 {
312 // remove session from context and invalidate other sessions with same ID.
313 _manager.removeSession(this,true);
314
315 // Notify listeners and unbind values
316 boolean do_invalidate=false;
317 synchronized (this)
318 {
319 if (!_invalid)
320 {
321 if (_requests<=0)
322 do_invalidate=true;
323 else
324 _doInvalidate=true;
325 }
326 }
327 if (do_invalidate)
328 doInvalidate();
329 }
330
331 /* ------------------------------------------------------------- */
332 public void invalidate() throws IllegalStateException
333 {
334 // remove session from context and invalidate other sessions with same ID.
335 _manager.removeSession(this,true);
336 doInvalidate();
337 }
338
339 /* ------------------------------------------------------------- */
340 protected void doInvalidate() throws IllegalStateException
341 {
342 try
343 {
344 LOG.debug("invalidate {}",_clusterId);
345 if (isValid())
346 clearAttributes();
347 }
348 finally
349 {
350 synchronized (this)
351 {
352 // mark as invalid
353 _invalid=true;
354 }
355 }
356 }
357
358 /* ------------------------------------------------------------- */
359 public void clearAttributes()
360 {
361 while (_attributes!=null && _attributes.size()>0)
362 {
363 ArrayList<String> keys;
364 synchronized(this)
365 {
366 keys=new ArrayList<String>(_attributes.keySet());
367 }
368
369 Iterator<String> iter=keys.iterator();
370 while (iter.hasNext())
371 {
372 String key=(String)iter.next();
373
374 Object value;
375 synchronized(this)
376 {
377 value=doPutOrRemove(key,null);
378 }
379 unbindValue(key,value);
380
381 _manager.doSessionAttributeListeners(this,key,value,null);
382 }
383 }
384 if (_attributes!=null)
385 _attributes.clear();
386 }
387
388 /* ------------------------------------------------------------- */
389 public boolean isIdChanged()
390 {
391 return _idChanged;
392 }
393
394 /* ------------------------------------------------------------- */
395 public boolean isNew() throws IllegalStateException
396 {
397 checkValid();
398 return _newSession;
399 }
400
401 /* ------------------------------------------------------------- */
402 /**
403 * @deprecated As of Version 2.2, this method is replaced by
404 * {@link #setAttribute}
405 */
406 @Deprecated
407 public void putValue(java.lang.String name, java.lang.Object value) throws IllegalStateException
408 {
409 setAttribute(name,value);
410 }
411
412 /* ------------------------------------------------------------ */
413 public void removeAttribute(String name)
414 {
415 setAttribute(name,null);
416 }
417
418 /* ------------------------------------------------------------- */
419 /**
420 * @deprecated As of Version 2.2, this method is replaced by
421 * {@link #removeAttribute}
422 */
423 @Deprecated
424 public void removeValue(java.lang.String name) throws IllegalStateException
425 {
426 removeAttribute(name);
427 }
428
429 /* ------------------------------------------------------------ */
430 protected Object doPutOrRemove(String name, Object value)
431 {
432 return value==null?_attributes.remove(name):_attributes.put(name,value);
433 }
434
435 /* ------------------------------------------------------------ */
436 protected Object doGet(String name)
437 {
438 return _attributes.get(name);
439 }
440
441 /* ------------------------------------------------------------ */
442 public void setAttribute(String name, Object value)
443 {
444 Object old=null;
445 synchronized (this)
446 {
447 checkValid();
448 old=doPutOrRemove(name,value);
449 }
450
451 if (value==null || !value.equals(old))
452 {
453 if (old!=null)
454 unbindValue(name,old);
455 if (value!=null)
456 bindValue(name,value);
457
458 _manager.doSessionAttributeListeners(this,name,old,value);
459
460 }
461 }
462
463 /* ------------------------------------------------------------- */
464 public void setIdChanged(boolean changed)
465 {
466 _idChanged=changed;
467 }
468
469 /* ------------------------------------------------------------- */
470 public void setMaxInactiveInterval(int secs)
471 {
472 _maxIdleMs=(long)secs*1000L;
473 }
474
475 /* ------------------------------------------------------------- */
476 @Override
477 public String toString()
478 {
479 return this.getClass().getName()+":"+getId()+"@"+hashCode();
480 }
481
482 /* ------------------------------------------------------------- */
483 /** If value implements HttpSessionBindingListener, call valueBound() */
484 public void bindValue(java.lang.String name, Object value)
485 {
486 if (value!=null&&value instanceof HttpSessionBindingListener)
487 ((HttpSessionBindingListener)value).valueBound(new HttpSessionBindingEvent(this,name));
488 }
489
490 /* ------------------------------------------------------------ */
491 public boolean isValid()
492 {
493 return !_invalid;
494 }
495
496 /* ------------------------------------------------------------- */
497 protected void cookieSet()
498 {
499 synchronized (this)
500 {
501 _cookieSet=_accessed;
502 }
503 }
504
505 /* ------------------------------------------------------------ */
506 public int getRequests()
507 {
508 synchronized (this)
509 {
510 return _requests;
511 }
512 }
513
514 /* ------------------------------------------------------------ */
515 public void setRequests(int requests)
516 {
517 synchronized (this)
518 {
519 _requests=requests;
520 }
521 }
522
523 /* ------------------------------------------------------------- */
524 /** If value implements HttpSessionBindingListener, call valueUnbound() */
525 public void unbindValue(java.lang.String name, Object value)
526 {
527 if (value!=null&&value instanceof HttpSessionBindingListener)
528 ((HttpSessionBindingListener)value).valueUnbound(new HttpSessionBindingEvent(this,name));
529 }
530
531 /* ------------------------------------------------------------- */
532 public void willPassivate()
533 {
534 synchronized(this)
535 {
536 HttpSessionEvent event = new HttpSessionEvent(this);
537 for (Iterator<Object> iter = _attributes.values().iterator(); iter.hasNext();)
538 {
539 Object value = iter.next();
540 if (value instanceof HttpSessionActivationListener)
541 {
542 HttpSessionActivationListener listener = (HttpSessionActivationListener) value;
543 listener.sessionWillPassivate(event);
544 }
545 }
546 }
547 }
548
549 /* ------------------------------------------------------------- */
550 public void didActivate()
551 {
552 synchronized(this)
553 {
554 HttpSessionEvent event = new HttpSessionEvent(this);
555 for (Iterator<Object> iter = _attributes.values().iterator(); iter.hasNext();)
556 {
557 Object value = iter.next();
558 if (value instanceof HttpSessionActivationListener)
559 {
560 HttpSessionActivationListener listener = (HttpSessionActivationListener) value;
561 listener.sessionDidActivate(event);
562 }
563 }
564 }
565 }
566
567
568 }