    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    }