001 // Copyright 2006, 2007, 2008, 2009, 2011 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.internal.services;
016
017 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
018 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
019 import org.apache.tapestry5.services.Session;
020 import org.apache.tapestry5.services.SessionPersistedObjectAnalyzer;
021
022 import javax.servlet.http.HttpServletRequest;
023 import javax.servlet.http.HttpSession;
024 import java.util.Collections;
025 import java.util.Enumeration;
026 import java.util.List;
027 import java.util.Map;
028
029 /**
030 * A thin wrapper around {@link HttpSession}.
031 */
032 public class SessionImpl implements Session
033 {
034 private final HttpServletRequest request;
035 private final HttpSession session;
036
037 private boolean invalidated = false;
038
039 public SessionImpl(HttpServletRequest request, HttpSession session)
040 {
041 this.request = request;
042 this.session = session;
043 }
044
045 public Object getAttribute(String name)
046 {
047 return session.getAttribute(name);
048 }
049
050 public List<String> getAttributeNames()
051 {
052 return InternalUtils.toList(session.getAttributeNames());
053 }
054
055 public void setAttribute(String name, Object value)
056 {
057 session.setAttribute(name, value);
058 }
059
060 public List<String> getAttributeNames(String prefix)
061 {
062 List<String> result = CollectionFactory.newList();
063
064 Enumeration e = session.getAttributeNames();
065 while (e.hasMoreElements())
066 {
067 String name = (String) e.nextElement();
068
069 if (name.startsWith(prefix)) result.add(name);
070 }
071
072 Collections.sort(result);
073
074 return result;
075 }
076
077 public int getMaxInactiveInterval()
078 {
079 return session.getMaxInactiveInterval();
080 }
081
082 public void invalidate()
083 {
084 invalidated = true;
085
086 session.invalidate();
087 }
088
089 public boolean isInvalidated()
090 {
091 if (invalidated) return true;
092
093 // The easy case is when the session was invalidated through the Tapestry Session
094 // object. The hard case is when the HttpSession was invalidated outside of Tapestry,
095 // in which case, request.getSession() will return a new HttpSession instance (or null)
096
097 invalidated = request.getSession(false) != session;
098
099 return invalidated;
100 }
101
102 public void setMaxInactiveInterval(int seconds)
103 {
104 session.setMaxInactiveInterval(seconds);
105 }
106
107 public void restoreDirtyObjects()
108 {
109
110 }
111 }